論文まとめ：Video-to-Video Synthesis

# はじめに 
ちょっと古いけど、NVIDIAのチームらが出した
[1]T. Wang, et. al. "Video-to-Video Synthesis"
のまとめ

- arXiv:
https://arxiv.org/abs/1808.06601

- githubの著者コード
https://github.com/NVIDIA/vid2vid

# 概要  
1. セグメントのシーケンスから動画を生成したり、動画の一部を変換した動画を生成したりするモデル
2. 時系列な過去の情報や optical flow を使って各フレームの画像を生成する

以下が生成例。

<img width="804" alt="vid2vid_img10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/61073335-d887-6cd8-665e-77c38e55f53b.png">

説明にも書いてるが、左上が入力のセグメンテーション画像、その右が pix2pixの結果、左下が COVSTの結果、右下が本手法の結果。

過去の情報を使ってる分白線とかが滑らか。


# 手法  
### 定義
${\bf s}\_1^T = \\{ {\bf s}\_1,  {\bf s}\_1, \cdots , {\bf s}\_T,\\}$ ・・・セグメンテーションの各シーケンス
${\bf x}\_1^T = \\{ {\bf x}\_1,  {\bf x}\_1, \cdots , {\bf x}\_T,\\}$ ・・・元動画のシーケンス
$\tilde{{\bf x}}\_1^T = \\{ \tilde{\bf x}\_1,  \tilde{\bf x}\_1, \cdots , \tilde{\bf x}\_T,\\}$ ・・・ ${\bf s}\_1^T$ を入力した時の動画のシーケンスの予測値

### 目標
目標はセグメンテーション・シーケンス ${\bf s}\_1^T$ を入力として与えた時の動画の予測値 $\tilde{{\bf x}}\_1^T$ の分布を正解の動画 ${\bf x}\_1^T$ の分布に近づけること。つまり

```math
p(\tilde{{\bf x}}_1^T | {\bf s}_1^T) = p({\bf x}_1^T | {\bf s}_1^T)
```

が目標。

### generator 
GeneratorはMarkov性を仮定して、過去 $L$ フレームの情報から生成させる

```math
\begin{eqnarray}
p(\tilde{{\bf x}}_1^T | {\bf s}_1^T) &=& \prod^T_{t=1} p(\tilde{{\bf x}}_t | \tilde{{\bf x}}^{t-1}_{t-L}, {\bf s}_{t-L}^{t}) \\
\end{eqnarray}
```

つまり、過去 $t-L$ フレームから $t - 1$ までのgenerator自身の生成動画 $\tilde{{\bf x}}^{t-1}\_{t-L}$ と過去 $t-L$ フレームから現在 $t$ のセグメンテーションのシーケンス ${\bf s}\_{t-L}^{t}$ を入力とし、現在の生成動画 $\tilde{{\bf x}}\_t$ を得る。

本論文の場合、$L=2$ をとるので、


```math
\begin{eqnarray}
p(\tilde{{\bf x}}_1^T | {\bf s}_1^T) &=& \prod^T_{t=1} p(\tilde{{\bf x}}_t | \tilde{{\bf x}}^{t-1}_{t-L}, {\bf s}_{t-L}^{t}) \\
&=& \prod^T_{t=1} p(\tilde{{\bf x}}_t | {\bf x}_{t-1}, {\bf x}_{t-2}, {\bf s}_{t-1}, {\bf s}_{t-2}) \\
&=& p(\tilde{\bf x}_T | \tilde{\bf x}_{T-1}, \tilde{\bf x}_{T-2}, {\bf s}_{T-1}, {\bf s}_{T-2}) \cdots  p(\tilde{{\bf x}}_1 | \tilde{\bf x}_{0}, {\bf s}_{0})\\
\end{eqnarray}
```

って感じ。

$L=2$ でフレーム $t$ からフレーム $t+1$ にかけてはこんな感じ。

<img width="572" alt="vid2vid_img31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/fcb069ae-5d61-26a5-e72c-96b89f534be2.png">


### optical flow な部分とそれ以外との分離

generator の内部を更に詳しく見ると、

1. optical flow に基づいて推定する部分
2. optical flow では表現できない ocullusion の部分

に分けて考えていて、2 に関しては generator の想像力で生成する。

具体的には

- $\tilde{\bf w}\_{t-1} = W(\tilde{\bf x}\_{t-L}^{t-1}, {\bf s}\_{t-L}^{t})$ ・・・$t-1$ フレームから $t$ フレームへの optical flow で、$W$ はそれを推定するネットワーク。
- $\tilde{\bf h}\_t = H(\tilde{\bf x}\_{t-L}^{t-1}, {\bf s}\_{t-L}^{t})$ ・・・occulusion で見えてない部分を推定した画像。$H$がそれに相当する image hallucinatio network。
- $\tilde{\bf m}\_t = M(\tilde{\bf x}\_{t-L}^{t-1}, {\bf s}\_{t-L}^{t})$ ・・・occulusion mask。[0,1]の連続値。

として

```math
F(\tilde{\bf x}_{t-L}^{t-1}, {\bf s}_{t-L}^{t}) = ({\bf 1} - \tilde{\bf m}_t ) \odot \tilde{\bf w}_{t-1}(\tilde{\bf x}_{t-1}) + \tilde{\bf m}_t \odot \tilde{\bf h}_t \tag{1}
```

とする。まず右辺１項目は optical flow に基づく部分で $t-1$ フレームの推定画像 $\tilde{\bf x}\_{t-1}$ を optical flow $\tilde{\bf w}_{t-1}$ で推移させることで求める。右辺２項目は optical flow では求まらない ocullusion な部分。両者を mask でわけて計算している。$\odot$ はアダマール積。

ganarotor ネットワークのアーキテクチャは以下。

<img width="819" alt="vid2vid_img20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/2c8be87b-a0c5-bf85-b812-e33d9021e3af.png">

これに先ほどの記号をあてはめるとこんな感じ。

<img width="741" alt="vid2vid_img30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/e818d63c-7ebc-0083-bf6d-22e75294acd8.png">

セグメントのシーケンスと生成画像のシーケンスとは分けて特徴量を取ってる。それを add？ した後、occulusionな部分を創造するパートと optical flow 、及び mask を推定するパートに分かれる。

### 前景と後景に分離して計算する  
さらに、$(1)$ 式第２項を前景部分（人や車）と後景部分（建物や道路）に分離する。前景部分と後景部分は動きがかなり違うので、これらを分けて推論させるとうまくいくだろう、という発想。

具体的には image hallucination network を前景部分 $\tilde{\bf h}_{t}$ を

1. 前景部分・・・$\tilde{\bf h}\_{F, t} = H_F (\tilde{\bf s}^t\_{t-L})$ 
2. 後景部分・・・$\tilde{\bf h}\_{B, t} = H_B (\tilde{\bf x}^{t-1}\_{t-L}, \tilde{\bf s}^t\_{t-L})$

に分ける。前景部分はセグメンテーションのシーケンスのみから推定する。よって （１）式は前景と後景を分けるマスク ${\bf m}_{B,t}$ を用いて

```math
F(\tilde{\bf x}_{t-L}^{t-1}, {\bf s}_{t-L}^{t}) = ({\bf 1} - \tilde{\bf m}_t ) \odot \tilde{\bf w}_{t-1}(\tilde{\bf x}_{t-1}) + \tilde{\bf m}_t \odot (({\bf 1} - {\bf m}_{B,t}) \odot \tilde{\bf h}_{F,t} + {\bf m}_{B,t} \odot \tilde{\bf h}_{B,t}) \tag{2}
```

とする。

# loss  

### loss の全体像  
loss は３つのパーツの合計。

```math
\min_F ( \max_{D_I} \mathcal{L}_I (F, D_I) + \max_{D_V} \mathcal{L}_V (F, D_V)) + \lambda_W \mathcal{L}_W (F)
```

### 画像１枚に対しての adversarial な loss。

上式 $\min$ 内第１項は画像１枚に対する adversarial な loss。

```math
\mathcal{L}_I = E_{\phi_I ({\bf x}_1^T, {\bf s}_1^T}) [\log D_I ({\bf x}_i, {\bf s}_i)] + E_{\phi_I ({\bf x}_1^T, {\bf s}_1^T}) [\log(1- D_I ({\bf x}_i, {\bf s}_i))]
```

つまり各フレームのセグメンテーション画像に対し、生成した画像がそれらしくなるように学習している。

### シーケンシャルな画像に対する adversarial な loss 

```math
\mathcal{L}_V = E_{\phi_V ({\bf w}_1^{T-1}, {\bf x}_1^T, {\bf s}_1^T)} [\log D_V ({\bf x}_{i-K}^{i-1}, {\bf w}_{i-K}^{i-2})] + E_{\phi_V ({\bf w}_1^{T-1}, \tilde{\bf x}_1^T, {\bf s}_1^T)} [\log(1- D_V (\tilde{\bf x}_{i-K}^{i-1}, {\bf w}_{i-K}^{i-2}))]
```

こちらは入力が生成した画像のシーケンスと optical flow のシーケンスになってるところが特徴的。

### optical flow に対する loss  
optical flow に対する loss は、以下。

```math
\mathcal{L}_W = \frac{1}{T-1} \sum^{T-1}_{t=1} \left( \| \tilde{\bf w}_t - {\bf w}_t \|_1 + \| \tilde{\bf w}_t ({\bf x}_t) - {\bf x}_{t+1}  \|_1 \right)
```

第１項は推定した optical flow と実際の optical flow との loss。

第２項は前フレームの実際の画像を推定した optical flow で変換したものと次フレームの実際の画像との loss。

# 実験と結果  

### 実装の詳細
- 低解像度で学習して高解像度化する
- discriminator は patchGANのようにpatchごと
- フレームレートを変化させる
- 最適化：Adam
- GAN loss は LSGANのleast-square loss
- 2K画像の場合、8個のtesla v100で10日間学習

### データセット
Cityscape等いろいろやってるが、ここではFace video 系のみとりあげる
- FaceForensics dataset・・・854のビデオからなる  
スケッチから顔を生成させるタスクの場合、まず顔輪郭から Canny edges を抽出してスケッチとする。


### メトリクス
- 人の定性的評価
- Frechet Inception Distance

### 定性的評価
Cityscape を用いた場合の pix2pixHDとCOVSTとの比較は以下。

<img width="808" alt="vid2vid_img11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/d5a122c8-76d3-9c96-0e05-a079e7d35b68.png">

人の評価が顕著によくなってる

### 定性的評価
ここではスケッチから顔生成のタスクのみ取り上げる


<img width="818" alt="vid2vid_img17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/5e90dfab-1e96-3d58-aa16-d3a8cabdf452.png">

まぁ、それっぽいのが生成されてる。

# 感想

optical flow で推定する部分と完全に創造する部分にわけてたり、あるいは後者は更に前景と後景にわけてたりと、興味深い。

ただDeepFake的に狙ったターゲット（例えばトランプの顔）にするにはconditionを与える等の必要があるね。

またそれに関連して、論文中 discussion にも書かれていたが、対象物体のIDを認識しているわけではないので、車の色が途中で変わったりの難点あり。

あと膨大な学習時間をなんとかしてほしい。