Textual Inversion の使い方
目次
Embedding を使う
Automatic1111 WebUI
Embedding は .pt や .bin ファイルで提供される。それらを embedding フォルダにいれて、プロンプトに embedding のファイル名を入れると使える。たとえば embedding のファイル名がtest だったとすると、プロンプトに test と入力すると使える。再起動不要。
ネガティブプロンプトに入力しても機能する。ネガティブプロンプト用 Embedding は以下のものが有名。
ComfyUI
Embeddings は models/embeddings に配置する。プロンプトに embedding のファイル名を入れると使える。たとえば embedding のファイル名がtest だったとすると、プロンプトに embedding:test とすると使える。
Textual Inversion の特徴
軽量
テキストエンコーダーの埋め込み部分のみで動作するためファイルサイズがとても小さい。
影響力は小さい
他のファインチューン手法と違い、モデルが元々表現できるものしか対応できない。モデルが表現できないものを学習させたい場合は LoRA や Dreambooth を使う。
AUTOMATIC1111WebUI で Embedding の作成
Train タブの Create embedding で embedding ファイルを作成する。
- 新しい embedding を作成し、学習させたい画像の入ったディレクトリを選択、学習させる
- 学習には時間がかかる
- 学習画像枚数は 5~100 枚、ステップ数は1万~10 万がよく使われる。デフォルトの状態でよく似たものが出せるなら学習画像枚数は少なくてもいい
- 半精度(FP16)でも機能するが検証が必要
- VRAM が豊富なら起動時に --no-half --precision full を付けることで単精度(FP32)で学習できる
- 512x512 より大きいサイズの画像も入力できるが、大きすぎるとメモリ使用量が増え、学習にも時間がかかる
- 学習を中断・再開してもデータを失わない(ただし AdamW 最適化パラメータは除く。これは重要ではないので、ほかのツールでも保存してない)
- --lowvram(VRAM4G サポート) --medvram 引数をつけて起動してはならない。これらの引数はテキストエンコーダーを VRAM から退避させることで VRAM を節約している。
Name
作成する embedding のファイル名。学習データを呼び出す際にプロンプトに入力するワードになる。
Initialization text
画像の特徴を指定する初期テキスト。たとえば "zzzz1234" という名前の1ベクトル(1トークン)の embedding で初期テキスト "tree" を指定したとする。トレーニングなしでそれを "a zzzz1234 by monet" というプロンプトで使うと、その出力結果は "a tree by monet" と同じになる。
つまり Initialization text には学習してほしいタグを書く。白髪赤目センター分けショートヘアーを学習させたいなら、Initialization text には red eyes, white hair, parted bangs, short hair を入れる。
Initialization text は学習画像に含まれる属性かつモデル(ckpt)で認識できる語が望ましい。
Number of vectors per token
embedding のトークンひとつあたりのサイズ。この値を大きくすればより多くの情報を詰め込めるが、より多くのトークン数を消費する。たとえば 16 ベクトル embedding はたとえ1語であっても 16 トークン消費する。プロンプトは 75 トークンしか入力できない。大ベクトルで良い結果を得るには、より多くの画像が必要になる。また大ベクトルは余計な情報を学習してしまう事にも注意が必要。
Embedding のトレーニング
デフォルトの 0.005(5e-3) は大きすぎるので、0.0005(5e-5) ぐらいから始めるとよい。
Embedding
学習させたい embedding を選択
Learning rate
学習速度。高すぎる値を設定すると embedding が壊れる。training info textbox に「Loss: nan」が表示された場合、学習に失敗し embedding は死んだ事を意味する。これはデフォルト値では絶対に起こらない。複数の学習率を指定することもできる。たとえば 0.005:100, 1e-3:1000, 1e-5 の場合、100 ステップまでは 0.005、1,000 ステップまでは 1e-3、1,001 ステップ以降は 1e-5 になる。
Batch size
1回の学習に使う画像枚数。これを上げると、VRAM を余計に使い計算速度も落ちるが、精度が上がる。
Dataset directory
学習に使う画像が入ったディレクトリ。画像のアスペクト比は1:1である必要がある。
Log directory
サンプル画像と学習の途中の embedding のコピーが出力される。
Prompt template file(キャプションファイル)
1行にひとつプロンプトが書かれたファイル。これはモデルをトレーニングするときに使われる。textual_inversion_templates ディレクトリにあるファイルを見れば何ができるのかわかる。スタイル(画風)をトレーニングするときは style.txt を使い、人や物を学習させたいときは subject.txt を使う。ファイル内では以下のタグが使える。
- [name]:embedding の名前
- [filewords]:データセットの画像のファイル名の単語をスペースで区切ったもの。タグファイルがあるならそちらが読み込まれる
filewords
[filewords] はプロンプトにファイル名を挿入するために使われる。デフォルトでは拡張子は削除され、- で始まるファイル名と全てが数字の部分は無視される。
000001-1-a man in suit.png というファイル名は a man in suit としてプロンプトに埋め込まれる。
Filename word regex オプションを有効にすれば正規表現による置換も使える。だが、ファイル名と同名のテキストファイルにキャプションを書いた方が便利だ。
Max steps
トレーニングが終了するステップ数。画像1枚をモデルに学習させたときに1ステップと数える。トレーニング画像を1周すると 1 epoch。1ステップで複数の画像を学習させるにはバッチを使うが、未サポート。学習を中断・再開した場合でもステップ数は保存される。
Preview prompt
プレビュー画像の作成時に使われる。空の場合訓練に使うプロンプトが使われる。
Use Deepbooru for caption
Deepbooru を使ってキャプションファイルを自動生成する。
Do not resize image
異なる画像解像度の画像を同時に学習させられる。ただしバッチサイズは1にする必要がある。
Gradient clipping
勾配の最大値を指定できるようになる。0.001:1000, 0.0001:2000 のように学習率と同様に、ステップごとに最大値を指定できる。
Gradient Accumulation
学習は Loss を計算してそれを元にネットワークを更新、という工程を画像1枚ごとに行う。gradient accumulation はネットワークを毎回更新せずに Loss をためておく。そしてためておいた Loss の合計を使ってネットワークを更新する。
Gradient accumulation steps はためておく Loss の数を指定する。
Gradient Accumulation がオフの場合、Max Steps 回 Loss の計算とネットワークの更新とを行う。Gradient Accumulation が2の場合、ネットワークの更新を Max Steps 回行い、Loss の計算は Max Steps * 2回行われる。
Shuffle tags by ',' when creating prompts.
タグをシャッフルする。プロンプトは後ろの方の影響力が小さく、そのため後ろの方のタグの内容を覚えてしまいやすい。
例えばキャプションの後ろに white background があると、white background を覚えて白背景になりやすくなる。タグをシャッフルするとこれを防げる。
Drop out tags when creating prompts.
タグをランダムに削除することで過学習を防ぐ。
latent sampling method
LDM と Textual Inversion とのオリジナルコードでは、学習データ画像をエンコードするときに、学習のループごとにランダムサンプルが作成されていた。しかし従来の AUTOMATIC1111 の実装では VAE からのサンプルは1つだけだった。これは VAE の想定されている使い方ではない。
- once:従来の方法
- deterministic:潜在空間の平均からサンプリングする。実装者は once や random よりよい結果が出ると主張している
- random:オリジナルの Textual Inversion のリポジトリで使われていた方法。VRAM 消費量は増える
例1
環境
- ハードウェア:RTX 3050 8GB
- 学習に使ったモデル:Waifu Diffusion v1.3 float16
-学習画像:Novel AI で出力したアスナ(ブルーアーカイブ)の画像 20 枚
50 枚作成したうちの 20 枚を採用
作成に使用したプロンプト:masterpiece, best quality, 1girl, {{{{asuna_(blue_archive)}}}}, hair over one eye, green eyes, blue eyes, white background, cowboy shot
- ネガティブプロンプト:realistic, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry
hair over one eye, green eyes, blue eyes, brown hair, hair ornament, hair ribbon, asymmetrical bangs, long hair, very long hair
出力例
- モデル:Waifu Diffusion v1.3 float16
- プロンプト:masterpiece, best quality, extremely detailed beautiful portrait of asuna-10000, in elaborately embroidered print_kimono, looking_away, golden hour, from_side, white marble glowing skin, subsurface scattering, cobblestone road, soft ambient lighting, light_rays
- ネガティブプロンプト:lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry
- ステップ数:20
- サンプラー:Euler
- CFG scale:7
- Clip skip:2
学習できなかったもの
hair over one eye と右目隠れ。でこ出しになったり左目隠れになったりする。
DreamArtist
ネガティブプロンプトもチューニングする Textual Inversion。Textual Inversionは潜在空間の Loss を使って学習するが、Dream Artistでは、潜在空間の Loss だけでなく、デノイズ結果をピクセル空間に戻した場合の Loss も計算に入れている。
インストール
git clone https://github.com/7eu7d7/DreamArtist-sd-webui-extension.git extensions/DreamArtist
DreamArtist Create embedding
基本的に Textual Inversion と同じ。Number of negative vectors per token を6~10 程度確保しておく。
DreamArtist Train
Train with reconstruction
ピクセル空間に戻した場合の Loss も計算に入れる。VRAM や時間を節約したいときはチェックを外す。
プレビュー・実際の使用
embedding 名が test だとすると、ネガティブ embedding は test-neg になる。
実際に使用する場合には ネガティブ embedding にいつものネガティブプロンプトを重ねて使っても効果がある(たとえば test-neg, lowres, bad ...)。
VRAM8GB で実行する
以下の設定で RTX3050 8GB で実行できた。
- Train with reconstruction:オフ
- 解像度:448 x 448
- 学習画像枚数:5枚
- Save an image to log directory every N steps, 0 to disable:0
- Save images with embedding in PNG chunks:オフ
- Read parameters (prompt, etc...) from txt2img tab when making previews:オフ
Embedding-inspector extension
embedding のマージができる。
リンク
DreamArtist: Towards Controllable One-Shot Text-to-Image Generation via Contrastive Prompt-Tuning