見出し画像

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

新しい技法やモデルが出てきたので手順の再検討をしてみました。


今回の目的(Purpose of this issue)

1枚の絵から特定キャラクターの再現性のあるLoRAの作成をします。
LoRA作成の手順を検討することが目的です。

前提条件(Prerequisite)

【使用ツール】
●Stable Diffusion (webui A1111)*1
●Transparent-Background*2
●NovelAI (V3)*3
●Kohya_LoRA_GUI (kohya-ss)*4
【実験環境】
●Model : Pony Diffusion V6 XL*5
●GPU : GeForce RTX 3090 (VRAM24GB)
※VRAMはFP8なら12GBでも学習できるそうです。
※各プログラム・サービスへのリンクは最後に記載してあります。

作成の手順(Process)

基本的な流れは以前の記事と同じになります。
使うツールの変更点や、各段階での考え方の補足があります。

(1)教師画像数の増量

教師画像数を増やします。
画像1枚だけの学習ではその画像しか再現できないLoRAになってしまうため、共通の特徴を持たせたパターンの異なる画像を複数枚用意する必要があります。
まずは画像の加工から行っていきます。
キャラクターは前回に引き続き自画像(?)でやっていきます。

今回の教師画像 ( 前回と同じ/アイコン画像 )
出力モデルはcrosskemono(g) というSD1.5のモデルです
サイズは大きめで1024×1472で出力しています

(1-1)教師画像の加工
キャラクター学習の場合、この画像のままでは不要な背景まで学習してしまうため背景を削除します。
「Transparent-Background」という背景除去ツールを使いました。

背景削除と同時にペイントソフトで額の模様を修正しています

背景削除後の画像で手足の一部が消えてしまっていますが、この時は気づかずに進めてしまいました。(残念ポイントです)
きちんとやるならキャラクターの体が消えないように設定値を調整したり、ペイントソフトでその部分だけ合成・加筆することで形を整えたほうがいいと思います。
キャラの服装やポーズなどの特徴がこの1枚の教師画像を基準とするため、再現したい特徴の明確な全身像の画像が望ましいと思います。
今回は「座っているポーズ」「フード付きジャケット」がキャラ本体と関係ない余計な特徴であったため、この後の作業で問題が起きます。

(1-2)全身と顔のアップの分離
全身画像から顔の部分だけ別に切り出します。

顔のみ画像はサイズが小さくなるので別途アップスケールします

(1-3)NovelAI (V3)を利用して教師画像数を増やす
ここでNovelAIの「インペイント」と新機能の「バイブストランスファー*6」を併用して教師画像数を増やします。
Stable Diffusionのi2iやNijijourneyのキャラクターリファレンス(--cref)でも同様のことはできると思いますが、それぞれ使ってみたところバイブストランスファーが面白かったので今回はNovelAIを使っています。
■インペイント+バイブストランスファー
1216×832横長の白いキャンバスをペイントソフトで新規作成し、先ほどの全身の映っている教師画像を端のほうに配置した画像を作成します。

右側に大きな余白がある状態です

NAIの画像生成画面を開いて横長画像をインペイント(i2i)に、顔のアップ画像をバイブストランスファーに読み込みます。
今回インペイントやバイブストランスファーの数値はほぼデフォルトで使いましたが、生成状況によって変えてみたほうがいいと思います。

設定値はデフォルトで使いました
※0.4とかのほうがいいかも?いい感じの数値に調整してみてください

インペイント機能の「描いてマスクを追加する」からマスクエリアの設定をします。
この時設定した範囲が画像生成の範囲となります。
こうすることで非マスク部分の絵を参照しつつ全体の再生成を行うようです。

青い部分がマスク範囲です

※このインペイントのアイデアはPlatさんの記事*7を参考にしています。
 詳しい挙動はPlatさんの記事を見てください。

他に匿名掲示板の有志の方の実験も参考にしています。
マスク範囲にノイズ画像を配置する方法もあるようです。
今回は白い余白でも生成できたのでそのまま進めています。

インペイントのマスク範囲の設定とバイブストランスファーの設定ができたら、プロンプトを入力して画像生成します。

▽参考プロンプト
1boy,furry,male,full body, reference sheet, multiple view, standing, tiger boy, tail,bald,white eyebrows,feet,legs,arms,hands,animal ears,
除外:worst quality, low quality,normal quality, lowres, bad, error, fewer, extra, missing, jpeg artifacts, bad quality, watermark, signature, extra digits

▽プロンプト考え方
promptは先頭にくるワードほど影響力が強くなります。
NAI公式でプロンプトのおすすめの組み方を公開しているので参考にしています。

1boy, 1girl, characters, series, everything else in any order

https://docs.novelai.net/image/tags.html

reference sheet というワードを使うとキャラクター設定シートや三面図のような絵が出やすくなるので、類似のタグを先頭近くに入れています。
キャラクターの細かい特徴や出てほしい部分はそのあとに列挙しています。
白い余白の大きい横長画像を準備したのはこのpromptによってNAIのインペイント機能で疑似的にキャラクターシートを生成するためです。

何回か生成して教師画像に良さそうな出力を選びます

バイブストランスファーに顔のアップ画像を入れたのは、画風の維持と全身像では認識されにくい顔の特徴の維持のためです。

しかしここで両方の画像ともフード付きジャケットが映りこんでいたため、生成作業中かなりの確率でフード付きジャケットが出てきてしまうという現象に見舞われます。
このままではフード付きジャケットもキャラの一部として学習されてしまうため対策が必要です。
解決方法として(1)顔の切り抜き画像からフード部分を取り除き顔だけにする、(2)promptでnudeなどの服を除外するワードを強調して入れる策をとりました。

ゆっくりしていってね!
服装の制限がなくなり、より教師画像として使いやすい状態に
一方でバイブストランスファーのみ有効の場合の出力
塗りや画風が変わり細部のデザイン(頭や耳の模様)も変わっています

バイブストランスファー、インペイントの利用、併用で生成した画像の中からキャラクターの特徴を汲んだ教師画像になりそうな品質の6枚を選別しました。
立ちポーズ(全身正面・しっぽあり・全裸)、顔のアップ(雰囲気の分かるもの・模様の分かるもの)、横から見た図などのカメラ方向の多様性を重視しました。
※教師画像が少ない場合、極端な構図(アオリやフカンなど)や変わったポーズ(ヨガのポーズや遠近感のあるポーズなど)が混ざるとそれを特徴として学習してしまう可能性があるため、絵的には素朴で無難なもので揃えたほうが良いと思います。

シマの模様の修正や不自然な部分の加筆処理が少しあります
各画像サイズが小さい場合は短辺1024px以上になるようリサイズするといいかもしれません

(1-4)教師画像のサイズ調整と加筆修正
サイズが小さい画像はアップスケールしました(StableDiffusion)。
SDXLでの学習になるので短辺が1024px以上となるようにしました。
額の模様やシマシマ模様の抜け、耳の模様の相違などはペイントソフトで簡易的に修正しています。
シンプルな絵柄のほうが修正が楽です。

(2)LoRA学習(Training)

(2-1)データセットの作成
kohya-ssの機械学習に対応したフォルダ形式のデータセットを作成します。
(2-1-1)フォルダの作成
「training」という名前のフォルダを作り、その中に学習用データを集めたフォルダを作成します。
学習用データフォルダの名前は「1_yatoracat」としました。

1_yatoracat内に画像ファイルが入っています

先ほど作成した6枚の画像に一番最初の元画像の全身・顔画像の2枚を加えて全部で教師画像数8枚としています。
これらの画像をフォルダ内に配置します。

※フォルダ名先頭の「1」は学習時の画像繰り返し数です。
この数字の数だけ中の画像が重複してあるものとしてカウントされます。
今回の教師画像数は8枚なので、
1_なら1×8枚=8画像数
10_なら10×8枚=80画像数となります。
画像数はepocやstepの計算をする際に参照され、総量を増やして学習効果を調整するときにこの数値を用いるようです。

後半のyatoracat部分は学習方式によって扱いが違う気がするのですが、私が詳しく分かっていないので今回はトリガーワードと同じにしています。

(2-1-2)タグ付け
タグ付けにはStable Diffusion webui A1111のTaggerという拡張機能を使いました。
複数の画像に一括してタグをつけられるので便利です。

学習モデルをPony Diffusion V6 XLとしているためe621用のInterrogate modelを使ってタグ付けしましたが、danbooru系のものでも大丈夫じゃないかと思います(やってないので不明です)。
例としてこちらの画像に対するタグ付けの結果は以下になりました。

anthro, mammal, felid, solo, clothing, topwear, fur, white background, blue eyes, tuft, white body, simple background, white fur, blush, orange body, looking at viewer, sitting, cheek tuft, facial tuft, countershading, hi res, orange fur, male, open mouth, clothed, young, feline, hoodie, black clothing, markings, tiger, stripes, multicolored body, multicolored ears, inner ear fluff, biped, striped body, dipstick ears, cub, striped fur, tail markings, multicolored fur, felis, domestic cat, shorts, jacket, tan body, chest tuft, bottomwear

タグtxt作成後のフォルダ内

8枚ともにタグのついたtxtファイルが作られたらタグの編集をします。
Dataset Tag Editorという拡張を使いました。
複数ファイルを読み込み一括でタグの追加・削除ができます。

先頭にトリガーワード「yatoracat」を追加するだけです。

yatoracat, anthro, mammal, felid, solo, clothing, topwear, fur, white background, blue eyes, tuft, white body, simple background, white fur, blush, orange body, looking at viewer, sitting, cheek tuft, facial tuft, countershading, hi res, orange fur, male, open mouth, clothed, young, feline, hoodie, black clothing, markings, tiger, stripes, multicolored body, multicolored ears, inner ear fluff, biped, striped body, dipstick ears, cub, striped fur, tail markings, multicolored fur, felis, domestic cat, shorts, jacket, tan body, chest tuft, bottomwear

キャラクターのLoRAを作るにあたってタグの編集方式はいろいろありますが、モデル同士の相性や学習方式、目的の品質、データセットの状態によってそれぞれの方法にメリットデメリットがあると思います。
キャラクターの特徴タグを残す・残さない、余計な品質タグを消す・消さない、トリガーワードだけで学習する方法などなど。
今回はTaggerのタグをすべて残してトリガーワードを先頭に追加する方法でやりました。
※画像の説明が間違っているタグは直したほうがいいので修正します。
 絵が青い目(blue eyes)なのにタグが赤い目(red eyes)となっているなど。

(2-2)LoRA学習
Kohya_LoRA_GUIというアプリを使いました。

GUIで動くので設定値の入力がしやすいです。
教師画像フォルダを選択する際は「1_yatoracat」フォルダではなく「training」フォルダを指定します。※ここを間違えると動きません。
またfp8_baseオプションが使えるので省メモリで動きます。
学習モデルはPony Diffusion V6 XL、パラメータは以下で学習しました。

accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py --pretrained_model_name_or_path "Z:\sd.webui\webui\models\Stable-diffusion\ponyDiffusionV6XL_v6StartWithThisOne.safetensors" --train_data_dir "Z:\Lora\training" --output_dir "Z:\kohya_lora_gui-1.9.0.1\output" --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 2 --max_train_epochs 250 --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 500 --output_name "yatoracat_test" --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

画像数8枚÷batch2=4、4×250epoch=1000step(batch1換算2000step)
※画像数に対する最適な学習設定がよくわかっていないので詳しい人どなたか教えてください。
設定値を入力して実行後、学習完了までしばらく時間がかかります。

完成したLoRAの確認

完成したLoRAをPony Diffusion V6 XLで使用してみます。
以下の画像はすべて同一Seedです。

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, yatoracat, anthro, solo, clothed, blue eyes, yellow fur,stripes,<lora:yatoracat_test:1>

最低限のタグで特徴が出ています。
教師画像の影響が強い印象なので少しLoRAの適用強度を下げてみます。

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, yatoracat, anthro, solo, clothed, blue eyes, yellow fur,stripes,<lora:yatoracat_test:0.6>

PonyV6の素の出力影響が大きくなり、LoRA効果の差異が見れらます。
次に前回行った設定資料風画像を出してみます。
今回はモデルの性能が高いためpromptだけで出せました。

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, yatoracat, anthro, solo, clothed, blue eyes, yellow fur,stripes, model sheet,<lora:yatoracat_test:1>

model sheetというpromptを追加しただけです。
次に服が相変わらずフード付きジャケットなので、服装を変更できるか試してみます。

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, yatoracat, anthro, solo, clothed, blue eyes, yellow fur,stripes, maid uniform,<lora:yatoracat_test:1>

大丈夫そうでした。
教師画像数が少ないためキャラクターとともに画風やシンプルな絵の特徴も学習してしまっていますが、promptが通る程度にはLoRAができているようです。
LoRAの影響が強い場合は適用強度を下げてみたり層別適用で調整するといいかもしれません。

score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, yatoracat, anthro, solo, clothed, blue eyes, yellow fur,stripes, goggles, brown lether jacket,cutoffs, red shirt,smile , dutch angle,low-angle view, young ,v sign,<lora:yatoracat_test:0.6>

LoRA製作の過程でいろいろ気づきがあったので時間があるときにまたまとめてみます。
お読み頂きありがとうございました。

情報まとめリンク

*1 Stable Diffusion (webui A1111) ローカル生成AIプログラム本体

*2 Transparent-Background 背景除去ツール

*3 NovelAI オンラインの生成AIサービス

*4 Kohya_LoRA_GUI (kohya-ss) 使いやすいLoRA学習プログラム

*5 Pony Diffusion V6 XL 最近のお気に入りモデル ケモノが強い

*6 バイブストランスファー NovelAIが提供する仕組みの一つです

*7 Platさんの記事 生成AIの記事がとても勉強になります


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