記事一覧

Imagicを理解する

17 oct 2022に出たImagicという技術について、ペーパーとソースを見比べながら説明します。
Imagicとは、1枚の画像に対してプロンプトを与えることで、一貫性を保ったまま編集を行う技術です。
どういうことかは口で説明するよりも画像を見たほうが早いと思います。

Screenshot from 2022-10-19 18-40-32
image-to-imageだとこうはいかないので、気になってペーパーとソースを読みました。
備忘も兼ねてここに書きます。
なお、今回の解説に用いるペーパーとソースはこちらです。

ペーパーはこちら:https://arxiv.org/abs/2210.09276

手法


Imagicの手法は3段階に別れています。ものすごく雑に説明すると、
  1. Target Embeddings(以下Etar)を調整してOptimized Embeddings(以下Eopt)を作って
  2. 拡散モデル本体をファインチューニングして
  3. EtarとEoptを適当な比率でマージしながらちょうどいい感じの生成結果を探す
これだけです。
感覚的には、Step1、2の工程によって、ファインチューニングした拡散モデルに対してEoptを入力したときにinput image(に限りなく近い画像)が出るようにしたうえで、Step3によって画像をEtar方向に誘導するような感じだと解釈しています。
ではソースコードを見ながら順に説明します。

注意:
本稿で参考にするソースコードは30GBVRAMを要求しますが、可読性の観点から採用しています。
現在は11GBVRAMで動くバージョンが公開されているので、試したい方は以下のリンクを参照してください。

今回は、皆さんご存知404ねーちゃんに黒スーツを着せてみましょう。
404ねーちゃんというのは、これ↓のことです。

istock_hannah-768x510-1.jpg

つまり、inputに上の画像を、target textに"a woman wearing black suit"を用いるという事です。

Step 1

まずは、target textから作られるEtarを調整して、Eoptを作ります。
この工程はソースコード上ではこんな感じになっていました。

step1.png

DMはevalモードになっているため、embeddingsだけが更新される仕組みです。
アルゴリズムも特に難しいことはなく、AdamとMSELossです。
簡単すぎて拍子抜けしたのではないでしょうか。

Step 2

次は、Step 1で作成したEoptをDMに入力してDMをファインチューニングします。
ソースは以下です。

step2.png

embeddingsを固定してDMをtrainモードにしているので、今度はDMの重みだけが更新されます。
こちらの実装も特に難しい箇所はありません。
以降、ファインチューニングしたDMをDMftと呼びます。

これで、DMftに対してEoptを入力したとき、input image(に限りなく近い画像)が出てくるようになりました。

Step 3

いよいよ大詰めです。
これまでに作ったEtar、Eopt、DMftを使って、画像の差分を作りましょう。
そのためのソースコードは以下です。

step3.png

EtarとEoptをマージしてDMftにぶち込んでいるだけです。おわり。
正直これで動くのが信じられないのですが、動いている以上文句を付けられません。
ディープラーニング何も分からん。

学習結果


最終的に生成された黒スーツ404ねーちゃんの画像です。
学習時間は覚えていませんが、15~20分ぐらいだったと思います。
一部ロケーションやスーツの色が間違っていますが、恐ろしいクオリティです。

gsregegfa.pnghtregref.png
ntbrtdgbrt.pngrgsgre.png

総評


ImagicはStable Diffusionとpytorchを触っている人なら誰でも実装できるほどアルゴリズムが簡単な上に、テキストによる画像操作をにわかには信じがたいクオリティで行えます。
試してはいませんが、恐らく思いつくことはできるはずです。
夢のある技術ですが、使い方を誤らないようにしましょう。
キャリアがぶっ壊れます。

コメント

コメントの投稿

非公開コメント

検索フォーム

プロフィール

birdMan

Author:birdMan
作ったもの(特に有志作成のmodや翻訳ファイル)を検索に引っかかるように置いてます.あとノウハウの共有備忘が目的です.

注意:
本ブログではアフィリエイトは一切使用していません.
何か連絡があったら下にSteamのプロフィールへのリンクを載せているのでそこへお願いします.