Stable Diffusionで複数人別々にプロンプトとポーズを指定する
Stable Diffusionで2人組(または複数人)で 以下の要求を持ってる人向けのメモ。
- 複数人別々にプロンプトを指定したい。
- 複数人全員にポーズを指定したい。
Stable Diffusion web UIの基礎的な解説はしないのでそのつもりで。
概要
何を隠そう、私の性癖は『複数の女の娘に見つめられること』である。 つよつよ新PCならStable Diffusionが使えると聞いて喜び勇んで使ってみたのだが、 複数人の女の娘に見つめてもらえるようになるまで、結構ハードルが高かった…。 ので、同じことに悩んでる人向けの助けになればと思って書くのがこの記事である。
以下のステップで進める。
- Regional Prompterで複数人それぞれにプロンプトを適用
- ControlNetでポーズを指定
- Regional PrompterとControlNetの組み合わせ
ステップ1とステップ2をそれぞれ解説してる記事はネットにいっぱいあるのだが、 ステップ3までやってる記事が見つからなかった。本記事はそれを解説する。
1. Regional Prompterで複数人それぞれにプロンプトを適用
複数人それぞれにプロンプトを適用するには、 Regional Prompter という拡張機能を使う必要がある (機能改善前はLatent Coupleという名前だった)。 これは、描画領域を 縦 or 横 に分割して、各領域ごとにプロンプトを適用する機能である。
拡張機能のインストール方法などは 先達の方の記事 が詳しいので、それを見て欲しい。 まぁ、ExtensionタブからGitHubのURLを指定してインストールするだけだよ。簡単❗
うまくインストールできれば、 『txt2img』タブの下のほうに『Regional Prompter』のタブができているはず。
早速使ってみよう。
- 『Active』にチェック
- 『Generation mode』が『Attension』(デフォルト)になってることを確認
- 『Use base prompt』にチェック(デフォルト)が入ってることを確認
- 『Use common prompt』はチェックが入ってなくて良い。後で使う。
- 『Use common negative prompt』もチェック不要。こっちは使ったことない。
- 『Matrix』タブで、『Split mode』を『Horizontal』にチェック(デフォルト)
- 『Divide Ratio』が
1,1
になっていることを確認
これで設定完了。 ちなみに、『visualize and make template』ボタンを押すと、 領域がどのように分割されるのか画像で確認できる。
あとはプロンプトを↓のように指定する。 ここでは試しに、赤髪ショートの女の娘と青髪ロングの女の娘の二人組を生成しようとしてみる。
2girls, multiple_girls, indoor,
ADDBASE
red_hair, short_hair,
ADDCOL
blue_hair, long_hair
で、生成したのが↓。狙い通りに生成できてるね❗ Regional Prompterなしで二人組を生成しようと悪戦苦闘してた人にはこれだけでも衝撃だと思う。私は衝撃だった。
プロンプトの解説をしよう。
キーワードは ADDBASE
と ADDCOL
。
どちらもただの区切り文字だと思えば良い。
プロンプト全体の最初から ADDBASE
までが1つのプロンプト群(ベースプロンプト)になる。
背景や全体の視点のプロンプトはここに配置すると良い。
2girls
と multiple girls
もここに配置するのが良さそう(経験則なので誤っている可能性あり)。
続いて、 ADDBASE
から ADDCOL
までのプロンプト群が画面左半分に描画する女の娘用。
最後に、 ADDCOL
から最後までのプロンプト群が画面右半分に描画する女の娘用。
これだけ❗簡単でしょう❓
ついでに、 ADDCOMM
も使えるようになろう。
これを使うと各プロンプト群に共通するプロンプトをまとめて書ける。
masterpiece
などのいわゆる画質向上呪文はここに配置すると良い。
使い方としては、まず、Regional Prompterの設定で、『Use common prompt』にチェックを入れる。 続いて、↓のようにプロンプトを記述する。
masterpiece, best_quality, 2girls, multiple girls,
ADDCOMM
indoor,
ADDBASE
red_hair, short_hair,
ADDCOL
blue_hair, long_hair
生成結果が↓。画質向上したね❗
プロンプト全体の最初から ADDCOMM
までのプロンプト群は、ベースプロンプトにも女の娘用のプロンプト群にも適用される。
つまり、↓のように書いた場合と同じ結果になる(らしい。公式の解説にこう書いてある)。
indoor, masterpiece, best_quality, 2girls, multiple girls,
ADDBASE
red_hair, short_hair, masterpiece, best_quality, 2girls, multiple girls,
ADDCOL
blue_hair, long_hair, masterpiece, best_quality, 2girls, multiple girls,
以上がRegional Prompterの使い方❗
Regional Prompterの欠点
Regional Prompterは素晴らしすぎる拡張機能なんだけど、 ポーズを指定しても思ったとおりにならないことが多い。
そこで、ステップ3でControlNetを併用することでポーズを高精度に指定できるようにする。
Regional Prompterの注意点
Regional Prompterを使う際、いくつか注意点がある。
Regional Prompterの注意点: 2人組にしたいとき
2girls
などを指定しても 必ずしも2人組が生成されるとは限らない 。
ポーズやカメラ位置( from_above
など)によっては、1人しか生成されなかったり、
逆に3人組になったりする。
この場合、 (2girls:1.2)
などのように、 2girls
のweightを高めれば解決することがある。
ただし、これは諸刃の剣で、高すぎると画像が破綻したり、顔が崩れたりする。 経験的には1.5までが実用範囲で、2.0が限界ってところだろうか。
また、Loraを使う場合、Loraによって2人組の生成確率が変わる。 なかなか生成されないときは、Loraのweightを下げてみよう。
2人組用のプロンプトを指定する手もある。
オススメはずばり、 symmetrical_docking
❗
脳内でブッピガンって言いそう。
これに breast_press
とかを指定すると大変に素晴らしい画像ができるよ。
なお、ステップ3でControlNetを併用すれば、2人組になる可能性を大幅に上げれる(経験則)。
Regional Prompterの注意点: 3人組にしたいとき
2girls
を 3girls
にして、
Regional Prompterの『Divide Ratio』を 1,1,1
にすれば良い。
ただ、思ったとおりに生成される可能性は2人組のときよりも低い。
また、3人が水平に並んでいる場合は簡単だが、それ以外の場合は途端に複雑になる。 領域を画像で指定してどーたらこーたらするらしいが、 実験的な機能とのことで、私は使ったことない。もしやるならがんばってくれ(ぶん投げ)。
Regional Prompterの注意点: 分割方向を変えたときにキーワードが変わる
左右に分割するときのキーワードは ADDCOL
だが、
上下に分割するときは ADDROW
になる。
キーワードの変更を忘れて分割方向を変えると、おかしな結果になって時間を無駄にする…(1敗)。
Regional Prompterの注意点: 分割位置を変える
「3人組で生成するとき、2人目の娘が右側に寄っちゃって、3人目の娘と髪色が同じになっちゃった〜😭」 なんてことはよく起きる。
そういうときは『Divide Ratio』を調整すれば良い。
中央の領域を広げたければ、 1,1,1
ではなく、 1,2,1
や 2,3,2
にすれば良い。
Regional Prompterの注意点: 何回か生成してるとバグる❓
これは私の環境だけかもしれないが、 何回か生成してると、あるとき突然、 空のプロンプト群が勝手に挿入されてるかのような生成結果になることがある。
例えば、赤髪、緑髪、青髪の3人娘を作ろうとしたのに、 赤髪、黒髪、緑髪の3人娘が生成される、など。
再現条件が不明だが、 傾向としては、『Hires. fix』を使った後なんかはこうなるときが多かったような…。
「なんかおかしいぞ🤔」と思ったら、本番用のプロンプトを一度全部消して、 赤髪、緑髪、青髪の女の娘(私はリファレンス娘3人衆と呼んでる)を生成してみると確認しやすい。
このバグが起きたら、Stable Diffusion(厳密には webui-user.bat
)を再起動して、
web UIも再起動すると治る。
再起動がめんどい場合は、 ADDBASE
や ADDCOL
の後にカンマを入れると治ったりした…ような❓
再現性が完璧じゃないので曖昧な情報しか書けない。ごめん。
Regional Prompterの注意点: プロンプトが長くなって目が滑る
これが一番厄介かもしれないw
3人分のプロンプトを書いたりするので、プロンプト全体が非常に長くなる。 こうなると目が滑って「やべ❗貧乳になっちゃった🥶」な〜んてミスが頻発する。
私は↓のような規則で書くことで、なるべくミスしないようにしている。
画質向上呪文, 3girls, multiple girls,
ADDCOMM 背景,
ADDBASE 1人目特徴(髪の長さや胸の大きさなど),
女の娘共通プロンプト(姿勢やおそろの衣装など),
個別プロンプト(手の配置、表情など),
ADDCOL 2人目特徴,
女の娘共通プロンプト,
個別プロンプト,
ADDCOL 3人目特徴,
女の娘共通プロンプト,
個別プロンプト,
ADDBASE
と ADDCOL
は行頭にあったほうが視認性が高い。
単独で行を使うのはおすすめしない。縦スクロールが発生して、これもミスの原因になる。
女の娘共通プロンプトは変更するたびに、他の娘にコピペする。
非常に質問が多いので良く書いておくけど、
ADDCOMM
まで のプロンプトが共通プロンプトなので注意。
↑の例で言うと、1行目のプロンプトが共通プロンプトであって、
背景
は共通プロンプトではない。
同様に、 ADDCOMM
以降は ADDBASE
まで のプロンプトがベースプロンプトになる。
つまり、 背景
がベースプロンプトになる。
ADDCOMM
と ADDBASE
が直感的に似すぎてるのが良くないのかな。
おまけに、このキーワードが手前が各プロンプト郡に相当するってのがややこしすぎる。
とにかく勘違いしやすいので、自分でいじくり回してみて、実感を持って理解してもらうのが一番かと思う。
Regional Prompterの注意点: BREAK
が使えない
Stable Diffusionには BREAK
というキーワードがある。
これを使うと、プロンプトをプロンプト群に分けることができる。
勘違いしないでほしいのが、プロンプトをプロンプト群に分けること自体は、 Regional Prompter固有の機能ではないということ。
プロンプト群の中では、あるプロンプトが別のプロンプトに意図せず影響しちゃうことがある。 例えば、↓のプロンプトを実行したとき、
red_hat, long_hair
本来は赤い帽子を着せたいだけなのに、髪まで赤髪になったりすることがある。
これを防ぐために↓のように BREAK
を使う。
red_hat, BREAK long_hair
これで、赤い帽子のプロンプト群と、長髪のプロンプト群を明示的に分割できる…らしい❗ …
原理がよくわかってないけど、とにかくこれで防げるってさ❗
で、この便利な機能が、Regional Prompterでは使えない。
というか、厳密には、Regional Prompterが既に BREAK
を使っちゃってる、というほうが正しそう。
事実、公式Docでは ADDBASE
や ADDCOL
の代わりに、 BREAK
を使って解説されてるんだよね。
もともと BREAK
を使って指定するのが本来のスタイルで、
視認性を良くするために後から ADDBASE
や ADDCOL
を使えるようにした…っぽい❓
つまり、もともとStable Diffusionがプロンプト分割機能を持っていて、
それを使って領域ごとにプロンプトを適用するのがRegional Prompterのやってること。
プロンプト群を更に細かく分割する機能はないので、
各領域ごとのプロンプト群の中で BREAK
を使うことはできない…ということかと。分かるかな❓
的を得ない解説で悪いけど、とにかく使えないと思って良いんじゃないかなぁ。
2. ControlNetでポーズを指定
ここからポーズ指定する方法を解説する。 一度、ステップ1のRegional Prompterのことは忘れて欲しい。 両方使うのはステップ3でやる。
ポーズ指定するにはControlNetという拡張機能を使う必要がある。 これは画像生成をよりコントロールするための手段を提供する拡張機能。 ここではざっくり「ポーズを簡単に指定する方法なんやな❗」って理解で良い。
導入方法はやっぱり 先達の記事 にぶん投げさせてもらう。解説めんどい❗ これもGitHubのURLを入力してボタン押すだけや❗簡単じゃろ❗
これも正常に導入できていれば、『txt2img』タブの下の方に『ControlNet v***』のタブが見えるはず。
ポーズ指定するには↓の2択。
- 既存の写真やイラストからポーズの読み取り
- OpenPose画像でポーズを指定
記事長くなってきちゃったから、1番は割愛させてくれ。 2番について書く。
OpenPose画像(という言い方が正しいか不明だが)は↓のような画像。
骨格を簡素に表現した画像だと思えばOK。 写真やイラストから読み取って生成できるし、↓のツールを使っても生成できる。
どっちも操作が難しいんだけど、座りポーズくらいなら5分でできる。 それに、あまり厳密に作っても意味がないので、ざっくりで良い。
では、ControlNetを使ってみよう。設定は↓。
- 『Image』欄にOpenPose画像をアップロード(コピペでも良い)
- 『Enable』にチェック
- 『Pixel Perfect』にチェック
- 生成画像とOpenPose画像の大きさが違う場合、これにチェックしないとOpenPose画像が伸び縮みしてしまう。
- 『Control Type』で『OpenPose』を選択
- 『Preprocessor』で 『none』を選択
- 『Model』で『control_v11p_sd15_openpose***』を選択
- 『Control Weight』を
1
(デフォルト) - 『Starting Control Step』を
0
(デフォルト) - 『Ending Control Step』を
1
(デフォルト) - 『Control Mode』を『Balanced』(デフォルト)
- 『Resize Mode』を『Crop and Resize』(デフォルト)
- 『[Loopback] Automatically send generated images to this ControlNet unit』はチェックなし(デフォルト)
これで red_hair, short_hair
だけのプロンプトで生成した画像が↓。ポーズが反映されているね❗
以上がControlNetの使い方❗ あとは、これを複数人で使うだけだ❗
ControlNetの欠点
OpenPose画像は複数人のポーズを含んでいても良い。 ControlNetも複数人のOpenPose画像に対応している。 ただし、Regional Prompterなしでは、 女の娘の特徴(プロンプト)を振り分けることができない。
そこで、ステップ3でいよいよ両方ともできるようにする。
ControlNetの注意点
Regional Prompter同様、いくつか注意点がある。
ControlNetの注意点: ポーズが反映されない
ポーズが思ったように反映されないことがある。
この場合、『Control Weight』を 1.0
以上にしたりすれば良い。
また、逆に、ポーズは反映されるが、画像が崩れるってこともある。
こっちは逆に、『Control Weight』を下げれば良い。
「『Ending Control Step』を下げろ」って言ってる人もいたけど、 『Control Weight』を下げた場合と何が違うのか私には分からなかった。 まぁ、あまり試してないけどね。
ControlNetの注意点: プロンプトもちゃんと指示したほうが良い
OpenPose画像を使えばプロンプトはいい加減でも良いかと言うと、そうではないっぽい。
例えば、四つん這いのOpenPose画像を使うなら、
all_fours
などもプロンプトでちゃんと指定したほうが良い。
特に、 hand_on_own_***
系の手の位置を指定するプロンプトはちゃんと指定したほうが腕の破綻が少ない気がする。
ControlNetの注意点: こっちを向いてくれない
OpenPose画像を編集してると、顔の向きが分かりづらい。 こっちを向いて欲しいのに、いざAI生成してみると変な方向を向いてたりすることが多々ある。
あんまりひどい場合はOpenPose画像を修正したほうが良い。
ちょっとそっぽ向いてるなってときは、
looking_at_viewer
を (looking_at_viewer:1.3)
などにして、weightを大きくしてやれば大概は解決する。
ちなみに、流し目にしたい場合は sideways_glance
などを指定すれば良い…はずなんだけど、
私は結構失敗する。難しい。
3. Regional PrompterとControlNetの組み合わせ
いよいよ2つの強力な拡張機能を両方とも使用する。
もったいぶって書いたけど、ぶっちゃけ特殊な操作は要らない。 普通に両方とも使えば良いだけ。
まずは、2人分のポーズを含んだOpenPose画像をControlNetに読み込ませる。 ↓は適当に作った2人組のお座りOpenPose画像。
Regional Prompterの『Active』、ControlNetの『Enable』の両方にチェックがついてることを確認。
2人分のプロンプトを用意↓。ついでに性癖もモリモリ❗
(masterpiece:1.2), best quality, 2girls, multiple girls
ADDCOMM outdoor, beach, clouds,
ADDBASE black_bow, blue_eyes, blunt_bangs, hair_bow, long_hair, pink_hair, large_breasts,
sitting, navel, looking_at_viewer, blush, bikini, wet, sweat, breasts, shiny_skin,
green_bikini, smile, :d,
ADDCOL folded_ponytail, forehead, hair_ribbon, red_eyes, red_ribbon, ribbon, short_hair, sidelocks, black_hair, small_breasts, parted_bangs
sitting, navel, looking_at_viewer, blush, bikini, wet, sweat, breasts, shiny_skin,
red_bikini, embarrassed,
せっかくだからNegative Promptも用意。内容は解説してる暇がないからググってくれ〜❗
easynegative, ng_deepnegative_v1_75t, verybadimagenegative_v1.3, 2koma, 3koma, multiple_views, text,
いざ生成❗
結果が↓。2人組ちゃんカワイイヤッター❗❗❗
さらにHires. fixでDenoising Strengthを 0.7
にして拡大するぞ❗❗❗❗❗
うぉぉぉ巨乳ピンクな女の娘とちょっとささやかな黒髪の娘というコントラストが青い空に輝くゥゥゥ👆👆👆👆👆👆👆👆
以上❗あとは君だけの複数人画像を作るんだ❗3人娘だってできるぞ❗
(いい感じのビーチを引けるまで10回くらいガチャしたのは内緒。あと、Upscalerは4x-UltraSharpね。)
雑記
つよつよPC(i7 + 4070)にしてからというもの、 マイクラ以外でもPCパワーを活用したいな〜ということでAI生成に手を出してみた。
結論: 超 楽 し い 🎉
目の前で女の娘達がキャッキャウフフなポーズを指示通りに取ってくれる。 ビキニな女の娘や制服JKでもなんのその❗ここが私だけのパラダイスだ❗
唯一の難点は楽しすぎて生成速度に不満が出てきた。 768x512の出力に10秒ちょっと。そこからHires. fixで縦横2倍にして2分ちょっと。 もう少し早くしたいよね。 でもそうなるとRTX 4090とかだよね。最安値で25万だって。厳し〜〜〜〜😇