U-Net階層別マージでモデルを混ぜる方法と各階層の画像への影響を解説(WebUI 1111用)

U-Net層別マージ 導入方法&各層の 画像への影響まとめ ソフトウェア

どこよりも丁寧に画像付きで解説。Stable Diffusion web UI(AUTOMATIC1111)の拡張機能タブ(Extension)から「Merge Block Weighted GUI」を用いて、各種設定項目の意味と設定方法層別マージの出力画像への影響をU-Net層ごとにまとめました。

層別マージは複雑なため、モデルマージ初心者はただのマージから始めるのがおすすめです。

チェック!!
さくいん! 本サイトのAI関連記事まとめ どれから見れば良いのか?!


数十記事ある本サイトのAI関連記事を体系的にまとめました。

目的別にどれから見れば良いのかわかります!!

AI記事索引ページはコチラ

1,まずMerge Block Weighted GUIをインストール

https://github.com/bbc-mc/sdweb-merge-block-weighted-gui

コチラを参考にながら上記URLを使って「Merge Block Weighted GUI」をインストールします。

このようになればインストールできています。

拡張機能をインストールしたらWebUIを再起動しましょう。

2,Merge Block Weightedの各種設定項目解説

Merge Block Weightedには旧バージョンの「MBW」タブと、新バージョンの「MBW Each」があります。

各層の値をモデル別に設定できる新バージョン「MBW Each」の設定項目をここでは解説しています。基本みんな新しい方を使うと思うので。

Model A/Model B Output Model Name

Model A/Model Bで混ぜたい2つのモデルを選択します。

Output Model Nameで完成したマージモデルの保存名を設定します。

IN00~IN11/OUT11~OUT00/M00

  • 「INxx」は入力ブロックで全12ブロックあります
  • 「OUTxx」は出力ブロックで、同様に全12ブロックあります
  • 00層が一番浅い層で、11が一番深い層です
  • 「M00」は中間ブロックで1ブロックだけあります

基本的に上記の値を色々変えてモデルを混ぜていくのが階層別マージです。
Model A/Model Bの割合を各層ごとに指定できます。

下のような図でよくU-Net層が説明されています。

左側の緑色がIN(入力)ブロック、オレンジ色中央がM(中間)ブロック、右側の赤色がOUT(出力)ブロックです。

https://pub.towardsai.net/getting-started-with-stable-diffusion-f343639e4931

図解するとアルファベットのUの字のようにブロックが位置するのでU-Netと呼ばれます。

各U-Net層の具体的な出力画像への影響などは後述します。

Preset Weights

階層別マージは奥が深すぎるので、各層のマージ比率の代表例がプリセットとしていくつか与えられています。

まずはプリセットを用いてマージ比率を設定するのが良いでしょう。

例えば「GRAD_A」を選択すると、このようにマージします。

Weight values

マージ比率は以下のような数値の羅列でも設定できます。

0,0.0833333333,0.1666666667,0.25,0.3333333333,0.4166666667,0.5,0.5833333333,0.6666666667,0.75,0.8333333333,0.9166666667,1.0,0.9166666667,0.8333333333,0.75,0.6666666667,0.5833333333,0.5,0.4166666667,0.3333333333,0.25,0.1666666667,0.0833333333,0

数値は以下のようにModel B側の各層の値を、IN→M→OUT順で記載します。

IN_B_00,IN_B_01,IN_B_02,......,IN_B_11,M_B_00,OUT_B_00,......,OUT_B_11

各層のマージ比率を簡単に共有できるようになっているんですね。

数値の羅列で設定する際は「Apply block weight from text」ボタンを押します。

base_alpha

base_alphaの意味
0マージされたモデルはModel_Aのエンコーダー(Text Encoder、Auto Encoder) を100%使用
1マージされたモデルはModel_Bのエンコーダー(Text Encoder、Auto Encoder) を100%使用

verbose console output/Allow overwrite output-model

  • verbose console output:詳細な情報をコンソールに出力
  • Allow overwrite output-model:同名のモデルファイルの上書きを許可

Save as half/Save as safetensors

  • Save as half:fp16精度でモデルを保存。基本チェックを入れます
  • Save as safetensors:ckptファイルでなくsafetensorsファイルとしてモデルを保存。基本チェックを入れます

Skip/Reset CLIP position_ids

CLIP内のIDの位置をどうするか?

つまり入力したプロンプト(トークン)を埋め込みベクトルに変換する際の位置設定でしょうか?

選択肢設定の意味
None通常のマージ同様何もしません
Skipposition_ids値をスキップしModel_Aの値を使用して効果を出します←????
Force Resetposition_ids値を tensor([[range(77)]]) に置き換えます

私の英語力ではSkipの説明が訳分からんことになってるので原文載せときます。
Skip position_ids key to eject effect. Value of Model A used.

3,階層別マージによるU-Net層ごとの出力画像への影響まとめ

例によって全てが手探りの沼ですが、検証を行った有志により得られた知見まとめました。

検証自体は多数行われているので、いくつか代表的なものを踏まえてまとめます。

スレ、Discordや私自身の試行錯誤により得られた知見も含め、以下のように特徴がまとまりました。
あくまで雰囲気というか主観評価であるため諸々ご了承ください。

U-Net層ごとの画像への影響まとめ(考察)

影響範囲影響箇所
IN00ごく一部手や指
IN01ごく一部手や指、髪?
IN02ごく一部手や指、色調
IN03ごく一部手や指
IN04ある程度限定構図
IN05ある程度限定構図
IN06ある程度限定構図
IN07ある程度限定構図
IN08ある程度限定構図
IN09画像全体色彩や塗り
IN10画像全体色彩や塗り
IN11画像全体色彩や塗り
M00画像全体大まかに全体?
影響範囲影響箇所
OUT00ごく一部手や指?
OUT01ごく一部手や指
OUT02ごく一部手や指
OUT03ある程度限定身体?
OUT04ある程度限定
OUT05ある程度限定
OUT06ある程度限定顔(影響弱)
OUT07ある程度限定顔(影響弱)
OUT08ある程度限定身体?
OUT09ある程度限定身体?
OUT10画像全体色彩や塗り
OUT11画像全体色彩や塗り

M00は大まかな全体への影響を持つと推測されていますが、正直よくわからないです。。。

IN層・OUT層ともに00などの浅い層は細部11などの深い層は全体に対して影響を持つと考えられます。

追記:詳細な検証記事noteにありました。とても参考になります。

複雑に感じた方はまず普通のマージから始めるのも手です。

主要なモデル一覧や、DreamBoothにおすすめのグラボなど関連記事もご覧ください

タイトルとURLをコピーしました