SDXLのプロンプトだけで画像を生成 ~ 画像生成AI実験メモ ②

ローカルで動作させる画像生成AIについての実験メモ。
第1回は、たった1枚の学習素材からLoRAが作製できるか?というテーマで書いてみました。
今回は、その一つ前段階になる、プロンプトだけでの画像生成について、となります。
そういえば、SDXLを使っての画像生成は、いきなりLoRAを使用したものとなりましたので、プロンプトだけで、どれくらい狙い通りの画像が生成できるか、というところは確認してなかったんですね。
本記事に掲載している人物画像は、すべて生成AIにより作成したものであり、特定の実在人物をモデルにしたものではありません。
SDXL と SD1.5
Stable Diffusion の環境を作成したところから始まった画像生成AIのシリーズは、第1回目に環境の構築を行い、第2回目にプロンプトでの画像生成、というテーマを扱いました。
基礎から始めるということで、素のSD1.5(ベースモデル)を使用しての画像生成でしたので、汎用的ではあるものの思い通りの画像を生成するには苦労した、という印象があります。
私が初めてローカルでの画像生成AIに触れたのがおよそ1年前のことになるんですが、既にSDXLは実用面では安定期に入ってましたので、SD1.5ではなく、いきなりSDXLから入った口になります。
しかも、多くの方が経験されているように、Civitaiなどで良さげなモデル(チェックポイント)をダウンロードして生成していましたので、素のSDXLベースモデルに触れたのも、先日のテーマを扱ったときが初めてだったりします。
なので、SD1.5もSDXLもベースモデルについては経験が浅いため、今回も「SDXLがSD1.5とどう違うのか」という点を、新鮮な目で見られるのではないか、と期待しています。
目指すは日本人女性
プロンプトを変えることで、生成される画像がどう変化するかを確認したいので、他のパラメータは固定にします。
・Sampler: DPM++ 2M Karras
・Sampling Steps: 35
・CFG: 5.5
・Size: 1024×1024
SD1.5のときと同様、Seed値をランダム(-1)として、5枚程度生成し、傾向的な画像をピックアップしてみたいと思います。
目標は、SD1.5のときと同じく、年齢層が20代後半~30代前半の日本人女性を想定した人物で、もちろん、特定の人物を題材にしたものではなく、あくまでも架空のキャラクター。いそうでいない、実在しない人をターゲットとしています。
では、さっそく。
まずは、SD1.5のときと同じプロンプトで挑んでみます。
prompt
a woman
シンプルですね。まだ、ネガティブプロンプトには何も設定しません。
生成した5枚ともに、実写ではなく、絵画風の画像となりました。もっとアニメ寄りの画像が生成されるのかと思っていましたので、少し意外ではあります。

このような感じのものです。
5枚のうち4枚までが、基本はモノクロームで、唇だけ赤みを差しているというのが面白いですね。
では、写真で出すようにと、プロンプトを追加してみます。
prompt
a woman, photo

5枚ともに写真になりました。3枚がモノクローム調(一部に色あり)で、2枚がカラーです。また、5枚のうち3枚が鎖骨よりも上の写真で、2枚が腰から上の、いわゆる上半身です。
SD1.5のときと違っていたのは、5枚中1枚が日本人風の写真だったこと。顔が明らかに日本人、というわけではなく、袴姿のものでした。白黒で上半身ですね。

SD1.5よりも日本人が出やすいのか、たまたまなのか。それは分かりません。
指定前から日本人風の画像が生成されたことにちょっと驚いてしまったんですが、SD1.5のときと同じく、Japaneseを入れてみたいと思います。
prompt
a Japanese woman, portrait photo

この傾向はSD1.5と全く同じでしたね。5枚中5枚とも、和装の女性となりました。
しかも、5枚中3枚に「桜」が含まれるのは、「Japanese」をトリガーワードとする学習素材として、いかに「着物」「桜の花」「日本家屋」の画像が使用されていたのか、というのを物語っていますよね。
まぁ、実のところ、このあたりでSD1.5とSDXLの違いが出てくるんじゃないかと、ちょっと期待してたんですが、「なんだ、同じ傾向か」というのが正直な感想です。
とはいえ、この写真。よく見ると西洋風の帽子を被っているんですよね。SD1.5のときに生成された5枚は、ものすごく時代を感じる写真だけだったのと比べると、5枚とも「現代感」があるものなので、やっぱり、SD1.5とSDXLとの違いは、あるのかもしれません。(とはいえ、たった5枚でのサンプリングですから、なんともいえないですけどね)
結局のところ、「Japanese」のワードでは、洋装の現代日本人女性を生成することは難しいようですので、SD1.5の時と同じく、見た目で追っていきたいと思います。
prompt
a woman, portrait photo,
black hair, brown eyes
ここで、ちょっと意外な違いが出てきました。

SD1.5では、「brown eyes」で、日本語でいう黒目が生成されたのに、SDXLでは5枚ともに、「本当に茶色の目」となったんですね。それと連動してか、顔の雰囲気も日本人っぽくはないんですよね。
ChatGPTによると、SDXLではプロンプトの文面通りに解釈するので、「dark brown eyes」とした方が日本人っぽい顔になるようです。

5枚中4枚が、日本人にもいるよな、という顔となっています。
なので、ここからは dark brown eyes で進めたいと思います。
日本人は、欧米の方よりも淡いメイクが多いということで、このようにプロンプトを追加してみました。
prompt
a woman, portrait photo,
black hair, dark brown eyes,
natural makeup, light makeup
SD1.5のときは、このワードの追加で微妙な感じになったんですが、SDXLでは、少し前進、という感じでしょうか。劇的変化とは言えないですけどね。

ただ、日本人か?というと微妙ではあります。
なので、ここでもう一度、「Japanese」で試してみたいと思います。
prompt
a Japanese woman, portrait photo,
black hair, dark brown eyes,
natural makeup, light makeup

5枚中5枚ともに、日本にいるよね、という感じになりました。1枚だけ、ちょっと着物(和装)に引きずられた衣装かな?というのがありましたが、概ね現代風の(特に日本文化を感じさせるものはない)写真となっています。面白いものですよね。同じ「a Japanese woman」なんですけどね。
ここで、SD1.5の時と同じように年齢の設定を入れておきます。
prompt
a Japanese woman in her late 20s, portrait photo,
black hair, dark brown eyes,
natural makeup, light makeup

期待値をそのままプロンプトに起こせば「in her late 20s to early 30s」になるんですが、あれれ?という高年齢化が進んだため、この表現にしました。
ちなみに、SD1.5のときは、「young adult」という表現を用いましたが、ChatGPT曰く、SD1.5は「短いタグっぽい単語の方が効きやすい」という理由だったようです。
SDXLは、SD1.5よりも自然文に近いプロンプトでも効きやすくなっているので、扱いやすいですよね。
この短いプロンプトで、もう、ゴールに近づいてきた感はあります。
でも、SD1.5のときもそうでしたが、表情を指定しないと、なんというか、「楽しいんだか楽しくないんだか、怒ってるんだか何か言いたいことがあるんだか」よく分からない表情が多いんですよね。
表情を付ける
というわけで、少しだけ笑顔になってもらいましょう。
prompt
a Japanese woman in her late 20s, portrait photo,
black hair, dark brown eyes,
natural makeup, light makeup,
soft smile

若干、無機質な笑顔にも見えますね。
こっちの方がいいでしょうか。SD1.5では、変な方向に行きましたけど。。
prompt
a Japanese woman in her late 20s, portrait photo,
black hair, dark brown eyes,
natural makeup, light makeup,
gentle
smile

自然な優しい笑顔になったのではないでしょうか。
もう一押しで、雰囲気も足してみます。
prompt
a Japanese woman in her late 20s, portrait photo,
black hair, dark brown eyes,
natural makeup, light makeup,
gentle smile,
friendly and helpful expression,
calm and trustworthy atmosphere
親しげな感じと、信頼感を感じさせるような雰囲気を醸し出す、ということですね。

ここまで来れば、あとは髪形や衣装、背景などを、変えていけばいいのかな、と。
衣装を変更
ブログの案内役的な…という位置付けはSD1.5のときと同じにしたいので、紺色のジャケットに白いブラウスという出で立ちに。
prompt
a Japanese woman in her late 20s, portrait photo,
black hair, dark brown eyes,
natural makeup, light makeup,
gentle smile,
friendly and helpful expression,
calm and trustworthy atmosphere,
wearing a navy blazer and white blouse

目的に合った、いい感じの写真になったんじゃないでしょうか。
不思議な引き算
ここで、「日本人らしくしていたはず」のワードを取っ払ってみます。
prompt
a Japanese woman in her late 20s, portrait photo,
black hair, dark brown eyes,
natural makeup, light makeup,
gentle smile,
friendly and helpful expression,
calm and trustworthy atmosphere,
wearing a navy blazer and white blouse
赤文字部分を削除しました。

確認の意味も込めて15枚ほど生成してみたんですが、15枚全てが「日本にいるよね」という顔になりました。目の色も、ほぼ全てがいわゆる「黒目」です。さすがに、黒髪の指定を外しているので茶髪混じりの髪が増えるんですが、黒髪指定なし→金髪→西洋人 のような変化にはならないので、1行目の「a Japanese woman」が効いている、ということになります。
「a Japanese woman」だけではダメ(日本文化寄り)で、黒目や黒髪を増やしたのに、化粧や表情を日本人っぽくアレンジしていくと「a Japanese woman」だけになっても、桜や和服、日本建築が全く出てこないという、ちょっと不思議な引き算になりました。
生成AIっぽい写真って?
ぱっと見た感じは、リアルな人物写真と変わりない気がしたんですが、ChatGPTに言わせると、
・肌がきれいすぎる
・歯が整いすぎている
・服のディテールが少し甘い
・背景のボケが少し都合よすぎる
・髪の毛の細部がやや生成画像っぽい
なんだとか。確かに、言われてみればそうかも、というところはありますね。
なので、せっかくなので、少しでもAIっぽさを減らすためのプロンプトを考えてみたいと思います。いや、考えるのはChatGPTですね。
AIっぽさを減らすために行うのは、ポジティブプロンプトで増やすのが、
・肌や服の実在感
・不完全さ
・写真としての自然さ
ネガティブプロンプトで消すのが、
・つるつるした肌
・整い過ぎた顔
・CGっぽさ
・過剰な美化
なんだとか。つまりは、「奇麗にし過ぎない」&「少し現実に寄せる」のだそう。
というわけで、
prompt
realistic skin texture,
subtle skin imperfections,
natural facial features,
natural hair texture,
stray hairs,
realistic fabric texture,
natural clothing wrinkles,
soft natural lighting
negative prompt
plastic skin, waxy skin, overly smooth skin, airbrushed skin,
doll face, uncanny, overly symmetrical face, perfect face,
cgi, 3d render, illustration, anime,
blurry clothing details
のあたりを追加してみたいと思います。

結論から言うと、ちょっと過剰だったかな、という感じですかね。この写真は、25枚出して、一番自然なものを採用しています。
なぜか3分の1近くがイラスト風の画像になったり、他には少数ではあるものの目がぎょろっとしたり、不必要に肌がくすんだり。

イラストな上に、思いっきり日本文化満載です。。
というわけで、プロンプトに追加するなら、最初の1行
prompt
realistic skin texture,
これくらいでいいかな、と思います。ネガティブプロンプトは一旦全部外しました。
こっちの方が、安定してますね。出力した画像全てが意図通りのものでした。

要は、AIっぽさを改善する万能薬は無い、ってことですかね。。
気に入らないところがあれば、都度、プロンプトやネガティブプロンプトを追加して確認する、というのが、生成枚数を気にしなくていいローカル画像生成の醍醐味、じゃないですかね。
というところで、自然な感じの日本人女性を安定して出力できる状態になりました。
といっても、プロンプト指定だけで「同じ人」を出すのは厳しいです。Seed値を固定すれば、プロンプトを変えることで、ある程度のバリエーションは可能ですが、違うシチュエーションで同じ人を出すのは絶望的に難しいです。
そんなときは、顔のイメージを学習して画像生成を行うためのLoRAを作成するしかないですよね。
LoRAとはなんぞやという方は、こちらをご覧ください。SD1.5ですが、LoRAを作成した話になります。
今回のテーマは、SDXLのベースモデルを用いてプロンプトを変えることで、どこまで意図した画像を生成するか、というところまでですので、SDXLでのLoRA作成については、このあたりをご覧ください。
こちらは、一連のシリーズの最終回で、SD1.5用の学習画像を使用してSDXLの学習を行う話になります。
それに対して、1枚の生成画像からLoRAを作成してしまおうという無謀な挑戦の話です。
参考になるかどうか(やってみようと思うかどうか)は、見てからご判断いただければ良いかと思います。
最後に。
まもなく6月、梅雨時期が近付いてきたので、アジサイの花とともに生成した1枚で締めくくりたいと思います。アイキャッチにも使用するので横長(1280×720)での生成となります。
prompt
a Japanese woman in her late 20s, upper body portrait photo,
natural makeup, light makeup,
gentle smile,
friendly and helpful expression,
calm and trustworthy atmosphere,
wearing a outing wear,
hydrangea flower field,
realistic skin texture,

25枚出力して、最後の25枚目が、奇しくもSD1.5で作成した人物と雰囲気が似ていたので、この1枚を採用しました。
というわけで、今回の実験テーマはこれで終了となります。














