Predicting Future Frames using Retrospective Cycle GAN

# Predicting Future Frames using Retrospective Cycle GAN
サーベイ2本目  
論文リンクは，以下
http://openaccess.thecvf.com/content_CVPR_2019/papers/Kwon_Predicting_Future_Frames_Using_Retrospective_Cycle_GAN_CVPR_2019_paper.pdf

# 概要
本論文では，CycleGANを利用して，学習は，
数フレームの入力に対して，そのフレームの過去/未来の予測を行うことで実行し，推論では学習したGeneratorを利用して将来のフレームを予測する．  
>We experimentally verify that this forward-backward compatible prediction yields better prediction performance`  

・Generatorが未来/過去予測できるようにする    
・予測された画像がRealisticなら，予測画像をinputにしても正しく過去フレームを再現できる．  
これらの特徴が，将来予測の精度をあげる．かつ，複数のframeの予測も行えるようになる

# モデル
モデルの概略図は，以下  
用いるmoduleは，Generator1つと，Discriminator2つ．  
そして，  
・過去のSequenceから未来のframeを予測するForaward prediction  
・未来のSequenceから過去のframeを予測するBackward prediction  
・生成された画像を組み込んだSequenceと正解SequenceをDiscriminatorに入力する Sequence discriminator  
・学習済みのGeneratorを用いて，未来のframeを予測するForward prediction  
4つの学習(検証)phaseによって成り立っている．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/9bfe8bcd-4ae5-049d-f8a6-ff13733a1473.png)


### ルール
・以下では，m>n  
・アポストロフィ  
  １個:real_sequenceから生成された予測画像  
  ２個:上記の予測画像を入れたSequenceから予測された画像
## Forward Prediction
1. m-nフレームを入力し，n+1フレーム(①)の予測を行う．
2. 得られた①と正解n+1をDiscriminatorへ
3. m+1-nフレームに①を加えて，予測画像込みのn+1-m+1フレーム(②)を作成
4. ②をGeneratorに通してmフレーム(③)の予測を行う(逆時系列)
5. 得られた③と正解mをDiscriminatorへ

## Backward Prediction
手順としては，Fowardの逆．  
最初に，過去フレームの予測を行い，その予測値を踏まえた入力から未来フレームの予測を行う．  
それぞれに対して，Discriminatorで損失関数を計算する．

## Sequence Discriminator
ここでは，Forward Prediction と Backward Prediction，それぞれから得られた4sequences+正解のSequenceをinputとしたDiscriminatorを実装する．
  
それぞれ，予測された画像と正解を識別するDiscriminatorと，生成されたSequenceと正解Sequenceを入力にするDiscriminatorにより，Generatorは，高精度な過去/未来フレームの予測を可能としている． 

# 損失関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/974a0d12-e70f-1376-1140-e554d4f54e2a.png)

  
再構成誤差2つと，adversarial loss 2つから成り立っている．
λは，非零のバランス係数  

## Reconstruction Losses
**上記の誤差関数の一項目は，以下で定義される．**  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/526ab0a8-fe85-ae88-1a7f-b6c2d10059ec.png)
 
LossはL1Lossで，lossの和は，以下の画像ペアで行う．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/6590049a-991e-7755-da5f-b3993ee68e54.png)
 
  
以上のペアの理由として，  
1つ目 : foward/backward　の予測誤差を小さくするため  
2つ目 : retrospective error  
3つ目 : それぞれ，forward/backwardで生成された同frameの画像なので，これを小さくすることで，cyclicになる．  
  

  
**2項目の誤差は以下のように定義される．**  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/d40be495-0d0a-3f3c-49b2-88c0d880cee3.png)

  
こちらでは，1項目で利用したpairと同じ画像を，Laplacian of Gaussian Filterに通して同じくL1Lossを計算している．  
Laplacian of Gaussian（LoG）filterでは，  
ラプラシアンフィルタで画像を平滑化した後，ガウシアンフィルタを通して，エッジを抽出する．  
**ラプラシアンフィルタは二次微分を適用する為，ノイズが強調されやすい．**  
その為，先にガウシアンフィルタを通して平滑化することでその効果を抑制している．
  
ノイズを除去した上で，画像内のエッジの情報を保存するために，以上の損失関数が計算される．



## Adversarial Looses
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/dae654ed-3bf5-5024-33fe-1bb09a0e85f3.png)

  
ここで，引数の1個目となっている，Sequenceは，GroundTruthSequence以外の，予測された,
Sequence Discriminatorへの入力4pattern．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/7d647c8c-dece-f03a-8f3a-a6ac3ada3de1.png)

各Lossは上記の式で導出されており，GがDを騙すように，DはGに騙されないようにする，GAN本来の損失関数である．  

# 実験について
今後追記
# まとめ
個人的に，敵対的生成ネットワークが好きだというのもあるが，興味深い．  
人の動きに注視するのなら，画像でなくても，BBoxやopticalflow /openposeなどでえた情報をinputにして，未来の行動を予測することはできるのでは？