独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する - Stable Diffusion

人型でない独自のキャラクターをLoRAを利用して学習して、どのような出力が得られるか確認します。
メモ
人型でないキャラクターを学習するのは難易度が高く、学習が苦手とされています。今回の記事でも実用面では不十分な結果となっています。
メモ
C3LierでLoRAを作成する手順はこちらの記事を参照してください。
補足
SDXL版はこちらの記事を参照してください。

事前準備:sd-scriptsのインストール

sd-scriptsをインストールします。手順はこちらの記事を参照してください。

教師データの準備

まずは、少ないデータでどの程度の出力が得られるのかを確認します。以下の画像とキャプションを用意します。

キャプション
toricchi, open mouth

キャプション
toricchi, close mouth

キャプション
toricchi, sitting, open mouth

キャプション
toricchi, sitting, close mouth

キャプション
toricchi, angry

キャプション
toricchi, hard, refreshing

キャプション
toricchi, smile

今回正則化画像は用意しません。正則化画像を使用しない場合に、どの程度の概念の浸食が起きるかも確認します。

ファイルの配置とtomlファイルの準備

学習データを配置して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起動バッチファイルの作成

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を配置して以下のプロンプトで画像生成します。
Prompt
<lora:toricchi:1> toricchi
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0, Sampler: Euler a, CFG scale: 7

キャラクターの雰囲気は出ています。


Prompt
<lora:toricchi:1> toricchi
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0, Sampler: Euler a, CFG scale: 7
"worst quality, low quality" のネガティブプロンプトを設定した場合です。なんとなく良さそうです。


キャラクターの雰囲気は出ているようです。


モデルを変更します。(Aing Diffusion v7.5)
Prompt
<lora:toricchi:1> toricchi
Prompt
worst quality, low quality,
Model, Sampler
Model: aingdiffusion_v75, Sampler: Euler a, CFG scale: 7
元のキャラクターが反映はされているようです。(キャラクターの雰囲気はつかめていますが、これじゃない感が。。。)



LoRAが無い場合の出力を確認します。
Prompt
toricchi
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0,Sampler: Euler a, CFG scale: 7

女の子の絵が出力されましたので、LoRAの動作や学習はうまくできていることが確認できます。



学習による浸食の確認

続いて学習による概念の浸食を確認します。初めに、LoRAを有効にして"girl"の出力を確認します。
Prompt
<lora:toricchi:1> girl
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0, Sampler: Euler a, CFG scale: 7
女性の画像が出力されました。問題はなさそうです。


続いて、"sitting"を確認します。学習したキャラクターの座っている画像に"sitting"のキャプションがついているため、 sittingの意味が若干変化している可能性があります。


以下のプロンプトで画像を生成します。
Prompt
girl, sitting
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0, Sampler: Euler a, CFG scale: 7



続いてLoRAを有効にして、以下のプロンプトで画像を生成します。
Prompt
<lora:toricchi:1> girl, sitting
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0, Sampler: Euler a, CFG scale: 7

ほとんど違いは判らない状態ですが、地べたに座るポーズが若干多いのかな?という印象があります。



学習が進んだLoRAの確認

続いて、23エポックまで学習したLoRAで動作確認します。
以下のプロンプトで画像を生成します。
Prompt
<lora:toricchi:1> toricchi
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0, Sampler: Euler a, CFG scale: 7
バリエーションがほとんどなくなってしまいました。



プロンプトを以下に変更してシチュエーションを追加します。
Prompt
<lora:toricchi:1> toricchi , in cafe, drinking coffee
プロンプトはある程度反映されていますが、バリエーションは少ないです。


過学習なのか、学習データが不足しているのかは不明ですが、23エポックより10エポックのほうが良さそうです。

学習データを増やす

学習データを増やしてリトライします。



タグ付けはTaggerを利用します。手順はこちらの記事を参照してください。
タグ付け後に間違っているタグの削除や"toricchi"タグを追加しています。"pokemon" タグはかなり怪しいところですが、良い影響があるのではとの見込みで削除していません。
学習データはこちらの記事の「学習データ (初版)」を参照してください。

結果

学習元のモデル、"ACertainThing" を利用して、epoch ごとの結果を確認します。
プロンプトは以下を利用します。
Prompt
toricchi <lora:toricchi:1>
Prompt
worst quality, low quality,
Model, Sampler
Sampler: Euler a, CFG scale: 7

結果は以下です。Epoch数が増えるごとに学習ができている様子が確認できます。
epoch 1
epoch 1

epoch 3
epoch 3

epoch 6
epoch 6

epoch 9
epoch 9

epoch 12
epoch 12


Epoch 10を利用してモデルごとの出力画像を確認します。
モデルによってはもうちょっとで、実用できそうな出力が得られます。
Counterfeit v3
Counterfeit v3

Aing Diffusion v8
Aing Diffusion v8

Pikas New Generation v2
Pikas New Generation v2

Featureless Mix v2
Featureless Mix v2

口がない結果があるのはなぜ?
結果を見ると、口がない画像がちらほら見受けられます。おそらくいくつかの画像のタグに"beak(嘴)"が記述されているため、 Toricchi にはbeakが付属品であると理解されている可能性がありそうです。 "beak"を削除すると、口が表示されない結果が減らせそうです。

Featureless Mixでの学習結果

Featureless Mixでの結果が良いため、学習元のモデルをA Certain ThingからFeatureless Mixに変更して学習します。

Epoch 10での結果です。
Prompt
toricchi <lora:toricchi:1>
Prompt
worst quality, low quality,
Model, Sampler
Model: featurelessMix_v20202307, Sampler: Euler a, CFG scale: 7, Sampling steps:20

やや座っているポーズが多い印象です。


Model, Sampler
Model: featurelessMix_v20202307, Sampler: DPM++ SDE Karras, CFG scale: 7, Sampling steps:40
サンプリングステップとサンプラーを変更した結果です。こちらもかなり良いイメージです。座っているポーズが多いです。


プロンプトにstandingを入れて、立ちポーズが出るか確認します。
Prompt
toricchi,standing <lora:toricchi:1>
Prompt
worst quality, low quality,
Model, Sampler
Model: featurelessMix_v20202307, Sampler: DPM++ SDE Karras, CFG scale: 7, Sampling steps:40

立ちポーズになりました。時々コレジャナイ感のあるキャラクターも出ますが、かなり良い感じです。


ここまでは良さそうですが、ほかの要素と組み合わせた場合にうまく動作しません。
Prompt
1girl, upper body, holding toricchi <lora:toricchi:1>
Prompt
worst quality, low quality,
Model, Sampler
Model: featurelessMix_v20202307, Sampler: Euler a, CFG scale: 7, Sampling steps:20


期待していた動作。(dogがtoricchiになるイメージ)
Prompt
1girl, upper body, holding dog <lora:toricchi:1>
Prompt
worst quality, low quality,
Model, Sampler
Model: featurelessMix_v20202307, Sampler: Euler a, CFG scale: 7, Sampling steps:20



DuckがToricchiに侵食されている可能性があるため次のプロンプトを試してみます。
Prompt
1girl, upper body, holding duck <lora:toricchi:1>
Prompt
worst quality, low quality,
Model, Sampler
Model: featurelessMix_v20202307, Sampler: Euler a, CFG scale: 7, Sampling steps:20
とんでもない結果もありますが、そこそこの結果もあります。


LoRAを外した結果は下図です。こちらは問題なしです。
Prompt
1girl, upper body, holding duck

著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2023-07-16
iPentec all rights reserverd.