はじめに
Stable Diffusion に与えるプロンプトを「呪文」とか「おまじない」としてブラックボックス的に扱うのではなく、「実践的にコントロールするための手段」として使いこなせるようになりたいなと試行錯誤した結果、自分なりにいくつか見えてきたことがあるので共有します。
内容
「人物像(ポートレート)の作成」を題材にして以下の内容を記します。
- 写真と絵画の出し分け方
- 構図の指定
- 色合いの指定
- 作風の指定
- 語順の影響
- 写真向けのキーワード
- 人物(被写体)の特徴指定
実際のプロンプトと作成された画像もそのまま載せます。 「プロンプトをうまく組み立てられるようになりたい」という初心者の方への入門編・参考資料になればうれしいなと思っています。
環境セットアップなどについて
実行環境のセットアップに関する情報はググればたくさん出てくるのでこの記事では扱いません。 あくまでも「プロンプトをどう組み立てるか」にフォーカスします。
基本的なスタンス
プロンプト組み立ての基本的なスタンスとしては、「少ない単語から始めて徐々に増やす」のステップ・バイ・ステップ方式で行きます (膨大な物量の情報から自分が必要なものを取り出す「引き算」よりも、最小限の情報に対して自分が必要な情報を足していく「足し算」の方が脳みその消費カロリーが少ない&コントロールできているという感覚が得やすい&その結果として学習が早く進むためです)。
被写体 (モデル) について
被写体 (モデル) は架空の人物 Mary Smith さんです (ググってみたところ、アメリカ合衆国で一番女性の名前が “Mary”、苗字が “Smith” と出てきたのでその名前をそのまま拝借しています)。
さっそくプロンプトに
Mary Smith
とだけ指定して画像作成するとこんな人が出てきました。
念のため “Mary Smith” というキーワードで画像検索してみたのですが、明らかに同じに見える人物はでてきませんでした。さらに、この画像を指定して画像検索してみても、完全一致する画像は出てきません。
ということで、まちがいなく「AIが作り上げた架空の人物画像」といえそうです。
- 余談ですが、日本人に多そうな名前を指定するとちゃんと日本人っぽい人物画になり、男性名と女性名を区別して出し分けを行ってくれます。
(参考) 設定等に関して
- この画像を生成した時の seed は
273431
です。- この後生成する画像はすべてこれと同じ
273431
を seed として利用します(seed を変えてしまうと、プロンプトが全く同じでも出力される絵が変わってしまうため、「seed が変わったせいで画像が変化したのか、プロンプトに加えた修正の影響で画像が変化したのか」がわからなくなってしまう、という問題を回避するためです)。
- この後生成する画像はすべてこれと同じ
- 今回の実験では手元のPC (GPU は GeForce GTX 1660 Ti, VRAM 6GB で Stable Diffusion を実行できるぎりぎりのラインのスペック) 上で Optimized Stable Diffusion の optimized_txt2img.py を jupyter notebook 上で実行できるようにばらして、以下の設定で実行しています。
- ステップ : 30 (時間短縮のため、ちょい少なめに設定)
- サンプラー : PLMS
- スケール : 7.5
- 画像サイズ : 512x512
- その他 : —n_samples 1 —n_iter 1 —turbo —precision full
1. 写真と絵画の出し分け方
写真と絵画の出し分け方は単純です。
写真だったら photo
絵画ならば oil painting
(油絵)、pencil drawing
(鉛筆画)というふうに素直に画像のタイプを指定するだけでOKです。
Mary Smith, photo
Mary Smith, oil paining
Mary Smith, pencil drawing
左端が未指定でその右が “photo” を指定したもの、続いて “oil paining”、“pencil drawing” 指定のものになります。
ちゃんと期待通りの結果になっています。
2. 構図の指定
上記の結果ですが期待通りではあるのですが “photo” だけ構図が異なるのが少し気になるので修正します。
人物像の場合、以下のようなキーワードが構図指定として思いつきます。
- closeup (顔のアップ)
- portrait (ポートレート)
- bust (胸像)
- full body (全身像)
photo 以外の画像は closeup
が一番近そうに見えるので、このキーワードを明示的にプロンプトに含めてみることにします。
Mary Smith, closeup
Mary Smith, photo, closeup
Mary Smith, oil paining, closeup
Mary Smith, pencil painting, closeup
出てきた画像はこちらです。
若干顔の雰囲気が変わった人もいますが…構図はそろったのでよしとしましょう!
ちなみに余談ですが、現在のAIモデル (1.4) では、full body
(全身像) の構図指定ははあまり満足いく結果になりません。
具体的に言うと
- 頭や足元が画角から外れて切れる
- 顔がぐしゃぐしゃに崩れる (特に写真がひどい)
で、若干工夫が必要です。 前者に関しては正方形ではなく縦長で画像生成すると緩和できます。 後者の顔の崩れに関しては、こちらの記事を参考にしてみてください。
あと、構図を示すキーワードとしては landscape
もありそうですが、人物画でこれを指定した場合、後ろ向きだったり最悪肝心の人物がいなくなったりすることがままあります。こちらも人物に対して使うときは「うまくいけばラッキー」ぐらいの気持ちで臨む方がストレスが少ないです。
3.色合いの指定
構図をそろえてみたら次は色がそろってないのが気になってきます。 ということで「カラー」と「モノクロ」の指定をしてみたいと思います。
「カラー化」できそうなキーワードとしては vivid
や HDR
など「鮮やかに見せる系」のものが思いつきますが、今回は超ベタに RGB
を指定しています。
モノクロは monotone
でよさそうです。
結果は以下の通りです。
予想結果としては上段が全部カラーで下段がモノクロだったのですが、そうなってませんね…。
具体的には以下が予想外でした。
- 上段の右端 (pencil drawing) がモノクロ
- 下段の中央 (oil painting) がカラー
なぜだろうとしばらく考えたのですが、理由がわかりました。
- 鉛筆画は黒い鉛筆で書くから白黒にしかならない
- 油絵をモノクロで書くことはできない
当たり前といえば当たり前ですね…
つまりAIによる画像生成は、書いた通りに動くプログラムとは異なり「指定した通りに画像生成してくれる」わけではなく「現実世界にあり得ないものは出せない」なんですね。
もっというと「現実世界にはあり得るかもしれないけど、それは学習してないから知らない」というケースもありそうです。pencil drawing
でも色鉛筆で描いた絵ならばカラーなはずなので出してくれても良さそうなのですが、「色鉛筆の画像は数が少ないので学習していない」とか「通常の鉛筆に比べて色鉛筆の画像は相対的に少ないため、単なる pencil drawing
という指示ではではでてこない」という可能性はありそうです。そのあたり少し想像力を働かせて「AI学習側の事情」を推察して、例えば colored pencil drawing
という形にプロンプトを修正すればひょっとしたら出せるかもしれません。
いずれにせよ一つ言えることは「効果を打ち消しあう矛盾した指示は避ける」でしょうか。指示してもどちらかは無視されるでしょうし、結果の予測もつきにくくなるので。
ま、人間でも「油絵でモノクロお願い!」と言われたら、「は?ふざけんなー墨絵で書いてやろうかっ」てな気分になるとおもうでそれと同じと考えればわかりやすそうです。
4. 作風の指定(1)
次はいよいよ「作風」です。ここからがAI画像生成の本領発揮な感じになります。
試しに世界的に有名な画家を指定して絵を描いてもらいましょう。
プロンプトに art by ...
という形で画家を指定します。
なおこの際、pencil drawing
など画材の指定は画家の自主性というか持ち味というか特徴を損なうだろうなーという気もするので削除します
(きっとこの辺の画家たちってあれこれ指示されるのめちゃくちゃ嫌いそうですよね…)。
Mary Smith, closeup, art by Edvard Munch
Mary Smith, closeup, art by Pablo Picasso
Mary Smith, closeup, art by Vincent van Gogh
Mary Smith, closeup, art by Claude Monet
はい。すごいですね。
キャプションつけなくてもだれの絵かが一発でわかっちゃいます。 しかももともとの絵の構図をちゃんと残している上でこれなので語彙がなくなるレベルでヤバい感じです。
「画家を信じて自主性に任せて大正解!」という気分です。
ちなみに、「よさげな作風を持った画家を調べたいなー」と思った時には CLIP Ranked Artists が便利です。作家名と作品画像がセットでみれます。
4. 作風の指定(2)
さてここでふと気になったのが「歴史的に有名は画家は当然いけるとして、日本人はどうなんだろ?ひょっとしたら漫画ならば結構世界進出してるからいけるんじゃない?」でした。で、ためしに「art by Akira Toriyama」とか「art by Hirohiko Araki」とか指定してみたんですがどうもそれっぽい感じにならず…(前者は「いわれてみればそうかも」なレベルで、後者は「ん?ひょっとして作者近影が元ネタ?」な感じでした)。でしばらく考えて「ひょっとしたら、作者は知らなくても作品名ならば知ってるんじゃない?」ということで、以下のプロンプトを試してみました。
Mary Smith, closeup, inspired by Dragon Ball
Mary Smith, closeup, inspired by JoJo's Bizarre Adventure
Mary Smith, closeup, inspired by Demon Slayer: Kimetsu no Yaiba
Mary Smith, closeup, inspired by Jujutsu Kaisen
結果はこちら:
いやー。んーこれどうなんだろ。確かに作品の雰囲気は出てるけど、微妙な感じが…ていうかドラゴンボール自己主張が激しすぎて Mary Smith さん要素消えてるじゃん…。
ちょっといまいちですねー。
4. 作風の指定(5)
そんなときには、「プロンプトを工夫して作風をまろやかにする」という方法があります。別の作家の影響が出るキーワードを追加します。
今回は以下の2つを追加してみます。
trending on ArtStation
trending on pixiv
こちらは「きっとAI画像生成の元ネタは ArtStation やら pixiv からも取得してるだろうからその辺の画像を示すキーワードを入れることでほかの作家の色で薄めてしまおう」てな魂胆です。
Mary Smith, closeup, inspired by Dragon Ball, trending on ArtStation
Mary Smith, closeup, inspired by JoJo's Bizarre Adventure, trending on ArtStation
Mary Smith, closeup, inspired by Demon Slayer: Kimetsu no Yaiba, trending on ArtStation
Mary Smith, closeup, inspired by Jujutsu Kaisen, trending on ArtStation
- … 同様に
trending on pixiv
を追加
上段が ArtStation で、下段が pixiv なんですが…作画が荒れまくっちゃいました。 そして全然薄まってなーい! 特にドラゴンボール!強すぎでしょ!!
そんな時にはあわてず騒がず語順を変えましょう。
5. 語順の影響
プロンプトに描く文字列の語順は作風にばっちり影響します。
具体的には「より前(左)にあるキーワードが強く、後ろ(右)に行くにつれて弱くなる」です。
例えば先ほどの
Mary Smith, closeup, inspired by Dragon Ball, trending on ArtStation
ですが、これを
Mary Smith, closeup, trending on ArtStation, inspired by Dragon Ball
というふうに inspired by Dragon Ball
一番最後に移動すれば、画風に対する影響を弱められます。
結果はこちら。
だいぶ落ち着きましたね!! 最強のドラゴンボールも頑張って髪の毛の爆発を抑えてくれました。 なお右端下段の人は白目むいちゃってますが、きっと呪霊に体乗っ取られたんだろうという想像で自分を納得させることにします…
せっかくなので世界の有名画家さんたちにも同様に薄まってもらいました。
皆さんだいぶ自己主張を控えてくれてます。
特にピカソさんは雰囲気を残しつつも元の画家が誰だったぱっと見でわからない感じになっていてこれはこれでありな感じがします。
なお作風に関しては、「複数の作家名を指定することにより、複数の作風をミックスして新たな作風を作る」という別のやり方もあるのですが、こちらに関しては書き始めると長くなる(めちゃくちゃ面白いんです!)ので別稿にしたいと思います。
6. 写真向けのキーワード
写真向けのキーワードについても若干捕捉します。
「写真を出したい」と思った時は前述の photo
の他に、“trending on 写真共有サイト名” というパターンも使えます。
trending on Flickr
や trending on 500px
といったものです。
ほかにもカメラ名やレンズ名を指定するという技も有効で、これと trending on ...
を組み合わせるとかなり安定して写真画像を出してくれます。
例えばこんな感じです:
Mary Smith, portrait, Canon EOS 5D Mark II, HDR, trending on 500px
また、絵画と同様の発想で「写真家の名前を指定する」という方法で作風も指定できるはずですが、こちらは試してないため(写真家の作風にくわしくないので…)、ここでの言及は控えます。
7. 人物(被写体)の特徴指定
人物(被写体)の特徴に関しても、思いついたキーワード指定するだけで結構素直に反映してくれます。 例えば
Mary Smith, portrait, Canon EOS 5D Mark II, HDR, trending on 500px
をベースにして、これに年齢的特徴(young
, middle age
, old
)と beautiful
(ありとなしの2パターン) を付加して出力するとこんな感じになりました。
結構納得感のある結果かなという気がします。
old
と old beautiful
に関してはほぼ同じにみえますが、こちらは一般的な傾向として「old
という特徴は beautiful
よりも強い」という事実を反映しているということのなのかもしれません。あるいは「実際には高齢の人でも美しければ old
というタグ付けがされない」ということなのかもです。
同じことを男性名 (James Smith
) でもためしてみました。
こちらは beautiful
の代わりに handsome
を指定しています。
年齢敵的特徴はOKとして「ハンサムかどうか」については、「あーあなたはこれをハンサムだととらえたのね」という印象。この辺についてはタグ付けする人の価値観やタグ付けされたデータの分量によって異なった結果になるんだろうなという想像(心の準備)をしておく必要がありそうです。もうちょっと具体的に言うと「プロンプトに記載するキーワードは(自分自身の価値観ではなく)AIの価値観を想像してチョイスし、自分の想像が間違っていないかを実際の出力結果で確認してみる必要がある」です。
この結果を見てふと「女性名に対して handsome
、男性名に対して beautiful
を指定するとどうなるんだろ?」思ったのでこれも実験してみました。
これはなかなか面白い結果になりました。
まず「女性名に対する handsome
」ですが、左側の若い2人と右端の女性は元の画像に比べて中性化している(男性っぽくなっている)ように見えます。この結果から想像できるのは「handsome
という英単語はふつうは女性には使わない」という事だと思います。
逆に「男性名に対する beautiful
」 の方は「確かにもとの人物より beautiful
かもなー」という印象があります。つまり「beautiful
という英単語は男性に対しても使う」という事実を反映しているといえそうです。
「AI画像生成を通じて英単語の意味が理解できる」というなかなか面白い経験ができました。
最後におまけでもう一つ chubby
(ぽっちゃり) という単語を追加してみます。
んー、かわいい!! こちらは男女の区別なくどの年齢でも適用可能な単語って感じですね。
まとめ
この実験を通して「的確なプロンプトを組み立てるために必要なスキル」がいくつか見えてきたのでリストアップしておきます。
- キーワードを並べること自体は簡単なので、技術的なハードルはすごく低い
- 抽象的なものを的確に言語化できるソムリエ的な能力が大事
- 「抽象的なものを的確に言語化できる」とは「自分の中の常識や概念を言語化できる」という意味ではなく、「AIモデルの価値観を言語化できる」ということ。したがってこれらを想像し、理解する努力が必須。「相手の気持ちを想像する」とか「異文化理解」が苦手な人には向かないかも
- AIモデルの価値観を理解するためには試行錯誤が必要になる。従って、試行錯誤を楽しんでやれる人でないと厳しい
という感じで、「いい感じのプロンプトをパクってちょっろっと変えて遊びたい」ではなく「プロンプトを駆使して思い通りの絵を生み出したい」という人にとってはそこそこ頑張らなきゃいけない(別の言い方をすると「楽しめる」)要素が結構ありそうだな、という気がしました。
次回
次回は「Stable Diffusion でプロンプトに複数の作家名を並べる理由」です。
応用編的な扱いになりますが、こちらの実験では「芸術の深淵を垣間見た」という感覚があったのでなかなか楽しかったです。