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になってしまうため、共通の特徴を持たせたパターンの異なる画像を複数枚用意する必要があります。
まずは画像の加工から行っていきます。
キャラクターは前回に引き続き自画像(?)でやっていきます。
(1-1)教師画像の加工
キャラクター学習の場合、この画像のままでは不要な背景まで学習してしまうため背景を削除します。
「Transparent-Background」という背景除去ツールを使いました。
背景削除後の画像で手足の一部が消えてしまっていますが、この時は気づかずに進めてしまいました。(残念ポイントです)
きちんとやるならキャラクターの体が消えないように設定値を調整したり、ペイントソフトでその部分だけ合成・加筆することで形を整えたほうがいいと思います。
キャラの服装やポーズなどの特徴がこの1枚の教師画像を基準とするため、再現したい特徴の明確な全身像の画像が望ましいと思います。
今回は「座っているポーズ」「フード付きジャケット」がキャラ本体と関係ない余計な特徴であったため、この後の作業で問題が起きます。
(1-2)全身と顔のアップの分離
全身画像から顔の部分だけ別に切り出します。
(1-3)NovelAI (V3)を利用して教師画像数を増やす
ここでNovelAIの「インペイント」と新機能の「バイブストランスファー*6」を併用して教師画像数を増やします。
Stable Diffusionのi2iやNijijourneyのキャラクターリファレンス(--cref)でも同様のことはできると思いますが、それぞれ使ってみたところバイブストランスファーが面白かったので今回はNovelAIを使っています。
■インペイント+バイブストランスファー
1216×832横長の白いキャンバスをペイントソフトで新規作成し、先ほどの全身の映っている教師画像を端のほうに配置した画像を作成します。
NAIの画像生成画面を開いて横長画像をインペイント(i2i)に、顔のアップ画像をバイブストランスファーに読み込みます。
今回インペイントやバイブストランスファーの数値はほぼデフォルトで使いましたが、生成状況によって変えてみたほうがいいと思います。
インペイント機能の「描いてマスクを追加する」からマスクエリアの設定をします。
この時設定した範囲が画像生成の範囲となります。
こうすることで非マスク部分の絵を参照しつつ全体の再生成を行うようです。
※このインペイントのアイデアはPlatさんの記事*7を参考にしています。
詳しい挙動はPlatさんの記事を見てください。
他に匿名掲示板の有志の方の実験も参考にしています。
マスク範囲にノイズ画像を配置する方法もあるようです。
今回は白い余白でも生成できたのでそのまま進めています。
インペイントのマスク範囲の設定とバイブストランスファーの設定ができたら、プロンプトを入力して画像生成します。
▽プロンプト考え方
promptは先頭にくるワードほど影響力が強くなります。
NAI公式でプロンプトのおすすめの組み方を公開しているので参考にしています。
reference sheet というワードを使うとキャラクター設定シートや三面図のような絵が出やすくなるので、類似のタグを先頭近くに入れています。
キャラクターの細かい特徴や出てほしい部分はそのあとに列挙しています。
白い余白の大きい横長画像を準備したのはこのpromptによってNAIのインペイント機能で疑似的にキャラクターシートを生成するためです。
バイブストランスファーに顔のアップ画像を入れたのは、画風の維持と全身像では認識されにくい顔の特徴の維持のためです。
しかしここで両方の画像ともフード付きジャケットが映りこんでいたため、生成作業中かなりの確率でフード付きジャケットが出てきてしまうという現象に見舞われます。
このままではフード付きジャケットもキャラの一部として学習されてしまうため対策が必要です。
解決方法として(1)顔の切り抜き画像からフード部分を取り除き顔だけにする、(2)promptでnudeなどの服を除外するワードを強調して入れる策をとりました。
バイブストランスファー、インペイントの利用、併用で生成した画像の中からキャラクターの特徴を汲んだ教師画像になりそうな品質の6枚を選別しました。
立ちポーズ(全身正面・しっぽあり・全裸)、顔のアップ(雰囲気の分かるもの・模様の分かるもの)、横から見た図などのカメラ方向の多様性を重視しました。
※教師画像が少ない場合、極端な構図(アオリやフカンなど)や変わったポーズ(ヨガのポーズや遠近感のあるポーズなど)が混ざるとそれを特徴として学習してしまう可能性があるため、絵的には素朴で無難なもので揃えたほうが良いと思います。
(1-4)教師画像のサイズ調整と加筆修正
サイズが小さい画像はアップスケールしました(StableDiffusion)。
SDXLでの学習になるので短辺が1024px以上となるようにしました。
額の模様やシマシマ模様の抜け、耳の模様の相違などはペイントソフトで簡易的に修正しています。
シンプルな絵柄のほうが修正が楽です。
(2)LoRA学習(Training)
(2-1)データセットの作成
kohya-ssの機械学習に対応したフォルダ形式のデータセットを作成します。
(2-1-1)フォルダの作成
「training」という名前のフォルダを作り、その中に学習用データを集めたフォルダを作成します。
学習用データフォルダの名前は「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系のものでも大丈夫じゃないかと思います(やってないので不明です)。
例としてこちらの画像に対するタグ付けの結果は以下になりました。
8枚ともにタグのついたtxtファイルが作られたらタグの編集をします。
Dataset Tag Editorという拡張を使いました。
複数ファイルを読み込み一括でタグの追加・削除ができます。
先頭にトリガーワード「yatoracat」を追加するだけです。
キャラクターのLoRAを作るにあたってタグの編集方式はいろいろありますが、モデル同士の相性や学習方式、目的の品質、データセットの状態によってそれぞれの方法にメリットデメリットがあると思います。
キャラクターの特徴タグを残す・残さない、余計な品質タグを消す・消さない、トリガーワードだけで学習する方法などなど。
今回はTaggerのタグをすべて残してトリガーワードを先頭に追加する方法でやりました。
※画像の説明が間違っているタグは直したほうがいいので修正します。
絵が青い目(blue eyes)なのにタグが赤い目(red eyes)となっているなど。
(2-2)LoRA学習
Kohya_LoRA_GUIというアプリを使いました。
GUIで動くので設定値の入力がしやすいです。
教師画像フォルダを選択する際は「1_yatoracat」フォルダではなく「training」フォルダを指定します。※ここを間違えると動きません。
またfp8_baseオプションが使えるので省メモリで動きます。
学習モデルはPony Diffusion V6 XL、パラメータは以下で学習しました。
画像数8枚÷batch2=4、4×250epoch=1000step(batch1換算2000step)
※画像数に対する最適な学習設定がよくわかっていないので詳しい人どなたか教えてください。
設定値を入力して実行後、学習完了までしばらく時間がかかります。
完成したLoRAの確認
完成したLoRAをPony Diffusion V6 XLで使用してみます。
以下の画像はすべて同一Seedです。
最低限のタグで特徴が出ています。
教師画像の影響が強い印象なので少しLoRAの適用強度を下げてみます。
PonyV6の素の出力影響が大きくなり、LoRA効果の差異が見れらます。
次に前回行った設定資料風画像を出してみます。
今回はモデルの性能が高いためpromptだけで出せました。
model sheetというpromptを追加しただけです。
次に服が相変わらずフード付きジャケットなので、服装を変更できるか試してみます。
大丈夫そうでした。
教師画像数が少ないためキャラクターとともに画風やシンプルな絵の特徴も学習してしまっていますが、promptが通る程度にはLoRAができているようです。
LoRAの影響が強い場合は適用強度を下げてみたり層別適用で調整するといいかもしれません。
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の記事がとても勉強になります
この記事が気に入ったらサポートをしてみませんか?