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

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などの深い層は全体に対して影響を持つと考えられます。

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

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

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