Textual inversion

Last-modified: 2023-03-27 (月) 21:27:29

公式⇒ https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Textual-Inversion

TI&HN時にはvaeは無効にしよう!
↑そんな情報を見た。
Settingsの真ん中に「Unload VAE and CLIP from VRAM when training」があるからONにしよう

動かすための条件など

8GB以上のVRAMがあればとりあえず動くこと確認
精度を高めるにはもっと必要&編集(--no-half --precision full)が必要とのこと
--lowvramandや--medvramを使用している場合は使えない
RTX2070で動かした際は専用GPUメモリ 7.8/8.0GBで張り付いてました。
ちなみにバランス電力モードで10万steps回すのに928m10.84sかかりました。 (約16時間

実際にTextual Inversionをする
※事前にトレーニングに使う画像を集めておきましょう。
※512x512の画像でトレーニングする必要があります。
!!!!現在読み込んでいるモデルを学習に使うので注意!!!!
学習時に使用するモデルは一番小さいのでも十分です。fullは基本数万枚の画像を追加で学習させるときに使いましょう

学習素材の事前加工

コチラ⇒https://wikiwiki.jp/sd_toshiaki/%E5%AD%A6%E7%BF%92%E3%81%AE%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99

階層見本

stable-diffusion-webui
 ┣embeddings   "画像生成の際に実際に使う"ptを保存するフォルダです。
 ┃
 ┃
 ┣traning           これはもともと存在しないので新規で作ったフォルダです。
 ┃ ┗学習素材未加工
 ┃ ┃┣ipose1.jpg  I字の女の子の画像
 ┃ ┃┗ipose2.jpg  I字の女の子の画像
 ┃ ┃
 ┃ ┗学習素材加工済み   ここに保存される。これは作成してなくても名前を指定すれば自動作成されたかも
 ┣textual_inversion
 ┃┗20XX-MM-DD     実際にトレーニングを開始するとその日付のフォルダが出来る。
 ┃ ┗[Name]へ入れた言葉が名前のフォルダ    トレーニング中に作成されるフォルダです。
 ┃  ┣embeddings      トレーニングしたptデータが保存されます。
 ┃  ┗images        トレーニングの途中の画像がここに出力されます。
 ┃
 ┃
 ┃
 ┗textual_inversion_templates     トレーニングに用いるテンプレがここに保存されています。
  ┣style.txt        ファイル名を使わないで学習する。 画風用のテンプレート
  ┣style_filewords.txt    ファイル名を使って学習する。 画風用のテンプレート
  ┣subject.txt       ファイル名を使わないで学習する。 モノ(キャラ)用のテンプレート
  ┣subject_filewords.txt   ファイル名を使って学習する。 モノ(キャラ)用のテンプレート
  ┣任意で作成した.txt
  ┗任意で作成した.txt

1.空のptファイルを作る

Trainタブを開きます。
「Create embedding」タブを開きます。(デフォで開くはず
「Name」にその学習ファイルにつける名前を入力します。  例)Name=あなる先生
※AUTOMATIC1111ではこれがそのまま呼び出しワードになります。
「Initialization text」へは、その覚えさせるものに一番近い概念を入力するらしいです。 ※書いてる人もちょっと完全には理解してません。
そのワードを開始地点として学習を開始するらしいので似たものを入力した方が学習効率がいいかもしれません。
 
「Number of vectors per token」では作成するptファイルのtoken数を決めます。
多いほうが色々な特徴を覚えるようですが、最初は小さい数字から始めるのが良いかもしれません。 ぺこらptは8で作成された様です。
絵師さんのイラストptでは1だけでそれなりの完成度を得ることができました。 良い設定が分かれば共有してください。
「Overwrite Old Embedding」
同名の場合に上書きする?
「Create embedding」を押すと「embeddings」フォルダ内に空のptが作成されます。      例)あなる先生.pt

2.トレーニングの設定を決める。

「Train」タブの中の「Train」タブを開きます。

★「Embedding」

「∨」を押すと「embeddings」フォルダ内のptの一覧が表示されるので、先ほど作成した空のptを選択します。

★「Hypernetwork」

ここは何も指定しません。別ページにあるHypernetworkを学習するときに選択します。

★「Embedding Learning rate」

学習の深度を決める数字です。高くするとptファイルが機能しなかったり、promptに従いにくくなります。(最初はデフォの数値で試しましょう)

★「Hypernetwork Learning rate」

TI学習には使いません。

★「Batch size」

★「Dataset directory」

加工済の画像を保存したフォルダのパスを書きます。 もしくは、任意の学習元画像が入ってるフォルダのパスを書きます。
例)H:\stable-diffusion-webui\traning\学習素材加工済み

★「Log directory」

なにも弄らなくてよいです。 ※弄ると学習途中のデータなどの出力先を変えることが出来ます。

★「Prompt template file」では、何を学習するかによって使うべきtxtファイルが違います。

ファイル名を使い画風を学習させる  例)H:\stable-diffusion-webui\textual_inversion_templates\style_filewords.txt
ファイル名を使わず画風を学習させる 例)H:\stable-diffusion-webui\textual_inversion_templates\style.txt
ファイル名を使いモノを学習させる 例)H:\stable-diffusion-webui\textual_inversion_templates\subject_filewords.txt
ファイル名を使わずモノを学習させる 例)H:\stable-diffusion-webui\textual_inversion_templates\subject.txt

これらのtxtファイルをメモ帳で開くとわかりますが、学習はそのpromptにそって行われます。
そのためこれを独自に編集することによって結果が変わります。
学習させたくないワードを書いておくと良いかもしれないと言われています。
また、緑髪のキャラにピンクの髪とキャプションつけすることによっていい感じに学習できたととしあきの報告もありました。

★「Width」と「Height」

トレーニング用の画像と同じ大きさを指定します。
Train an embedding; must specify a directory with a set of 1:1 ratio images と上で書いてある通り
TI(embedding)は1:1の画像でトレーニングする必要があります。

★「Max steps」

何step学習を回すかです。デフォは10万が入っています。途中で止めることもできるのでそのままでもよいかもしれません。
基本的に10万は過剰です。3万くらいで指定して様子見がいいかも

★「Save an image to log directory every N steps, 0 to disable」

何stepごとにsampleの画像を出力するか決めます。
デフォのままでもいいですし、寝てる間に回して結果は普通に画像生成して確認するからという人は0でもいいかもしれません。
画像生成するときはもちろん学習は止まるので、あまり頻繁に出力するべきではないかもしれません。

★「Save a copy of embedding to log directory every N steps, 0 to disable」 

何stepごとにptファイルを作成するか決めます。
ここはデフォのままでもよいですし、「100」などの数値にしてもいいです。 ただ、細かくするとそれだけ結果の確認が大変になります。

★「Save images with embedding in PNG chunks」

?

★「Read parameters (prompt, etc...) from txt2img tab when making previews」

学習時のサンプル確認にtxt2imgで指定したpromptなどを使用します。 ※ここを弄ったから学習結果が変わるなんてことはないはずです。
seedを固定することで学習結果の進捗確認が容易になるとのこと

3.トレーニング開始

「Train」を押すと学習がスタートします。

4.トレーニングの止め方

止めると自動的にembeddingsフォルダ内の指定したptにはそのstepまでの学習結果が記録されます。

「Max steps」をまで回ると自動的に学習は止まります。
 textual_inversion⇒学習の日付⇒学習の名前(例:あなる先生)⇒images を見ると学習途中の画像が表示されます。(出力している場合
 ここで十分によい結果が得られてる気がするな?と思った場合は途中で止めても良いかもしれません。
 「Interrupt」を押すことで学習がストップします。

※2個Stablediffusionを使える人なら(例:2PCやローカル+Colab)
 textual_inversion⇒学習の日付⇒学習の名前(例:あなる先生)⇒embeddings に途中のptが出力されます。(出力している場合
 コピーして別のSDへもっていけば途中でもいろいろ確認することが出来ます。

5.途中からトレーニングを再開する。

空のptを作成するstepを飛ばし、前回学習に用いたptファイルを「Embedding」で指定するだけです。
途中から再開する場合には「Learning rate」を落とした方が良い結果が出るかも?といわれていました。わかりません。
10000まで回したけど、2000のptから再開したいなんて言う場合は
textual_inversion⇒20XX-MM-DD⇒名前⇒embeddings
フォルダ内に出力された途中のptもstable-diffusion-web-ui⇒「embeddings」へいれればその指定したstepから再開できる。

メモ

女〇パンツはめちゃくちゃstep回して良い結果が得られていた(過去スレ
Prompt template fileは学習時に使用するpromptが書いてあるファイルを指定(スタイル学習かつ画像ファイルに名前を付けるならデフォのままでいいかも。画風じゃなくキャラを学ばせるならsubjectのほうがよい)  名前をつけないのであればfilewordsと書いてないtxtを指定したほうが精度がよくなる可能性あり。

厳密には違いますが、"[name]" を使用すると、トレーニング セット (埋め込み名自体) 内のすべての画像に対して同じプロンプトで埋め込みがトレーニングされることを意味します。ファイル名にプロンプトを入れて「[filewords]」を使用すると、個々の画像で何が起こっているかについてより多くの情報が得られます。
たとえば、Foo をトレーニングしていて、Foo が青いドレスを着ているサンプル画像がある場合、ファイルに「Foo wear a blue dress」という名前を付けると、AI が青いドレスの部分が画像は探しているものではなく、残りの部分です。

としあきメモ(2023/3/25)

TI学習方法

1.初期必要画像は最低10~ 推奨20~集める

2.プリプロセス
2.1 xnconverterで512:512になるように縮小して端は塗りつぶし(全身画像用)
2.2 1111のtrain\proseccing imageタブでAuto focal point cropする(拡大画像用)

  2.1と2.2片方だけでよければそれでもかまわない

2.3  2.1と2.2を同じフォルダに集める
2.4 必要に応じて画像のシャッフルリネーム(名前的にシャッフルしないと不安)

3.01 Train\Create embeddingタブでNameを命名←既存であるmadokaみたいなのは良くないかも
   Initilazition textは適宜 "*"でもいいけど"1girl"が良いかも
   Numbers of vectors per tokensは適宜 4~16の間がいいかも←後々"AND"や"BREAK"や75トークンを気にすることがあれば要注意
    Create embeddings!!!!


4.00 1111の指示modelをnaiに変更←超重要!!!!!!!!
     1111の指示SD vae=Noneに←重要!!!
4.02 Train\Trainタブに移行
4.03 Dataset directoryを2.3のフォルダを指定
4.04 prompt templateを"subject.txt"に
4.05 Max stepsを15000に変更 (デフォは1桁多い 無駄な電気代)
4.06 色付き「Train Embedding」を押してひたすら待つ」
(3080で約90分とちょっと)

4.1 「stable-diffusion-webui-master\textual_inversion\yy-mm-dd\images」フォルダに500step毎に画像が出るから確認すると良い
4.2 「stable-diffusion-webui-master\embeddings」に最終データが書き込まれる

5 好きにするがよい

sd-scriptsを用いた学習法(2023/3/27)

LoRA学習のためにsd-scriptsを導入していた場合、Textual Inversionの学習も行うことが出来る。
LoRA学習と同様、画像の大きさの自動調整なども行ってくれるため、
sd-scriptsでのLoRA学習経験がある人がTIの学習をやりたい場合はこちらの方が学習しやすいと思われる。
2023年3月27日現在、実行支援ツール等はないため要コマンド直打ち。

キャプション方式でのTIの学習法を以下に記載するが、
sd-scriptsが導入済みかつLoRA学習経験がある人を前提とする。
コマンドの詳細やトークンの扱い等についてはkohya氏のReadmeを確認すること。
https://github.com/kohya-ss/sd-scripts/blob/main/train_ti_README-ja.md

★1.画像およびキャプションの整理

画像やキャプションについては、LoRA学習と同様。
画像の調整は不要かつキャプションもLoRA同様taggerを用いると楽。

★2.tomlファイルの用意

テキストエディタを立ち上げ、

[general]
enable_bucket = true                        # Aspect Ratio Bucketingを使うか否か

[[datasets]]
resolution = 512                            # 学習解像度
batch_size = 4                              # バッチサイズ

  [[datasets.subsets]]
  image_dir = 'C:\hoge'                     # 学習用画像を入れたフォルダを指定
  caption_extension = '.txt'             # キャプションファイルの拡張子に.txt を使う
  num_repeats = 10                          # 学習用画像の繰り返し回数

[注:LoRA学習の際は学習画像があるディレクトリの一つ上を指定したが、TI学習の場合は学習画像があるディレクトリそのものを指定すること。]
このように記載し、拡張子を.tomlとして保存。
上記の値等は、適宜書き換え。

★3.実行環境の立ち上げ

Powershell等のコンソールを起動し、sd-scriptsの階層まで移動。

.\venv\Scripts\activate

のコマンドで仮想環境を立ち上げる。

★4.学習の実施

仮想環境下で学習コマンドを実行。
以下は例として記載するが、実行時には1行に収めること。

accelerate launch --num_cpu_threads_per_process 10 train_textual_inversion.py
 --dataset_config="(.tomlファイルのディレクトリ)"
 --output_dir="(学習結果ファイルの出力ディレクトリ)"
 --pretrained_model_name_or_path="(学習ベースとなるモデルのディレクトリ)"
 --output_name="(学習結果ファイルの名前)"
 --save_model_as=safetensors
 --prior_loss_weight=1.0
 --max_train_steps=10000
 --learning_rate=5e-6
 --optimizer_type="AdamW8bit"
 --xformers
 --mixed_precision="fp16"
 --cache_latents
 --gradient_checkpointing
 --token_string=(学習時のトークン文字列)
 --init_word=(コピー元トークンの文字列)
 --num_vectors_per_token=(トークン消費量)

(LoRA学習と同様に--shuffle_captionや--keep_tokensも使用可能)

文法の誤り等が無ければ、学習が開始。
学習が完了した際には、--output_dirで指定したディレクトリに学習結果が保存される。

指摘・更新するべき箇所や助言など

  • tokenは多すぎると学習がうまくいかなくなる気がする -- 2022-11-12 (土) 23:16:44
  • 上手くいかなくなるというよりも、必要学習量がより多く求められる感じですかね -- 2022-11-13 (日) 09:37:30
  • これってAMDでもいけるんすかね? -- 2022-11-21 (月) 14:10:18
  • タグはtoken化すると数が増えるので、tokenizer(https://github.com/AUTOMATIC1111/stable-diffusion-webui-tokenizer)を使ってInitialization textで学習させるタグが何token分になるか確認してる -- 2022-11-21 (月) 16:24:40
  • 新しいwebUIで動かしたらすぐに過学習を起こした。何が悪かったんだろう -- 2022-12-07 (水) 07:52:21
  • 最期の>>AI が青いドレスの部分が画像は探しているものではなく、残りの部分です。<< どういう意味?日本語よくわからんわ -- 2022-12-11 (日) 13:38:05
  • 前文から推論すると「AI が"Foo"として学習するのは青いドレスではなく、残りの部分です。」と言い換えられると思う -- 2023-03-23 (木) 11:36:17