広告
広告

Stable Diffusion のファインチューンの Tips

カテゴリ:deeplearning

目次

概要

間違いやすいポイント

Textual Inversion と Hypernetwork のタグの違い

VRAM 8GBだが学習ができない

前処理

学習画像に2人以上人がいる

Danbooru タグの検査

画像のタグファイルに書くタグ例(学習させないタグ)

画風の定義

学習画像のタグファイル

設定

プレビューの固定

CLIP Skip は任意

VAE は外しても外さなくてもいい

Hypernetwork を外す

Hypernetwork strength を1に戻す

Quicksettings(UI 上部に設定を表示)

学習用の ui-config.json を使う

学習時

崩壊した後に持ち直すのを繰り返す

学習率と局所的最適解

ステップ数より epoch(エポック)が重要

Loss の監視は無意味

学習の失敗

Hypernetwork

Hypernetwork でキャラの学習と使用

活性化関数選び

Layer Normalization を有効にする場合は学習率を大きくする

Wide VS Deep

画風学習用の設定例

タグファイルに名前を入れる

Textual Inversion

Textual Inversion でやりがちなミス

覚えてほしい特徴と覚えてほしくない特徴

パーツ学習の問題点

Dream Artist を使う

Textual Inversion でネガティブな要素を学習させる

Dreambooth

チューニングする予定のモデルで正則化画像を作る

Preprocess(前処理)

画像加工ツール

学習テクニック

学習データ

Textual Inversion でキャラを学習させる場合のタグ

画風を学習させる場合のタグ(Textual Inversion・Hypernet)

Textual Inversion

Dream Artist

Hypernetwork

Dream Booth

CLIP Aesthetic

VAE の埋め込み

その他の情報

概要

このページでは AUTOMATIC1111 を使ったファインチューンの Tips を扱う。

画風を学習させる場合、Textual Inversion より Hypernetwork の方がよい。なぜなら学習時間が短いからだ。Use deepbooru for caption を使えばタグ付けも自動化できる。

Textual Inversion や Hypernetwork の学習は、学習画像のサイズが 512x512 なら VARM 8GB の RTX 3050 でもできる。ただし VRAM を解放するために実行前に webui の再起動が必要になる。モニターを複数枚使っている場合、VRAM が不足することがある。そのため快適に学習させたければ、VRAM 12GB 以上の GPU を使うか、Google Colab を使う。

Dreambooth を使って学習させるには最低でも 12 GB の VRAM が必要になる。

Textual Inversion はテキストエンコーダーを調整する。Hypernetwork はテキストエンコーダーと U-Net との間に追加のネットワークを挿入して、その追加ネットワークを調整する。

まとめ

Hypernetwork

画風の調整に向いてる。学習時間が短く準備の手間も少ない。ファインチューニングは、まず Hypernetwork から挑戦してみるのがいい。

Textual Inversion

デフォルトの状態で呼び出せる人や物を語に覚えさせたり、トークンを節約したりするのに使う。描く能力はあるが呼び出し方がわからない人や物を呼び出せることがある。Hypernetwork に比べて学習に時間がかかり、背景を塗りつぶしたり、タグ修正したりする手間が追加で発生する。

Dreambooth

デフォルトの状態で呼び出せない人や物を呼び出せる。

VRAM8GB でできるファインチューニング

  • Textual Inversion
  • Hypernetwork
  • DreamArtist

VRAM 12 GB でできるファインチューニング

  • Dreambooth

VRAM 16 GB でできるファインシューニング

  • 追加学習

間違いやすいポイント

Textual Inversion と Hypernetwork のタグの違い

Textual Inversion と hypernetwork とでは画像のタグのつけ方が違う。Textual Inversion では覚えさせたい特徴を Initialization Text に入れて、覚えてほしくない特徴を画像のタグファイルに書く。hyperntwork は画像の特徴はすべて画像のタグファイルに書く。

Textual Inversion を使う場合は、ただ embedding 名をプロンプトに入れるだけだ。hypernetwork でキャラを出したい場合は、学習時に指定したタグの中でそのキャラに関係のあるものをプロンプトに入れる必要がある。

VRAM が8GBだが学習ができない

Dreambooth は VRAM 8GB では実行できない。Textual Inversion と Hypernetwork で VRAM が不足する原因は原因はいくつかある。

  1. 学習画像のサイズが 512x512 でない
  2. 学習画像の枚数が多い(たとえば 100 枚以上)
  3. 単精度オプション等がついている --precision full --no-half --medvram
  4. webui を再起動してない
  5. layer structure の層が深い(たとえば 1, 2, 4, 4, 4, 2, 1)
  6. Move VAE and CLIP to RAM when training hypernetwork にチェックを入れてない
  7. xformers を有効にしてない

CPU に内蔵されている GPU が使えるなら、マザーボードから出ている映像出力端子とモニターとを繋ぐと VRAM を節約できる。

学習画像に2人以上人がいる

画風を学習させる場合には問題にならないが、キャラを学習させる場合には絶対にやってはいけない。

Danbooru タグの検査

無関係なタグや、重複しているタグを削除する。たとえば、hair ornament, star hair ornament, star \(symbol\) を star hair ornament でまとめるなど。

lollipop, ..., holding のような曖昧なタグは holding lollipop のように分かりやすくする。これは間のカンマがなくなることで holding と lollipop の結びつきが強くなる。

looking at viewer, looking at another, looking at away のような視線を指定するタグはよく間違うので手動で修正する。

blurry background があると、画像がぼける事があるので削除した方がいいかもしれない。

画像のタグファイルに書くタグ例(Textual Inversion で学習させないタグ)

  • white background, black background
  • solo, 1girl, looking at viewer, full body, close-up, breasts, solo focus, face
  • 表情・感情
    open mouth, closed mouth, smile, angry
  • ポーズ(ポーズを学習させない場合)
    squatting, standing, sitting

服を着せ変えたい場合は服も画像のタグファイルに書く。服を固定したい場合は、服の特徴を Initialization Text に入れる。

画風の定義

全身画像だけで画風を学習させようとすると細部がつぶれる。大抵は顔と髪で画風を判断しているので、顔のアップ画像やバストアップの画像があった方がいい。

服も学習させる場合は、頭をクロップした画像を用意して、head out of frame タグを付ける方法もある。

学習画像のタグファイル

学習画像と同名のテキストファイルがあると、そのファイル内のタグを読み込むようになっている。Windows はパスの長さが 255 文字程度に制限されているので、ファイル名にタグが入りきらない場合にこの機能を使う。

CLIP Skip は任意

固定した CLIP Skip しか使わないならその固定値で学習するのは問題ない。ただしほかの値で上手く動かない可能性が高い。Settings タブの Stable Diffusion の Stop At last layers of CLIP model で設定できる。

VAE は外しても外さなくてもいい

vae は学習に影響を与える。VAE を外す場合は ckpt と同じディレクトリにある .vae.pt をリネームするか、別のディレクトリに移動する。ただし常に VAE を有効にした状態で使うなら VAE を外す必要はない。

Hypernetwork を外す

Hypernetwork は学習に影響を与えるので外す。

Hypernetwork strength を1に戻す

Hypernetwork strength が1未満だと学習が遅くなる。

プレビューの固定

train タブの train で Read parameters (prompt, etc...) from txt2img tab when making previews にチェックを入れると、任意のプロンプトやパラメータでプレビューできる。特にシードの固定は絶対にしておきたい。

崩壊した後に持ち直すのを繰り返す

崩壊した後に持ち直すのは局所的最適解から抜け出して、最適解に近づいている証拠だ。崩壊した後にいつまでも持ち直さない場合は失敗している。

学習率と局所的最適解

ステップ数が増えるごとに学習率を下げる方法(たとえば 5e-6:5000, 5e-7)は、局所的最適解から抜け出せない。早いうちに発散してしまった場合は、学習率を下げて学習を再開させる。

局所的最適解を抜け出す方法として焼きなまし法がある。ただし運が悪いと悪化する。

MonkeyPath の Cosine Annealing は焼きなまし法に対応したスケジューラーが使える。

ステップ数より epoch(エポック)が重要

画像1枚を学習したら1ステップで、用意した学習画像を1周したとき1 epoch。

Hypernetwork の場合、学習画像 20 枚でステップ数 10,000 未満で学習できるので、500 epoch 程度必要になる。たとえば学習画像 1,000 枚だった場合、500 epoch のためには 50 万ステップ(1,000 * 500)必要になる。

Loss の監視は無意味

Loss の大小は学習時に加えるノイズ量で決まるため見ても意味がない。学習の成否は実際にランダムシードで画像を生成してみないとわからない。

Investigating the training loss #4043

Loss はデノイザよって予測されたノイズの二乗誤差の期待値だ。問題はそれが推定値にすぎないこととサンプル空間が巨大なこととだ。サンプル空間の乱数は、潜在空間のノイズ画像とノイズレベルとの影響が大きい。サンプル空間が巨大なので乱数で Loss が上下してしまう。

previous_mean_loss

hypernetwork の csv に出力される Loss は previous_mean_loss の値だ。これは各学習画像の最新の Loss の平均だ。たとえば学習画像2枚で 100 ステップごとにログを書き込む場合、計算に使う Loss は2つだけだ。100 ステップの Loss の平均ではない。

hypernetwork の学習時に WebUI 上に表示される Loss もこの previous_mean_loss の値だ。

Textual inversion の場合は直近 32 ステップの Loss の平均だ

Loss-タイムステップグラフ

以下の図の縦軸は Loss、横軸はタイムステップ横軸はステップ数ではない。タイムステップは img2img の Denoising strength のようなもので、タイムステップが大きいと小さい Denoising strength を使うようなものだ。つまりタイムステップが大きいと、画像に加えるノイズが最初から少ない。

以下の図を見ればわかるように、Loss は学習が進むごとに小さくなるのではなく、引いたタイムステップで決まる。

loss-noise level
縦軸は Loss、横軸はタイムステップ
出典:https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/4043

Loss のばらつきは学習の結果のように見えるがそうではない。以下の図は学習画像ごとのグラフだ。

per image
学習画像ごとのグラフ
出典:https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/4043

Loss が大きいからと言って学習内容が豊富だとは限らない。大抵は間違ったタグがついているだけだ。

学習の失敗

発散

発散はプレビューがノイズ画像になるか、溶けるかするので分かりやすい。

過学習

プレビューではうまくいっているが実際に生成してみると上手くいかない、つまり汎用性がない状態。過学習かどうかを判断するには、一度学習を止めて(もしくは別のマシンで)ランダムシードで何枚か生成してみるしかない。

プレビューをランダムシードにしても過学習かどうかはわからない。なぜならランダムシードでプレビューするとシードが悪いのか学習が悪いのかの切り分けができないからだ。

過学習であっても Hypernetwork strength を下げれば普通に使える場合もある。

Quicksettings(UI 上部に設定を表示)

Settings タブの User interface の Quicksettings list に表示したい UI 名を指定すると、UI 上部に設定を表示できる。たとえば、chekcpoint と hypernetwork, Hypernetwork strength, Stop At last layers of CLIP model, VAE を表示するには Quicksettings list を以下のように設定する。

sd_model_checkpoint, sd_hypernetwork, sd_hypernetwork_strength, CLIP_stop_at_last_layers, sd_vae

Apply Settings を押した後、再起動する必要がある。

学習用の ui-config.json を使う

設定ミスを防ぐために学習用のデフォルト値を設定した ui-config.json と bat ファイルを用意すると便利だ。vae を分離したい場合は、コマンドライン引数に --vae-path を追加して vae を分離する必要がある。

手順

  1. ui-config.json をコピペリネームして learning-config.json を作成
  2. learning-config.json を編集
  3. webui-user.bat をコピペリネームして、webui-learning.bat を作成
  4. webui-learning.bat に set COMMANDLINE_ARGS=--ui-config-file learning-config.json を追加

そして学習時は webui-learning.bat を起動する。

Hypernetwork

Hypernetwork でキャラの学習と使用

画像のタグファイルには覚えてほしい特徴も、覚えてほしくない特徴もすべて書く。

Hypernetwork 使用時にキャラの特徴のタグをプロンプトに入れる。

活性化関数選び

活性化関数は以下の3つがよく使われる

Linear

活性化関数実装前に使われていた(つまり活性化関数なし)。Linear は学習できる量が少ないのが欠点だ。Linear 以外の活性化関数なら同じ layer structure でも多くの内容を学習できる。

relu

有名でよく使われている活性化関数。ReLU は Layer weights initialization で Normal を選択してはならない。ReLU を Normal で初期化するとニューロンの半分が初期化時に死んでしまう。

学習後のウェイトが0以下になるとニューロンが死んでしまう Dying ReLU 問題がある。ReLU を使う場合の Dying ReLU 対策には以下の2つのどちらかを使う。

Layer Nomralization を入れる

Layer Nomralization を入れると 5e-4 や 1e-3 のような大きな学習率を指定しないと学習が進まない。ほかの人ハイパーパラメータを参考にする場合には Layer Normalization の有無は重要になる。

学習率を小さくする

小さい学習率(5e-6 程度)は学習に時間がかかる。

mish

2022 年現在で最も高性能な活性化関数の一つ。AUTOMATIC1111 の実装では ReLU と処理速度がほとんどかわらない。Dying ReLU 問題もないのでオプションの選択も自由。

Layer Normalization を有効にする場合は学習率を大きくする

Layer Nomralization を入れると 5e-4 や 1e-3 のような大きな学習率を指定しないと学習が進まない。

Wide VS Deep

デフォルト(1, 2, 1)は 20 枚程度の画像で学習させるのに向いている。

広いネットワーク(たとえば 1, 3, 1 や 1, 4, 1)は新しい概念(人・物・動物)を学習させるのに向いている。

深いネットワーク(たとえば 1, 1.5, 1.5, 1 や 1, 2, 2, 1)は画風を学習させるのに向いている。

深くて広いネットワーク(たとえば 1, 2, 4, 2, 1)は学習に時間がかかり、過学習を起こしやすいのでよくない。

ファイルサイズは数字の合計で決まる。1, 3, 1 と 1, 1.5, 1.5 ,1 は同じファイルサイズになる。層が深いネットワークほど学習に時間がかかる。層が深いと勾配消失の影響があるので学習率を大きくする必要がある。

画風学習用の設定例
  • 1, 1.5, 1.5, 1.5, 1 - Softsign - Xavier init - Dropout - 5e-6:20000, 5e-7
  • 1, 1.5, 1.5, 1.5, 1 - Mish - Xavier init - 5e-5:1500, 5e-6:9000, 5e-8
  • 1, 1.5, 1.5, 1.5, 1 - Tanh - Normal init - 5e-6
タグファイルに名前を入れる
画風の場合

モデルがそのアーティスト名を認識していなくてもタグファイルにアーティスト名を入れるのは意味がある。学習後に Hypernetwork を適用して画像を作成する際に、プロンプトにそのアーティスト名を入れると画風がより固定される。

キャラ・オブジェクトの場合

キャラ・オブジェクトの場合でも、タグファイルにキャラ・オブジェクト名を入れる。学習後に Hypernetwork を適用して画像を作成する際に、プロンプトにその名前を入れると学習させたキャラ・オブジェクトを呼び出しやすくなる。

シェルで追記

タグファイルのあるフォルダに移動して以下のコマンドでファイルの末尾に任意の文字を追記できる。

# Powershellls *.txt|%{$filename = "$_"; Write-Output ((Get-Content "$filename")+", ここに追記したいタグを入れる") | Set-Content -Encoding Default "$filename"}
# Bashfor i in *.txt; do echo -n ", ここに追記したいタグを入れる" >> "$i"; done

Textual Inversion

Textual Inversion でやりがちなミス

以下のミスをするとプレビューが変化しない。

  1. プレビューのプロンプトに embedding 名を入れ忘れる
  2. Prompt template file に [name] を入れ忘れる

覚えてほしい特徴と覚えてほしくない特徴

覚えてほしい特徴は、embedding 作成時の Initialization Text に入れる。

覚えてほしくない特徴(white background や close-up など)は画像のタグファイルに書く。

パーツ学習の問題点

キャラの髪飾りを Textual Inversion で学習させたいとする。このとき、髪飾りだけの画像で学習すると応用が効かない。つまり髪飾り単体は描けるが、キャラと同時に出現させられない。

なので服や装飾品を学習させたいときは、キャラとセットで学習させる必要がある。そうすると 512x512 では解像度が足りなくなる。

Textual Inversion でネガティブな要素を学習させる

ネガティブプロンプトで指定できないネガティブな要素を学習させて、ネガティブプロンプトに指定する方法がある

Dreambooth

チューニングする予定のモデルで正則化画像を作る

正則化画像をよそから持ってくると、正則化画像もモデルが学んでしまう。つまりクラスプロンプトで使ったタグを使って画像を生成すると、出力される画像が正則化画像に似てしまう。

Preprocess(前処理)

Train タブの Preprocess image は画像を加工して、別のディレクトリに書き出す機能。

  • Source directory:画像の入ったディレクトリ
  • Destination directory:結果を出力するディレクトリ
  • Flip:左右反転した画像を出力する(私[dskjal]の見解では、左右非対称な特徴[髪型や服]を持つキャラを学習させたい場合は左右反転は使うべきではない)
  • Split into two:縦長や横長の画像の短辺を望ましい解像度に合うようにリサイズし、可能な限り交差する画像を2つ切り出す
  • Auto focal point crop:顔・輪郭・複雑さなどをもとにクロップする場所を自動で決める
  • Add caption:学習画像名にキャプションを含めるために BLIP モデルを使う
  • Use deepbooru for caption:--deepdanbooru オプションをつけて起動すると使える。学習画像と同じ名前のテキストファイルに Deepdanbooru を使ってタグを出力する
  • settings タブの Training で Shuffleing tags by ',' when create texts. にチェックを入れるとタグをシャッフルしてくれる

Auto focal point crop

  • Focal point face weight:影響率 58%:顔のある方向にクロップ位置を移動させる
  • Focal point entropy weight:影響率 10%:複雑な場所にクロップ位置を移動させる
  • Focal point edges weight:影響率 32%:輪郭抽出できる場所(コントラストが高かったり、フォーカスの当たっている場所)にクロップ位置を移動させる

画像加工ツール

Train タブの Preprocess images

画像サイズの調整や、Split oversized images into two で簡単な切り出しができる。Hypernetwork で画風を学習させるだけなら Use deepbooru for caption の出力が無加工で使える。

切り出し

WAIFU SQUARELIZERは顔を認識して切り出してくれる。

XnConvert は画像を 512x512 にするときに便利。

背景の除去

iOS16 以降で背景を切り抜ける。

Windows ならペイント3Dのマジック選択が使える。

anime-segmentation

イラストの背景除去が得意。DEMO 版

Anime Segmentationの導入

rembg

Remgbを使って画像から背景を削除してみた

ImageMagick

ImageMagick を使うと透過を白背景に変換できる。

Windows ではコマンドプロンプトから winget を使ってインストールできる。

winget install ImageMagick

Powershell からは使えないので cmd.exe から使う。

magick convert a.png -background white -flatten a.jpg

不要物の除去(Lama Cleaner

画像に含まれる不要物を違和感なく完全削除できる無料ツール「Lama Cleaner」のインストール手順&使い方まとめ

タグ削除ツール

以下の python スクリプトはテキストファイルに書かれた削除したいタグを読み込み、指定されたフォルダ内のテキストファイルからそのタグを削除する。

使い方

  1. テキストファイルにカンマ区切りで削除したいタグを入力する。たとえばこれを ng.txt とする。例:hair over one eye, green eyes, blue eyes, brown hair
  2. スクリプトを実行する
    python ./remove_tag.py [タグファイルのあるフォルダパス(例:C:/.../train_data)] [削除したいタグが書かれたテキストファイルのパス(例:C:/.../ng.txt)]
#!/usr/bin/env python# -*- coding: utf-8 -*-# python ./remove_ng.py [image folder path] [the path of ng.txt]import glob, sysng_path = sys.argv[2]# read ng listwith open(ng_path, 'r') as f:    ngs= [x.strip() for x in f.read().split(',')]files = glob.glob(sys.argv[1] + "/*.txt")if ng_path in files:    # to prevent ng.txt is emptied if ng.txt is in image folder.    files.remove(ng_path)for file in files:    with open(file, 'r') as f:        print("processing {}".format(f))        tags = [x.strip() for x in f.read().split(',')]        tags = list(filter(lambda x: not x in ngs, tags))        tags = ", ".join(tags)    with open(file, 'w') as f:        f.writelines(tags)

学習テクニック

失敗するまで学習させる方法

Hypernetwork を学習するときに、学習率 0.000005(5e-6)からはじめて、失敗したら一度学習をストップさせる。次に学習させたものの中から上手くいっているものを選択して、より低い学習率(たとえば 0.0000005(5e-7))で学習を継続する方法がある。

Learning rate scheduling

Learning rate に以下のように入力すると、2,000 ステップまでは 5e-6、10,000 ステップまでは 5e-7、終了まで 5e-8 の学習率で学習する。

5e-6:2000, 5e-7:10000, 5e-8

焼きなまし法(annealing)

以下のように学習率を上げたり下げたりする。こうすることで局所的最適解から抜け出せる可能性がある。

5e-5:100, 5e-6:1500, 5e-7:2000, 5e-5:2100, 5e-7:3000, 5e-5:3100, 5e-7:4000, 5e-5:4100, 5e-7:5000, 5e-5:5100, 5e-7:6000, 5e-5:6100, 5e-7:7000, 5e-5:7100, 5e-7:8000, 5e-5:8100, 5e-7:9000, 5e-5:9100, 5e-7:10000, 5e-6:10100, 5e-8:11000, 5e-6:11100, 5e-8:12000, 5e-6:12100, 5e-8:13000, 5e-6:13100, 5e-8:14000, 5e-6:14100, 5e-8:15000, 5e-6:15100, 5e-8:16000, 5e-6:16100, 5e-8:17000, 5e-6:17100, 5e-8:18000, 5e-6:18100, 5e-8:19000, 5e-6:19100, 5e-8:20000

学習データ(Textual Inversion)

Train タブの Preprocess images の Use deepbooru for caption を使えば、タグをテキストファイルに書き出してくれる。画風を学習させる場合、この出力フォルダを Train の Dataset directory に指定するだけで準備は完了する。これを使うには --deepdanbooru オプションをつけて起動する必要がある。

Textual Inversion でキャラを学習させる場合のタグ

学習させたい特徴は embedding 作成時の Initialization Text に入れる。学習してほしくない特徴(white background や close-up など)は画像のタグファイルに書く。

Textual Inversion の学習は雑に説明すると以下のようなステップになる。

  1. 指定されたプロンプト(styles.txt などで指定)で画像を生成する。
  2. 生成した画像と学習用画像とを比較して差異を計測
  3. 計測した差異を元に語のウェイトを調整。Hypernetwork の場合はプロンプト全体を調整

ここで重要なポイントは学習させたい特徴はタグに含めてはいけないということだ。言い換えるとタグに含めるのは学習してほしくない特徴

たとえば白髪赤目センター分けショートヘアーの c1 というキャラの顔を学習させるとしよう。学習させたいタグは red eyes, white hair, parted bangs, short hair 。なのでこれを Initialization Text に入れる。すると c1 の初期特徴ベクトルは red eyes, white hair, parted bangs, short hair を合成したものになる。

そして画像のタグファイルに red eyes, white hair, parted bangs, short hair を含めてはいけない。なぜならそれらの特徴を c1 という語に関連付けさせたいからだ。

ランドセルを学習させたい場合

Danbooru タグの randoseru は効果がないので、効果のあるタグを Initialization Text に指定する。たとえば red latex leather backpack。Textual Inversion ではこの red latex leather backpack をスタート地点として、教師画像から特徴を学ぶ。

キャラを学習させる場合のタグ決定アルゴリズム

  1. 覚えさせたい特徴のタグをメモ帳などに列挙する
  2. Use deepbooru for caption で画像にタグをつける
  3. 2. の中で画像と無関係なタグを削除する
  4. 2. で付けたタグから 1. で列挙したタグを削除する

画風を学習させる場合のタグ(Textual Inversion・Hypernet)

Use deepbooru for caption でタグをつけた後、画像と無関係なタグを除去するだけだ。

CLIP Aesthetic

インストール

以下のコマンドを実行する。

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients extensions/aesthetic-gradients

使い方

embedding を models/aesthetic_embeddings 入れると、txt2img タブの Open for Clip Aesthetic で設定できる。

サンプルファイルが vicgalle/stable-diffusion-aesthetic-gradients/aesthetic_embeddings からダウンロードできる。サンプルの作例は vicgalle/stable-diffusion-aesthetic-gradients で見れる。

Aesthetic steps

最適化ステップの実行回数。2や3ぐらいから始めて少しずつ大きくしていく。大きくするほど embedding の影響が強くなる。

Aesthetic learning rate

最適化の学習率。デフォルトの 0.0001 から動かす必要はない。

外部リンク

Using Aesthetic Images Embeddings to improve Dreambooth or TI results #3350

【NovelAI】开源的WebUI即将引入重磅更新,大幅提升图像品质

VAE の埋め込み

StableDiffusionのcheckpointに任意のVAEをマージする

[実装付き]Stable Diffusionの追加学習に適する画像を、VAEを利用して選別する

その他の情報

デフォルトの状態で戦車の画像が出せない場合、Textual Inversion や Hypernetwork を調整しても戦車は出力できない。しかし Dreambooth や追加学習なら新たに戦車の画像を学習させられるので、戦車の画像が出力できる。

sd ldm
概念図
ti training
Textual Inversion の概念図
出典:An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion(https://textual-inversion.github.io/)

より詳細な図

DreamBooth と Textual Inversion との比較

Textual Inversion

Textual Inversion の論文によると、学習画像は5枚までがよいとのことだが、74 枚使った方が結果がよかった。

学習は 25,000 ステップまでにしておかないと、キャラが崩壊してくる。

Dreambooth

プロンプトの指示でキャラクターが編集しやすくなり、構図もよい。しかし画風への対応力がいまいち。

画像3枚の学習の方が 72 枚使った時よりよかった。

1,000 ステップ(A6000 で 30 分かからない)の学習で十分。

外部リンク

22/09/26 Stable Diffusion追加学習の記録

Textual Inversion versus Dreambooth

Textual Inversion

Textual Inversion も Hypernetwork も Aesthetic Gradients もデフォルトの状態で出せないような絵は出力できない

DreamBooth と Textual Inversion との比較ではステップ数は 25,000 程度と書かれているが、100,000 ステップまで学習させても問題ないことも多い。

An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion

プロンプトはまずトークンの集合に変換される。次にそれぞれのトークンが固有の埋め込みベクトル(embedding vector)に変換される。この埋め込みベクトルが下流のネットワークへ入力される。

Textual Inversion はテキストエンコーダーに、新しいトークンと新しい埋め込みベクトルとを挿入し、挿入された埋め込みベクトルを調整する。

Stable Diffusion with Aesthetic Gradients

Custom Styles in Stable Diffusion, Without Retraining or High Computing Resources

.pt ファイルの結合

rinongal/textual_inversion の merge_embeddings.py を使う。

ベクトル埋め込みの最適化によるアイデンティティを保ったキャラクター生成

通常の Textual Inversion では Initialization text で embedding を初期化する。この記事では複数の画像を embedding に変換してその平均を初期 embedding とする。

解説リンク

Google Colab ではじめる Textual Inversion

How to Fine-tune Stable Diffusion using Textual Inversion では手動(Python)で TI を行う方法を解説している。

[Tutorial] "Fine Tuning" Stable Diffusion using only 5 Images Using Textual Inversion.

--RETARD'S GUIDE TO TEXTUAL INVERSION--

Stable-textual-inversion_win

Invoke AI

キャラやオブジェクトと語彙とを同時に追加する(Dreambooth)

Dreambooth は Textual Inversion や Hypernetwork と違い、学習に使ったキャラ・オブジェクトを直接呼び出せる。

GPU で実行する

AUTOMATIC1111 で Dreambooth を動かす PR

Ttl/diffusers

DeepSpeed を使うことで VRAM8GB で動作する。ただし RAM を 25 GB使う。

ShivamShrirao/diffusers

VRAM 10 GB でローカル実行できる。ただし Adam 8 bit。精度を上げるには VRAM 16 GB 以上が必要。

Colab

dreambooth-gui

VRAM 10 GB でローカル実行できる。GUI 付き。

画像生成AI「Stable Diffusion」にたった数枚のイラストから絵柄や画風を追加学習できる「Dream Booth」が簡単に使える「Dreambooth Gui」レビュー

NMKD

VRAM 24 GB でローカル実行できる。GUI 付き。

fast-dreambooth-colab

12GB の VRAM で実行できる 。

Colab

Dreambooth-Stable-Diffusion-cpu

CPU で実行できる Dreambooth。推奨メモリ量は 32 GB 以上。Ryzen 3900X 3.6 GHz, メモリ 48 GB のマシンで 500 step の学習に7時間程度かかったらしい。

diffusers to ckpt

convert_original_stable_diffusion_to_diffusers.py

jachiam/convert_diffusers_to_sd.py

Made a Hugginface Dreambooth models to .ckpt conversion script that needs testing

外部リンク

DiffusersベースでStableDiffusionのモデル(U-Net+Text Encoder)をfine-tuningする

DiffusersベースのDreamBoothの精度をさらに上げる(Windows対応)

Diffusers版DreamboothをVRAM 8GBのWindowsで無理矢理動かす

Diffusers版DreamboothをVRAM 12GBのWindows PCで動かす

DreamBooth Stable Diffusion を試す

VRAM 8 GB で Dreambooth を実行する。不要なデータを RAM に退避させるのでメモリは 25 GB 以上必要になる。

Diffusers版Dreamboothを変更して精度を上げる(Text Encoderを学習対象とする)

[資料]DreamBoothのstepごとの学習結果

AIで特定キャラを描く(DreamBoothで追加学習)(Google Colab)

DreamBooth Stable Diffusion training in 10 GB VRAM, using xformers, 8bit adam, gradient checkpointing and caching latents.

Colab で Dreambooth

Stable Diffusion Dreambooth Concepts Library

Installing Stable Diffusion & Dreambooth for Windows(RTX A5000 24GB VRAM)

Imagic

Imagic は画像1枚とプロンプトとを使って拡散モデル自体をファインチューンして、画像の差分を生成する。Imagic 自体は Embedding と拡散モデル自体とを出力する。学習に使った画像とプロンプトを、Imagic が出力した Embedding と拡散モデルとに入力すると、プロンプト通りの画像が生成される。

imagic example
出典:https://github.com/justinpinkney/stable-diffusion/blob/main/notebooks/imagic.ipynb

外部リンク

Imagicを理解する

原論文

追加学習

Stable Diffusionを「いらすとや」で追加学習する

Waifu diffusionの追加学習をColabのT4で行う。(使用VRAM13.6GB)※dreamboothじゃないよ

Waifu diffusion式の追加学習のやり方。(VRAM14GB~)(12.2GB~?)

U-Net のチューニング

DiffusersベースでStable Diffusionをfine tuningする

外部リンク

第3回 ディープラーニング最速入門 ― 仕組み理解×初実装(後編)

Inside of Deep Learning (ディープラーニングの性能改善手法 一覧)


広告
広告