過学習に近いLoRAを利用したテンプレート シーンの画像生成 - Stable Diffusion

過学習に近いLoRAを利用したテンプレートシーンの画像生成がどの程度できるか確認します。

やりたいこと

下図の画像を過学習気味に学習します。この画像のプロンプトを"scene001"とします。


"scene001" に "coffee cup on desk" をプロンプトに追加して、机の上にコーヒーカップを描画したいです。 コーヒーカップや机の概念は元のモデルの情報を利用し、カップや机を学習せずに生成させる狙いです。


別の例では、"scene001, laptop pc on desk"で机の上にノートPCを描画したいです。


また、別の例では "scene001, smile" でキャラクターの表情の変化を狙います。

LoRA学習

以下の画像で学習します。
img-01.png
img-01.png

img-01.txt
scene001, desk, 1girl, dissatisfied, sitting chair, yellow t-shirt, khaki long pants, white background, flat color

ベースモデルの配置

ベースモデルを準備します。今回はSDXLのモデル AnimagineXL v3 (animagineXLV3_v30.safetensors) を利用します。

設定ファイルの作成

sd-scriptsの設定ファイルを作成します。
学習設定は以下を利用します。(パラメーターを試行錯誤し、品質が良い結果のパラメーターです。)
config.toml
[model_arguments]
pretrained_model_name_or_path = "D:\\data\\model\\animagineXLV3_v30.safetensors"

[additional_network_arguments]
network_train_unet_only = true
cache_text_encoder_outputs = true
network_module = "networks.lora"

[optimizer_arguments]
optimizer_type = "prodigy"
optimizer_args = ["betas=0.9,0.999", "weight_decay=0"]
learning_rate = 1
network_dim = 32
network_alpha = 1
network_args = ["conv_dim=32"]
lr_scheduler="cosine"

[dataset_arguments]
dataset_config = "D:\\data\\lora-scene-001\\dataset.toml"
cache_latents = true

[training_arguments]
output_dir = "D:\\data\\lora-scene-001\\output"
output_name = "scene-001"
save_every_n_epochs = 1
save_model_as = "safetensors"
max_train_steps = 1600
xformers = true
mixed_precision= "bf16"
save_precision = "bf16"
gradient_checkpointing = true
persistent_data_loader_workers = true

[dreambooth_arguments]
prior_loss_weight = 1.0

[sample_arguments]
sample_every_n_epochs = 2
sample_sampler = "k_euler_a"
sample_prompts = "D:\\data\\lora-scene-001\\prompts.txt"
dataset.toml
[general]
enable_bucket = true 

[[datasets]]
resolution = 1024
batch_size = 12

[[datasets.subsets]]
image_dir = 'D:\data\lora-scene-001\image'
caption_extension = '.txt'
num_repeats = 192
prompts.txt
scene001, desk, 1girl, dissatisfied, sitting chair, yellow t-shirt, khaki long pants, white background, flat color --w 1024 --h 1024 --d 10000
scene001, desk, 1girl, dissatisfied, sitting chair, yellow t-shirt, khaki long pants, white background, flat color --w 1024 --h 1024 --d 20000
exec.bat
accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py --config_file=D:\data\lora-scene-001\config.toml

ファイル配置

exec.bat, config.toml, dataset.toml, prompts.txt を同じディレクトリに配置し、image ディレクトリ内に画像とタグのテキストファイルを配置します。

解説

network_train_unet_only = true によりunetのみの学習としています。
unetとテキストエンコーダー両方の学習も実施してみましたが、キャラクターが2人描画されてしまうケースが多く、結果は芳しくありませんでした。
学習結果は1Epochごとの出力とし、2Epochごとに画像を生成して結果が確認できる設定としています。
オプティマイザーは"Prodigy"を利用しています。学習率は自動調整されるため、"1"を設定しています。
バッチサイズ12で画像の繰り返し数は192としています。

学習結果

学習結果が収束したEpoch 88の画像です。完全に学習画像に一致しませんが、おおむね学習画像のイメージが出力できています。 学習回数が増えても生成画像は下図のイメージで安定し、変化はほとんどないです。

作成したLoRAを適用して画像を生成します。以下のプロンプトで画像を生成します。
Prompt
Prompt: scene001, desk, 1girl, dissatisfied, sitting chair, yellow t-shirt, khaki long pants, white background, flat color <lora:scene-001:1>
Negative prompt: worst quality, low quality
Model: animagineXLV3_v30
Size: 1024x1024

生成結果は下図です。当たりはずれがありますが、学習元画像とほぼ同じイメージが生成できる場合もあります。

画像生成

プロンプトを変更して画像を生成します。
Prompt
Prompt: scene001,(a coffee cup on desk:1.4), desk, 1girl, dissatisfied, sitting chair, yellow t-shirt, khaki long pants, white background, flat color <lora:scene-001:0.75>
Negative prompt: worst quality, low quality

生成結果は下図になります。あたりはずれがありますが、コーヒーカップが机の上に描画できる場合があります。


プロンプトを変更します。
Prompt
Prompt: scene001,(laptop pc on desk:1.4), desk, 1girl, dissatisfied, sitting chair, yellow t-shirt, khaki long pants, white background, flat color <lora:scene-001:0.75>
Negative prompt: worst quality, low quality

生成結果は下図になります。描画されない場合や崩れた結果もありますが、狙ったようなノートPCが机の上に描画される結果も出力されます。
もう少しノートパソコンの細部を描画してほしいですが、その場合はノートパソコンのイメージを学習させる必要がありそうです。


プロンプトを変更します。
Prompt
Prompt: scene001,(books on desk:1.4), desk, 1girl, dissatisfied, sitting chair, yellow t-shirt, khaki long pants, white background, flat color <lora:scene-001:0.75>
Negative prompt: worst quality, low quality

生成結果は下図になります。崩れた結果もありますが、本が机の上に描画されます。稀に床に描画されたり、空中に浮いたりする場合もあります。


プロンプトを変更します。
Prompt
Prompt: scene001,(smile girl:1.4), desk, 1girl, dissatisfied, sitting chair, yellow t-shirt, khaki long pants, white background, flat color <lora:scene-001:0.75>
Negative prompt: worst quality, low quality

生成結果は下図になります。にっこり顔になる場合もありますが、顔(特に口の周り)が高い確率で崩れてしまい、狙った結果にはなりませんでした。 キャラクターの表情を学習させる必要があるのかもしれません。

評価・所感

過学習に近いLoRAを利用して、テンプレート的なシーンに対して、追加で要素を描画させることができました。
以下の課題があります。
  • 狙った通りの画像出力になる成功率が低い、ノイズが入ってしまうケースが多い
  • 学習したLoRAの出力が一定にならず、画像のあたりはずれが出てしまう

もう少し学習元のデータを工夫する必要がありそうです。
著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2024-02-05
iPentec all rights reserverd.