数枚の画像で動きを転移できるFew shot vid2vid(Few shot video to video Synthesis)

この記事は2018/08/20にarXiv投稿されたVideo-to-Video Synthesis[1]と2019/10/28に投稿されたFew-shot Video-to-Video Synthesis[2]を紹介・解説する記事です。

  • 前者は、領域分割マスク等を元にそれらしき動画を合成することができるGAN、vid2vidに関する論文です。
  • 後者は、前者をさらに発展させて、少数の参照画像があればそれと領域分割マスク等をもとに動画を構成することができるGAN、Few shot vid2vidに関する論文です。

Video-to-Video Synthesis

概要

この論文では、領域分割マスクや線画スケッチを元に、リアルで高解像度な動画をGANであるvid2vidによって生成しています。この論文を要約すると以下のようになります。

動画を合成するGAN。先行研究のpix2pixHD・COVSTと比較すると、前のフレームの条件付き確率を用いて生成を行なっているため映像の乱れが少ない。学習が進むにつれて合成に使用するフレーム数を増やしていくtemporally progressive Trainingと、PG-GANの段階的に解像度を上げいくspatially progressive trainingを交互に行う”Spatio-temporally Progressive Training”がポイント。

下の例では、左下の領域分割マスクを元に2つの高解像度動画を生成した例です。

[3]より引用。city space datasetで生成した例

問題設定

時刻1から時刻Tにおける合成動画(合成画像の集合)xチルダを、時刻1から時刻Tの参照動画sで生成することを考えます。そうすると、下記のように各時刻tにおいて、直前の時刻t-1から数フレーム前の時刻t-Lまでの合成動画と、合成したい時刻tから時刻t-Lまでの参照動画の同時確率を条件にした生成モデルで動画の生成を定義できます。

この論文では、下の式に従って、順々に合成画像を生成していく問題を解いていきます。

Generator(F)

まず、時刻tのフレームを合成する関数Fの構造を示します。

Fの構造

ざっくりと説明すると、「optical flowで直前の時刻の合成画像を歪ませた画像(青)」と「それ以外の部分を合成した中間生成画像(赤)」の2つを0~1の連続値をもつマスクmを用いて場所ごとに構成しています。動画は連続しているので、optical flowを用いて表現できる部分とそうでない部分に分かれているとした、自然な仮定を入れています。

後者の中間生成画像hは以下のように、さらに分解することができます。添字Bは背景、添字Fは前景を示しています。

背景を構成する部分と、前景を構成する部分にhを分解する

時刻tにおける背景の位置を示すマスクm_Bによって、背景を構成するh_B, 前景を構成するh_Fに分解して画像を生成するという構造になっています。前景を構成する関数h_Fはoptical flowでは表現しにくい激しい動きをする部分の構成を担当し、背景を構成するh_Bは動きの少ないoptical flowで表現できる部分を担当します。optical flowを使って画像を歪ませる項がFの第1項に含まれているので、実質的にh_Bが担当するのは、時刻tで新たに出現する背景等のoptical flowだけでは表現できない部分になります。

これらを含めてFを書き直すと下記のようになります。

Discriminator

vid2vidでは、Image Discriminatorと Video Discriminatorという2つのDiscriminatorを導入しています。前者は(真の画像、対応する参照画像)or (生成画像、対応する参照画像)を判断するDiscriminatorで、参照画像から生成された画像が尤もらしいか、を判断します。後者は(真の画像、対応する1つ前の時刻のOptical Flow)or (生成画像、対応する1つ前の時刻のOptical Flow)を区別し、動画として自然かどうかを判断しています。

また、モード崩壊を防ぐために複数のスケールでDiscriminatorを導入すると良いことが知られており、複数のスケールでImage Discriminatorを導入しています。

[3]より引用

目的関数

このGenerator(F)とDiscriminatorを最適化するための目的関数は以下のようになっています。

vid2vidの目的関数

カッコで囲まれた第1項L_I、第2項L_Vは通常のGANの目的関数と同じく、Generator Fと2つのDiscriminatorのミニマックス問題で、それぞれ下記のようになっています。添字IはImage Discriminator, 添字Vはvideo Discriminatorを表しています。

目的関数のうち、Image Discriminatorに関する部分(L_I)
目的関数のうち、Video Discriminatorに関する部分(L_V)

第3項L_WはOptical Flowに関する項です。第1項目は真のOptical Flowと予測Optical Flowの差分、第2項は予測Optical Flowを使って1つ先の時刻を予測した画像と真の1つ先の時刻の画像との差分です。

学習方法

学習はspatio-temporally progressive mannerと呼ばれる形式で行われます。簡単に言うと、少ないフレーム数・粗い解像度で学習を開始し、徐々にフレーム数・解像度を交互に上げていく学習方法です。

[3]より引用

結果

結果の一部を抜粋します。まず、同じ領域分割マスクを使って、2つのビデオを生成した例です。マスクが同じなので、車や背景(街路樹とビル)の位置は変わりませんが、ビル⇄街路樹や、車の種類を自由に変換できていることがわかります。

次に他の手法との比較です。前の時刻の条件付きで画像を生成しているため、他の手法と比較しても自然なビデオが生成できているのがわかります。

(Left)Pix2pixHD. (Center)COVST, (Right) vid2vid

Few-shot Video-to-Video Synthesis

概要

この論文は2019/10/28にarXivに投稿されました。vid2vidでは学習したドメインでしか合成ができませんでしたが、本研究で提案された手法では、vid2vidをベースとしながらも学習時になかったドメインでも動画合成が可能です。

概要をまとめると以下のようになります。

few shotでvideoを合成するGANを提案。vid2vidを踏襲しつつもFew shotで合成する対象のサンプルをSPADEを使ってstyleを入れ込む。①②を合わせて新しい時刻のフレームを合成する。

  1. 合成したビデオの直前のフレームと合成したい時刻の参照画像(semantic image, key pointや領域分割マスク)からOptical Flow WとOcclusion Map M を抽出
  2. 合成したいサンプルの特徴量をEで抽出し、合成元の情報と合わせてパラメータを可変にしたSPADE ResBlockに入れ込む
(Left)vid2vid, (Right)Few shot vid2vid

Few shotのためのアーキテクチャ改善

基本的にはvid2vidを踏襲していますが、Few shot合成を実現するために中間生成画像を出すモジュールHに工夫を加えてます。vid2vidではモジュールHのパラメータは、入力データによらず固定値でした。しかし、Few shot vid2vidは合成したいサンプル(e_K, s_K)によって動的にパラメータを変えられるようにしています。

では、どのようにして動的にパラメータを変えられるようにしているのでしょうか?それには大きく分けて3つ手順を踏んでいます。

  1. (e_K, s_K)からEncoder(E_P)を用いて、各フレーム毎に特徴量を抽出し、Encoderの層毎に特徴量q^l (lは層のID)を計算する
  2. 各フレーム毎にAttention Weightを計算し、Attentionで重み付けしたqを算出する
  3. Attentionで重み付けしたqと参照画像sを、パラメータを可変にしたSPADEを使ってGenerator Hに入れ込む
Few shot合成に必要な手順

まず、手順1,2では、フレーム画像e、参照画像sそれぞれをE_F, E_Aで処理しています。フレーム画像eをエンコーダーE_Fで処理すると特徴量q、参照画像s E_Aで処理するとAttention Weightが出てきます。ここで特徴量qはエンコーダーE_Fの層毎に抽出している点に注意してください。

手順3では、SPADE[4]というstyle変換に用いる正規化層を使います。SPADEを用いたGauGANでは、単純な線と色で描かれたイラストから、写実的な画像を生成することができます。

SPADEが用いられているGauGANのデモ。 https://www.nvidia.com/en-us/research/ai-playground/ より引用

元の論文で提案されたSPADEの構造は以下の通りです。イラストを畳み込みしたものをそれぞれ、バッチ毎に正規化した特徴量に係数とバイアスとして入れます。

SPADE ResBlk(左)とSPADE(右)

通常のSPADEにおけるγとβは固定のフィルターを用いて畳み込み処理を行なっています。しかし、Few shot vid2vidにおけるSPADEは動的にパラメータを変える必要があるため、フレーム画像をエンコーダーE_PE_Aで処理した重みθ_Hを使って畳み込みを行います。

θ_Hθ_S, θ_β, θ_γに分割され、それぞれ異なった部分で畳み込み処理をします。数式で書くと以下のようになります。

結果

今まで紹介した機構を用いてFew shotで転移した例を紹介します。まず、ダンスしている人のキーポイントを用いて、Few shotでダンスを転移した例です。非常に上手く転移できているのがわかります。

ダンスの動きを転移させた例。上がサンプルe, 左が参照画像のシーケンスs

次に道路と街(city space dataset)の例です。ここでもマスク画像を用いて、転移させたいExample imagesのスタイルで動画を生成できています。

他の手法と比較した例です。本手法が既存手法と比較して、非常にうまく動作を転移できていることがわかります。

まとめ

今回は自然なビデオを合成できるvid2vidと、それをFew shotで合成できるFew shot vid2vidを紹介しました。GANの進化は本当に凄まじいので、新たな研究を見るのはとても楽しみです。

Reference

  1. Ting-Chun Wang et al. Video-to-Video Synthesis arXiv:1808.06601,2018
  2. Ting-Chun Wang et al. Few-shot Video-to-Video Synthesis, arXiv:1910.12713,2019
  3. Research at NVIDIA: Video to Video Synthesis ,https://www.youtube.com/watch?v=GrP_aOSXt5U&feature=youtu.be
  4. Taesung Park et al. Semantic Image Synthesis with Spatially-Adaptive Normalization. arXiv:1903.07291, 2019

Data Scientist (Engineer) in Japan Twitter : https://twitter.com/AkiraTOSEI LinkedIn : https://www.linkedin.com/mwlite/in/亮宏-藤井-999868122