Stable Diffusionの階層マージのやり方:初心者向けハウツー
前回、AUTOMATIC 1111を用いて「単純マージ」でStable Diffusionのオリジナルモデルを作成する方法を紹介しましたが、今回は「階層マージ」を使ったマージ方法を紹介し、あなたをマージ沼に招待していきたいと思います。
Introduction
Stable Diffusionのマージは、複数のモデルを掛け合わせて新しいモデルを作り出すことを指しています。階層マージはその中でもモデルが持つ特徴を層として捉え、それぞれの層をどの濃度で掛け合わせるのかを調整することでより求めているモデルを生み出しやすくするマージ方法です。
例えば背景の描画に特化したモデルと、人物描画に特化したモデルを掛け合わせる際に前者からは背景に関連する層を多く取り込むよう調整することで背景に強く人物描画にも強いモデルを生み出せるようになります。
つまり、階層マージを学べばこれまで以上に好みを濃縮させたオリジナルのモデルを作成出来るようになります。(階層マージに手を出した人の中には画像生成よりもモデル生成ばかりやるようになった人も数多く......)
この記事ではそんなマージ沼に引き込むべく下記を想定読者としています。
- Stable Diffusionでオリジナルモデルを錬成したい人
- 階層マージが何を表しているのか分からない人
階層マージの基本概念
Stable Diffusionの構成
いきなり階層マージのやり方を学ぶ前に、まずStable Diffusionの構成を簡単に押さえておきましょう。
Stable Diffusionは大まかに以下のパーツで成り立っています。
- Text-Encoder
- Autoencoder (VAE)
- U-Net
Text-Encoderでプロンプトを解釈し、VAEを経由してU-Netへその情報が送られ、またVAEを通して最終的な画像になるというざっくりの理解で構いません。(私自身もそうなんだ程度の理解です)
下記の記事はより詳細な解説記事です。
階層マージとU-Net
U-Netは下記のようにU字型でインプット/基底部/アウトプットでイメージされます。このように層のような情報を蓄積しているものが、私たちが求めているモデルというファイルの姿です。
さて、階層マージはMBWという略称で記載されることが多いのですがMerge Block Weightedの略称です。ブロック毎に重み付けをして複数のモデルをマージする、という意味です。
図ではシンプルに描かれていますが階層マージの際にはU-Netを12層のインプット、1層の基底部、12層のアウトプットで合計25層として扱います。
U-Netの各層が司る領域
各階層が画像を生成する際に関係している領域はある程度、有志によって特定されています。
上記の図は一般的なモデルに対して、全てを灰色で出力するモデルを層別に0.5の重みでマージしたものです。基底部に近いほど色彩や構図など全体的な部分に影響し、浅い層ほど手などの局所的な特徴を左右すると言われています。
このように私たちは階層マージをするにあたり各層の影響する領域を考慮しながらそれぞれのモデルを掛け合わせていくことになります。
U-Netの各層が司る領域の画像出典元
AUTOMATIC 1111版で階層マージを実践する
拡張機能「sd-webui-supermerger」を導入する
階層マージを行う方法はいくつかあるのですが、今回はhako-mikan/sd-webui-supermergerを使用した階層マージを紹介します。
この拡張機能はAbyssOrangeMixなど著名なモデルのマージ作業でも使用されているものです。標準機能を使用したマージでは毎回モデルが生成されてしまうのですが、この拡張機能ではモデルを保存することなく複数マージを行い画像生成をして比較をすることができます。
拡張機能の導入方法は一般的な拡張機能と変わらないため割愛します。
sd-webui-supermergerの画面説明
インストールが完了するとタブに「SuperMerger」が現れます。基本的にマージ操作はすべてここで行っていきます。
画面項目について説明していきます。奥が深すぎる世界のため、よく使用する項目のみ触れます。やり方だけ知りたい方は飛ばしても大丈夫です。
生成される画像はtxt2imgの設定を参照するため、マージを実行する前に試したいプロンプトなどを設定しておきましょう。
Model A,B,C
マージに使用するモデルの選択欄。
- マージしたいモデルをAとBに設定する。
Merge Mode
マージ方法の選択欄。
- 今回はWight sumを使う
- Wight sum:今回使用する方法。単純に2つのモデルに重みづけを行う方法。
- Add difference:Wight sumと比較して、B単体の代わりにBとCの差分を用いる方法。
- Triple sum, Twice sum:数式見て想像してください。よほど理解していないと使いません。
use MBW
- use MBW:階層マージを行う場合に選択
- alpha:Merge Modeに関連して重みづけに使用する値
- beta:alphaと同様
Merge!, Merge&Gen, Gen
- Merge!:マージのみ実行するボタン、生成したモデルを補完する場合に使用
- Merge&Gen:マージして画像も生成するボタン、今回は使用しない
- Gen:最後にマージした生成したモデルで画像を生成するボタン、今回は使用しない
save setting
マージしたモデルの保存方法に関する設定。
- save model:Merge!ボタンでマージしたモデルを保存したい時に使用、一旦は保存せずに比較するためチェックを外す
- overwrite:保存先に同名のモデルが存在する場合に上書きする際に使用
- safetensors:モデルのファイル形式としてsafetensorsにしたい場合に使用、自身で追加学習など行わないのなら容量的にチェックを入れた方が良い
- fp16:浮動小数点を節約した形式で保存する場合に使用、ほとんど誤差のような違いとなるため容量的にチェックを入れた方が良い
write merged model ID to
画像生成時にモデル別のID情報をどこに保存するかの設定。
- image:生成した画像上にIDを書き込む
- PNG info:PNG ファイルの中にデータとして持たせる
Custom Name
モデルを保存する際の名前。
merge from ID
マージを試すごとに発行される履歴IDを設定する。
いざ気に入ったマージ方法で保存する際に使用し、マージを試す段階では「-1」のままで良い。
Set from ID(-1 for last)
「merge from ID」で指定した履歴IDのマージ設定を次のマージ設定に自動で設定する。
次のマージ設定とは「Merge!」を押下した際のマージ設定を指す。
hiresfix
画像生成時のhires fix設定。fixした画像で比較したい場合は使用するが、当然処理時間が増えていく。
Elemental Merge
階層マージは合計25層で行うと書きましたが、各層の中にもまた層が実はあります。
層の中の層に対しての階層マージ設定をここで行えますが、人間の処理能力を超えているためあまり実用的ではありません。
X type
基本はX/Y/Z plotと同じ。
XをSeedとすることでモデル別に異なるシード値を与えることができます。
- number of -1:X 軸の数
- Sequential Merge Parameters:カンマ区切りで、X軸別に与える値を設定する。X typeをシード値とした場合「-1,-1」とすればランダムに2つのシード値を試行する
Y type
基本はX/Y/Z plotと同じ。
階層マージを行う場合、基本的には「mbw alpha」を選択する。
これによりマージの際の重みづけを色々試しながら比較を行うことができる。
- Y grid:試す重みづけを羅列する。カンマ区切りではなく改行で区切る点に注意
Sequential XY Merge and Generation
- Sequential XY Merge and Generation:XYの設定を元に連続マージを実行する
- Stop XY:マージ作業を停止する
- Reserve XY Plot:予約したマージを行う(使わないのでよく分からず)
Weights Setting / Weights Presets / Reservation
-
Weights Setting:階層マージにおける重みづけを設定する
- Add weights to Sequence X:重みづけ値をX軸に追加する
- weights for alpha, ..... OUT11:alphaとして与える各層の重みづけをカンマ区切りで設定する
-
Weights Presets:プリセットとして定義された重みづけの名称とその詳細値の一覧
-
Reservation:マージ内容を予約する(使わないのでよく分からず)
実際に階層マージしてみる
Weights Presetsの「available」の中からいくつかプリセットを選びます。
今回は試しに下記のプリセットで比較してみます。
- FLAT_75
- WRAP08
- COSINE
- TRUE_CUBIC_HERMITE
それぞれのマージ結果で画像を1枚生成して比較したいので、X typeはseedを選択して-1を1つだけ設定します。
上記で選定したプリセットで階層マージを比較したいので、Y typeはmbw alphaを選択してプリセット名を改行しながら設定します。この時、プリセットではなく試したい重みづけがあればカンマ区切りでその設定を設定することも可能です。
「Sequential XY Merge and Generation」ボタンを押下することで、マージと画像生成が開始となります。
出来上がった比較画像
サンプル画像では忘れてしまったのですが「write merged model ID to」にて「image」にチェックを入れていると生成された画像にIDが記載されるようになります。
同じプロンプト、同じシード値を与えていますが絵柄など細かい点が変化していることが分かります。階層マージによって生成されたモデル別に特徴が混ざりあっていることが分かりますね。
今回は4つのプリセットだけで試しましたが、私自身がよくやる比較は全てのプリセットを列挙し、シード値を2つ与えて気に入ったものを残し、再度マージしなおして選別してを繰り返す蟲毒方式です。最後の方はシード数を増やして絵柄や破綻しやすさだとか、構図のクセを見ながら絞り込みます。
階層マージに使用したモデル
気に入ったマージを保存する
階層マージを繰り返す中で気に入ったマージ設定を見つけたら次はモデルの保存です。
生成画像のIDを控えておくか、Historyタブから履歴を確認するなどしてマージ履歴IDを探します。
IDを見つけたら「-1」になっている「merge from ID」にIDを設定し、「Set from ID(-1 for last)」ボタンを押下します。
するとIDからマージ設定を各項目に自動で反映してくれます。
「save settings」で保存したい形式になっていることを確認したら「Merge!」ボタンを押下します。
これでモデルの保存は完了です。
モデルの保存場所
モデルを通常保管しているフォルダに保存されます。
Docker版を使用している場合stable-diffusion-webui-docker\data\models\Stable-diffusion
となります。
マージ履歴情報の保存場所
Docker版を使用している場合stable-diffusion-webui-docker\data\config\auto\extensions\sd-webui-supermerger\mergehistory.csv
となります。
まとめ
- モデルは U-Net という仕組みの中で階層別に特徴を持っている
- 階層マージはその階層の濃度を調整しながらマージする手法
- 使いこなせば各モデルの良いとこどりが出来る
参考にした解説は下記です、感謝します。