論文まとめ：MoCoGAN: Decomposing Motion and Content for Video Generation

# はじめに
CVPR2018から以下の論文
[1] S. Tulyakov, et.al. MoCoGAN: Decomposing motion and content for video generation. In IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2018.
のまとめ  

ちょっと古いがその後の論文に対する影響も考慮してざっくりまとめ。

arXiv:
https://arxiv.org/abs/1707.04993

著者らのらしきコード：
https://github.com/sergeytulyakov/mocogan
pytorchっぽい。

松尾研のKei Akuzawa氏のまとめ：
https://www.slideshare.net/DeepLearningJP2016/dl-mocogan-79636540

# 概要
1. 生成モデル GANs の一種。
2. あるビデオに対し、その content（写ってるAさんとか）を維持しながらその動きを変えたり、逆に動きはそのままで contentを変えたりできる
3. content と動き（motion）を分離するのが特徴的

以下のように同じ人や表情（content）に対して別の動き（motion）をさせることができる。

<img width="544" alt="MoCoGAN_img01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/eaaf40c5-ab5a-0951-a8ab-78be125fdcc5.png">

上２つの行でいうと、ある人の顔（content）は変わらないが、右にいくと表情が変わる。この場合、motionは顔の筋肉の動きのようなもの。


# 背景
著者らによると、画像の生成とは異なり動画の生成は以下の点で難しい。

1. 物体の外見だけでなく動きも学習する必要があるが、その動きは物理的に可能なものでなければならない。
2. 同じ動作を表現するにしても早く行うか遅く行うかなど、多様である
3. 人は動きに対して敏感なので、人が見て不自然にならない動きにするのは困難である

# アーキテクチャ
### 1. 定義
$Z_I \equiv \mathbb{R}^d$ ・・・画像の潜在空間
${\bf z} \in \mathbb{R}^d$ ・・・画像（もしくはビデオの１フレーム）
$[{\bf z}^{(1)}, \cdots , {\bf z}^{(K)}]$ ・・・動画。右上の添字はフレーム番号

### 2. 画像潜在空間を content と motion へ分離 

$Z_C \in \mathbb{R}^{d\_{C}}$ ・・・contentのsubspace
$Z_M \in \mathbb{R}^{d\_{M}}$ ・・・motionのsubspace
として、
$Z\_{I} = Z\_{C} \times Z\_M, \ \ d = d\_{C} + d\_{M}$
と分離する。

それぞれこんな感じ。

<img width="504" alt="MoCoGAN_img00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/a59287d2-a5bb-dcd1-cd97-739dd5767ecb.png">

### 3. content subspace の詳細
content subspace は

```math
\begin{eqnarray}
{\bf z}_C &\sim& p_{Z_C} \equiv \mathcal{N}({\bf z} | 0, I_{dc}) \\
\end{eqnarray}
```

$I_{dc}$ は $d\_{C} \times d\_{C} $ の分散共分散行列。

１つの video clip 中は content は変わらないと考えて ${\bf z}\_C$ は一定とする。

### 4. motion subspace の詳細

まず各フレームにおいてガウス分布からベクトルをサンプリングする。

```math
\epsilon^{(k)} \sim p_E \equiv \mathcal{N}(\epsilon | 0, I_{d_E}) 
```

これをRNN（本論文ではGRUを使用） $R\_M$ に入力し、motion の subspace を得る。

```math
{\bf z}^{(k)}_M = R_M(k)
```

$\epsilon^{(k)}$ は各フレームごとに独立にサンプリングされるが、 $R\_M$ を通すことでそれが時間軸方向に意味ある繋がりを持つイメージ。以下の図がその部分。

<img width="476" alt="MoCoGAN_img02_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/dbe012ae-777c-f48c-b994-0b3aa4d15b83.png">

### 5. generator 

video clip 内で一定の ${\bf z}\_C$ とフレームごとにRNNから生成される ${\bf z}^{(k)}\_M$ を generator に入力する。つまり

```math
[{\bf z}^{(1)}, \cdots , {\bf z}^{(K)}] = \left[ \left[\begin{array}{c}
      {\bf z}_C \\
      {\bf z}^{(1)}_M
    \end{array}
 \right], \cdots , 
         \left[\begin{array}{c}
      {\bf z}_C \\
      {\bf z}^{(K)}_M
    \end{array}
 \right] \right]
```

を入力する。

<img width="460" alt="MoCoGAN_img02_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/15c60721-0848-ff28-11ab-08f3ff695dc4.png">

generatorからはフレーム $k$ ごとに画像 $\tilde{\bf x}^{(k)}$ を生成する。

```math
\tilde{\bf x}^{(k)} = G_I \left( \left[ \begin{array}{c}
      {\bf z}_C \\
      {\bf z}^{(k)}_M
    \end{array}
 \right] \right)
```

<img width="468" alt="MoCoGAN_img02_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/409eb0da-5878-f163-3481-8067d386864e.png">

### 6. discriminator 
discriminator は画像ベースでreal か fake かを判断する $D\_I$ と動画ベースで real か fake かを判断する $D\_V$  

<img width="520" alt="MoCoGAN_img02_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/6321163f-d262-cc1f-2b43-e18ca4fb1643.png">


特に $D\_V$ の方はシーケンスの長さを決めて（論文では16を使用）、3d-cnnで畳み込む。

<img width="402" alt="MoCoGAN_img12_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/f0a87613-691e-dad8-4570-86be3d662862.png">

# loss 
### GANs loss
adversarial な loss は以下。

```math
\begin{eqnarray}
&& \max_{G_I, R_M} \min_{D_I, D_V} \mathcal{F}_V (D_I, D_V, G_I, G_M)\\
&=& \mathbb{E}_{\bf V} [-\log D_I(S_I({\bf v}))] + \mathbb{E}_{\tilde{\bf v}} [-\log(1- D_I(S_I(\tilde{\bf v})))] + 
   \mathbb{E}_{\bf V} [-\log D_V(S_V({\bf v}))] + \mathbb{E}_{\tilde{\bf v}} [-\log(1- D_V(S_V(\tilde{\bf v})))] \\
\end{eqnarray}
```

右辺第１項はrealなimage（１フレーム）を入れた場合、第２項はgeneratorで生成したimageを入れた場合、第３項はrealなvideoのclipを入れた場合、第４項はgeneratorで生成したvideo の clipを入れた場合。

### categorical な losss
infoGANのごとく相互情報量の変分下限 $L\_I (G\_I, Q)$ を最大化させることでカテゴリーごとに分かれるように仕向ける。

参照　自分のinfo-GANの記事：
https://qiita.com/masataka46/items/9d2c0167c334125a41a6

total の loss は両方たす

```math
\max_{G_I, R_M} \min_{D_I, D_V} \mathcal{F}_V (D_I, D_V, G_I, G_M) + \lambda L_I (G_I, Q)
```

# 実験と結果
### 1. average content distance による定量的評価
content を固定して motionを変える場合、全てのフレームにおけるcontentは一致してほしい。

average content distance は例えば顔の表情タスクの場合、OpenFaceなど性能を認められたモデルで各フレームを推論させ、feature vectorを取り出してそれらが一致するかをL2 distannce で測定する。

結果は以下。

<img width="465" alt="MoCoGAN_img04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/c7c152e9-9352-8bf8-29a8-1ae66693d568.png">

VGANやTGANよりdistanceが小さい（性能が良い）

### 2. 定性的評価
VGANやTGANと比較したらこんな感じ。

<img width="937" alt="MoCoGAN_img03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b8663384-a967-b2c0-b5fc-926e963feebb.png">