人型でない独自のキャラクターをLoRAを利用して学習して、どのような出力が得られるか確認します。
sd-scriptsをインストールします。手順はこちらの記事を参照してください。
まずは、少ないデータでどの程度の出力が得られるのかを確認します。以下の画像とキャプションを用意します。
今回正則化画像は用意しません。正則化画像を使用しない場合に、どの程度の概念の浸食が起きるかも確認します。
学習データを配置してtomlファイルを作成します。以下のtomlファイルを作成しました。
学習データの配置先は、C:\data\lora-toricchi\toricchi
です。
tomlファイルは C:\data\lora-toricchi\config.toml
に配置します。
[general]
enable_bucket = true
[[datasets]]
resolution = 512
batch_size = 4
[[datasets.subsets]]
image_dir = 'C:\data\lora-toricchi\toricchi'
caption_extension = '.txt'
num_repeats = 10
num_repeats = 10
が記述されていますが、今回の例では正則画像がないことと、複数のデータセットではないため、num_repeats = 1
でも結果は変化しないとのこと。(未検証)sd-scriptsを起動するコマンドを記述したバッチファイルを作成します。
今回は、"ACertainThing" モデルに対して学習を実行します。
ACertainThingの入手はこちらの記事を参照してください。
作成したバッチファイルはC:\data\lora-toricchi\exec.bat
に配置します。
accelerate launch ^
--num_cpu_threads_per_process 1 ^
train_network.py ^
--pretrained_model_name_or_path=C:\Storage\Image-Gen\model\ACertainThing.ckpt ^
--dataset_config=C:\data\lora-toricchi\config.toml ^
--output_dir=C:\data\lora-toricchi\output ^
--output_name=toricchi ^
--save_model_as=safetensors ^
--prior_loss_weight=1.0 ^
--max_train_steps=400 ^
--learning_rate=1e-4 ^
--optimizer_type=AdamW8bit ^
--xformers ^
--mixed_precision="bf16" ^
--cache_latents ^
--gradient_checkpointing ^
--save_every_n_epochs=1 ^
--network_module=networks.lora
--persistent_data_loader_workers
を追加していないため、処理に時間がかかっています。
Windowsマシンの場合は--persistent_data_loader_workers
を追加すると処理時間が短くなります。仮想環境に切り替えて、exec.batを実行します。
cd C:\Storage\Image-Gen\sd-scripts
.\venv\Scripts\Activation.bat
C:\data\lora-toricchi\exec.bat
400ステップの学習をするため、エポックは23まで作成される旨の表示があります。
23エポックまで学習できました。約20分かかりました。
まずは、10エポック目のモデルで動作確認します。
LoRAを配置して以下のプロンプトで画像生成します。
キャラクターの雰囲気は出ています。
"worst quality, low quality" のネガティブプロンプトを設定した場合です。なんとなく良さそうです。
キャラクターの雰囲気は出ているようです。
モデルを変更します。(Aing Diffusion v7.5)
元のキャラクターが反映はされているようです。(キャラクターの雰囲気はつかめていますが、これじゃない感が。。。)
LoRAが無い場合の出力を確認します。
女の子の絵が出力されましたので、LoRAの動作や学習はうまくできていることが確認できます。
続いて学習による概念の浸食を確認します。初めに、LoRAを有効にして"girl"の出力を確認します。
女性の画像が出力されました。問題はなさそうです。
続いて、"sitting"を確認します。学習したキャラクターの座っている画像に"sitting"のキャプションがついているため、
sittingの意味が若干変化している可能性があります。
以下のプロンプトで画像を生成します。
続いてLoRAを有効にして、以下のプロンプトで画像を生成します。
ほとんど違いは判らない状態ですが、地べたに座るポーズが若干多いのかな?という印象があります。
続いて、23エポックまで学習したLoRAで動作確認します。
以下のプロンプトで画像を生成します。
バリエーションがほとんどなくなってしまいました。
プロンプトを以下に変更してシチュエーションを追加します。
プロンプトはある程度反映されていますが、バリエーションは少ないです。
過学習なのか、学習データが不足しているのかは不明ですが、23エポックより10エポックのほうが良さそうです。
学習データを増やしてリトライします。
タグ付けはTaggerを利用します。手順はこちらの記事を参照してください。
タグ付け後に間違っているタグの削除や"toricchi"タグを追加しています。"pokemon" タグはかなり怪しいところですが、良い影響があるのではとの見込みで削除していません。
学習データはこちらの記事の「学習データ (初版)」を参照してください。
学習元のモデル、"ACertainThing" を利用して、epoch ごとの結果を確認します。
プロンプトは以下を利用します。
結果は以下です。Epoch数が増えるごとに学習ができている様子が確認できます。
Epoch 10を利用してモデルごとの出力画像を確認します。
モデルによってはもうちょっとで、実用できそうな出力が得られます。
Featureless Mixでの結果が良いため、学習元のモデルをA Certain ThingからFeatureless Mixに変更して学習します。
Epoch 10での結果です。
やや座っているポーズが多い印象です。
サンプリングステップとサンプラーを変更した結果です。こちらもかなり良いイメージです。座っているポーズが多いです。
プロンプトにstandingを入れて、立ちポーズが出るか確認します。
立ちポーズになりました。時々コレジャナイ感のあるキャラクターも出ますが、かなり良い感じです。
ここまでは良さそうですが、ほかの要素と組み合わせた場合にうまく動作しません。
期待していた動作。(dogがtoricchiになるイメージ)
DuckがToricchiに侵食されている可能性があるため次のプロンプトを試してみます。
とんでもない結果もありますが、そこそこの結果もあります。
LoRAを外した結果は下図です。こちらは問題なしです。