TecoGAN 試してみた(私的備忘録・メモ帳) -(1)

## はじめに
はじめまして
現在、深層学習・画像処理を趣味でやっている学生です。最近巷で流行っている(いた?)TecoGANを試してみました。

※あくまで、私的な備忘録です。もし間違いなどありましたら、指摘して下さると幸いです。。

## TecoGANとは？
深層学習を利用した動画(ビデオ)超解像手法の一つ。
元論文 https://arxiv.org/pdf/1811.09393.pdf

GANを利用しているため、生成結果画像が人の知覚品質に近いものになるようです。
単眼(単一)超解像SRGANの動画版みたいです。

## 超解像とは？
そもそも超解像とは何か？としばしば聞かれることがあるのでここにて記載しておきます。

超解像とはその名の通り画像を高解像度化させる処理です。
高解像度とは、画質がいい、鮮明に見えるなどいろいろありますが、ここでは、画素数が大きい＋高周波成分を含んでいるという意味です。

|低解像度画像 81×54 px|超解像処理後の画像 810×540 px|
|---|---|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796105/4c250b27-6b33-9f8a-47a4-02df61906c25.png" width="810" height="540"px>|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796105/785933e7-53a6-cdbe-452b-20d2fb333a66.jpeg">|


この超解像ですが、いろいろな種類があります。
画像一枚を高解像度化する単一(単眼)超解像、動画を(各フレーム全て)高解像度化する動画(ビデオ)超解像など色々な種類・手法がありますが、今回のTecoGANは、深層学習を用いた後者のタイプになります。

## 環境構築
### PC環境
OS : Ubuntu 18.04
CPU: i7 
GPU: Geforce GTX1080ti
python 3.6

## 各種ライブラリの導入
https://github.com/thunil/TecoGAN
こちらがソースもとになります。
ソースもとの記載通りに、まず以下コマンドでtensorflownをインストールします。

~~~sh
pip3 install --ignore-installed --upgrade tensorflow-gpu
~~~
次に`requirements.txt`に記載されている各ライブラリのインストールを行います。

~~~sh
pip3 install -r requirements.txt
~~~


よしこれで実装できるぞ！と思ったのですが、上手く実行できませんでした・・・（笑）
それもそのはずで、ソースが公開されたのが2年くらい前で、`tensorflow-gpu`,`requirements.txt`とともに当時に合わせて、ver〇.〇.〇以上をインストールと記載されているからです。

しかし、現在(2020年/10月)において、それらをインストールすると、最新のものがインストールされ、結果として、ライブラリが最新バージョンだと仕様が変更されていたり、ライブラリ同士が噛み合わなかったりして、上手く実行できないようです。

なので参考までに以下にて自分が推論・評価・学習のすべてのモードにて実行可能であった`cuda`,`cudnn`,`tensorflow-gpu`,`requirements.txt`各ライブラリのバージョンの組み合わせを載せておきます。

`cuda`
cuda : v10.0
`cudnn`
cudnn : 7.4.1 
`tensorflow-gpu`
tensorflow-gpu==1.13.1

`requirements.txt`　
numpy==1.16.2
scipy==1.0.1
scikit-image==0.14.0
matplotlib==3.0.3
pandas==0.23.1
Keras==2.1.2
torch==1.2.0
torchvision==0.4.0
opencv-python==3.1.0.5
ipython==7.4.0

その他ライブラリ・まとめ
![Screenshot from 2020-09-29 15-58-43-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796105/9a8bd9f8-8fcd-4244-64ad-22fb42d061b5.png)

## TecoGAN実行
### 学習済みモデル(とサンプル用画像)のダウンロード
以下コマンドで学習済みモデルとサンプル用連番画像(Vid4など)の低解像度(LR)、高解像度(HR)のセットをダウンロードします。


~~~sh
python3 runGan.py 0
~~~

ダウンロード自体は、自分の環境においては数十分程かかった気がします。

### 推論モード
以下コマンドの実行でTecoGAN超解像の推論を実行できます。デフォルトでは、`LR`フォルダ中の`calendar`が入力となっています。

~~~sh
python3 runGan.py 1
~~~

結果

・calendar

|LR(Input) 180×144 px|TecoGAN(Output) 720×576 px|
|---|---|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796105/b313627b-8642-bdcb-c1a3-6a4cd09b5725.png" width="720" height="576"px>|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796105/9d62b198-cab6-c464-dcfc-f827bfccc780.png">|






### 評価モード
以下コマンドの実行で画像の定量評価が行えます。

~~~sh
python3 runGan.py 2
~~~

定量評価指標には、フレーム一枚を評価する空間評価指標とフレーム間のつながりを評価する時間評価指標の二種類、計5つあります。

|空間評価指標|時間評価指標|
|:--:|:--:|
|(ⅰ)PSNR (ⅱ)SSIM (ⅲ)LPIPS|(ⅳ)tOF (ⅴ)tLP|


LPIPSは、論文曰く、生成画像の多様性を評価する知覚的評価指標であり、値が低いほど知覚品質において良いとされているらしいです。

tOFは、これも論文曰く、正解フレーム間と生成フレーム間の各フレーム間の動き(optical flow)の類似度を評価するものらしいです。

tLPは、LPIPSにより、正解フレーム間と生成フレーム間の知覚的類似性を測定する？ものらしいです。(これだけいまいちピンときませんでした。)



##終わり
TecoGANは自分が想像していた以上に出来栄えがよく素晴らしいものだと感じました！

ですが、他の方がすでにご指摘されている通り、4倍拡大にしか対応していなく、他の倍率に変えることはできないのかなと思いました。
また、デフォルトの入力動画だと、動きが緩やかなものしかないですが、動きが速い動画の場合は、オプティカルフローを求める処理など上手く対応できているのかな。。。なんてことも疑問に思いました。

まあ何はともあれ、実装できてよかったです。
次回は、ネットワークの構造など理論的なことや学習モードについてまとめてみようと思います！