dskjal
広告
広告

Textual Inversion の使い方

カテゴリ:deeplearning

目次

Embedding を使う

Automatic1111 WebUI

Embedding は .pt や .bin ファイルで提供される。それらを embedding フォルダにいれて、プロンプトに embedding のファイル名を入れると使える。たとえば embedding のファイル名がtest だったとすると、プロンプトに test と入力すると使える。再起動不要。

ネガティブプロンプトに入力しても機能する。ネガティブプロンプト用 Embedding は以下のものが有名。

ComfyUI

Embeddings は models/embeddings に配置する。プロンプトに embedding のファイル名を入れると使える。たとえば embedding のファイル名がtest だったとすると、プロンプトに embedding:test とすると使える

Textual Inversion の特徴

軽量

テキストエンコーダーの埋め込み部分のみで動作するためファイルサイズがとても小さい。

影響力は小さい

他のファインチューン手法と違い、モデルが元々表現できるものしか対応できない。モデルが表現できないものを学習させたい場合は LoRADreambooth を使う。

AUTOMATIC1111WebUI で Embedding の作成

Train タブの Create embedding で embedding ファイルを作成する。

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 を使う。ファイル内では以下のタグが使える。

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 の想定されている使い方ではない。

例1

環境

-学習画像:Novel AI で出力したアスナ(ブルーアーカイブ)の画像 20 枚
50 枚作成したうちの 20 枚を採用

作成に使用したプロンプト:masterpiece, best quality, 1girl, {{{{asuna_(blue_archive)}}}}, hair over one eye, green eyes, blue eyes, white background, cowboy shot

  • 学習画像サイズ:512x512
  • タグ:Deepdanbooru の出力から以下のタグを削除したものを使用
    hair over one eye, green eyes, blue eyes, brown hair, hair ornament, hair ribbon, asymmetrical bangs, long hair, very long hair
  • embedding 名:asuna
  • Initialization Text:hair over one eye, green eyes, blue eyes, brown hair, hair ornament, hair ribbon, asymmetrical bangs, long hair, very long hair
  • Prompt template file:[name], [filewords] だけ書かれたファイルを使用
  • Number of vectors per token:8
  • 学習率:5e-3:5000, 5e-4
  • ステップ数:10,000
  • 学習速度:1.32 it/s
  • 学習にかかった時間:2時間 30 分程度
  • 出力例

    学習できなかったもの

    hair over one eye と右目隠れ。でこ出しになったり左目隠れになったりする。

    seed:729737763

    seed:729737763

    seed:448772941

    seed:448772941

    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 で実行できた。

    Embedding-inspector extension

    embedding のマージができる。

    リンク

    DreamArtist: Towards Controllable One-Shot Text-to-Image Generation via Contrastive Prompt-Tuning

    Advance prompt tuning

    Stable Diffusion web UI (Advance Prompt Tuning)

    Advance Prompt Tuning(APT)


    広告
    広告

    カテゴリ