SDXLで画風を表現するLoRAを作成する手順を紹介します。
これまでの調査結果を踏まえて、SDXLで画風を表現するLoRAを作成します。
画風を表現する場合は画像の枚数は比較的少なくてよいですが、学習回数が増えると学習画像が出力結果に強く影響を与えてしまうため、
バリエーションを増やしつつ、品質の良い画像を多めに用意する方針が良さそうです。
学習は弱くても雰囲気は表現される傾向があるため、弱めの浅い学習とする方針で進めます。
学習は弱くても学習元の画像の雰囲気は比較的よく反映されるため、学習回数は低めで切り上げます。
network_dimの値は、低いと少ない学習で学習元のイメージが強く反映されてしまい、オリジナルのモデルの画風の反映が弱くなってしまうため、
network_dimの値を高い値に設定します。しかし、値が大きすぎると、LoRAのファイルサイズが増えることや、学習時のVRAM使用量が増えるため、
学習に要するスペックと処理時間を考慮してなるべく高い値とします。
検証結果から生成画像の崩れを極力防ぐことを優先としたいため、"1"とします。
今回は、"1e-4" とします。
今回は画風を表現するLoRAのため、形状を厳密に再現する必要がないため、テキストエンコーダーの学習はしません。
今回はSDXLのベースモデルに対して学習を実行します。
13個のデータセットを利用します。合計519画像のデータセットです。
画像はTaggerでタグ付けをします。今回は先頭にトリガワードを付与するのみで自動タグ付けされたタグ内容の精査は実施しません。
Taggerのタグ付けの手順はこちらの記事を参照してください。
学習データには低い品質の画像を含めないよう注意します。全体の2%程度の画像であっても、タグ付けしていないと特徴を覚えてしまうため、品質の低い画像は学習データセットから外します。
また、学習を希望しない部分やパーツは取り除いたり、ペイントソフトで修正するなど、データセット全体のクオリティを高く保つための修正は積極的に実施したほうが良いです。物の形状やポーズなどの概念の学習では低品質の画像が含まれていてもそれほど影響がない印象ですが、
仕上げやカラーリング、レイアウトに関する学習では、学習画像を厳選したほうが最終的な結果は良くなる印象があります。
人間(データセット製作者)が、画像を見て、まあまあ良い画像と判断してデータセットに追加した場合、
その画像の良いところをデータセット製作者が強く評価しており、学習画像の良くない部分は過小評価しているケースがあります。
AIの学習ではどの画像のどの部分も同じように学習されるため、画像の良くない部分も同じ重みで学習してしまうため、
人間の感覚と学習結果にギャップが出る印象があります。
学習画像は超厳選して、(データセット製作者から見て)素晴らしいクオリティの画像のみで
データセットを作成したほうが最終結果は良くなる印象です。
以下の設定ファイルとなりました。
accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py --config_file=D:\data\lora-xxxx\config.toml
[model_arguments]
pretrained_model_name_or_path = "D:\\data\\model\\sdXL_v10.safetensors"
[additional_network_arguments]
network_train_unet_only = true
cache_text_encoder_outputs = true
network_module = "networks.lora"
[optimizer_arguments]
optimizer_type = "AdamW"
learning_rate = 1e-4
network_dim = 32
network_alpha = 1
[dataset_arguments]
dataset_config = "D:\\data\\lora-xxxx\\dataset.toml"
cache_latents = true
[training_arguments]
output_dir = "D:\\data\\lora-xxxx\\output"
output_name = "lora-xxxx"
save_every_n_epochs = 1
save_model_as = "safetensors"
max_train_steps = 10000
xformers = true
mixed_precision= "bf16"
gradient_checkpointing = true
persistent_data_loader_workers = true
keep_tokens = 1
[dreambooth_arguments]
prior_loss_weight = 1.0
13個のデータセットを利用します。合計519画像のデータセットです。
[general]
enable_bucket = true
[[datasets]]
resolution = 1024
batch_size = 4
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\1'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\2'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\3'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\4'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\5'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\6'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\7'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\8'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\9'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\10'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\11'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\12'
caption_extension = '.txt'
num_repeats = 1
[[datasets.subsets]]
image_dir = 'D:\data\lora-xxxx\13'
caption_extension = '.txt'
num_repeats = 1
上記の設定で学習します。学習はGeForce RTX 4090で2時間25分を要しました。
次のプロンプトで出力テストをします。
約500画像のデータセットのため、Epoch5の段階でも絵柄が出力結果にかなり反映されています。
特にトリガワードありのほうは顕著です。
ただし、背景を含めた全体の画像トーンが学習元の画像のテイストにはなりませんでした。これは学習元データの背景数が少ないことが原因と考えられます。
手の崩れなどがありますが、LoRAなし状態でも崩れはあるため、LoRAの影響ではなさそうです。
トリガワードありの出力結果は若干崩れが多い印象です。
背景に対してキャラクターが鮮明すぎる傾向にあります。学習がキャラクターのみに対して強く影響しており、背景部分が学習元の画像をあまり反映できていないことが原因と考えられます。
学習元データの背景数が少ないことと、今回プロンプトが学習元の画像の背景にヒットするワードがないことが推測されます。
キャラクターが半透明状態や溶けている画像がいくつか見られる状態になります。学習しすぎの可能性がありそうです。
Epochが30以上になると顔は鮮明で背景がソフトな出力になる傾向です。
学習元の画像がシャープな画像が多いためと考えられますが、背景部分の学習が進まずにキャラクターの学習のみが進んでしまっている印象です。
おそらく学習データのタグ付けがキャラクター部分に集中しており、背景のタグが十分に記述されていない可能性が高そうです。
学習データのタグ付けに関しては、自動タグの設定後に精査や見直しが必要な印象です。
その後、学習元の画像を調査した結果、学習元の画像で、シャープでないぼかしのある背景が多い意外と多いことや、
シャープな背景に含まれる特有のワードを含めていないことが原因の可能性が高く、学習自体は正しく実行されている状態との見解です。
学習元の画像の雰囲気はEpoch5程度でも表現できているため、学習元画像が500枚程度であれば、多くても30Epoch以下で十分な印象です。
作成したLoRAをCounterfeit XL v1.0に適用して、出力画像を確認します。
Counterfeit XLの絵柄と学習元画像の絵柄が似ているため、違いが分かりにくいですが、Epoch20付近では学習元画像の特徴が出ている印象です。
Epochが40以上になると体の一部分が透明化したり、溶けるような画像の結果になり、学習しすぎの傾向が見られます。
また、学習元の画像の影響のためか、学習が進むとロングショットの画像が減る傾向になります。
10個のデータセットを利用します。合計253画像のデータセットを利用して学習し、LoRAを作成します。
次のプロンプトで出力テストをします。
Epochが20程度から学習画像の特徴が表れ始める傾向です。
学習画像の特徴をやや極端に学習する傾向があります。このデータセットのLoRAはやや扱いにくい印象を持ちますが、
Epoch20から30の間がバランスが良さそうな印象です。40以上は特徴が極端に出すぎているように見えます。
モデル自体の絵柄やカラーが学習元画像と似ているため、LoRAの適用をしても効きが弱い印象です。
効きが弱いため、大きいEpoch数を適用しても、崩れはなく画像生成できます。学習元画像の特徴はEpoch40程度から出始めているように見えます。
5個のデータセットを利用します。合計107画像のデータセットを利用して学習し、LoRAを作成します。
次のプロンプトで出力テストをします。
Epochが20程度から学習画像の特徴が表れ始める傾向です。学習の進みが意外と速く、Epoch40ではかなり学習元データの影響が強く出ています。
また、出力画像の崩れも目立ちます。
100画像程度の学習では学習回数を増やした場合、画風ではなく形状を覚えてしまう傾向にあるようです。
学習画像の影響が強いため、画像の雰囲気を表現するためのLoRAとして利用する場合は、Epoch20以下を利用する方針が良さそうです。
絵柄は反映されにくい印象ですが、服のデザインや体形、色遣いが学習元画像を反映している印象です。
Epoch30程度から学習画像の特徴が現れます。Epoch数が増えると学生服のデザインが増えます。また、体形がより細身になります。
Epoch50を利用しても問題なく画像生成できます。
4個のデータセットを利用します。合計285画像のデータセットを利用して学習し、LoRAを作成します。
次のプロンプトで出力テストをします。
Epoch20付近から学習画像の特徴が強く出始めます。Epoch数が上がっても画像の崩れが少ない結果になっています。
変化がわかりにくいですが、Epoch30以上では学習元の画像の体形の特徴である頭身が低めのキャラクターが出力できています。
学習画像の特徴がEpoch20付近から多くなっています。スカートをつまむポーズがなくなり、腕を外側に開くポーズが増えていることが学習元画像の特徴になります。
このデータセットではちびキャラの画像も別トリガワードで学習しています。
LoRAなしConterfeitでは金髪の洋風なちびキャラが出力されますが、LoRAあり版では、金髪が減り和風的なデフォルメキャラクタが出力できています。