Imagicを理解する
- 2022/10/19
- 19:06
17 oct 2022に出たImagicという技術について、ペーパーとソースを見比べながら説明します。
Imagicとは、1枚の画像に対してプロンプトを与えることで、一貫性を保ったまま編集を行う技術です。
どういうことかは口で説明するよりも画像を見たほうが早いと思います。
image-to-imageだとこうはいかないので、気になってペーパーとソースを読みました。
備忘も兼ねてここに書きます。
なお、今回の解説に用いるペーパーとソースはこちらです。
ペーパーはこちら:https://arxiv.org/abs/2210.09276
手法
Imagicの手法は3段階に別れています。ものすごく雑に説明すると、
- Target Embeddings(以下Etar)を調整してOptimized Embeddings(以下Eopt)を作って
- 拡散モデル本体をファインチューニングして
- EtarとEoptを適当な比率でマージしながらちょうどいい感じの生成結果を探す
これだけです。
感覚的には、Step1、2の工程によって、ファインチューニングした拡散モデルに対してEoptを入力したときにinput image(に限りなく近い画像)が出るようにしたうえで、Step3によって画像をEtar方向に誘導するような感じだと解釈しています。
ではソースコードを見ながら順に説明します。
注意:
本稿で参考にするソースコードは30GBVRAMを要求しますが、可読性の観点から採用しています。
現在は11GBVRAMで動くバージョンが公開されているので、試したい方は以下のリンクを参照してください。
今回は、皆さんご存知404ねーちゃんに黒スーツを着せてみましょう。
404ねーちゃんというのは、これ↓のことです。
つまり、inputに上の画像を、target textに"a woman wearing black suit"を用いるという事です。
Step 1
まずは、target textから作られるEtarを調整して、Eoptを作ります。
この工程はソースコード上ではこんな感じになっていました。
DMはevalモードになっているため、embeddingsだけが更新される仕組みです。
アルゴリズムも特に難しいことはなく、AdamとMSELossです。
簡単すぎて拍子抜けしたのではないでしょうか。
Step 2
次は、Step 1で作成したEoptをDMに入力してDMをファインチューニングします。
ソースは以下です。
embeddingsを固定してDMをtrainモードにしているので、今度はDMの重みだけが更新されます。
こちらの実装も特に難しい箇所はありません。
以降、ファインチューニングしたDMをDMftと呼びます。
これで、DMftに対してEoptを入力したとき、input image(に限りなく近い画像)が出てくるようになりました。
Step 3
いよいよ大詰めです。
これまでに作ったEtar、Eopt、DMftを使って、画像の差分を作りましょう。
そのためのソースコードは以下です。
EtarとEoptをマージしてDMftにぶち込んでいるだけです。おわり。
正直これで動くのが信じられないのですが、動いている以上文句を付けられません。
ディープラーニング何も分からん。
学習結果
最終的に生成された黒スーツ404ねーちゃんの画像です。
学習時間は覚えていませんが、15~20分ぐらいだったと思います。
一部ロケーションやスーツの色が間違っていますが、恐ろしいクオリティです。
総評
ImagicはStable Diffusionとpytorchを触っている人なら誰でも実装できるほどアルゴリズムが簡単な上に、テキストによる画像操作をにわかには信じがたいクオリティで行えます。
試してはいませんが、恐らく思いつくことはできるはずです。
夢のある技術ですが、使い方を誤らないようにしましょう。
キャリアがぶっ壊れます。