見出し画像

1枚の絵からキャラクターLoRAを作る(AI実験/2024年3月v2)

いろいろ試していたらもっと簡単にできました

SDXL、Pony Diffusion V6 XLのモデル性能のおかげで、教師画像を増やす手順の部分を簡素化できました。
やっていることは今までの記事と同じです。
教師画像1枚のLoRAで必要十分な品質が得られたので、無理に有料サービスを使わないでも大丈夫かもという内容です。


実験の経緯

8枚という少枚数でもそれなりのLoRAが作れたのでもっと少ない枚数でも行けるのではないかと思い、実際に1枚の絵でLoRAを作ってみました。
SD1.5の場合は教師画像1枚でのLoRAは出力が偏りすぎたり、画質が劣化してガビガビになったり、どんなpromptを入れても同じ絵しか出せない過学習LoRAになることが多かったのですが、SDXLの場合はモデル構造が変わったからか教師画像1枚でもそれほど品質の劣化が起こらずに再生成(蒸留)ができました。

実験環境と使用イラストとタグと学習設定

学習modelはPony Diffusion V6 XLです。
使用イラストは同じくPony Diffusion V6 XLで出力したものになります。

この子です

実験的に背景はそのままで、顔の切り抜きもしませんでした。
画像サイズはアップスケールをしたので2048×2624です。
学習モデルと教師画像の出力モデルを揃えると絵柄の差異が少なくなるため、学習後のLoRA出力が自然になる気がしました(元のモデルで出る絵柄なのだから再現しやすくて当たり前だよね、という話)。
逆に言うと教師画像の絵柄や要素があまりにも学習モデルとかけ離れている場合は再現が難しい可能性があります(人間モデルでケモノを学習する等)。
その場合は事前に他の手段で教師画像を増やした方がいいかもしれません。
SDXLが性能高いので気にしなくてもいい可能性もありますが。

トリガーワード, solo, anthro, clothing, hi res, hair, mammal, fur, horn, blue body, weapon, clothed, blue eyes, fingers, blue fur, navel, pawpads, open mouth, melee weapon, digital media (artwork), standing, pink pawpads, white body, toes, claws, 4 fingers, outside, canid, tuft, looking at viewer, canine, 4 toes, male, footwear, countershading, white hair, feet, sword, white fur, finger claws, sky, cute fangs, detailed background, fox, full-length portrait, holding weapon, markings, gesture, absurd res, paws, multicolored body, smile, shaded, blue hair, day, portrait, inner ear fluff, front view, cloud, circle eyebrows, white countershading, multicolored fur

拡張機能taggerによる学習時のタグ付けです

Pony Diffusion V6 XLがどのタグをどのような内容で学習しているのか不明なため、いったんtaggerで出たタグ(e621タグ)を全部残し、生成時に効果のあるものないものを足したり引いたりして調整する方法を取りました。
最適なやり方ではないと思うので、こうしたらこうなるのかくらいの参考になりましたら。
今回は教師画像1枚の学習でタグ数も多いためトリガーワードはあまり機能せず、無いよりはマシかな?という影響度でした。
※普及しているタグ付けの良い方法は詳しい方の記事を参考にしてください(マルゼンスキーム法など)。

accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py --pretrained_model_name_or_path "モデルデータフォルダ" --train_data_dir "教師画像データセットフォルダ" --output_dir "出力先フォルダ" --network_module "networks.lora" --xformers --gradient_checkpointing --persistent_data_loader_workers --cache_latents --cache_latents_to_disk --max_data_loader_n_workers 1 --enable_bucket --save_model_as "safetensors" --lr_scheduler_num_cycles 4 --mixed_precision "fp16" --learning_rate 0.0001 --resolution 1024 --train_batch_size 1 --max_train_epochs 600 --network_dim 128 --network_alpha 64 --shuffle_caption --keep_tokens 1 --optimizer_type "AdaFactor" --optimizer_args "relative_step=False" "scale_parameter=False" "warmup_init=False" --lr_warmup_steps 100 --output_name "出力ファイル名" --bucket_no_upscale --save_precision "fp16" --lr_scheduler "constant_with_warmup" --min_bucket_reso 512 --max_bucket_reso 2048 --caption_extension ".txt" --seed 42 --network_train_unet_only --multires_noise_discount 0.3 --fp8_base

この設定はこれのほうがいいよ!というアドバイスありましたら教えてください

学習設定は前回とほぼ変えていません。
教師画像数が1枚なので batch1 の 600epoch(=600step) --lr_warmup_steps 100 にしたくらいです。
学習時間は15~20分くらいでした。

1枚学習LoRAの結果

SD1.5でいう過学習のような結果に

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, トリガーワード, solo, anthro, clothing, hi res, hair, mammal, fur, horn, blue body, weapon, clothed, blue eyes, fingers, blue fur, navel, pawpads, open mouth, melee weapon, digital media (artwork), standing, pink pawpads, white body, toes, claws, 4 fingers, outside, canid, tuft, looking at viewer, canine, 4 toes, male, footwear, countershading, white hair, feet, sword, white fur, finger claws, sky, cute fangs, detailed background, fox, full-length portrait, holding weapon, markings, gesture, absurd res, paws, multicolored body, smile, shaded, blue hair, day, portrait, inner ear fluff, front view, cloud, circle eyebrows, white countershading, multicolored fur <lora:test:1>
Steps: 30, Sampler: Euler a, CFG scale: 7

生成時のpromptです

生成modelはPony Diffusion V6 XLです。
学習時のタグをそのまま使用すると、ほぼ同じ構図の画像が出力されます。
ここからpromptを減らして、どのワードがキャラクターに影響していてどのワードが影響していないかを確認します。

anthroのみ

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, anthro, <lora:test:1>
Steps: 30, Sampler: Euler a, CFG scale: 7

※タグ先頭のscore_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up,は
Pony特有の品質タグなので入れていますが、気にしないで大丈夫です。

promptをanthroのみにしても絵が変わりません。

トリガーワードのみ

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up,トリガーワード <lora:test:1>
Steps: 30, Sampler: Euler a, CFG scale: 7

トリガーワードのみにしてもほぼ変わりません。
anthro(獣人)要素が減って少し人よりになっています。
このままではpromptごとの影響も分からず、明らかに使えないのでLoRAの強度を下げます。

<lora:test:0.5>

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, トリガーワード, solo, anthro, clothing, hi res, hair, mammal, fur, horn, blue body, weapon, clothed, blue eyes, fingers, blue fur, navel, pawpads, open mouth, melee weapon, digital media (artwork), standing, pink pawpads, white body, toes, claws, 4 fingers, outside, canid, tuft, looking at viewer, canine, 4 toes, male, footwear, countershading, white hair, feet, sword, white fur, finger claws, sky, cute fangs, detailed background, fox, full-length portrait, holding weapon, markings, gesture, absurd res, paws, multicolored body, smile, shaded, blue hair, day, portrait, inner ear fluff, front view, cloud, circle eyebrows, white countershading, multicolored fur <lora:test:0.5>

LoRA効果強度半分

学習時のタグに戻してLoRAの効果強度を0.5にしてみました。
教師画像の要素が色濃いですが、元のキャラクターの特徴を維持しつつモデルの影響度も出てきているように感じます。
ちなみに0.3まで下げるとこのような結果に。

かわいい

かわいいですが教師画像の構図に固定されすぎているので、試しにpromptとLoRA強度を変更調整してみます。
・LoRA強度:0.5
・背景変更:outside, sky, detailed background, day → (white background:1.4), simple background,
・装飾品変更:weapon, melee weapon, sword, holding weapon → 除去
・口を閉じる:open mouth → closed mouth
・表情変更:smile → angry
・座る:standing → sitting
・一部品質系タグ除去:hi res, digital media (artwork) → 除去
・余分な要素除去:gesture, looking at viewer, full-length portrait → 除去

prompt変更適用後

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, solo, トリガーワード, anthro, clothing, hair, mammal, fur, horn, blue body, clothed, blue eyes, fingers, blue fur, navel, pawpads, pink pawpads, white body, toes, claws, 4 fingers, canid, tuft, canine, 4 toes, male, footwear, countershading, white hair, feet, white fur, finger claws, cute fangs, fox, markings, absurd res, paws, multicolored body, angry, shaded, blue hair, portrait, inner ear fluff, front view, cloud, circle eyebrows, white countershading, multicolored fur,sitting,closed mouth,(white background:1.4), simple background, <lora:test:0.5>
Steps: 30, Sampler: Euler a, CFG scale: 7

promptに従って構図・背景・表情の変更ができましたが元のキャラクターの体型から離れてしまってたので、今度はLoRA強度を上げつつ体型や構図をpromptで調整してみます。

LoRA強度0.5→0.6

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, トリガーワード, solo, anthro, nude, hair, mammal, fur, horn, blue body, blue eyes, fingers, blue fur, navel, white body, toes, claws, 4 fingers, canid, tuft, canine, 4 toes, male, footwear, countershading, white hair, white fur, finger claws, cute fangs, fox, markings, absurd res, paws, multicolored body, smile, portrait, inner ear fluff, front view, cloud, circle eyebrows, white countershading, multicolored fur,closed mouth,(white background:1.4), simple background,(white hair), shaded,blue hair,thick thighs, petite, tiny body, small proportions, thick thighs, wide hips, abs <lora:test:0.6>
Negative prompt: backlighting, clothed,armwear, footwear, weapon,melee weapon,
Steps: 30, Sampler: Euler a, CFG scale: 7

cloudとかいらないタグが多いです

元のキャラクター要素を引き継ぎつつ、prompt影響をある程度受け付ける状態にできました。
このままでも簡単な絵であれば十分作れますが、元の教師画像の影響が強く自由度は高くありません。

ですがこのくらいの可変性があれば「キャラクターシート風画像」生成等で教師画像数を増やせるので「1枚絵LoRAを作る」→「強度やpromptを調整して教師画像を生成」→「増やした教師画像で再度LoRAを作る(精度・柔軟性アップ)」という流れでキャラクターLoRAを作るのに十分実用できそうです(この繰り返し手順はLoRAの蒸留と呼ばれています)。
やっていることは今までの記事とほとんど同じですが、SDXLの性能向上により綺麗な教師画像をローカルのStableDiffusionでも簡単に自家生産できるようになったことは大きいかなと思います。

キャラクターシート風

SD1.5の頃からあった考え方なので、他の方がすでに同様の手法の記事を書かれているとは思いますが、SDXLでケモノオリキャラLoRA作る工程の参考になりましたら幸いです。
お読みいただきありがとうございました。

参考リンク

コピー機学習法・LoRAの蒸留ですごいLoRAを作られている方です。
線画化LoRAやFlat LoRAなどたくさん使わせていただいてます。



この記事が気に入ったらサポートをしてみませんか?