画像生成AI

【StableDiffusion】プロンプトの書き方とコツ|5つのベストプラクティス【画像生成AI】

この記事でわかること
  • StableDiffusionのプロンプト文法
  • 美しい画像を生成するためのベストプラクティス
  • 美女の画像生成方法

こんにちは、「学びが人生を豊かにする」をテーマに本日は「画像生成AIのプロンプトのコツ」についてです。

StableDiffusionを使用して画像を生成するときに思った通りの画像を生成するのって難しいですよね。
特にプロンプトってイマイチ何を指定したらよいのかすぐにはわからないものです。

本記事では初心者の方でも思った通りの画像生成が出来るようになるために、プロンプトのコツについて解説していきたいと思います。
基本となる原理原則をもとに、私なりのベストプラクティスをお伝えできればと思います。

なお、本記事はStableDiffusionのプロンプトを前提としています。
MidjourneyやDALL・E2の場合には異なる部分もありますが、部分的には共通するところもあると思います。
基礎的な内容から応用的な内容まで紹介しますので、興味のある部分だけでも読んでみてください。

プロンプトの基本

プロンプトとは簡単に言うと画像生成におけるAIへの指示テキストのことです。
ここでは、下記の3つについて解説します。

  • プロンプトの種類
  • プロンプトの基本文法
  • プロンプトの応用文法

プロンプトの種類

プロンプトの種類といっても、以下二つだけです。
画像生成AIに触り始めたら、まず最初に覚えることですね。

  • ポジティブプロンプト
  • ネガティブプロンプト

ポジティブプロンプト

ポジティブプロンプトとは、一言で言うと「AIに何を書かせるのかのテキスト」です。
StableDiffusionは、一連の確率的な処理ステップを通じて画像を生成してくれます。
これは、生成される画像がランダムなノイズから徐々に明確な形や色彩に発展していくプロセスを反映しています。

これに対してポジティブプロンプトは、画像の特定の側面や特徴に対してより具体的な指示を与えることできます。
例えば、ある特定の形状や色彩、あるいは特定のオブジェクトやシーンを示すワードをプロンプトに入力すれば、AIはそのプロンプトに基づいて新たな画像を生成してくれます。

ネガティブプロンプト

ポジティブプロンプトに対してネガティブプロンプトは「AIに書かせたくないものを示すテキスト」です。
AIは書かせたいものを指示するだけでなく、書かせたくないものを指示することで、より正確な画像を生成することができます。

例えば、特によくネガティブプロンプトとして指定されるのは指などに関するワードです。
通常画像生成AIは指など複雑な人体構造を生成するのを苦手をしており、しばしば指の本数などを間違えて描画します。
これに対して「extra fingers」や「fewer fingers」などと指定するいと、指の本数の誤りを防ぐ効果があります。(それでも正確な描画は困難なケースが多いですが)

プロンプトの基本文法

覚えるべき基本文法は以下3つです。

  • 英語の単語を組み合わせて書く
  • 単語同士は半角カンマで区切る
  • かっこや数値で単語を強調できる

ほとんどの場合は、この3つのルールでプロンプトは構成されます。

単語の組み合わせ

プロンプトの基本は英単語の羅列になります。
単語は「girl」のような1wordでも「black hair」などの複数ワードでもOKです。
これらのワードを羅列して出力したい画像の指定をしていきます。

通常は英単語の羅列ですが、文章を入力することも可能です。
例えばChatGPTのプラグイン「photorealistic」ではシーンを説明した文章が出力されますが、それをそのまま入力することができます。
まだ、プロンプトの基本がわからないという場合には、こういうのを活用するのも一つの手ですね。

下記は、「Photorealistic」で猫のプロンプトを生成し、StableDiffusionで生成した画像です。

photorealisticで生成した画像

An action-packed image of a cat chasing a toy. The cat is a blur of motion, its body stretched out in a sprint, its claws extended. The toy, a small, brightly colored ball, is just out of reach. The setting is a sunny outdoor garden, with the sun casting long, dramatic shadows. The image is captured with a Canon EOS 5D Mark IV DSLR camera, using a 70-200mm f/2.8 lens for a dynamic, high-speed shot. The image is highly detailed and realistic, with a focus on the cat’s intense expression and the vibrant colors of the garden.


また、プロンプトは日本語で入力しても問題ありません。
ただし、画像の学習は英語のタグで実施されるのが一般的のため、英語で入力するのがデファクトスタンダードになります。
ちなみに、下記は日本語と英語で同じ意味の言葉をそれぞれ指定した結果です。
日本語だと日本人っぽい画像になるなど、言語の違いでも生成される画像は大きく変わります。

日本語プロンプト


半角カンマ区切り

プロンプトの基本は英単語の羅列ですが、単語同士は半角カンマで区切ります。
すなわち、「1girl, black hair, smile」のような書き方をします。
カンマを使用しなくても、ある程度意味をくみ取ってくれますが、カンマで明示的にするのが狙った通りの画像を作るのには必要不可欠です。

カンマ区切り表記

上記は、半角カンマ有無の比較画像です。
複雑なプロンプトでないので、カンマがなくてもほとんど同じような画像を出力してくれています。

単語の協調

プロンプトの単語は画像生成への影響力を強調させたり逆に弱めることが出来ます。
単語の強調には以下のような括弧や数値を付与してください。

  • 丸括弧()で10%影響度を強める(1×1.1)
    例:(smile)
  • 角括弧[]で10%影響度を弱める(1/1.1)
    例:[word]
  • 括弧の数で強調を重ねる(乗算)ことができる
    例:(((smile))) この場合、1.1*1.1*1.1倍になる
  • 数値で指定も可能
    例:smile:1.1

下記はかっこによる強調度合いの比較の例です。
(smile)より(((smile)))のがよりsmileが強調されているのがわかります。
逆に[[[smile]]]とすることで、デフォルトのsmileよりsmile度合いが減っています。

強調構文

括弧の数をふやすことでより強調できますが、テキストが分かりにくくなるというデメリットがあります。
そのため、通常は数値で指定することが多いです。
数値で書く場合には角括弧[]は使用せず、丸括弧を使用してください。
後述しますが、角括弧を使用した「[smile:0.5]」は強調とは別の意味になります。

数値強調

また、ワードの強調は複数の言葉をまとめて強調することも可能です。
例えば「(smile:1.2),(long hair:1.2)」は「(smile,long hair:1.2)」と書くことができます。

プロンプト応用文法

ここではワンランク上のプロンプトの使い方を紹介します。
応用的な使い方としては以下の5つです。

  • 追加モデルの読み込み(rolaファイルなど)
  • 文字のエスケープ
  • from-to構文
  • AlternativeWord構文
  • BREAK構文

この中で良く使用するのは追加モデルの読み込みです。
後はBREAK構文がしばしば使用されるぐらいで、あとは特殊な状況で使用する感じなので、こんなのがあるなぐらいの気持ちで知っておいてください。

追加モデルの読み込み

rolaファイルやTextual Inversionの指定は画像生成において非常によく使用されるプロンプト技法です。
ここではrolaファイルやTextual Inversion自体の説明は省略しますが、要は追加の学習モデルを指定できるというものです。

例えば特定のキャラクターを再現するために、そのキャラクターで専用に学習されたrolaファイルを読み込むなどの使い方です。
Textual Inversionはembeddingsなどとも呼ばれますが、ネガティブプロンプトでよく使われる追加の学習データです。
例えば、ネガティブプロンプトとして強力に効果を発揮するモデルをembeddingとして埋め込むことで、複雑なプロンプトを書く必要がなくなったりします。

rolaファイルの使用方法については、配布元に記載がある場合が多いですが、プロンプトの構文としては以下のように指定します。

<rola:ファイル名:数値>

下記は「add_detail」という画像を詳細化することに特化したrolaファイルの例です。
上段がrolaファイルを使用した画像、下段は単純にdetailというワードを使用した画像になっています。

rolaファイル読み込み

Textual Inversionはrolaと異なりファイル名をそのまま記載するだけで埋め込むことが出来ます。
定番のネガティブプロンプトのTextual Inversionには「EasyNegative」というのがありますが、ネガティブプロンプトにそのまま書くだけでOKです。

embedding

文字のエスケープ

強調文を使用する場合には例えば「(smile)」と記載します。
では単語自体に()がついているワードを入力するにはどうしたら良いでしょうか。
そんなときに使用するのがエスケープ構文です。

単語に()が必要な例ですが、例えばspringというワードは春という意味と温泉などの泉という意味があります。
そのため春という意味の単語を学習する際に学習データではこれらをしばしば、「spring (season)」というタグを使用します。
このときプロンプトとしてそのままワードを入力すると「season」が強調されてしまい、ただしく単語を認識できません。

エスケープ文字は以下のようにバックスラッシュを使用することで()の文字を強調ではなくただの文字列として認識します。(下記円マークはバックスラッシュに読み替えてください)

\(word\)

from-to構文

from-to構文ではサンプリングステップの途中でプロンプトを変えることができる構文です。

[from:to:when]

基本となる構文は上記で、fromに指定した単語を最初のサンプリングステップで使用し、Whenのタイミングでtoの単語に入れ替わります。
例えば「[boy:girl:0.5]」と指定すると、サンプリングステップの最初の50%はboyを使用し、残りの50%ではgirlを使用します。
whenは1未満を指定するとトータルステップ数の割合を示し、整数値を入れると何枚目のステップで入れ替えるのかを指定することが可能です。

下記画像は[boy:girl:0.5]というように、途中で性別を変えようとしたプロンプトの例です。

fromto構文

上記は生成過程を一部出力したものですが、途中まで男性っぽい画像が出力されていましたが、それが途中から女性っぽくなっていますよね。
なかなか活用が難しい構文ですが、おもしろい機能だと思います。

from-to構文は下記のようにformまたはtoを省略することも可能です。

[to:when]

[from::when]

前者ではwhenのタイミングからtoに指定したワードが使われ、後者ではfromの単語がwhenのタイミング以降で削除されます。

ちなみに数値を使用した強調で角括弧[]を使用できないのはこの構文があるためです。
すなわち例えば[smile:2]と入力すると、強調ではなくSTEP=2からsmileが有効になるという動作になります。

AlternativeWord構文

こちらも活用が難しい構文ですが、交互に指定したプロンプトを使用するという構文です。
これは下記のように記載します。

[word1|word2]

例えば[cat|dog]と入力するとサンプリングステップの奇数と偶数でそれぞれcatとdogを使用することになります。
正直、あまり活用方法が思いつかないです。

BREAK構文

BREAK構文はしばしば使用される構文です。
少し細かい話になりますが、プロンプトは75トークン単位でグループ化され、システムに送られます。
ここのトークンとは1単語のような意味を持つ用語です。(実際には1単語で複数トークンもある)
75トークン単位でグループ化されるという仕組み上、75トークン目と76トークン目は一つの意味のワードであっても分割して処理されます。

例えば75,76トークン目が「long hair」とある場合、システムには別々のグループとして送られて処理されるため、意図しない動作になる恐れがあります。
そんな時にBREAK構文が有効です。

BREAK構文を入れた場所で残りの部分が穴埋めされるため、ワードが分割されるのを防ぐことが出来ます。
例えば60トークン目でBREAKを挿入し、次の文字に「long hair」と入力すると「long」は76トークン目に入ることになります。

プロンプトの原則原理とベストプラクティス

次にプロンプトの原則原理からベストプラクティスを考察していきたいと思います。
ベストプラクティスに関しては、描画したい内容やモデルなど様々な要因が影響してくると思うので、一つの考え方ぐらいに思ってください。
また実際には使用するモデルや単語などが最重要であり、このベストプラクティスはそれらを最適化するプロンプトの書き方という位置づけになります。

プロンプトの9つの原則原理

まずはプロンプトの重要な原則原理は以下の9つです。

  • 先に書いてあるトークンの影響力が大きい
  • トークンは後ろのトークンに影響を与えやすい
  • トークンはトークン同士が近い方が影響しやすい
  • トークンは75トークン単位でシステムに送られる
  • 強調はしすぎると不自然または破綻する
  • プロンプトで指定しない要素はシステムが勝手に補う
  • プロンプトの要素が多いと全てを表現できない
  • 同じベクトルの要素は補完しあう
  • ネガティブプロンプトはポジティブプロンプトを引き立てる

なかなか、こうした内容を並べても具体的にどのようなプロンプトを作ればよいのか、わからないかと思います。
そのため、この原則原理から下記のベストプラクティスを提案します。

プロンプトの5大ベストプラクティス

上記の原則原理をもとに、下記5つのベストプラクティスを提案したいと思います。

  • 画像を構成する重要な要素を指定する
  • 重要なトークンは最初に、全体像から詳細化する順番で並べる
  • 要素の塊でBREAKを使用する
  • 品質関連の単語は複数並べる
  • 強調表現は出来るだけ控えめにする

詳細について解説します。

重要な要素の指定

プロンプトで指定しない要素はAIが勝手に補完します。
そのため、良い画像を作成したい場合には、必要な要素をしっかり指定してあげるのが大切です。
特にプロンプトで重要な要素は以下になります。

  • 全体にかかわる要素
    • 品質
    • スタイル(写真、イラストなど)
    • 画面効果(焦点、照明、雰囲気など)
  • コア要素
    • テーマ(人・猫など画像の中心となるもの)
    • 構図(上半身、アングルの指定など)
    • 細部の指定(表情や装飾、色など)
  • その他
    • 背景など

これらの要素をしっかりと指定してあげるのが良い画像を生成するために重要です。

トークンは全体像から詳細化させていく

トークンは前半部分が影響度が高く、さらに後ろのトークンに対して影響を与えやすいという特徴があります。
そのため、品質関連など全体にかかわる要素を最初に記載し、表情や色など詳細部分を後半に書くようにしましょう。
また、トークンは近いトークン同士で影響しあいやすいため、似た単語を近くに配置し、関連したくない単語は離すようにしてください。
これは、特に色の指定などで重要で色の指定トークンが近い配置にあると、片方の色が他方のトークンに影響する可能性が出てきます。

要素の塊でBREAKを挿入

75トークン以内に全てのワードが入力できればあまり大きな問題はありませんが、それ以上になる場合には、要素の単位でBREAK構文をいれましょう。
トークンは75単位でシステムに送られてその後結合されるため、出来るだけ独立した情報、つまりは要素の塊で区切るのが良いです。

また、BREAK構文を使用すると次のグループの1トークン目の影響が大きくなります。
そのため、75トークン以内のプロンプトでもBREAK構文を使用することで、直後のワードの影響を強くするなども可能です。

品質関連は複数並べる

良い画像を出力するためには品質関連のワードは特に重要です。
しかし、品質を強調するため強調構文を過剰に使用すると自然な画像にはなりません。
その一方で同じベクトルの単語(似た意味の単語)は複数並べることで自然な強調を可能にします。
そのため、品質関連のワードについては、1ワードを過度に強調するのではなく、複数を並べることで自然な高品質化が可能となります。

強調表現は出来るだけ控えめに

繰り返しになりますが、強調表現は過度な使用は不自然さや画像の破綻をもたらします。
一方で適切な強調をすることで、自然かつ優れた結果をもたらします。
どの程度の値で強調するかは使用する単語や、モデル、全体のプロンプト内容などに強く影響をうけますが、通常は1.5ぐらいまでの値が破綻しにくい強調になります。
推奨値としてまずは、1.3ぐらいの値から調整していくのが良いでしょう。

プロンプトの実践

最後に上記のベストプラクティスをもとに、実際に画像生成してみて検証していきたいと思います。
わかりやすく、テーマは「美女」の生成としましょう。
それでは、以下のSTEPで生成していきたいと思います。

  1. 要素の指定
  2. ワードの拡充と整理
  3. 仕上げ

また、その他のパラメタは以下の通りとします。

  • model:BracingEvoMix_Fast_v1
  • step:30
  • サイズ:512×512
  • method:DPM++ 2M SDE Karras

要素の指定

まずは比較用として「beautiful woman」で画像生成し、これに対して要素を指定していきたいと思います。

  • 品質:best quality
  • スタイル:realistic
  • 効果:lim lighting
  • テーマ:beautiful woman
  • 構図:upper body
  • 細部:smile
  • その他:outdoors

今回は検証用として上記のワードを使用しましたが、どのワードを使用するかはプロンプトの肝となる部分です。
どんなワードが良く使用されるかはCivitaiのサンプル画像などを参考にしてください。

上記の要素を指定して生成した結果が下記になります。

要素指定比較

beautiful woman,best quality, realistic, cinematic lighting,upper body, smile,outdoors,

左の画像が「beautiful woman」とだけ指定した画像です。
真ん中の画像が要素指定して画像生成した結果で、右の画像は参考としてhires.fixで1.5倍に高画質化したものです。
beautiful womanだけでも確かに美女ですが、写真集とかで見られる美女というよりも少し絵画っぽい雰囲気ですね。

ワードの拡充と整理

続いて要素の拡充として、品質関連のワードなどを追加していきたいと思います。
また、単純に追加するだけでなく、同じ意味の単語は近くに配置し、全体から詳細化する順番でトークンを並べ替えます。

ワード追加比較

masterpiece,best quality,32K,16K,8K,4K,ultra high res,high resolution,ultra-detailed,finely detail,realistic,photorealistic,professional photography,RAW photo,cinematic lighting,beautiful woman,upper body,smile,outdoors,

いかがでしょうか、品質のワードを増やしたり順番を変えたりするだけで、結構雰囲気などが変わってきますよね。
上記は品質関連のワードですが、詳細情報をさらに追加していきたいと思います。
基本的なテーマは変えずに、肌の質感や目の雰囲気などを追加していきます。

詳細ワード追加

masterpiece,best quality,32K,16K,8K,4K,ultra high res,high resolution,ultra-detailed,finely detail,realistic,photorealistic,professional photography,RAW photo,cinematic lighting,beautiful woman,upper body,looking at viewer,cute,smile,super detailed skin,shiny skin,detailed face,detailed eyes,symmetrical eyes,light on face,outdoors,

真ん中がbeforeで右が詳細ワードを追加した結果です。
大分顔などが鮮やかになりましたね。

ここまではポジティブプロンプトの入力だけでしたが、さらにネガティブプロンプトも追加します。

ネガティブプロンプト

Positive prompt:
masterpiece,best quality,32K,16K,8K,4K,ultra high res,high resolution,ultra-detailed,finely detail,realistic,photorealistic,professional photography,RAW photo,cinematic lighting,beautiful woman,upper body,looking at viewer,cute,smile,super detailed skin,shiny skin,detailed face,detailed eyes,symmetrical eyes,light on face,outdoors,

Negative prompt:
EasyNegative,negative_hand-neg,ng_deepnegative_v1_75t,badhandv4, bad-hands-5,bad_prompt_version2-neg,NSFW,test,watermark,logo, worst quality,low quality,normal quality,low res,monochrome,disfigured, grayscale,painting,sketches,bad anatomy,bad proportions,malformed limbs,extra limbs,missing arms,missing feet,extra legs,missing legs,long neck,bad hands,mutated hands,extra hands,fused fingers,strange fingers,extra fingers,fewer fingers,missing fingers,cleavage,ugly, nipples,face stain,mole,age spot,skin blemishes,acnes,

ネガティブプロンプトにはEasyNegativeをはじめ、複数のTextual Inversionを埋め込んでいます。
そのため、全体の画像に対する影響はかなり大きいですが、一気に美女の写真っぽくなりましたね。
ただし上記の結果からもわかる通り、一番重要なのは追加モデル含め何のワードを使用するかということに注意してください。

仕上げ

最後の仕上げとして、BREAK構文と強調構文によりプロンプト最適化を図ります。
まず、上記ポジティブプロンプトは85トークンあるため、1-75と76-85トークンの二つに分割されてシステムに送られています。
これに対して、BREAK構文で適切な位置でプロンプトのトークンを分割します。

最も適している位置は、本画像のテーマである「beautiful woman」の位置でしょう。
この位置で分割すると、1-75トークンは品質や全体に関するグループ、二つ目がテーマやその詳細の部分となります。
また、76トークン目はグループの1番目にくるトークンになるため、影響度が強くなります。
そのワードにテーマのトークンを持ってくるのは非常に理に適っていると言えるでしょう。

BREAK文

上記がBREAK構文を挿入前後の比較画像です。
また結構雰囲気が変わっているのが分かります。
正直、どちらがより美女の画像なのかといわれると、好みの問題のような気もします。

ただし、BREAKを入れた影響として、上記のケースで重要なのは実は目の部分です。
BREAK挿入前のプロンプトでは75,76トークン目は「symmetrical eyes」となっており、挿入前のプロンプトではここで分割が起きています。

下記は目の部分を拡大した比較画像です。
BREAK挿入前が上側の画像であり、目が76トークン目にあるせいなのか左右で色違いになっています。
必ずしもトークンの位置の影響であるとは言えませんが、BREAK構文を入れないと意図しないワードが高い影響をもつリスクがあるわけです。

BREAK影響


最後に品質のトークンなどを少し強調するなど、適宜補正していきます。
ここら辺は、最終的な調整なので特に正解はなく、好みの画像が作れるように試行錯誤するイメージです。
修正した結果が下記になります。

強調比較

いかがでしょうか。
プロンプトをある程度機械的に組み込むだけでそれなりに美女の画像が生成できたと思いませんか。

上記はプロンプトによる画像生成結果ですが、さらにスケールアップなどをすることで、簡単に高画質化が可能です。
下記は1.5倍のスケールアップですが、これだけでも見違えるほどの結果になります。

最終結果の比較

まとめ

本記事では、画像生成AIのプロンプトについて詳しく解説しました。
画像生成AIのプロンプトは、AIが期待通りの画像を生成するための指示やヒントであり、モデルの選択と同じくらい重要な要素です。
プロンプトはAIの出力を大きく左右するため適切なプロンプトを使用することで、ユーザーの要求に応じた高品質な画像を生成することが可能になります。

また、プロンプトの作成におけるベストプラクティスについても触れました。
9つの原則原理とそれに基づく5つのベストプラクティスを紹介し、これらをもとに実際に美女の画像生成を作成するSTEPを実例解説しました。

この記事を通じて、画像生成AIのプロンプトの重要性とその最適な使用方法について理解を深めることができたかと思います。
画像生成AIのプロンプトは奥が深く、重要なワードの選択だったりモデルやパラメタの組み合わせなど、必要な要素が多くあります。
シンプルな正解などなく、試行錯誤が必要な分野ですが、本記事で少しでも良い画像生成ができるようになればと思います。

是非、プロンプトをはじめとした画像生成AIの技術を追求し、よりよい画像生成を実現してみてください。

なお、本記事のプロンプト文法などについて、より詳細に知りたい場合には下記AUTOMATIC1111公式ドキュメントも合わせてご確認ください。
https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features

ABOUT ME
ミスタ
ミスタと申します! このブログは主に日々学んでいる知識についてアウトプットしていくことを目的としたブログです。 その他、趣味や戯言なども時々書いたりもします。 最近は専らAI関連が興味の対象です。 このブログが少しでも誰かの役に立てればと思っています!