見出し画像

Stable Diffusion web UIを使ったAI画像生成のPromptの記法のまとめ

本記事は Synamon Advent Calendar 2022 の12日目の記事になります。


今年2022年の9月頃から話題になっていた、AI画像生成はみなさん触ってみましたでしょうか?

Stable DiffusionがOSSとして公開されたことを皮切りに、イラストに寄せたモデルのWaifu Diffusion、クオリティの高いイラストが生成できると話題になったNovelAI Diffusion、直近でもStable Diffusionのver2が公開され、ものすごいスピードで進歩しています。

https://github.com/Stability-AI/stablediffusion

個人的にも興味があり、触ってみて生成したイラストをTwitterに投げていたりしました。

今回の記事では、こういった画像生成を触っている中で自分がPromptの記法に関してしばらく勘違いをしていて正しく理解するまで時間がかかってしまったので、基本的なことではありますが整理したいと思います。

自身の備忘録も兼ねていますが、もしAI画像生成初心者の方の理解の手助けになれば幸いです。

Promptとは

Stable DiffusionではSampling MethodやCFG Scaleなど様々なパラメータを設定でき、それによって生成されるイラストのクオリティが変わります。

そのパラメータの中でも最も影響の大きいものは、なんと言ってもPromptでしょう。

画像生成AIでは、Promptと呼ばれるテキストを入力し、どのような画像を生成して欲しいか命令をすることができます。

具体例を見たい方は公式のガイドなどをご覧ください。

今回紹介するのは自分が普段使用しているStable Diffusion web UIでのPromptの記法となります。

ツールによって拡張機能の有無が異なる場合などもありますので、使用される際にはご確認ください。

また、Novel AIは標準のStable Diffusionとは大きく異なる部分があり勘違いしやすい部分なので補足で説明します。

Stable Diffusion web UIの簡単な紹介

Stable Diffusion web UIは、Stable Diffusionの拡張版の一つで、Web UI = ブラウザで操作をすることができるのが大きな特徴です。

またそれ以外にも様々な拡張機能や使いやすさのためのカスタマイズがされています。

https://github.com/AUTOMATIC1111/stable-diffusion-webui

こちらではPrompt内の特定のフレーズの影響度合いを調整するための記法が存在します。

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#attentionemphasis

強調

強調したいフレーズ(以下phrase)を ( ) の記号で括ることで、1.1倍に強調することができます。

(phrase) = phraseの影響度を1.1倍にする

これは複数重ねることも可能で、その場合乗算されます。

((phrase)) = phraseの影響度を(1.1)^2 = 1.21倍にする

弱調

逆に影響を弱めたい場合は、[ ] の記号で括ることで、1/1.1倍に弱調することができます

[phrase] = phraseの影響度を1/1.1 = 0.91倍にする

こちらも同様に複数重ねて使用することができます。

[[[phrase]]] = phraseの影響度を(1/1.1)^3 = 0.75倍にする

数値での影響度の指定

記号を重ねすぎると少し見づらくなってしまったりしますし、もっと細かい単位で指定したい場合もあると思います。

そのような場合には、自分で倍率を指定する次の記法が便利です。

(phrase:weight) = phraseの影響度をweight倍にする

例えば、illustrationというフレーズを1.2倍に強調したい場合には、

(illustration:1.2)

といった感じです。

ここで注意すべき点が2つあります。

一つめは、phraseとweightと:(ダブルコロン)の間にスペースなどを挟むと強調のコントロールが効かなくなる場合がある点です。

(phrase:weight) -> OK
(phrase: weight) -> NG
(phrase : weight) -> NG
(phrase :weight) -> OK(これは大丈夫らしい)

おそらく記法の正規表現の仕様だと思います。

強調をしているつもりが効いていなかったのでいくらweightを調整しても徒労だった、ということにならないよう注意しましょう。

二つめは、[ ] の方には同じような記法が使用できないことです。

[phrase:weight] = phraseをweight倍にする

これは後で説明するPrompt Editingの記法と判定されてしまうためです。

Novel AI Diffusionとの強調記法の違い

Stable Diffusion web UIの記法は上記で説明した通りですが、実はNovel AIでは記法と効果に少し異なる部分があります。

Novel AIにおける強調、弱調の記法は下記になります。

{phrase} = phraseの影響度を1.05倍にする
[phrase] = phraseの影響度を1/1.05倍にする

使用する記号が ( ) { } で異なることと、影響度が異なることに注意が必要です。

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#attentionemphasis

元素法典などNovel AIでのPromptを紹介しているものと、Stable DiffusionでのPromptを紹介しているものとでそれぞれ異なりますので、ご自身の使用される環境の記法に読み替えて参考にしていただければと思います。

Prompt Editing

Prompt Editingは、画像生成のステップの途中でphraseを切り替えたり、有効無効を切り替えたりすることができる機能です。

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#prompt-editing

[from:to:when] = (whenが整数の場合はstep数、0 ~ 1の少数の場合はstepの割合)より前の場合はfromを、それ以降はtoをphraseとして使用する

ちょっと分かりづらいですが、例えば

[red:white:0.5] hair

のPromptで50ステップに設定している場合には、前半の25ステップでは red hair、後半の25ステップでは white hairを入力する、といった感じです。

また必ずしも2つのphraseを指定する必要はなく、次のような使い方もできます。

[from::when] = whenのstepまではfromを、それ以降は何も入力しない

[to:when] = whenのstepまでは何も入力せず、それ以降はtoを入力する

少し難易度高めの記法ですが、Stable Diffusionの画像生成のステップは前半で大雑把な描画を、後半で細部の描画をするみたいなので、タイミングを狙ってPromptを指定したい場合に活用できるかもしれません。

Alternating Words

Alternating Wordsはphraseをステップ毎に切り替える機能です。

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#alternating-words

[phraseA|phraseB] = phraseAとphraseBをステップで交互に切り替えて入力する

2つ以上でも使用できます。

[phraseA|phraseB|phraseC] = phraseAとphraseBとphraseCをステップで交互に切り替えて入力する

Wildcards

拡張機能の一つにWildcardsというものがあります。

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Extensions#wildcards

特定のフォルダに例えば filename.txt  というテキストファイルを置いておくと、Promptに

__filename__

のように_(アンダースコア)2つで囲ってあげることで、このファイルに書かれているテキストのランダムな行をロードして入力することができます。

Alternating Wordsの複数phrase版としても使えますし、一行にPromptを詰め込んでテンプレートのように使用することもできます。

エスケープ

これまでに説明したように、強調などをするための記法で ( ) [ ] などの記号を使用します。

これらの記号を文字通りのテキストとしてPromptに入力したい場合には、\(バックスラッシュ)を手前につけます

(phrase) -> phraseの強調
\(phrase\) -> (phrase)というテキストとして入力される

一見あまり使い道がないように見えますが、NovelAI等でDanbooruタグとして()の付いたテキストをPromptに使用したい場合に有用です。

トークン数制限

Promptの記法の話ではありませんが、通常のStable Diffusionではトークン数が75までという制限がありました。(ver2で変わったのか追えていませんが)

トークンというのはPromptに含まれる単語の数というわけではないことに注意は必要ですが、大雑把に言えばせっかく長文のPromptを指定しても手前のPromptしか入力されないということが起こります。

Stable Diffusion web UIでは独自の拡張によってこのトークン数制限がなくなっていますので、気にせず長文のPromptを使用することができます。

Novel AIはサービス側で制限を設けていたと思いますので、使用される際はご確認ください。

おわりに

Promptの記法はよく使っている方にとっては既に当たり前の知識かもしれませんが、自分はStable Diffusionの記法とNovel AIの記法をごっちゃに使ってしまっていたり、(phrase:wight)の記法に余計なスペースを挟んで無駄な時間を使っていたりしました…笑

その辺りを説明している日本語の記事があまり見当たらないような気がしたため、改めて整理してみたという形になります。

これから始める方、これからPromptをもっと細かく調整してクオリティを上げたいと思っている方の参考になれば幸いです。

最後に余談ですが、機械学習で綺麗なイラストが生成できるようになってきているわけですが、それでも成果物のクオリティを左右するのはAIに自分の要望を丁寧に言語化して伝える能力だったり、構図やコンセプトを考えるデザインのセンスだったりするような気がしています。

その点イラストをちょっと齧ったことのある程度の自分のような素人よりは、イラストやデザインをされている方がツールとして使った方が効果的なのではとも思います。

日本ではAI画像生成はまだ技術面以外にも課題を抱えていると思いますが、将来的にはこういった先端技術が誤解や恐れなく適材適所にいい感じに使われるようになっていくといいなと思っています。

ちなみにアイキャッチのイラストの全体はこんなでした。

いいなと思ったら応援しよう!