Stable DiffusionのU-Netでブロックごとに異なるプロンプトを与えて画像生成する(ブロック別プロンプト)

はじめに

※1/10追記:コメントでご指摘いただきましたが、キャプションが有効(CrossAttentionが存在する)なのはblock 1, 2, 4, 5, 7, 8, 12, 16 ~ 24です。他のblockのキャプションは無視されます。確認が足らず失礼いたしました。
ご指摘いただいたgcem156氏に感謝します。

U-Netの構造については以前の記事に書きました。

U-NetはText Encoderからの出力を受け取り、それに沿うように(プロンプトを再現するように)画像生成を行いますが、Text Encoderの出力はU-Netのブロックそれぞれに渡されます。つまり25個のブロックそれぞれで受け取っていることになります。

通常はそれぞれが同じプロンプトの情報(conditioning)を受け取りますが、別々にすることも可能ではないか、ということで試してみたのがこの記事になります。

スクリプト

Automatic1111氏のWeb UIのscriptとして作成してあります。以下のファイルをWeb UIをインストールしたフォルダのscriptsフォルダに置いてください。

Web UIを再起動すると、画面左下のScriptの箇所のドロップダウンから「Prompts for each U-Net block」が選べるはずですのでそれを選んでください。

制限事項

  • 1枚ずつの生成にしか対応していません。バッチ生成、一括生成はできません。

  • スケジュール付きのプロンプト(「(red:blue:5)」のような記法)、AND記法には対応していません。

使用法

左側のEnableのチェックボックスにチェックすると有効になります。それぞれのブロックに渡すプロンプトをCSVファイルで記述し、そのファイルのフルパス(フォルダ名を含む)を右側のテキストボックスに入力します。ファイル名の先頭と末尾に「"」が付いていると自動的に削除されます。

※エクスプローラーでShiftキーを押しながらファイルを右クリックすると「パスのコピー」という選択がありますので、それを使うと便利です。

あとは「Generate」ボタンで生成してください。

Web UIのプロンプト欄は無視されます(画像のファイル名になりますので適当にメモを記入すると良いようです)。

CSVのサンプルファイルは以下になります。

CSVの内容は以下のようになります。

this is comment,,
0,"1girl, smile, glasses, blue hair, earrings, detailed 8k wallpaper","lowres, bad anatomy, bad hands, error, missing fingers, cropped, worst quality, low quality, normal quality, jpeg artifacts, blurry"
1,"1girl, smile, glasses, blue hair, earrings, detailed 8k wallpaper",
2,"1girl, smile, glasses, blue hair, earrings, detailed 8k wallpaper",
3,"1girl, smile, glasses, blue hair, earrings, detailed 8k wallpaper",
.
.
.

最初の列はブロックのIDで0~24です。二番目の列はpositive prompt、三番目の列はnegative promptです。
promptとnegative promptは省略すると前のブロックと同じになります。上のサンプルはすべて同じnegative promptを使う例です。
最初の列に数字以外を書くと無視されますのでコメントとして使用できます。

Officeソフトで開くと次のような感じになります。

LibreOfficeで開いた

以下のように必要なブロックだけ記述しても構いません。0~12と13~24でそれぞれのプロンプトが使用されます。

this is comment,,
0,"1girl, smile, glasses, blue hair, earrings, detailed 8k wallpaper","lowres, bad anatomy, bad hands, error, missing fingers, cropped, worst quality, low quality, normal quality, jpeg artifacts, blurry"
13,"1girl, standing along on beach,upper body, looking back",

生成時、Web UIのコンソールウィンドウに実際に使用されたプロンプトが表示されますのでそちらで確認できます。

生成結果

適当ですが画像のディテールと構図をそれぞれ浅いブロックと深いブロック、INブロックとOUTブロックに配置して生成してみました。CSVファイルもそれぞれ添付します。

ディテールのプロンプトは「1girl, smile, glasses, blue hair, earrings, detailed 8k wallpaper」、構図は「1girl, standing along on beach,upper body, looking back」としました。

モデルはwd-v1-3を使いました。生成条件は以下になります。

Steps: 40, Sampler: Euler a, CFG scale: 7, Seed: 1, Size: 512x512, Model hash: 84692140

通常の生成では以下の通りです。

1girl, smile, glasses, blue hair, earrings, detailed 8k wallpaper
Negative prompt: lowres, bad anatomy, bad hands, error, missing fingers, cropped, worst quality, low quality, normal quality, jpeg artifacts, blurry
1girl, standing along on beach,upper body, looking back
Negative prompt: lowres, bad anatomy, bad hands, error, missing fingers, cropped, worst quality, low quality, normal quality, jpeg artifacts, blurry

浅い層にディテール

わりと予想通り

CSVファイルは先に添付したものです。

浅い層に構図

イヤリングだけ生きてる

IN側にディテール

眼鏡や髪の色、イヤリングが全く無視された

IN側に構図

おおむね残っている

おわりに

たしかに何らかの効果はあるようですが、正直なところ、なんとも私では判断できない結果になりました……。

先のブロック別の重み付きマージはいろいろな方により研究が進み、利用されているようですので(ありがとうございます)、このブロック別プロンプトも何らかの活用法が見つかることを期待しています。

またWeb UIのscriptとしては本当に必要最低限の機能しかありませんので、どなたかがより使いやすくして頂ければと思います。
(スクリプトは自由に改変、再配布等していただいて構いません。)

この記事が気に入ったらサポートをしてみませんか?