kumilog.net

データ分析やプログラミングの話などを書いています。

VideoGANの論文を読んだ

GANの一種であり、動画を生成するVideoGANの論文を読みました。

概要

VideoGANはNIPS2016でMITが発表した論文です。これはGAN*1を使った動画生成モデルで、25fpsで1秒程度の短い動画を生成することができます。静止画像の未来を予測するのに有用とのことです。

動画の生成には、ForegroundとBackgroundの2つのネットワークを用います。画像では2次元の畳込みネットワークを使いますが、動画は時間軸が加わり3次元畳込みを利用します。

以下は生成された動画のサンプルです。公式ページには他のサンプルや実装コード、学習につかったデータもあります。

Beach



出典:Generating Videos with Scene Dynamics - MIT

ちょっといまいちなものもありますが、波の様子はそれなりに上手くできていると思います。

動画生成モデル

動画生成モデルは、GANをベースにしています。GANは、Generative Adversarial Networks(敵性的生成ネットワーク)の略で、Generator Network  GとDiscriminator Network  D の2つネットワークの学習によって、ノイズから画像を生成するアルゴリズムです。

Generatorは、Disciminatorに本物と誤認識させるような画像を生成し、Disciminatorは、本物か偽物かを見分けるように学習します。

Generator Network

VideoGANのGenerator Network  G は、低次元のデータ  z を入力とし、高次元の動画を出力することを目指します。 z は通常のGANと同じくガウス分布から得られるノイズです。

また、出力する動画は、固定カメラで通常はオブジェクトだけが移動することを想定します。つまり、背景は静止しており、前景が動く動画を生成します。

以下の図にように、Generator Network  G は2つの独立したネットワークで構成されます。どちらもアップサンプリングです。図の数字は、それぞれの層の出力サイズで、括弧内はチャンネル数です。つまり、100次元のノイズから64 x 64の画像が32フレームある動画を生成します。

f:id:xkumiyu:20171101005014p:plain 出典:[1609.02612] Generating Videos with Scene Dynamics

Foreground Stream

Generator Network  G の1つ目のネットワークは、動く前景部分を担当します。ここでは、5層の3次元畳込みネットワークを用います。ストライド幅は2で、カーネルサイズは、4 x 4 x 4を使用します。(1層目のみ 2 x 4 x 4)これらの値が学習のスピードと質のバランスが優れているそうです。

また、細かく畳み込みを行うと、効率的にアップサンプリングを行うことができると記載がありましたが、理由はよく分からなかったです。

Background Stream

もう1つのネットワークは、静的な背景を担当します。このネットワークは、2次元畳込みで静止画を生成するので、通常のDCGANによる画像生成と変わりないです。

ForegroundとBackgroundの結合

ForegroundとBackgroundを結合して、動画を生成します。Foregroundからオブジェクト部分を抜き出したものと、オブジェクト部分以外にはBackgroundの画像を当て込むような結合を行います。

$$ m \odot f + \left(1 - m\right) \odot b $$

 m は、0 \le m \le 1であり、3次元空間の各要素において、ForegroundかBackgroundのどちらを選択するか時空間的なマスクの役割を担います。 \odotは各要素の積(element-wise multiplication)です。

 bは、すべての時間において同じ画像を複製します。 m \odot fが、Foregroundからオブジェクト部分を抜き出したものに対応し、 \left(1 - m\right) \odot bがオブジェクト部分以外のBackgroundに対応します。

f:id:xkumiyu:20171101151720p:plain
出典:[1609.02612] Generating Videos with Scene Dynamics

Discriminator Network

Discriminator Network  D はVideoGANによって生成された動画かリアルな動画か、フレーム間の動きかリアルであるかの2点を解決するような判別器です。

このネットワークは、Generator Network  GのForeground Streamの逆になるように設計し、アップサンプリングではなく、ダウンサンプリングになるようにします。カーネルサイズが 4 x 4 x 4である5層の3次元畳込みネットワークを用います。

学習と実装

学習に用いたパラメータなどは以下のとおりです。(DCGANと同じような感じだと思います。)

  • OptimizerにはAdam(alpha=0.0002, beta1=0.5)を使う
  • バッチサイズは64
  • 学習データ(動画)は、[-1, 1]の範囲に正規化
  • Generatorの各層(出力層を除く)の後に、batch normalizationとReLUを使用
  • Discriminatorは最初の層を除いて、batch normalizationとleaky ReLUを使用
  • 重みは正規分布(平均0, 標準偏差0.01)で初期化

また、学習はGPUで数日かかったそうです。

条件付きGANへの拡張

GANは、ノイズから画像(VideoGANでは動画)を生成するため、どのような画像を生成するかは制御できません。そこで、ラベル付で学習することで、生成する画像を制御することができるに拡張したのが、条件付きGAN(Conditional GAN)です。

f:id:xkumiyu:20170909021908p:plain
Conditional GAN

Conditional GANについては、以下の記事も合わせてご覧ください。

www.kumilog.net

VideoGANでも、同様にGeneratorのForegroundのネットワークにラベルを加えることで拡張できます。残りのGeneratorと、Discriminatorは同じネットワークです。loss関数に変更を加えますが、ここでは割愛します。