🧠

LoRAで自分の画像でファインチューニングして、プロフィール画像を生成する

2024/12/03に公開

はじめに

この記事は株式会社LabBase テックカレンダー Advent Calendar 2024 3日目の記事です。

株式会社LabBaseでエンジニアをしている渡辺創です。今回は LoRA で自分の画像でファインチューニングして、プロフィール画像を生成しました。fal.aiというサービスを使っています。

背景

少し前にAIアバターが話題になっていて、自分っぽい画像とかアバターの生成面白そうだなと思い、実際にやるとなるとどんな感じだろうなと思い、プロフィール画像を生成しました。

画像生成周りは無知なので、LoRAやControlNetについて軽く調べた後にLoRAを使うことに決めました。この辺まだわかってない部分もあるので、ぜひ他の方法についても知ってる人いたら教えてください。
Xはこちら

LoRAとは何か?

LoRAは既存のモデルの元のパラメータは更新せず、追加学習用の低ランク行列を追加する方法です。
モデル全体のパラメータを更新する従来のファインチューニングとは異なり、低ランク行列をチューニングすることによって、少ない計算量で特定のタスクに適応させることができます。

ControlNetとは何か?

ControlNet とは Diffusion Model 向けの拡張機能で、輪郭線やポーズ情報をinputの条件として取り込むことで構図を細かく調整できるものです。プロンプトは意味的な条件の調整は得意ですが、空間的な条件の調整が苦手なため、そこにきく手法として活用されています。

LoRA、ControlNet、ファインチューニングの違い

言葉の粒度が違うため、これらを比較することに違和感を感じましたが、LoRAもControlNetもファインチューニングの方法の一種であり、モデルのすべてのパラメータを更新する従来のファインチューニングよりも効率的に特定のタスクに適応させつつ、壊滅的な忘却や過学習を防ぐための手法という感じでした。

LoRAは、効率的にモデルを特定のタスクに適応させることができ、ControlNetは、画像生成プロセスの空間的な条件を細かく制御することができる。ファインチューニングは、モデルを特定のデータセットに最適化するための再学習できるが、全パラメータを更新するための計算リソースはかかるという感じです。

今回は自分の画像でモデルを作成したかったので、LoRAを使用することにしました。
(今後としてはLoRAでつくったモデルに、ControleNetを適用したいと思いました。)

fal.aiでLoRAを使って、モデルを作成する

Pythonを使ってやっていきます。
まず、環境変数にAPI_Keyを埋め込みます。

import os
import fal_client

os.environ["FAL_KEY"] = "YOUR_API_KEY

学習画像のアップロード

学習画像をアップロードします。
今回は私に似ている架空の人の画像を使って、モデルを学習させていきます。
こんな感じの画像を15枚ほど用意します。それらをzipで圧縮してアップロードします。
画像のファイル名は a_photo_of_bob(1).jpg のような形で、bobという架空の名前をつけて保存しており、この後の画像生成段階のプロンプトの中でその名前を使用します。


a_photo_of_bob(1).jpg


圧縮する前の画像フォルダ

zipフォルダの用意が終わったら、そのデータをfal.aiにアップロードします。
完了するとURLが返ってきます。これをモデルの作成に使用します。

uploaded_url = fal_client.upload_file("path/to/your_zip")
print(result)

LoRAを使ったモデルの作成

続いて、LoRAを使ったモデルの作成をしていきます。
portrait-trainerという人物画像向けに特化したモデルがあったので、こちらのモデルを使用します。
argumentsの中のimages_data_urlに先ほど返ってきた uploaded_url を指定します。

def on_queue_update(update):
    if isinstance(update, fal_client.InProgress):
        for log in update.logs:
           print(log["message"])

result = fal_client.subscribe(
    "fal-ai/flux-lora-portrait-trainer",
    arguments={
        "images_data_url": uploaded_url
    },
    with_logs=True,
    on_queue_update=on_queue_update,
)
print(result)

学習の過程が表示されつつ、完了すると結果が表示されます。


学習の過程

以下のようなjsonがresultの中に入っています。diffusers_lora_file の中の url 部分が作成したモデルのURLなので、画像の生成にこちらを使用します。

{
    'diffusers_lora_file':{
        'url': 'YOUR_LORA_FILE_URL',
        'content_type': None,
        'file_name': None,
        'file_size': None
    },
    'config_file':{
        'url': 'YOUR_CONFIG_FILE_URL',
        'content_type': 'application/octet-stream',
        'file_name': 'config.json',
        'file_size': 288
    }
}

画像の生成

画像の生成には LoRAのURLとプロンプトが必要です。lorasの部分で先ほどのURLを指定し、プロンプトでは、画像ファイルの名前につけたbobという名前を使って、bobのポートレート画像を生成してもらいます。

result = fal_client.subscribe(
    "fal-ai/flux-lora",
    arguments={
        "prompt": "a character straight face portrait of bob like ID photo, pure white background, trending on mentalray, wearing a plain white t-shirts without logo. High quality, Ultra detailed, best quality, insanely detailed, beautiful, masterpiece",
        "image_size ": {
            "width": 1280,
            "height": 1280
        },
        "loras": [{
            "path": "YOUR_LORA_FILE_URL",
            "scale": 1.0
        }]
    },
    with_logs=True,
    on_queue_update=on_queue_update,
)
print(result)

以下のようなjsonがresultに入るので、imagesの中のurlを開いてください。

{
    'images': [{
        'url': 'YOUR_GENERATED_IMAGE_URL',
        'width': 1280,
        'height': 1280,
        'content_type': 'image/jpeg'
    }],
    'timings': {
        'inference': 4.780863367021084
    },
    'seed': 'YOUR_SEED',
    'has_nsfw_concepts': [False],
    'prompt': 'a character straight face portrait of bob like ID photo, pure white background, trending on mentalray, wearing a plain white t-shirts without logo. High quality, Ultra detailed, best quality, insanely detailed, beautiful, masterpiece'
}

結果

このような白いシャツを着せた微妙に別人っぽい画像が生成されました。絶妙に似ていて、いい感じでです。

生成された画像

おわりに

最後までお読みいただき、ありがとうございます!

公開できない部分も多いのですが、LabBaseのリサーチエンジニアチームでは生成AIを使ったプロトタイプの作成やサービスに注力しています。生成AIを使って、プロトタイプを作成し、ユーザにヒアリングをしながら価値あるものをスピード感をもって、つくりたいという方がいらっしゃいましたら、ぜひ渡辺のXまでお気軽にお声がけください!!

明日は瀬戸口さんです。お楽しみに!

Discussion