JSONを使って画像生成AIを使うと解像度が高いという話
FacebookのOpenAIのグループで、Rogerio Pereiraさんが綺麗な絵を投稿していて、そのプロンプトがJSONだったので興味を惹かれました。(こちら)
投稿されていたJSONデータをコピペしてChatGPT-4oに流し込んで、自分で試してみたのが以下のものです。彼が投稿していたものと大差なく、なかなか良いではないですか!
大規模言語モデルってJSONフォーマット熟知しているから、人間が1項目ずつ指定していけば良い絵が描けるというのも納得です。
以前うまく行かなかった題材で挑戦してみた
そこで、以前試して、うまく描けなかった「公園にいるギターを背負った女の子」を描いてもらうことにしました。JSONを使って描いたのが次の画像です。
実際に使ったプロンプト
ここで使ったプロンプトは次のようなものです。JSONでプロンプトを書くとこんな感じになります。
{
"プロンプト": {
"概要": "ギターバッグを背負った女の子を描いてください。",
"女の子": {
"髪": ["ロング", "ストレートヘア", "光沢"],
"髪色": "水色",
"人種": "アジア",
"服": "白のワンピース",
"化粧": "ナチュラルメイク",
"表情": "笑顔",
"持ち物": [
"ギターケース": {
"配置場所": "肩にかけて少女の後ろに半分隠す",
"形状": "黒のナイロン",
},
"カバン": {
"配置場所": "少女が持っている",
"形状": "薄いA4サイズのバッグで楽譜が入っている"
}
]
},
"背景": {
"鮮明度": "淡い色で描画",
"場所": "噴水のある公園",
"テーマ": "春の爽やかな公園にたたずむギター少女",
"地面": "石畳",
"木々": {
"様子": "丁寧に手入れされている",
"種類": ["桜", "藤", "アジサイ"]
},
"設備": [
"ブランコ",
"滑り台"
],
},
"品質": {
"解像度": "高解像度",
"スタイル": "漫画風"
},
"サイズ": "1792x1024",
"n": 1
}
}
JSONと実際の絵を見比べてみると、それほどうまく行っている訳ではないのですが、そこそこJSONの指示に従ってくれているのが分かります。
JSONを使わずに描いたときは、なかなかうまく行きませんでしたが、なかなか良い感じに描けました。とは言え、JSONで指定するから良いというのもありますが、人間がプロンプトを作る時に、より細かく条件を指定しやすいというインターフェイス的な良さもあるように感じました。
英語で試すとどうか?
ちなみに、上記のJSONを大規模言語モデルで英語化してから試してみたのが次のものです。英語でも日本語でもそれほど変わりませんね。
英語の良し悪しはそれほど分かりませんが、以下のようなプロンプトを与えました。
{
"prompt": {
"overview": "Draw a cute girl carrying a guitar in the park.",
"girl": {
"hair": ["long", "straight hair", "shiny"],
"hair_color": "aqua",
"race": "Asian",
"clothes": "white dress",
"makeup": "natural makeup",
"expression": "smiling",
"belongings": [
{
"type": "guitar case",
"placement": "carried on the shoulder, half-hidden behind the girl",
"shape": "black nylon"
},
{
"type": "bag",
"placement": "held by the girl",
"shape": "thin A4-sized bag containing sheet music"
}
]
},
"background": {
"brightness": "draw in light colors",
"location": "park with a fountain",
"theme": "a girl with a guitar standing in a refreshing spring park",
"ground": "cobblestone",
"trees": {
"appearance": "well-maintained",
"types": ["cherry blossom", "wisteria", "hydrangea"]
},
"facilities": [
"swing",
"slide"
]
},
"quality": {
"resolution": "high resolution",
"style": "anime style"
},
"size": "1792x1024",
"n": 1
}
}
YAMLでも良いかも?
この論理で行くと、YAMLで書いても良さそうです。と思って以下のようなYAMLを作ってみました。
プロンプト:
概要: ギターバッグを背負った女の子を描いてください。
女の子:
髪:
- ロング
- ストレートヘア
- 光沢
髪色: 水色
人種: アジア
服: 白のワンピース
化粧: ナチュラルメイク
表情: 笑顔
持ち物:
ギターケース:
配置場所: 肩にかけて少女の後ろに半分隠す
形状: 黒のナイロン
カバン:
配置場所: 少女が持っている
形状: 薄いA4サイズのバッグで楽譜が入っている
背景:
鮮明度: 淡い色で描画
場所: 噴水のある公園
テーマ: 春の爽やかな公園にたたずむギター少女
地面: 石畳
木々:
様子: 丁寧に手入れされている
種類:
- 桜
- 藤
- アジサイ
設備:
- ブランコ
- 滑り台
品質:
解像度: 高解像度
スタイル: 漫画風
サイズ: "1792x1024"
n: 1
これを使うと以下のような画像が生成されました。指定したワードや構造が同じなので、ほとんど同じ画像が生成されました。YAMLでもJSONでも構造化されたデータであれば、ほとんど同じ画像が生成されることが分かりました。
まとめ
ちょっと試しただけですが、JSONを使うと、文章を使って描きたい絵を指定するよりも、解像度が高くなる感じがします。JSONが分かる人限定の指定方法ですが、なかなか良いと思いました。
先日、プロンプトエンジニアリングの本を書きました✨良かったら見てみてください。