Stable Diffusion でプロンプトを操る ~ 画像生成AI ②

生成AIをいろいろと試してみたいとHPのOMEN35Lを購入して、画像生成AIの環境構築を終えたところです。

本記事に掲載している画像は、すべて生成AIにより作成したものであり、特定の実在人物をモデルにしたものではありません。

プロンプトは万能か

前回の最後に、「mountains and lodges」とだけプロンプトを入力して、青い空と山脈、それに山小屋の風景写真が出力されて喜んだところですが、今回の目標は風景画ではなく、人物画です。いや、画というと絵っぽいですが、架空キャラクターの写真っぽいもの、ですね。

目指す人物像は、架空のアシスタントキャラクターで、ブログ内での案内役として、自然で落ち着いた雰囲気を持つ、身近に感じられる存在にしたい、と思っています。

画像を生成するにあたってもう少し具体化すると、年齢層が20代後半~30代前半の日本人女性を想定した人物、というイメージを考えています。もちろん、特定の人物を題材にしたものではなく、あくまでも架空のキャラクター。いそうでいない、実在しない人、ですね。

画像生成のために使用するモデルは、引き続き、SD1.5のベースとなる v1-5-pruned-emaonly.safetensors です。独自に学習を加えていないピュアなモデル、と言って良いでしょうか。

今回は、あくまでもプロンプトの違いによる画像変化を確認するテーマとなりますので、それ以外のパラメータは、あえてデフォルト値を使用しています。

・Sampler:DPM++ 2M
・Schedule type:Automatic
・Sampring steps:20
・CFG Scale:7
・Seed:-1
・サイズ(Width x Height):512 x 512

このあたりの変更については次回以降に触れてみたいと思います。

Batch countは 5 に設定し、同じパラメータで Seedが異なる(-1 でランダム)画像を5枚生成して確認します。ボリュームが多いので全ての生成画像は例示しません。説明しやすい代表的なものを使用しますので若干恣意的な選択にはなってしまいますが、特徴は捉えられるかな、と思います。

もちろん、Seedが異なりますので同じパラメータでも同じ画像が出てくる可能性はほぼゼロです。ですので、以下の説明中に、実は不要だった、と考えられるパラメータの追加などが生じる可能性がありますが、参考程度にご覧いただけたら、と思います。

では、さっそく。

まずは、どんなものが出てくるか、というパンドラの箱のような気持ちで。

prompt
a woman

至ってシンプルに。

掲載にあたり、JPEGに変換しています(以下同様)

確かに。としか言いようがないですね。女性です。絵とも写真とも指示してないですし。5枚中3枚が絵画風の画像でした。

では、ということで、写真で出して欲しい、ということで、

prompt
a woman, photo

としてみました。

5枚中5枚とも、写真風の生成画像となりました。

きちんとプロンプトが効いているようですね。基本的にはこの画像のように、こちら(正面)を向いたひとりの女性となっています。念のため、プロンプトに portrait(肖像画) と追加してみましたが、大きな変化はありませんでした。

でも、この portrait なし(5枚)/あり(5枚)の10枚は、見事に西洋系の人物ですね。

Japanese は 日本人?

今回の目標は日本人ですので、判りやすく、japaneseを追加してみましょう。

prompt
a japanese woman, portrait photo

これで生成されたのがこちら。

確かに、日本人女性ではあるんですが…。

他の4枚もすべて和装でした。

ひょっとしたら、もっと生成する数を増やせば現代風(洋装)の女性が登場する可能性もありますが、現時点で5枚中5枚と100%なので、方針を変えた方が良さそうですね。

画像生成のSD1.5における「japanese」というワードは、単に「日本人」を指す属性ではなく、日本人や日本文化そのものを象徴するアイコンとして内部的に定義されているんでしょうね。

SD1.5の学習データ作成の際、着物・和風建築・伝統衣装・文化紹介 のような写真のワードとして「japanese」が使用されているために、これらと強く結びついているのかな、と思われます。

それゆえ、日本人的な顔立ちを期待して japanese を指定しても、文化や衣装の方が強く出てしまう、という結果になるようですね。

なので、japanese にこだわると遠回りする可能性がありそうなので、方針転換。

「見た目」をプロンプトに指定してみることにします。

prompt
a woman, portrait photo,
black hair, brown eyes

これ以降、プロンプトが2行以上にわたりますが、特に意味はありません。登場順にプロンプトとしての効きが強くなる、というルールはあるようですが、改行による効力の違いは無いと思われます。

で、この生成画像です。

5枚中、最も現代の日本人っぽいものを選んでみました。他の4枚のうち、2枚は、ちょっと違和感はあるけれども現代の日本人かな、というもので、あとの2枚は黒髪で日本語で言うところの黒目ではあるんですが、なんでしょう、東アジア系ではない感じです。

恐らく、SD1.5が学習に使用した大量の「黒髪で黒目」の写真が、一般的な日本人を含む東アジア系の人に限定されていない、ということでしょうね。

なので、そのあたりの調整が必要と思われます。

でも、ちょっと前進ですね。

より日本人らしく

というわけで、欧米でよく見られるような濃いメイクではなく、日常的な雰囲気を出すために、このようにプロンプトを追加してみました。

prompt
a woman, portrait photo,
black hair, brown eyes,
natural makeup, light makeup

…なんですが、逆効果?

これ、ナチュラルメイクなんですかね。。

この回の5枚で最も自然な感じの日本人っぽい画像がこちらです。

これは、近付いてきた感があります。

年齢的なバラツキもあったので(確かに、年代の指定はしてませんでしたね)、次の5枚はこのように。

prompt
a woman, portrait photo,
young adult,
black hair, brown eyes,
natural makeup, light makeup

想定年齢層より若い指示のプロンプトですが、実はこれ、ChatGPTの助言だったりします。。

いや、この追加はNGだったのでは?

5枚ともに「日本人というには…」という感じのものとなりました。

だんだんとChatGPT依存が高まってきますが、学習素材の日本人写真は表情が控えめなものが多く、欧米人モデルは表情が強い、という情報から、表情を抑えるプロンプトを追加してみます。

prompt
a woman, portrait photo,
young adult,
black hair, brown eyes,
natural makeup, light makeup,
calm expression, gentle expression, soft expression,

これでどうなったかというと…。

かなり「日常にいそうな」感じになってきました。

ここでは顔だけに注目してください。手が異常なのは置いといて…。意外と生成画像ではありがちなんですけどね。

ここまで来れば、ということで、ようやく japanese の出番です。

prompt
a japanese woman, portrait photo,
young adult,
black hair, brown eyes,
natural makeup, light makeup,
calm expression, gentle expression, soft expression,

近所にいそう、です。通勤時間帯の大阪駅構内を歩いているとすれ違いそうな感じがします。

他の4枚も、大きく外すものは無く、それなりに近付いてきた感じがあります。

やっぱり、 japanese は、必要なんでしょうね。でも、それだけではダメで、特徴を積み上げたところに、補助的な要素として追加する、というのが有効なようです。

ここまでのプロンプトをちょっと整理します。重複させると強すぎるものは適宜省いて、こんな感じにしました。

prompt
a young adult woman, portrait photo,
black hair, brown eyes,
natural makeup,
calm expression,
japanese

5枚とも、「自然な顔」ではあるんですが、全体に「物憂げ」という言葉がぴったりな表情なんですよね。calm expression って、穏やかな表情であって、悩みを抱えているという感じでは無いと思うのですが。。

表情を変える

なので、少し笑みを入れてみます。

prompt
a young adult woman, portrait photo,
black hair, brown eyes,
natural makeup,
calm expression,
japanese,
light smiling,

頭が切れてますが、それは置いといて、5枚中一番いい表情のものです。ただ、ちょっとわざとらしい笑顔なので、もう少し抑えてみようかと、

prompt
a young adult woman, portrait photo,
black hair, brown eyes,
natural makeup,
calm expression,
japanese,
gentle smile,

に。

いや、逆、行ってます。これ。

あとの4枚も、わざとらしい笑顔の上に、画像生成の限界なのか、口元が妙に歪んでいたり、顔の骨格がおかしくない?となっていたりと、調整は難しいですね。

といいつつも、一番最初のプロンプトからは、格段に現実的な写真になってきているのを感じます。

身なりの調整

この先も微調整が必要なのですが、今回の最終形は、ブログの案内役となる架空キャラクターを生み出す、というところなので、身なりのプロンプトを追加してみました。

prompt
a young adult woman, portrait photo,
black hair, short hair, brown eyes,
natural makeup,
calm expression,
japanese,
gentle smile,
simple casual clothes,

すっきりとした雰囲気というのでしょうか。

ネガティブプロンプトを追加する

実は、このあたりから、「プロンプトで生成したいもの」とは逆に、勝手に生成されては困るものを落とす、「ネガティブプロンプト」が必要になってくるんじゃないかと推測していたんですが、それほど必要になるものが無いのが不思議な感じがします。

念のため、リアルな写真を目指すには邪魔となる、一般的なネガティブプロンプトを追加しておくことにします。

prompt
a young adult woman, portrait photo,
black hair, short hair, brown eyes,
natural makeup,
calm expression,
japanese,
gentle smile,
simple casual clothes,

negative prompt
anime, illustration, cartoon, CGI, render, doll-like

特に変わったような気がしないのは、それらが生成されてなかったから、ということでしょうかね。

なので、生成画像の例示も控えておきます。

調整を続ける

案内役の雰囲気を出せたら、と、役割のプロンプトを追加してみました。(髪型は、思っていたものが出せなかったので変えています)

prompt
a young adult woman, portrait photo,
black hair, brown eyes,
simple hairstyle with a distinctive fringe,
natural makeup,
calm and attentive expression,
japanese,
gentle smile,
simple casual clothes,
professional and confident demeanor,

ちょっと整い過ぎた感はありますが、案内役に相応しい感じになってきたように思います。

とはいえ、実は最初の5枚では「ちょっと違う」感が強くて、追加での5枚の中の1枚になります。なので他の9枚は、微妙なものばかりです。

この精度を上げようと、「現実にいそう」感を出すプロンプトを追加。ネガティブプロンプトにも追加しています。

prompt
a young adult woman, portrait photo,
black hair, brown eyes,
simple hairstyle with a distinctive fringe,
natural makeup,
calm and attentive expression,
japanese,
gentle smile,
simple casual clothes,
professional and confident demeanor,
clean and refined appearance,
slightly stylized but realistic,

negative prompt
anime, illustration, cartoon, CGI, render, doll-like,
overly generic, stock photo look

これで生成されたのがこちら。

確かに、「いそう」ではあります。

が、この髪型じゃない、という気がします。。

シンプルで実用的ながら、手入れが簡単なヘアスタイルに(って、もはや私には判らないです…)。

prompt
a young adult woman, portrait photo,
black hair, brown eyes,
simple and practical hairstyle,
low-maintenance hairstyle,
natural makeup,
calm and attentive expression,
japanese,
gentle smile,
simple casual clothes,
professional and confident demeanor,
clean and refined appearance,
slightly stylized but realistic,

確かに、そうなのかも。と思わせる髪型ですね。

この他の4枚(うち1枚は顔が歪に)も、オフィス街にいそうな顔と髪型となっています。こんな抽象的なプロンプトでも、かなり寄せてきてます。

が、この例示の1枚もそうですが、全体的に目尻が鋭いというのか、きつい印象のものが多いんですね。

なので、表情を和らげるため、ネガティブプロンプトを追加。要は、きつく感じる目を「出さない」という方向です。

negative prompt
anime, illustration, cartoon, CGI, render, doll-like,
overly generic, stock photo look,
sharp eyes, upturned eyes, overly defined eye shape

最初の5枚は、「うーん」というものだったので、5枚を追加。この1枚だけが納得のいくものになりました。他の9枚は、気に入る気に入らないという次元ではなく、「なんか変」なんです。

何が変なのかを考えていて気付いたのが、目や鼻といったパーツのバランスの悪さ、というんですかね。

それぞれのパーツを見るとおかしくないんです。が、全体を見ると、「うーん」という感じ。

それを改善できるかどうかは不明なんですが、目尻の切れは、ライティング(光の加減)で変わって見える、というChatGPTの助言を受けて、プロンプトを追加してみました。同時に視線の柔らかさも追加しています。

prompt
a young adult woman, portrait photo,
black hair, brown eyes,
simple and practical hairstyle,
low-maintenance hairstyle,
natural makeup,
relaxed eyes, soft gaze,
calm and attentive expression,
japanese,
gentle smile,
simple casual clothes,
professional and confident demeanor,
clean and refined appearance,
slightly stylized but realistic,
soft natural light,
slightly uneven lighting

結局、今回も10枚出力してみたんですが、なんか違う感はぬぐえず。さらに10枚追加しても、なんか違和感が消えなかったんですね。

おまけに、どのプロンプトが影響しているのか、目は黒い、髪も黒いけれども、どう見ても肌も黒い、というルーツの違う系の人が急に増えてきたんです。

これとは別に、日本人「風」であっても、頬から下がふくよかというのか、太っているわけではないけれども頬から顎にかけてが目立つものが増えた気がします。

negative prompt
anime, illustration, cartoon, CGI, render, doll-like,
overly generic, stock photo look,
sharp eyes, upturned eyes, overly defined eye shape,
round face, chubby cheeks, full cheeks

というわけで、ネガティブプロンプトにそのあたりの抑止を追加。

他の4枚も、何が影響したのか判らないですが、まずまずのものが出力されました。というわけで、5枚ともにオフィス街ですれ違いそうな顔となりました。

いったん整理

さすがに、プロンプトもネガティブプロンプトも長くなってきたので、いったん整理します。

意味合いの重複しているものを削除したり、統合したり。

prompt
a young adult woman, portrait photo,
black hair, brown eyes,
simple, practical hairstyle,
natural makeup,
relaxed eyes with a soft gaze,
calm and attentive expression with a subtle smile,
japanese,
simple casual clothes,
professional demeanor,
clean and slightly stylized appearance, realistic,
soft, slightly uneven natural light

negative prompt
anime, illustration, cartoon, CGI, render, doll-like,
overly generic, stock photo look,
sharp eyes, upturned eyes, overly defined eye shape,
round face, overly full cheeks

あれ…。やっちゃったかも。。

仕様通りに動作しているソースコードを整理しようと手を入れたら動きがおかしくなるどころか、ビルドが通らなくなったような焦燥感を感じてしまいました。。

で、困ったときのChatGPT頼みになってしまったんですが、

prompt
a young adult japanese woman, portrait photo,
black hair, brown eyes,
simple, practical hairstyle,
natural makeup,
relaxed eyes with a soft, slightly unfocused gaze,
neutral to calm expression,
very subtle smile, mouth relaxed,
front-facing or very slight angle, head upright,
soft facial structure, gentle facial proportions,
distinctively east asian facial features,
simple casual clothes,
clean but understated appearance,
indoor setting,
soft, slightly uneven natural light

negative prompt
anime, illustration, cartoon, CGI, render, doll-like,
overly generic, stock photo look,
fashion model, runway look,
sharp eyes, upturned eyes, overly defined eye shape,
strong smile, wide smile, teeth visible,
prominent cheekbones, strong jaw structure

全体的に手が入っているので、気になる方はWinMergeなどで差分を取ってみてください。

なんとか、5枚ともに、日本にいそうな人の顔となりました。

でも、不思議なことに、この写真もその傾向があるのですが、眉から上が先細りというか、とんがってる感じのものが増えてるんです。

で、再度調整。

prompt
a young adult japanese woman, portrait photo,
black hair, brown eyes,
natural rounded head shape,
balanced head proportions,
flat to slightly rounded crown,
hair lying naturally on the head,
simple, practical hairstyle,
natural makeup,
relaxed eyes with a soft, slightly unfocused gaze,
neutral to calm expression,
very subtle smile, mouth relaxed,
front-facing or very slight angle, head upright,
soft facial structure, gentle facial proportions,
distinctively east asian facial features,
simple casual clothes,
clean but understated appearance,
indoor setting,
soft, slightly uneven natural light

もはやChatGPTに言われるがままになりつつあるんですが、出力開始。

「うーーん」。なんでしょうか。なぜにこんなにぽっちゃりになるの、という感じです。

ChatGPT曰く、

「頭頂を丸くしよう」とした指定が、
モデルにとっては
👉「顔全体を太らせる」
という解釈にすり替わりました。

いや、判ってたなら対策しといてよ…。

というわけで、逆に、プロンプトではなく、ネガティブプロンプトに頭の盛り上がりを抑止するワードを追加します。

prompt
a young adult japanese woman, portrait photo,
black hair, brown eyes,
simple straight hairstyle with minimal volume,
camera at eye level,
natural makeup,
relaxed eyes with a soft, slightly unfocused gaze,
neutral to calm expression,
very subtle smile, mouth relaxed,
front-facing or very slight angle, head upright,
soft facial structure, gentle facial proportions,
distinctively east asian facial features,
simple casual clothes,
clean but understated appearance,
indoor setting,
soft, slightly uneven natural light

negative prompt
anime, illustration, cartoon, CGI, render, doll-like,
overly generic, stock photo look,
fashion model, runway look,
sharp eyes, upturned eyes, overly defined eye shape,
strong smile, wide smile, teeth visible,
prominent cheekbones, strong jaw structure,
excessive volume on top,
puffy hair on top,
tall hair silhouette

カメラ位置のプロンプトを追加しているのは、頭頂を誇張されにくくするため、だそうです。

20枚出力して、これが最も適任そうな一枚となりました。

20枚中15枚が、「いそうな感じ」の顔、後の5枚が異常に歪んだ顔や、顔がフレームからはみ出しているもの、となっています。

ただ、全体に物憂げな顔が復活してます(全体見直しのときでしょうね。きっと)。

というわけで、修正。

prompt
a young adult japanese woman, portrait photo,
black hair, brown eyes,
simple straight hairstyle with minimal volume,
camera at eye level,
natural makeup,
attentive eyes with a calm, soft gaze
calm and approachable expression,
subtle, reassuring smile, mouth relaxed,
front-facing or very slight angle, head upright,
soft facial structure, gentle facial proportions,
distinctively east asian facial features,
simple casual clothes,
clean but understated appearance,
indoor setting,
soft, slightly uneven natural light

終盤に近付いてきた感があるので、40枚ほど。

全体に優しい感じの雰囲気になっています。

「あれ?」というのは、2割くらいあったでしょうか。

この写真くらいの自然な笑みで安定させたいと、プロンプトを修正したんですが、それは失敗。全体に表情が暗くなりました。

ChatGPTの自作自演的な感じはするんですが、最終的に落ち着いたのがこちら。

prompt
a young adult japanese woman, portrait photo,
black hair, brown eyes,
simple straight hairstyle with minimal volume,
camera at eye level,
natural makeup,
attentive eyes with a calm, soft gaze,
calm and approachable expression,
slight smile as a natural response,
soft, friendly impression,
subtle jaw definition,
clean transition from jaw to neck,
front-facing or very slight angle, head upright,
soft facial structure, gentle facial proportions,
distinctively east asian facial features,
natural skin texture,
simple casual clothes,
clean but understated appearance,
indoor setting,
soft, slightly uneven natural light

negative prompt
anime, illustration, cartoon, CGI, render, doll-like,
overly generic, stock photo look,
fashion model, runway look,
sharp eyes, upturned eyes, overly defined eye shape,
strong smile, wide smile, teeth visible,
prominent cheekbones, strong jaw structure,
excessive volume on top,
puffy hair on top,
tall hair silhouette,
overly rounded jawline,
heavy jaw

理想的なものが100%出力される、というのには程遠く、大半が「ちょっと違う」というものではあるんですが、目標としていた、「自然で落ち着いた雰囲気を持つ、身近に感じられる存在」の姿にはなったのではないでしょうか。

今回の締めに…

それにしても、です。

実際のところ、日本人向けに特化していないSD1.5のモデル、v1-5-pruned-emaonly.safetensors で、ここまで自然な感じの写真が生成できるとは思ってませんでした。

Stable DiffusionのAIモデルを共有するサイト、Civitaiでは、いくつもの日本人に特化したモデルがダウンロード可能です。つまりは、それだけ、素のモデルでは使い勝手が悪い、ということの裏返しかと思っていたんですね。

それが、これだけ出来るとは、です。

とはいえ、最後に挙げたプロンプトとネガティブプロンプト。現時点でのベースになるもの、となったわけですが、この写真1枚を生成するのに必要なワードの数では無い、ですよね。恐らく、日本人特化したモデルなら、半分以下になった上に、もっと高頻度で狙いの画像が生成できるようになるのではないかと思います。

今のままだと、ポーズを変えるたびに別人になる気がしてなりません。

少なくとも、今のところ、狙った「雰囲気」の人を生成するのがやっとで、見た目が同じ人物を生成することは、ほぼ無理な状況です。

どうすれば、安定して「同じ人物」を生成することが出来るようになるのかを、次回以降のテーマとしたいと思います。

というわけで。

ひとまず今回の締めくくりとして、さらに画像を生成して、その中の1枚を完成の画像としたいと思います。