エンジニアリングノート
Image to Promptにおけるスタイル保持:何を、なぜ変えたか
私たちのImage to Promptツールは、被写体は正しく捉えられるのにスタイルを外してしまうという問題を抱えていました。粒子の粗い90年代のスナップ写真が、洗練された映画のポスターになって返ってくるのです。これは、なぜそれが起こるのか、私たちが何を変えたのか、そしてどの部分を任意のツールで手動で応用できるのかについてのノートです。

被写体は忠実だが、スタイルが違う
報告は一貫していました。誰かが参照画像をアップロードし、プロンプトを得て、それを実行すると、結果は明らかに同じシーンではあるものの——同じ被写体、同じフレーミング、おおよそ同じ光——自分の画像には見えない、というものでした。質感はより滑らかに。色はより豊かに。何かが均されてしまっているのです。
このパターンは手がかりになります。被写体と構図は残るのに表面と仕上げが残らない場合、そのプロンプトはフレームがどう作られたかではなく、フレームの中に何があるかを説明しているのです。これらは異なる仕事であり、後者の方がはるかに間違えやすいのです。
スタイルは9項目のリストの中の一つにすぎなかった
以前のビジョンモデルへの指示は、「被写体、状況、構図、レンズや視点、照明、パレット、素材、雰囲気、スタイル」を捉えるよう求めるものでした。一見、綿密なチェックリストのように読めます。しかし実際には、スタイルが注意力の9分の1しか受け取れないことを保証するやり方だったのです。
平坦なリストは、均等な扱いを招きます。しかし、スタイルは9つのうちの一つの属性ではありません——他の8つがどうレンダリングされるかを決めるものです。そのうえ、言葉にするのが最も難しいものでもあり、それゆえに追加のガイダンスを最も必要とする項目でありながら、こうしたリストの中では最もそれを受け取りにくい項目でもあるのです。
スタイルには形容詞ではなく語彙を与える
スタイルが何から成り立っているかを伝えないまま言語モデルにスタイルを説明させると、その概念に最も近い言葉に手を伸ばしてしまいます。「デジタルアート」「非常に精緻な」「映画的」といった言葉です。これらは説明ではありません。目の前にある特定の画像についての情報をほとんど含んでいないのです。
さらに悪いことに、これらは隙間を残し、下流の画像モデルはその隙間を自らの既定の美観で埋めてしまいます——それはまさに、あなたが上書きしようとしていたものです。解決策は、スタイルが実際に分解される軸を名指しし、モデルが具体的に参照できる場所を用意することです。
- メディウムと技法:35mm film photograph, gouache, 3D render, flat vector, ink line art
- 時代や潮流。単独の形容詞よりも多くの情報を伝えることがよくあります。
- カメラの個性:焦点距離の感覚、被写界深度、フィルムストック、あるいは模倣しているレンダーエンジン。
- マークメイキング:線の太さ、筆致の挙動、エッジの質、面と面の接し方。
- カラーグレーディングと色温度。どの色が現れるかとは切り離して考える。
- 粒子、質感、表面の仕上げ。
- 後処理:ハレーション、色収差、ハーフトーンドット、セル画調の陰影、強い圧縮ノイズ。
参照画像をアップグレードしない
これがどれほど重要かは、私たち自身にとっても驚きでした。パイプライン内のあらゆるモデル——画像を読み取るモデルも、プロンプトから生成するモデルも——には「改善バイアス」があります。フラットで、露出不足で、安っぽい照明で、あるいは圧縮された何かを与えられると、それを静かに「より良い」バージョンにして返してくるのです。
しかし、不完全さもまたスタイルです。直射フラッシュのパーティー写真、白飛びしたスマホのスナップ、目に見えるバンディングのある低解像度スキャン——こうした特質こそが、たいていの場合、その画像を保存した理由そのものなのです。そこで今の指示ははっきりとこう述べています。画像がアマチュア的、フラット、低忠実度、あるいは不完全であれば、それを率直に述べ、そのまま保持する、と。
自分の手でプロンプトを書いているなら、これが最も手軽にできる改善です。欠点を意図的に描写しましょう。
空虚な品質ワードはタダではない
「美しい」「見事な」「傑作」「非常に精緻な」「8k」「受賞歴のある」。これらは、音量つまみを上げるようなもので、無害に感じられます。しかし実際はそうではありません。プロンプトには有限の注意力予算があり、不要な言葉一つひとつが、実際にあなたの画像を説明している言葉からその分を奪っていくのです。
こうした言葉はまた、平均へと引き寄せます。「受賞歴のある」には視覚的な意味がないため、モデルはそれを、受賞歴のある画像とはこういうものだと学習してきたものへと解決してしまいます——それは、あなたの参照画像から遠く離れた、強く一般的な美観です。今の指示では、このリストを明示的に禁止しています。
プロンプトを書く前にスタイルを見極める
分析と出力を一つのステップで求めると、モデルはスタイルを、手近にあるものを何でも埋め込む形容詞の枠として扱ってしまいます。今の指示は2段階で実行されます。何かを書く前に、モデルはまずメディウムと制作技法を特定し、そのうえで一つの具体的な問いに答えます。
その違いを名指しすることこそが、タスクのすべてです。一度名指しされれば、プロンプトはメディウムとスタイルを被写体よりも前に置いて書かれます——なぜなら、そこがどのターゲットモデルにおいても最も重く重み付けされる場所だからです。
モデルごとにプロンプトの読み方は異なる
以前のモデルごとの指示は、トーンを調整するものでした。Midjourney向けのプロンプトには「喚起的であれ」、GPT Image向けのプロンプトには「直接的かつ文字通りであれ」と指示していました。それは文体上のレジスターであり、スタイルが生き残るかどうかを決めるものではありません。
それを決めるのは、モデルが使用するテキストエンコーダー、プロンプトの中でスタイル用語がどこに位置するか、そしてモデルがどんなネイティブの制御機能を公開しているかです。これらは具体的なものであり、たいていのプロンプトガイドが認める以上に、モデル間で異なっています。
- Nano BananaとGPT Imageは自然言語の文章を読み取ります。メディウムは被写体より前、冒頭の節で宣言しましょう。
- FluxはT5エンコーダーを使用し、長い文章をうまく処理しますが、(term:1.2)のような重み付け構文は完全に無視します——強調は言葉遣いと語順から生み出す必要があります。
- Midjourneyはプロンプトの先頭を大きく重み付けし、カンマ区切りの密なフレーズを好み、文章として書かれた否定表現を理解しません。
- Stable DiffusionはCLIPトークンを77トークンのまとまりで読み取り、それぞれの先頭を重み付けするため、メディウムとスタイルのタグは末尾ではなく先頭に置くべきです。
Midjourneyには、あなたの説明と競合するパラメータがある
これはこの記事の中で最も役立つ情報であり、プロンプトの書き方のテクニックではまったくありません。Midjourneyは、--stylizeによって制御される独自の美観をあなたのプロンプトの上に適用します。このパラメータのデフォルト値は100です。この設定では、モデルは、あなたが求めたものではなくMidjourneyらしい見た目に画像を仕上げるよう積極的に促されます。
そのため、参照画像を変換しようとしていて、出力が元の画像よりも洗練され、映画的で、アートディレクションが効きすぎたものとして繰り返し返ってくるなら、どれだけ説明を尽くしても解決しません。あなたを上書きしているのは、このパラメータなのです。
私たちが生成するすべてのMidjourneyプロンプトは、今ではその独自の美観を無効化する--style rawと、50前後の低い--stylizeで終わるようになっています。除外したいものは、文章ではなく--noで表現します。ここでは文章による否定表現が機能しないからです。
Stable Diffusionでは、プロンプトの半分がネガティブプロンプトである
Stable Diffusionのユーザーは、プロンプトとネガティブプロンプトという2つのブロックを想定しています。スタイルの忠実度は後者に大きく依存します。そこでこそ、モデルが本来適用してしまう既定の美観へのドリフトを抑え込むことができるからです。
私たちは最初のブロックしか生成しておらず、それは成果物の半分にすぎませんでした。現在生成されるStable Diffusionプロンプトは、メディウムとスタイルのタグを先頭に置き、見た目を決定づける1〜2個のタグにだけ(term:1.2)の重み付けを控えめに適用し、使い回しの定型リストではなく、その特定の画像のために書かれたネガティブプロンプトを含むようになっています。
出力フォーマットとターゲットモデルが食い違うとき
このツールでは、出力フォーマット——一般的なプロンプト、構造化されたブループリント、JSON——を選び、それとは別にターゲットモデルを選べます。この2つの選択は互いに矛盾することがあります。「有効なJSONのみを返す」ことと、「パラメータで終わるカンマ区切りのタグを書く」ことは、両方同時には満たせません。
以前は両方の指示を渡して、モデルに解決させていました。モデルは確かに解決していましたが、実行のたびに異なる形で解決していたのです。この一貫性のなさは、バグとしては見えにくいのに、体験としては非常に目立ちます。同じ設定の同じ画像から、明らかに異なる性格のプロンプトが生成され、それはスタイルがランダムに失われているように見えてしまいます。
今では優先順位が明示されています。自由形式のフォーマットは、出力全体をターゲットモデルに委ね、その構文とパラメータを完全に適用します。構造化されたフォーマットは自身の形を保持するため、ターゲットモデルは語彙だけを提供し、パラメータは出力しません。
画像を読み取ることは、創作ではなく書き起こしである
小さな変更ですが、効果は大きなものでした。私たちは、画像を読み取るツールのサンプリング温度を下げました。漠然としたアイデアからプロンプトを書くことは創作的な行為であり、ある程度の自由度から恩恵を受けます。しかし参照画像を読み取ることは書き起こしに近く、そこでの自由度の一つひとつが、実際にフレームの中にあるものからのずれになってしまいます。
Text to Promptは、その自由度を保ったままにしました。Image to PromptとAI Image Describerは、目に見えて文字通りになりました。
ここから得られること
これらの変更のほとんどは、どんなツールを使っていても、自分の手で応用できるものです。
- あらゆるプロンプトで、被写体より先にメディウムを名指しする。
- 不完全さは意図的に描写する。モデルは、そうしないよう言われない限り、それらを取り除いてしまうため。
- 品質を表す不要な言葉は削除する。注意力を消費し、平均へと引き寄せてしまうため。
- Midjourneyでは、プロンプトをまた書き直す前に、まず--style rawと低めの--stylizeを試す。
- Stable Diffusionでは、ネガティブプロンプトを仕事の半分として扱う。
- まず本質を見極める問いを立てる。この画像を、この画像たらしめているものは何か?