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 とDiscriminator Network
の2つネットワークの学習によって、ノイズから画像を生成するアルゴリズムです。
Generatorは、Disciminatorに本物と誤認識させるような画像を生成し、Disciminatorは、本物か偽物かを見分けるように学習します。
Generator Network
VideoGANのGenerator Network は、低次元のデータ
を入力とし、高次元の動画を出力することを目指します。
は通常のGANと同じくガウス分布から得られるノイズです。
また、出力する動画は、固定カメラで通常はオブジェクトだけが移動することを想定します。つまり、背景は静止しており、前景が動く動画を生成します。
以下の図にように、Generator Network は2つの独立したネットワークで構成されます。どちらもアップサンプリングです。図の数字は、それぞれの層の出力サイズで、括弧内はチャンネル数です。つまり、100次元のノイズから64 x 64の画像が32フレームある動画を生成します。
Foreground Stream
Generator Network の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 $$
は、
であり、3次元空間の各要素において、ForegroundかBackgroundのどちらを選択するか時空間的なマスクの役割を担います。
は各要素の積(element-wise multiplication)です。
は、すべての時間において同じ画像を複製します。
が、Foregroundからオブジェクト部分を抜き出したものに対応し、
がオブジェクト部分以外のBackgroundに対応します。
Discriminator Network
Discriminator Network はVideoGANによって生成された動画かリアルな動画か、フレーム間の動きかリアルであるかの2点を解決するような判別器です。
このネットワークは、Generator Network の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)です。
Conditional GANについては、以下の記事も合わせてご覧ください。
VideoGANでも、同様にGeneratorのForegroundのネットワークにラベルを加えることで拡張できます。残りのGeneratorと、Discriminatorは同じネットワークです。loss関数に変更を加えますが、ここでは割愛します。