見出し画像

1枚絵(立ち絵)からのキャラLoRA作成アンチョコ


なにこれ

これは「1枚絵」しかないキャラ絵を元にある程度相似のキャラLoRAを作成するための手法に関する個人的なアンチョコです。学習素材、学習設定、成果物も併せて公開しているため参考資料として使用可能かもしれません。
以下のような方をターゲットにしています。

  • 一枚しか絵がないようなキャラを使って何とかキャラLoRAを作ってみたい人

  • 細部より雰囲気重視の人

  • 細部より雰囲気重視だけどReference onlyではうまくいかなかった人

  • 「蒸留」したい人

  • 学習までは程々に手間かけずにやりたい人

逆に以下のような方はあまり参考にならない可能性があります。

  • 自分なりのLoRA作成ロジックを既に確立している人

  • 大量の良質な学習素材が用意できる人

  • こんなん作るより描いたほうが早いし正確だ! という方(それはそれで素晴らしい)

  • 絶対チェリーピッキングしたくない人

こういう作成手法自体、散々既出な気はしますが、まあnの数は多い方が参考になるはずなので、ね。


学習素材とキャプション設定

まずは学習素材を用意します。
インプットとして1枚絵を選定します。今回はStable Diffusionを使って生成した高さ1920×幅1080のAI絵画像を学習元素材とします。
ある程度再現難易度を上げるために、髪色を複数色にしたり、Halo出したりしました。


今回学習対象とした1枚絵のHalo子ちゃん。

またせっかくなので衣装違いを何か考えてみましょう。
こんな感じでしょうか。

鎧姿イメージ

顔が違う? その通りですが今回はクロップしてしまうので問題ないです。ということでスタートラインは立ち絵1枚、別衣装1枚の都合2枚です。

まずはこの素材をコピーして、それぞれを学習素材のサブフォルダに配置します。
今回はimgフォルダの配下に「org」と「amr」をそれぞれ用意しました。
コピーした画像を様々な画角でクロップします。顔のみ、左半身のみ、上半身のみ……など。haloもlama-cleanerで取り除いて有無を増やして13枚ほどに増やします。
鎧は顔をクロップした上でこちらも同様の手順で6枚に増やします。

こんな感じになります(既にキャプション入ってますが後述します)。

通常衣装のフォルダ
鎧衣装のフォルダ。

続けて、キャプションファイルを付与します。
まずは使い慣れたTaggerでこれらのフォルダに機械的にタグ付けさせます。
[stable-diffusion-webui-wd14-tagger]で今回は実施しました。
使用したInterrogaterはwd14-convnextv2-v2です。
※細かいことは割愛します。設定周りもいい記事ありますし、「Tagger stable-diffusion」あたりで検索してみてください。
付与は別に上記のTaggerでなくても、DatasetTagEditorなり、sd-scriptのTaggerで付与してもいいと思います。

この後が諸説あるポイントですが、機械的に付与されたタグを整理・追記します。
今回はざっくり出てくれればいいのでほぼ修正しませんが、トリガーとして以下を追加しました。
キャラクター名:akabu aoi ¥(original¥)
衣装名(通常):jissen school uniform
衣装名(鎧姿):kingdom armor
Haloの詳細情報:two-tone halo, green halo

なお、個人的なタグの修正指針としては以下を基本としています。今回はサクサクやりたいし面倒くさくなってやってませんが

  • 襟や小物などでタグ付与が漏れていたら追加(特に襟)

  • 類似意味の単語をひとつに統一

  • 明らかに間違っているタグを削除(女の子の学習させようとしてるのにboyとかmale focusがついたとか)

フォルダに繰り返し回数も設定したので学習素材の準備は終わりです。
続けて学習設定です。

学習に関する設定

オプティマイザはProdigyを使用します。
学習元モデルは今回ACertaintyを使用することとします。
また多少なりとも過学習抑制を企図して、一部の層については学習しないよう設定します。層別学習というやつですね。

accelerate launch --num_cpu_threads_per_process=4 "./train_network.py" --enable_bucket --min_bucket_reso=256 --max_bucket_reso=2048 --pretrained_model_name_or_path="N:/Data/AI/models/stable-diffusion/ACertainty.ckpt" --train_data_dir="N:/Picture/Train/Original_HaloGirl/img" --resolution="512,512" --output_dir="N:/Picture/Train/Original_HaloGirl/model" --logging_dir="N:/Picture/Train/Original_HaloGirl/log" --network_alpha="32" --training_comment="Key:akabu aoi \(original\) Option:jissen school uniform,  kingdom armor made by prodigy for test" --save_model_as=safetensors --network_module=networks.lora --network_args conv_dim="32" conv_alpha="16" down_lr_weight="0,0,0,0,1,1,1,1,1,1,1,1" mid_lr_weight="0" up_lr_weight="1,1,1,1,1,1,1,1,1,1,1,1" --text_encoder_lr=1.0 --unet_lr=1.0 --network_dim=128 --output_name="Original_HaloGirl_v1r1-12832-noreg-noise803" --lr_scheduler_num_cycles="10" --no_half_vae --learning_rate="0.0001" --lr_scheduler="cosine_with_restarts" --train_batch_size="6" --max_train_steps="137" --save_every_n_epochs="1" --mixed_precision="fp16" --save_precision="fp16" --seed="1234" --caption_extension=".txt" --cache_latents --optimizer_type="Prodigy" --max_train_epochs=10 --clip_skip=2 --keep_tokens="3" --bucket_reso_steps=64 --xformers --persistent_data_loader_workers --bucket_no_upscale --multires_noise_iterations="8" --multires_noise_discount="0.3" --sample_sampler=k_dpm_2 --sample_prompts="N:/Picture/Train/Original_HaloGirl/model\sample\prompt.txt" --sample_every_n_epochs="1"

実行します。完了しました(5分程度)。

走行結果。

この後は出来上がった10エポック分のLoRAで適当に試験生成して、比較的許容できる画像が生成できそうなエポックを選ぶことになります。
ざざっとX\Y Plotで選別して(画像省略)、……とりあえず000006がいいですかね。

出力してみました。ニーハイが普通の靴下に変わってたりトーン分け等細部では物申したいところがありますが、元素材に存在しない靴とかも描写してくれています。

6エポック目から生成したサンプル。

別衣装は頭なし画像の生成率がやや上がりますが、こんな感じの画像が生成できました。

紐とかBunとか細かいところはこっちも色々(ry

プロンプトで指定した衣装も打率を無視すればちゃんと着てくれるようです。
Haloの色彩についても単一色ではないということを学習してくれているようですね。ただし体感では円形にすらならないケースが3割近くありそうです。

所々不思議なことになっているのはご愛嬌


今回の生成品はある程度特徴がわかるエポックまでいくとポーズを変えるのに結構プロンプト強度が必要なので、潔くControlNetで指定した方が楽そうです。
蒸留用途の人は、適当なポーズを別途3Dポーズエディタ等で作成してOpenposeを使うなどすればいいのではないでしょうか。

おまけ(学習素材とか成果物とか)

自分で学習から試したい、できたLoRAを手元で触ってみたい人向けに🤗に一式置いておきます。
類似の設定でSDXL学習もついでに試したのでそれもおまけに置いておきました。test/HaloGirl配下です。良識と常識の範囲でどうぞ。
※塗りがちょっと強めに出るので追加で層別適用した方がいいかもしれません

それでは。

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