DALL-E で、文から画像を生成する

1.はじめに

 2021年新年早々、OpenAIが「テキストを入力するとそれっぽい画像を生成するDALL-Eというモデル」を発表し、私はその表現力に衝撃を受けました。

 先週、OpenAIからコードの一部Discrete VAE の部分)と論文が公開されましたが、まだ公式にはDALL-Eを完全には動かせない状態です。

 そうした中、@advadnoun さんがこれを受けて Discrete VAE に CLIP を組み合わせたプロトタイプを公表してくれました(素晴らしい!)。今回はこれを試してみたいと思います。

2.DALL-Eとは?

  DALL-Eは、任意のテキストを入力するとその内容に合わせた画像を生成するモデルです。このモデルは、大きく分けると2つのステージを経て作られます。

 ステージ1は、画像の圧縮・復元モジュールの作成です。これには、Discrete VAE(離散変分オートエンコーダ)と呼ばれるモデルが使われていて、エンコーダがRGB 256×256画像を32×32の中間出力に圧縮し、デコーダはその中間出力を再び入力とほぼ同品質のRGB256×256画像に復元します。

 一般的に画像は情報量が大きくそのままでは扱い難い訳ですが、Discrete VAEの中間出力を使うことで画像の情報量を192分の1に削減出来ることになります。Discrete VAEは、画像のみを学習データとして、入力した画像を正確に出力することを学習します。

 ステージ2は、画像とテキストの対応関係の学習です。これには、Transformerと呼ばれるモデル(赤の点線で囲まれたEncoderの部分)が使われていて、画像情報(画像トークン)とその内容を説明するテキスト情報(テキストトークン)の対応関係を学習します。

 Transformerへ入力するデータ形式は、画像トークンとして先ほどの中間出力(32×32=1024個)、テキストトークンとしてテキストを構成する単語をベクトルに変換したもの(最大256個)、この2つを連結したものです。

 学習データはインターネットから収集された2億5000万の画像とテキストのペアを先程の形式にし、120億のパラメーターを持つ巨大なTransformerに学習させます。

 この2つのステージが完了すると、下記の様にテキストから画像トークンを求めて画像に復元させれば目的が達成できるわけです。しかし、残念ながら現段階で DALL-E Text Encoder は公表されていないので、この方法は使えません。

 そこで、少し回り道になりますが、同じくOpenAIが発表したCLIP(テキストと画像それぞれから特徴ベクトルを抽出し類似度を算出できるモデル)を組み合わせて下記の様なプロトタイプを考えます。

 CLIPを使って、Textと DALL-E Image Decoder の出力それぞれから特徴ベクトル(T, I )を求め、類似度(ベクトルの内積)が出来るだけ高くなるように誤差逆伝播で Parameter を最適化すれば、目的とする画像(Image)が生成できるわけです。

3.コード

 コードはオリジナルを少しいじったものをGithubに上げてあります。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。

 最初に、セットアップを行います。

 

 次に、必要なライブラリーのインポートと関数の定義を行います。

 

 画像生成したいテキストを設定します。 text_input にテキストを設定し、特徴ベクトルに変換します。ここでは、an armchair in the shape of an avocado(アボガドの形をしたアームチェア)と設定しています。

 

 学習ループです。パラメータをリセットし、画像保存用のimagesフォルダーをリセットしたら、1001 iter 学習ループを廻します。学習の安定性を向上させるために、生成した画像から画像をランダムに切り出し・回転させたものを複数作成します。そしてそれらを正規化し平均をとってから特徴ベクトルに変換しています。生成した画像は、50iter 毎にimages フォルダーに、000000.pngという連番形式で保存します。

 OpenAIのデモではスマートな画像でしたが、ちょっとリアリティがある感じになりました。

 生成過程を動画にします。ffmpeg でimages フォルダーの連番画像から動画を作成します。学習回数(iter)を変更する場合は、最後の画像を5枚コピーする部分のforループの設定も変更して下さい。

 

 それでは、作成した動画を再生してみましょう。

 

 2回目以降画像生成を行いたい場合は、「テキストの設定」以降を繰り返せばOKです。それでは、いくつか試した結果をお見せします。

 エッシャーが設計した美しくミステリアスな家(a beautiful and mysterious house designed by Escher)

 騙し絵の大家エッシャーの雰囲気が結構出てますよね。

モナリザが屋上にあるジャグジーで赤ワインを飲んでいる(Mona Lisa is drinking red wine in the rooftop jacuzzi)

 正に、無茶苦茶なテキストを与えたわけですが、さすがDALL-Eです、こちらの要求をちゃんとかなえてくれました(笑)。

ガウディが設計したスポーツカー(Sports car designed by Gaudi)

 これは凄いです!もはや車の概念を超えています。さすがガウディ、ぶっ飛んでいます(笑)。

 それにしても、クリエイティブな感覚を刺激してくれる面白いモデルです。ビジュアルで詰まっている時に、気分転換に使うと色々なアイディアが出て来そうな気がします。凄い時代になったものです。

では、また。

2021.6.22最新版Colabリンク

https://colab.research.google.com/drive/1L8oL-vLJXVcRzCFbPwOoMkPKJ8-aYdPN

(twitter投稿)

2 件のコメント

  • 自分でも試してみましたが、それっぽい画像はできますがOPENAIのようなきれいな画像はなかなかできないですね・・・
    やはりこれはTransformerの部分の影響でしょうか?

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

    ABOUTこの記事をかいた人

    アバター

    ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。