伝わる(?)プロンプト

写真

Stable Diffusionで遊んでいるうちにちょっと分かってきたことを暫定的にまとめておく。あくまでAUTOMATIC1111限定の話ではあるし、これが正しいということでもない(と思う)。Generative AIってまだ全然分からんというお気持ちですw

ガチャを回しているうちはプロンプトが分かってない

ということが分かったw

上手いプロンプトは、シード値によらず同じような絵が出力される。つまり描きたい絵の説明がきちんとされている

Civitaiや他のプロンプト付きで画像がアップロードされているサイトで画像とプロンプトをよく見比べると、

  • プロンプトで指示したキーワードが画面に出力されてない
  • プロンプトで指示していない要素が画面に出力されている

のが非常に多い。

前者はそのキーワードのプロンプト中での位置が後方であったりウェイトの指定が小さいため切り捨てられていたり、場合によってはスペルが間違っているものもある。あと、日本人の我々は和製英語を入力しがちなので、ちゃんと辞書を引こう。

後者は”correlation”「相関」と呼ばれる現象で、プロンプトに含めたあるキーワードから連想されるものがついでに出力されているだけ。ただ、これはかなり厄介な現象で、例えば”blue eyes”を指定すると、青い目はヨーロッパの人々つまり”Caucasian”に多いために、背景を指定しないとヨーロッパ風の街並みが連想されて出力される。

作例は全然正しくない

キレイに見える絵でも、ダウンロードしてAUTOMATIC1111のPNG Infoからtxt2imgに送って生成してみると再現しない。もちろん画像サイズによっては再現されないという問題(512ピクセルに収まってない、縦横比が特殊)もSDにはあるのだけど、上述の通りプロンプトが正しくなく偶然そのキレイな絵が出力されただけというのが多いからだ。

SDにはシード値というゆらぎがあるのは確かだし、その同じシード値でも毎回絶対に同じ絵が出力されるものでもない。ところがプロンプトが上手くなると、シード値を変えてもほぼ同じ構図・要素が配置された絵が出力されるのも事実なので、絵とプロンプトが一致しているサンプルを真似した方が上達は早いと言えそう。

上手いプロンプトってどんな?

自分が書いたプロンプトが上手いか否かは、バッチで10枚回してみればすぐ分かる。指定したキーワードが出力されていて、指定していないキーワードが出力されていない、のが上手いプロンプト。

じゃあ具体的にどうしたら上手いのかなんだけど、気付いたことを列挙しておくのでチェックしてみると良いし、自分もチェックしながらやっている。

ウェイトの位置

“(beautiful face:1.2)”は間違い。これは「顔を1.2にして」の意なので顔が大きくなる。「1.2の美しい顔にして」という指定では無い。おそらく正しくは、”beautiful:1.2 face”、もしくはウェイトがより大きくなるけれど、”(beautiful:1.2)face”。”(beautiful face):1.2″、だと美しさも大きさも1.2になる気がする。

定性的→定量的

“ultra(ultra-)”、”high(high-)”、といった定性的なキーワードも間違い。例えば”ultra detailed face”という書き方は必ずしも”ultra”が”detailed”を修飾せず、“ultra face”と”detailed face”の両方を意味している。”ultra-detailed face”だと修飾関係は正しくなるが、「どの程度がultraなのか」という解釈をSDに投げてしまっていてコントロールが出来ない。”(detailed:1.2)face”だと、「1.2ぐらい詳細な顔」と解釈してくれる気がする。定量的を目指そう。

定量的な画質の指定

“4k”、”8k”などは一見定量的に見えるがおそらく間違いでたぶん定性的なキーワード。両方指定している例も見受けられるが、生成する画像サイズが”4k”や”8k”というのは(現在のSDでは)あり得ないし、そもそも”8k”を指定するなら”4k”は不要なはず。高解像感のある画像を生成したいのなら、プロンプトの前方に”(resolution:1.4)”などとすれば良い。同様に”masterpiece”も定性的で、”(quality:1.4)”といった指定が定量的

定量的なライティングの指定

ライティングの指定はなかなか難しくて、”cinematic lighting”や”professional lighting”といったキーワードが散見される。でもこれらも定性的。「逆光」が欲しいなら”backlight”だし、「柔らかい光」が欲しいなら”soft lighting”、もちろんこれも定量的に増減するなら”(soft:1.2)lighting”と指定すべきじゃないかと。

正しい英文にする

日本人としてはここが一番難しいのだけど、ChatGPTとか使えばかなり楽になっているかと。例えば、

(detailed:1.2)photo of full body of(beautiful:1.2)(Japanese:1.2)1girl, kimono, (long:1.2)black hair, standing, temple

だと、SDは「なんとなーく」指定された要素を画面に「並べて」いく。たまたま「着物を着た長い黒髪のキレイな日本の少女が寺の前に立っているポートレイトの写真」が出力されるかも知れないけれど、確率はかなり低い。そうではなく、きちんと前置詞等を使って英文にする。ただしウェイトは挟む、と。

(detailed:1.2)photo of full body of(beautiful:1.2)(Japanese:1.2)(18yo)1girl with (long:1.2)black hair in (beautiful:1.2)(floral:1.2)Furisode standing(at the front of)the entrance of the(Japanese)temple with(smile on(beautiful:1.4)face)

やってみよう。まず単語を並べるだけ。

(detailed:1.2)photo of full body of(beautiful:1.2)(Japanese:1.2)1girl, kimono, (long:1.2)black hair, standing, temple, (solo), (quality:1.4), (photorealistic:1.2), (resolution:1.4), (sharpness:1.6)

次は英文にしてより具体的にしたもの。

(detailed:1.2)photo of full body of(beautiful:1.2)(Japanese:1.2)(18yo)1girl with (long:1.2)black hair in (beautiful:1.2)(floral:1.2)Furisode standing(at the front of)the entrance of the(Japanese)temple with(smile on(beautiful:1.4)face), (solo), (quality:1.4), (photorealistic:1.2), (resolution:1.4), (sharpness:1.6)

概ね「寺の入口の前」に立ってくれたし、日本人としては若い女性が着る「着物」としてイメージされるのは、おそらく「振袖」であって派手な感じであろうし”Furisode”はSDが(モデルによるが)認識してくれる。ただ、これでも髪の色として指定した”black”が振袖の色に「相関」しているのが分かる。プロンプト中でBREAKキーワードを適宜使うかControlNetのcolorがオススメ。

とはいえ

まだまだ本当に分からんというのが正直なところ。

  1. ControlNetのscribbleか、Photoshopで描いた下書きからControlNetのcannyで全体の感じをキメる
  2. プロンプトを調整してイメージした絵に近づける
  3. 2で生成した絵をcannyで再度「下絵」として再生成、Inpaintで細部を修正する、ControlNet colorで色を修正
  4. ESRGANとR-ESRGANを組み合わせて2倍にアップスケール

というフローを現在はお試し中。