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

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

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

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

教師データの準備

まずは、少ないデータでどの程度の出力が得られるのかを確認します。以下の画像とキャプションを用意します。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像1
キャプション
toricchi, open mouth
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像2
キャプション
toricchi, close mouth
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像3
キャプション
toricchi, sitting, open mouth
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像4
キャプション
toricchi, sitting, close mouth
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像5
キャプション
toricchi, angry
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像6
キャプション
toricchi, hard, refreshing
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像7
キャプション
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 でも結果は変化しないとのこと。(未検証)
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像8

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

独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像9

400ステップの学習をするため、エポックは23まで作成される旨の表示があります。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像10

23エポックまで学習できました。約20分かかりました。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像11

動作確認

まずは、10エポック目のモデルで動作確認します。
LoRAを配置して以下のプロンプトで画像生成します。
Prompt
<lora:toricchi:1> toricchi
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0, Sampler: Euler a, CFG scale: 7

キャラクターの雰囲気は出ています。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像12

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" のネガティブプロンプトを設定した場合です。なんとなく良さそうです。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像13

キャラクターの雰囲気は出ているようです。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像14

モデルを変更します。(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を利用して学習する:画像15
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像16

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

女の子の絵が出力されましたので、LoRAの動作や学習はうまくできていることが確認できます。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像17
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像18

学習による浸食の確認

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

続いて、"sitting"を確認します。学習したキャラクターの座っている画像に"sitting"のキャプションがついているため、 sittingの意味が若干変化している可能性があります。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像20

以下のプロンプトで画像を生成します。
Prompt
girl, sitting
Prompt
worst quality, low quality,
Model, Sampler
Model: Counterfeit-V3.0, Sampler: Euler a, CFG scale: 7
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像21
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像22

続いて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を利用して学習する:画像24

学習が進んだ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
バリエーションがほとんどなくなってしまいました。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像25
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像26

プロンプトを以下に変更してシチュエーションを追加します。
Prompt
<lora:toricchi:1> toricchi , in cafe, drinking coffee
プロンプトはある程度反映されていますが、バリエーションは少ないです。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像27

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

学習データを増やす

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

独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像28

タグ付けは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 - 独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像29

epoch 3
epoch 3 - 独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像30

epoch 6
epoch 6 - 独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像31

epoch 9
epoch 9 - 独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像32

epoch 12
epoch 12 - 独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像33


Epoch 10を利用してモデルごとの出力画像を確認します。
モデルによってはもうちょっとで、実用できそうな出力が得られます。
Counterfeit v3
Counterfeit v3 - 独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像34

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

Pikas New Generation v2
Pikas New Generation v2 - 独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像36

Featureless Mix v2
Featureless Mix v2 - 独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像37

口がない結果があるのはなぜ?
結果を見ると、口がない画像がちらほら見受けられます。おそらくいくつかの画像のタグに"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

やや座っているポーズが多い印象です。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像38

Model, Sampler
Model: featurelessMix_v20202307, Sampler: DPM++ SDE Karras, CFG scale: 7, Sampling steps:40
サンプリングステップとサンプラーを変更した結果です。こちらもかなり良いイメージです。座っているポーズが多いです。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像39

プロンプトに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

立ちポーズになりました。時々コレジャナイ感のあるキャラクターも出ますが、かなり良い感じです。
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像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
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像41

期待していた動作。(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

独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像42

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を利用して学習する:画像43

LoRAを外した結果は下図です。こちらは問題なしです。
Prompt
1girl, upper body, holding duck
独自のキャラクター(人型でないキャラクター)をLoRAを利用して学習する:画像44
AuthorPortraitAlt
著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。 最近は生成AIの画像生成の沼に沈んでいる。
作成日: 2023-07-16
Copyright © 1995–2025 iPentec all rights reserverd.