逆畳み込みネットワークによる顔の生成

私の好きなディープラーニングの論文の1つがディープラーニングにおける畳み込みネットワークを使ったイス、テーブル、車の生成です。論旨はとても単純で、ネットワークに自分が描きたい物のパラメータを与えると、そのとおりにできあがるというものです。しかし、そこからは信じられないほど面白い結果が生じます。ネットワークに3D空間や自らが描く物体の構造についての概念を学習する能力があるようで、数値ではなく画像が生成されるので、ネットワークの”考え”方までもがよく分かる感じがします。

注釈: イスのモーフィング

少し前にRadboud表情データベースをたまたま見つけ、これと同じことが表情の生成や補間に適用できるのではないかと思いました。

結果を見て本当に興奮しました!

ネットワークアーキテクチャ

この実装にあたって、先ほどのイスの論文から”1s-S-deep”モデルのバージョンを応用しました。このモデルにおいては、イスの”スタイル”のワンホットエンコーディングと、方向とカメラの位置を決めるためのパラメータがネットワークへ入力されます。そのあと、入力されたデータをいくつかの全結合層に通し、描くものの表現を得ます。その表現が逆畳み込みネットワークへ渡され、画像を描き、セグメンテーションマスクを予測します。表情の生成のため、セグメンテーションネットワークを完全に取り除く以外(理由は顔のグランドトゥルースがないためです)、論文と同じことを行い、人物や感情、顔の向きを入力しました。

A diagram of the model used to generate chairs (from
        Dosovitskiy et al.)
イスの生成に使われたモデルのダイアグラム(Dosovitskiy et al.)

ここでの逆畳み込みネットワークは、セマンティックなセグメンテーションと生成ネットワーク(例えば、こちらこちら、またはこちら)向けの他のモデルで人物や感情を見る方法と似ています。本質的に、分類ネットワークで一般的に使用される操作の逆です。通常は、畳み込みが数層あり、続いて入力量の次元を減らすためのプーリング層があります。逆畳み込みネットワークでは、これらの操作を逆に行います。まず入力のアップサンプリング(別名:アンプーリング)を行い、それから畳み込みを適用するのです。

An illustration of 'deconvolution' as upsampling (unpooling)
        followed by a convolution operation (from Dosovitskiy et al.)
アップサンプリング(アンプーリング)の後に畳み込み操作が続く’逆畳み込み’の図(Dosovitskiy et al)

本質的に、アンプーリングを行う際はキャンバス上でグリッド状に点をペイントし、それから畳み込みカーネルをペイントブラシとして使い、ペイントした色を周りに広げて混ぜます。

このアーキテクチャを論文からほぼそのまま適用できましたが、GPUメモリを消耗せずにより高解像度のイメージを取得するために、層ごとのカーネルの数を調整し、バッチ正規化を使用して確実にLeaky ReLU活性化関数が動作するようにしなければなりませんでした。モデルは、TheanoとTensorFlow上に構築された高度なディープラーニングフレームワークのKerasに実装されます。

顔の補間

既にご覧いただいたとおり、ネットワークはかなりスムーズに人物と人物の間や感情と感情の間を補間することができます。

注釈:感情と人物の循環

実際にモード間をやや写実的に補間し、各サンプル間のフェージングのような不自然なメソッドに頼ることはありません。私が本当に驚いたのは、ある意味で口の開閉のような顔の特徴について学んでいるみたいだったということです。頬骨の動きや眉毛の上下の動きなどを見ることができます。もしかすると、これを使って複雑な式と遷移をアニメーション化することができるかもしれません。

人物のみ、または感情のみに分けて、補間する様子を見ることもできます。

注釈: 人物の補間

注釈: 感情の補間

顔の向きの変化を補間させることについては断念しました。残念ですが、ネットワークは同じ方法で顔の向きを学習することができなかったのです。その理由として可能性が高いと思われるのは、データセット内にあった利用可能な向きの情報はネットワークが3D空間の感覚を発展させるには粗すぎたことと(データセットには45度毎の向きしか含まれません)、より簡単な方法を選んで様々な向きの顔を描く学習していたことです。

注釈: 向きの補間

特に、後頭部などの全く知識のないものを描こうとした際のネットワークの振る舞いは、視覚的に非常に興味深いものです。ネットワークを利用した際に、新しいながら根本的に不正確で、それでも視覚的に面白いイメージを創り出す方法はおそらく他にもあるでしょう。

“無効”な入力値の使用

今のところ、ネットワークに渡されたパラメータの入力値はすべて、おおむね”有効”な値でした。これまで、人物と感情のベクトルは常に正規化されていました(つまり、人物と感情を混合した場合でもです)。そして、向きの入力値は常に有効な角度を表していました。しかし、このルールを破り、代わりにランダムな値をネットワークに渡すと、どうなるでしょうか?

とても恐ろしいことになります。


無効な向きの解釈の方法が分からなかったり、処理する人物と感情が”多すぎ”たりといった、いくつかの要素が合わさることで、ネットワークは無秩序で異様な状態に、顔を伸ばしたり、ねじ曲げたりしてしまうのです。

フレームごとに入力値を少しずつランダムに変化させることで、アニメーションも作ることができます。

注釈: ランダムパラメータ

ワイルドですね。

部分的に訓練したネットワークによるイメージの生成

最後にご紹介するのは、もっと面白いイメージを作るために、部分的に訓練したネットワークを利用して色々試す方法です。例えば、部分的に訓練したネットワークでAdaGradを使うと、以下のようにランダムなイメージが作られます。

注釈: 部分的に訓練したネットワークでAdaGradを使用

私が特に関心を持ったのは、異なるオプティマイザが、どれだけ違うイメージを描くのかという点です。特に、訓練初期は興味深いです。例えば、部分的に訓練したネットワークで、単純な確率的勾配降下法を使って生成されるイメージは、人の顔というよりも抽象画のように見えます。

注釈: 部分的に訓練したネットワークで確率的勾配降下法を使用

私は、これらのネットワークを使った実験や、イメージ生成やオプティマイザの影響をネットワークが学習する過程の観察を、もっと詳しく行いたいと思っています(そして、どうしてその学習過程を取るのかという理由も知りたいですね)。しかし、今後の投稿のために今回は触れないでおきましょう。

コードはこちらでご覧いただけます

2016年10月2日改:モデルが実際に行っていることを正確に反映させるため、畳み込み演算の記述を変更しました。”スイッチ”のアンプールを学習するのではなく、アンプーリングするためにアップサンプリングを行っています。

2016年9月30日改:部分的に訓練したネットワークのアニメーションを追加しました。