プロンプト構文のルールです。
Stable Diffusion web UIにおけるprompt指定方法の詳細な解説です。
プロンプト構文のルール
プロンプトの強弱
語句を( )、[ ]で囲むことでプロンプトの効果を強調、控えめにできます。
(abc)・・・abcへの注目度を1.1倍増加する。→ abcの効果を1.1倍する。 [abc]・・・abcへの注目度を1.1倍減少する。→ abcの効果を1/1.1倍=0.91倍する。
(school uniform:1.2)の様に空白を挟んでいても、括弧で括ってる範囲全部効きます。
倍率は数字入力により指定することができます。
(abc:3.12)・・・abcへの注目度を3.12倍増加する。
括弧を重ねると、重ねた回数だけ倍になります。
(…:1.10) = (…)
(…:1.21) = ((…))
(…:1.33) = (((…)))
(…:1.46) = ((((…))))
(…:1.61) = (((((…)))))
(…:0.91) = […]
(…:0.83) = [[…]]
(…:0.75) = [[[…]]]
(…:0.68) = [[[[…]]]]
(…:0.62) = [[[[[…]]]]]
文章を選択して「Ctrl」+上下キーを押すことで強弱変更できます。
例えば、abcを選択後またはabcを入力後、
「Ctrl+↑」を押す毎に
abc → (abc:1.1) → (abc:1.2) → 以降、0.1倍ずつ増加
「Ctrl+↓」を押す毎に
abc → (abc:0.9) → (abc:0.8) → 以降、0.1倍ずつ減少
- 変動量は、Settings→User interfaceで変更可能。
NovelAI用の呪文をStable Diffusion向けに変換する
NovelAI(NAI)のプロンプト強調の記述ルールは、Stable Diffusionと異なります。
匿名としあきの作成した素晴らしいブックマークレットがあるのでそちらを活用しましょう。
リンク⇒スレ閲覧時に便利なブックマークレット2
或いは Extensions からインストールできる novelai-2-local-prompt を使うのも良いかもしれません。
NAI手動変換
(…:1.0500) {…}
(…:1.1025) {{…}}
(…:1.1576) {{{…}}}
(…:1.2155) {{{{…}}}}
(…:1.2763) {{{{{…}}}}}
(…:0.9524) […]
(…:0.9070) [[…]]
(…:0.8638) [[[…]]]
(…:0.8227) [[[[…]]]]
(…:0.7835) [[[[[…]]]]]
スケジュール構文
指定stepを基準にプロンプトのON/OFFを切り替えることができます。
基本形 [A:B:数字] [from:to:when]を意味する。
TIPS
Q:なぜ()ではなく[ ]を使うの?
A:(abc)と(abc:1.1),[abc]はすでに強調文として使われているかららしい。
詳しいPRはこちら
https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#prompt-editing
指定数字が0~1の場合 → 全ステップ数に対する割合で指定
[A:B:0.5]
[この語句から:この語句へ:このステップで切り替え]
Sampling Stepsが100の場合
0~50step :プロンプトAが適用される
50~100step:プロンプトBが適用される
[A:0.5]
これは[B:A:0.5]のBが省略された形を意味します。
Sampling Stepsが100の場合
0~50step :なにもしない
50~100step:プロンプトAが適用される
[A::0.5]
これは[A:B:0.5]のBが省略された形を意味します。
Sampling Stepsが100の場合
0~50step :プロンプトAが適用される
50~100step:なにもしない
指定数字が1以上の整数の場合 → 変化するステップ数を直接指定
step数を直接指定する以外は、上記の割合で指示した場合と考え方は同じです。
例:
Sampling Stepsが100の場合
[A:10] = [A:0.1] = どちらも10step以降からAが有効
[A:50] = [A:0.5] = どちらも50step以降からAが有効
使用例
moutainとlake単独で存在するのではなく、moutainの中にlakeが内包する形で出力されやすくなります。先に実行されるプロンプトが絵の概要を生成し、後のプロンプトがディティールとして生成されます。そういった順番のノイズ除去が行われます。
sampling steps : 60 , Seed:1 ,Sampler :Euler a ,512×512pixel,Clip skip 2 , CFG scale:7.5,model:anyloraCheckpoint_bakedvaeFtmseFp16NOT.safetensors
プロンプトの入れ子構造
公式が想定しているスケジュール構文の応用です。
スケジュール構文は、入れ子にして使用することができます。
応用例1
この呪文を見ていきましょう
[[red::0.2]:green:0.8]
上記の式を一般化すると、 [A:B:0.8] A=[C::0.2]と同義です。
したがって、上記プロンプト構文の生成結果は、
全体の80%まで[red::0.2]
20%を過ぎるまでredが有効
20%を過ぎたらredが消え
そこから次のgreenが80%くらいで入ってくるまで何もなし
0→red→20%→無し→80%→green→100%の流れです。
応用例2
この呪文を見ていきましょう
[(partially [[blue:green:0.2]:red:0.35] hair:1.2):0.1]
上記プロンプト構文の生成結果は、
10%を過ぎた段階でこの呪文の読み込み開始。(それまでは無)
20%くらいまでpartially blue hairの1.2倍に
20%過ぎたらpartially green hairの1.2倍に
35%以降でpartially red hair の1.2倍に
となっています。
スタート→無→10%→partially blue hair 1.2倍→20%→partially green hair 1.2倍→35%→partially red hair 1.2倍→100%終了
うまく使えば、メッシュやインナーカラーに使えるらしい。他には瞳の色など。
複雑なpromptが正常に機能しているかわからなくなったとき
プログラムを書き換えて、プロンプトの実行状況を表示する方法がある。
★プログラムのバックアップを取ってから実行してね
これするともしかしたらgit pull時にerror: Your local changes to the following files would be overwritten by merge:みたいなエラー出るかも↑みて解消
\modules\prompt_parser.pyを開き
60~80行目付近にある文章を編集する。
■変更前
def get_schedule(prompt):
tree = parser.parse(prompt)
return [[t, at_step(t, tree)] for t in collect_steps(steps, tree)]
promptdict = {prompt: get_schedule(prompt) for prompt in set(prompts)}
return [promptdict[prompt] for prompt in prompts]
ScheduledPromptConditioning = namedtuple("ScheduledPromptConditioning", ["end_at_step", "cond"])
ScheduledPromptBatch = namedtuple("ScheduledPromptBatch", ["shape", "schedules"]
■変更後
def get_schedule(prompt):
tree = parser.parse(prompt)
return [[t, at_step(t, tree)] for t in collect_steps(steps, tree)]
res = [get_schedule(prompt) for prompt in prompts]
for t in res:
print(t)
return res
ScheduledPromptConditioning = namedtuple("ScheduledPromptConditioning", ["end_at_step", "cond"])
ScheduledPromptBatch = namedtuple("ScheduledPromptBatch", ["shape", "schedules"]
その状態で生成を実行すると、例えば下記のpromptをSampling Steps100で入れた場合
[(partially [[blue:green:0.2]:red:0.35] hair:1.2):0.1]
コマンドプロンプト上に
[[100, '']]
[[10, ''], [20, '(partially blue hair:1.2)'], [35, '(partially green hair:1.2)'], [100, '(partially red hair:1.2)']]
と表示されます。
ここでは
[Sampling step,'プロンプト']の形式で書かれていますので、
つまり
スタート→無→step10→partially blue hair 1.2倍→step20→partially green hair 1.2倍→step35→partially red hair 1.2倍→step100終了
Sampling Stepsが50の場合には
[[50, '']]
[[5, ''], [10, '(partially blue hair:1.2)'], [17, '(partially green hair:1.2)'], [50, '(partially red hair:1.2)']]
と表示されます。
この場合も上記と同じですが、今回は50が最大なので1%=0.5stepとなります。
よって10%=step5,20%=step10,35%=step17,100%=step50となり
そのため
スタート→無→step5→partially blue hair 1.2倍→step10→partially green hair 1.2倍→step17→partially red hair 1.2倍→step50終了
という意味になります。
Sampling Stepsが20の場合には
[[20, '']]
[[2, ''], [4, '(partially blue hair:1.2)'], [7, '(partially green hair:1.2)'], [20, '(partially red hair:1.2)']]
と表示されます。
この場合最大stepが20で1%=0.2stepのため
10%=step2,20%=step4,35%=step7,100%=step20となります。
スタート→無→step2→partially blue hair 1.2倍→step10→partially green hair 1.2倍→step17→partially red hair 1.2倍→step20終了
という意味になります。
エスケープ処理
\(hogehoge\) とか ¥(hogehoge¥) とかあるのって何?
その \ とか ¥ はエスケープ処理ってやつだ。
例えば1111で toshiaki (futaba), って入力したいとする。
するとfutabaの前後にカッコがあるから、futabaが1.1倍に強調されちゃうよね。
そこで toshiaki \(futaba\), という入力にすることで強調効果を回避できる仕組みが、1111には用意されてる。
このように「特別な意味がある文字や記号を別の文字に置き換えること」をプログラミング界隈ではエスケープ処理と呼ぶ…って庭に来たジュウシマツがゆってた。
AND
- ANDはいわゆる融合機能、ヒュージョンです。
- andではなくANDです。
- 試しに「son goku」「vegeta」「son goku AND vegeta」でそれぞれ出力してみよう。
それですべて理解できるはず。
(著作権的な都合で公開はできない) - 白い猫AND黒い犬
→白い猫と黒い犬が融合した動物が描かれる - サンプル紹介
https://energy-based-model.github.io/Compositional-Visual-Generation-with-Composable-Diffusion-Models/
お手軽合成(融合)呪文として一応使えているみたいです。 - 公式wiki
https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#composable-diffusion
- 試しに「son goku」「vegeta」「son goku AND vegeta」でそれぞれ出力してみよう。
補足
- 2022/10/06より追加された機能
- サンプラーによってはAND構文は使えないことがある。
- AND文を使用すると生成に通常より時間がかかります。
本来呪文は75token(AIの認識できる75個の言葉まで)ですが、AND以降はまた文字カウントがリセットになります。
BREAK
- BREAKは1111で利用できる特殊なキーワード。
公式wikiにごく短い説明がある。 - breakではなくBREAK
- BREAKを入力すると75トークンまで空のトークンまで自動的に埋めて、次の区切りに移行する。
つまり、BREAKを境界として、お互いの干渉を起こしにくくする。
例えば色移りの防止などに利用できる。
注意点
- 2023/1/16の1111アプデで実装された機能なので、更新してないと効果を発揮しない。
240 無念 Name としあき 23/02/19(日)16:24:46 ID:qLW8bEds No.1068513211 del そうだねx6
>AND構文とBREAK構文の違いがわからない
白い猫BREAK黒い犬
→白い猫と黒い犬が描かれる