見出し画像

テキストだけで画像編集:Prompt-to-Prompt 論文解説

Prompt-to-Prompt 論文解説、やっていきます。
私も初学者であり、説明が間違っていたり勘違いによる記述が含まれている場合がありますので、ぜひコメントなどをいただけたらありがたいです。


論文情報

元論文

論文サイト

概要

本論文は、テキストプロンプトの編集のみによる直感的な画像編集手法を提案しています。Stable Diffusionなどの大規模な画像生成モデルでは、プロンプトのわずかな変更でも全く異なる画像が生成されるという課題がありました。例えば、"公園で遊んでいる犬"というプロンプトで生成した画像に対して、犬の部分を猫に変えようと"公園で遊んでいる猫"というプロンプトで再生成すると、全く違う画像が出てきてしまいます。これを回避するためには、Inpaintなどを使って変更したい部分だけをマスクによって指定する方法がありますが、マスクの作成は手間がかかり、また必要な情報までも失われてしまうリスクがあります。そこで本論文では、画像生成モデルのクロスアテンションに着目し、これを操作することで元の画像構造を保持しながら編集を可能にしました。

プロンプトの一部を変更することで、特定の部分だけを編集

提案手法

クロスアテンションの役割

画像生成におけるクロスアテンションは、単語と画像の対応関係を表しています。実際に画像生成時のクロスアテンションマップを可視化すると、各単語が画像の対応する部分に特徴を集中させていることが分かります。


ノイズ除去ステップにおけるクロスアテンションマップの可視化

アプローチ

上の画像を見てみると、それぞれの単語はしっかりと画像の対応する部分に特徴が集まっているのが分かります。そこで、本論文では、拡散モデルの生成プロセス中にクロスアテンションマップを操作することで、テキストの指示だけでの画像生成を実現しています。具体的には、元の画像生成時のアテンションマップを新しいプロンプトでの生成プロセスに注入することで、画像の構造を保持しながら内容を変更することができます。

変更前プロンプトのアテンションマップMに、変更後のM*を注入

このアテンションの差し替えによって、本論文では以下の3つのタスクを実現しています。

  1. 単語の置換

  2. 新しいフレーズの追加

  3. アテンションの再重み付け

それぞれの処理について、詳しく見ていきます。

単語の置換

ここでは、ユーザーは元のプロンプトの単語を他の単語と交換します。例えば、$${P=}$$"大きな赤い自転車"から$${P^*=}$$"大きな赤い車"などです。主な課題は、新しいプロンプトの内容に対応しながら、元画像の構成を保持することです。このために、元画像のアテンションマップを変更されたプロンプトでの生成に注入します。しかし、提案されたアテンション注入は、特に「車」から「自転車」のような大きな構造的変更が含まれる場合、幾何学的構造の制限が強すぎてうまく編集ができない恐れがあります。

$$
\text{Edit}(M_t, M_t^*, t) := \begin{cases} M_t^* & \text{if } t < \tau \\ M_t & \text{otherwise.} \end{cases}
$$

そこで、どのステップまでアテンションを注入を適用するかを決定する$${\tau}$$を設定することで、元の画像を維持する強さを設定できるようにします。使い方としては、ControlNetのControl weightに近いです。

新しいフレーズの追加

ここでは、ユーザーがプロンプトに新しい単語トークンを追加します。例えば、$${P=}$$"川の隣にある城"から$${P^*=}$$"川の隣にある子供の絵の城"のような場合です。共通する部分を保持するために、両方のプロンプトから共通の単語に対してのみアテンション注入を適用します。形式的には、ターゲットプロンプト$${P^*}$$から単語トークンインデックスを受け取り、$${P}$$の対応する単語トークンインデックスを出力するか、一致がない場合はNoneを出力するアライメント関数$${A}$$を使用します。そして、その関数は以下のように与えられます。

$$
(Edit(M_t, M_t^*, t))_{i,j} := \begin{cases} (M_t^*)_{i,j} & \text{if } A(j) = \text{None} \\ (M_t)_{i,A(j)} & \text{otherwise.} \end{cases}
$$

一見複雑そうですが、元画像のプロンプトと新しいプロンプトを比較して、元画像のプロンプトにない単語の場合は、新しいアテンション$${M^*}$$を、そうでない場合は元画像のアテンション$${M}$$を使いますよ、という処理です。

アテンションの再重み付け

最後に、ユーザーは各単語トークンが結果の画像に影響を与える程度を強化または弱化したいと思うかもしれません。例えば、プロンプト$${P=}$$"ふわふわした赤いボール"を考え、ボールをより多くまたは少なくふわふわにしたいと仮定します。このような操作を実現するために、割り当てられた単語トークン$${j^*}$$のアテンションマップをパラメータ$${c}$$でスケーリングし、任意の単語を強めたり弱めたりできます。AUTOMATIC1111などでよくある(fuwafuwa:1.5)のような強調方法と似ていますが、この手法では他の単語や構図に影響を与えずに編集ができます。
数式は次の通りです。

$$
(Edit(M_t, M_t^*, t))_{i,j} := \begin{cases} c \cdot (M_t)_{i,j} & \text{if } j = j^* \\ (M_t)_{i,j} & \text{otherwise.} \end{cases}
$$

特定の単語に対してスケーリングの指示があったら、その分だけアテンションを強め(弱め)ます。

以上、3種類のタスクを紹介しました。これらの機能を併せ持つ、アテンションをを編集する関数をそれぞれのタイムステップで適用することで、画像編集を実現します。

$$
Edit(M_t, M_t^*, t)
$$

この関数を用いて、Prompt-to-Prompt全体のアルゴリズムを表すと、次のようになります。ここで、$${z}$$は初期ノイズ、$${T}$$はノイズ除去ステップ数、$${M}$$はアテンションマップを表し、$${*}$$は編集後のプロンプトに対するものであることを表します。

Prompt-to-Prompt全体のアルゴリズム

複雑ですが、それぞれ処理はシンプルです。一行ずつ見ていきます。

  1. 入力として、編集前のプロンプト、編集後のプロンプト、ランダムシードを受け取る

  2. 出力として、元画像、編集後の画像を返す

  3. シードから、元画像の初期ノイズを生成

  4. 元画像の初期ノイズを編集後の画像の初期ノイズに設定

  5. 生成ステップを実行

  6. 元画像のノイズ、プロンプトを用いて、編集前のアテンションを得る

  7. 編集後のノイズ、プロンプトを用いて、編集後のアテンションを得る

  8. 元画像のアテンションに対して、$${Edit}$$関数を適用

  9. $${Edit}$$関数で作成したアテンションを用いて、画像のノイズを除去

  10. 生成ステップを終了

  11. 元画像、編集画像を返す

このように、プロンプト編集前とプロンプト編集後のアテンションを用意し、条件に応じてどちらかを使って画像生成のステップを進めていくことで、最終的に編集後の画像を得ることができます。

生成結果

実際にプロンプトの置換や追加を行った生成結果を見てみます。

単語の置換

「元画像のアテンションの注入をどこまで行うか」による生成結果比較

元プロンプトの単語を別の単語に置き換えています。元画像のアテンション注入割合が大きいほど、より元画像に近い画像が得られています。文章の指示だけでここまで特徴を維持できるのは驚きです。

単語の追加

単語追加による編集結果 上:物体に対する編集 下:環境に対する編集

元プロンプトやある物体に対して、修飾する単語を追加しています。物体に対する編集、環境に対する編集ともに、元画像の特徴を維持しつつ画像の編集ができています。

アテンションの再重み付け

特定の単語に対するアテンションの 強化/減衰 結果

ある単語が画像に与える影響力を調整します。特定の単語に対するアテンションを強めたり弱めたりすることで、画像の調整ができています。また、単語ごとのアテンションを操作することで、ほかの物体や構図に与える影響を最小限に抑えられています。

まとめ

Stable Diffusionなどの大規模な画像生成モデルは、多様な画像の生成が可能ですが、プロンプトのわずかな変更でも画像全体が大きく変化してしまい、部分的な編集が困難であるという課題がありました。

本論文では、拡散モデルのクロスアテンションマップを操作することで、元画像の構造を保持しながら編集を可能にする手法を提案しています。具体的には、元のプロンプトで生成された画像のクロスアテンションマップを、編集後のプロンプトによる生成プロセスに注入することで、画像の構造を保持しながら内容を変更することができます。

この手法により、マスクなどの追加入力なしに、テキストプロンプトの編集だけで直感的に画像を操作できるようになりました。

感想 & 余談

Prompt-to-Promptの論文を解説しました。シンプルなアプローチながら、かなり実用性の高い技術だと思います。条件付き生成で一世を風靡したControlNetよりも昔からある技術だったりするのですが、拡張機能が普及していなかったり、実用性に対してあんまり日の目を浴びていない感じがして悲しいです。(本手法を学習データに使ったInstruct Pix2Pixとかが結構有名?)

また、気づいた方もいるかもしれませんが、この手法は入力として画像生成時のプロンプトと初期ノイズを必要とするため、画像生成によって生成された画像にしか使えません。これが結構致命的なのですが、逆に画像からプロンプトと初期ノイズが推定できればこの手法で画像編集をすることができます。実はこの論文と同じ研究チームがその手法についても提案しているので、機会があれば紹介したいと思います。気になった方は、Null-text Inversionで調べてみてください。


いいなと思ったら応援しよう!