論文まとめ：Recycle-GAN: Unsupervised Video Retargeting

# はじめに
ECCV 2018 から以下の論文
[1] A. Bansal, et. al. "Recycle-GAN: Unsupervised Video Retargeting"
のまとめ

- arXiv:
https://arxiv.org/abs/1808.05174
- github 公式コード:
https://github.com/aayushbansal/Recycle-GAN

こちらの方が既にまとめている:
https://medium.com/@crosssceneofwindff/recycle-ganを用いた行動模倣-b1116e318649
ので、ここでは従来手法（Cycle-GAN）を用いた場合の課題と、その対処法に焦点を当てて解説する。

# 概要
- GANを用いたビデオの変換タスク
- cycle-GANを改良し、時空間な制約を導入する
- これにより、contentを変換しながら、taget domain の styleを維持することができる


# video変換でcycle-GANを用いた場合の問題点

以下の図では

![recycle_GAN_img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/4499869a-9435-8ae2-4ce0-760477b9687e.png)
[1]Figure2より

１行目がInput画像、２行目がCycle-GANを用いた変換、３行目がその再変換。

２行目Outputではトランプがオバマになってる（contentは変換されている）。しかし表情は同じに見える（styleは維持されてない）。しかし３行目Reconstructionを見ると、再変換されたトランプは、表情も含めてinputを再現できている。

よく見るとOutputのpixelレベルでは各列微妙に違っているそう。よって、この情報を元にトランプの各表情を復元できてると考えられる。

最下段は本手法によるoutput。

次にドメイン変換でよく見られる図を用いる。以下は Cycle-GANの場合。

![recycle_GAN_img27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/f37be4bb-2854-cc85-1f06-200897bd2aa9.png)

理想的にはこの図のように、トランプの半開きの口はオバマの半開きの口に変換され、トランプの閉じた口はオバマの閉じた口に変換される。

しかし、実際はこうなっている。

![recycle_GAN_img26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/ec4a22c4-182d-56e8-2e9c-5a2f4b9b6246.png)


１）まずトランプの半開きの口、および閉じた口、いずれもオバマの半開きの口に変換される。（赤い矢印）

２）しかし半開きの口の中でもpixelレベルで微妙な違いがある。

３）その違いをもとに再変換した時にトランプの半開きの口、及び閉じた口にちゃんと復元される。（青い矢印）

そこで Recycle-GANでは以下のようにする。

![recycle_GAN_img28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/eed966f9-69db-53d7-4362-4dada556b62e.png)

まず、前のフレームから次のフレームを予測する $P\_X, P\_Y$ を考える。

１）トランプの「半開きの口」（$X\_t$）をオバマに変換する。

２）これに対して $P\_Y$ で次のframeを予測する

３）予測した画像をさらに再変換する。

４）これと、実際の $X\_{t+1}$ とでlossを計算する

こうすると、オバマの「半開きの口」の付近の領域はおおよそトランプの「半開きの口」に付近に変換されるよう学習するため、「半開きの口」が少しずれただけで「閉じた口」に変換されることは無くなるだろう。

# Loss
なので、Cycle-GANの reconstruction error を Recycle な error に変える。

また 次フレーム予測器のLossも考えると、Lossは以下の３種類。

- adversarial loss
- recycle loss
- 予測器のrecurrent loss

## 1.adversarial な loss  

-  $G\_Y$：X→Y の変換器
-  $G\_X$：Y→X の変換器
-  $P\_X$：Xの前frameから次frameを予測する予測器
-  $P\_Y$：Yの前frameから次frameを予測する予測器
-  $D\_X$：Xを識別するdiscriminator
-  $D\_Y$：Yを識別するdiscriminator

として、まずadversarial lossのうちYに関するものは

```math
L_g(G_Y, D_Y) = \sum_s \log D_Y (y_s) + \sum_t log(1-D_Y (G_Y(x_t)))
```

## 2.recycle loss
recycle lossのうちX→Y→予測→X 経路のものは

```math
L_r (G_X, G_Y, P_Y) = \sum_t \| x_{t+1} - G_X(P_Y(G_Y(x_{1:t}))) \|^2
```

## 3. recurrent loss
予測器に関するlossのうち、Xに関するものは

```math
L_\tau (P_X) = \sum_t \|x_{t+} - P_X (x_{1:t}) \|^2
```

## 4. トータルのloss
以上からトータルのminmaxな式は

```math
\underset{G,P}{\min} \underset{D}{\max} L_{rg} (G, P, D) = L_g(G_X, D_X) + L_g(G_Y, D_Y) + \lambda_{rx}L_r(G_X, G_Y,P_Y) + \lambda_{ry}L_r(G_Y, G_X,P_X) + \lambda_{\tau x}L_{\tau}(P_X) + \lambda_{\tau y}L_{\tau}(P_Y)
```

各 $\lambda$ は掛け率。

# 推論時の工夫
推論時は学習した変換器だけでなく、予測器も使う。つまり、t 時の Y を予測するのに、t 時の X を変換したものだけでなく、t-1 時までの X を変換して t-1時までのYとし、これを予測器 $P_Y$ で予測したものも用いる。

```math
y_t = \frac{G_Y(x_t) + P_Y(G_Y(x_{1:t-1}))}{2}
```

# 実験と結果
## 定量的評価
Viper dataset を用いた評価は以下。

![recycle_GAN_img30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/a3e95045-9719-9312-a03e-46bb8429ad8e.png)

cycle-GANより精度がよい。

## 定性的評価
花が開いたり、散ったりするところのビデオで学習させた結果は以下。
![recycle_GAN_img31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/3de91943-f9a7-87eb-28d1-d16f1e3a1fb9.png)

うまく再現できている。