ICCV2019 Best paper SinGANのできる事できない事[実践編]

#はじめに
本記事はCyberAgent20新卒エンジニア[Advent Calender2019](https://adventar.org/calendars/3976)の18日目のエントリです．
私は大学院でDeep learningを用いたComputer visionの研究をしている者です．
twitter → https://twitter.com/revi_matsu
今回は，先日開催されたICCV2019でBest paperを受賞した**SinGAN**実践編です．

#本記事の読み方のすヽめ
[ざっくりと概要を理解したい方]
本記事を読んでください。
[少し仕様を知りたい方]
本記事→["SinGAN"さらっと読んで簡単にまとめてみた](https://qiita.com/Vision_Matsu_Run/items/5f9a958cbaf93bc7b171)
[詳細まで知りたい方]
本記事→["SinGAN"さらっと読んで簡単にまとめてみた](https://qiita.com/Vision_Matsu_Run/items/5f9a958cbaf93bc7b171)→[論文](https://arxiv.org/pdf/1905.01164.pdf)


#SinGANとは
SinGANについての解説は以下の記事を参照してください．ここでは簡単に要点をまとめます．
[ICCV2019 Best Paper "SinGAN"さらっと読んで簡単にまとめてみた](https://qiita.com/Vision_Matsu_Run/items/5f9a958cbaf93bc7b171)

SinGANはGANベースのone-shot learningメソッドです．
何がすごいかというと**1枚の学習画像で様々なタスクに応用できる**という点です．
通常，GANに限らずにDeep learningの学習は非常に多くの学習画像を要します．しかしながら当然データ収集の難しさ等の理由により，少ない学習画像での実装は高い需要のテーマになっていますが当然簡単な問題ではありません．

SinGANではこれまで抽出することのできなかった特徴まで学習が可能になっています．
下図はRandom sampling(1枚の学習画像で学習し，似たようなサンプル画像をノイズから生成する)の例です．
従来法のPSGANやDeep Texture Synthesisでは学習画像の**テクスチャ(雰囲気)のみ**を保持し，画像生成されていますが，ビルや建物の形状情報は保持できていないことが分かります．対してSinGANは建物のようなものも再現していることが確認できます．

SinGANは高いレベルで他タスクにも応用可能で論文に非常に多くの実験が記載されています．
今回はその中から実際に著者の[github](https://github.com/tamarott/SinGAN)から実際に実験を行うことに加え，論文に載っていないタスクに応用した場合を踏まえた実践編を紹介できたらなと思います．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458845/7e222f8b-e428-c035-fa2c-106a01620d0c.png)

#実践編
コードは[こちら](https://github.com/tamarott/SinGAN)を使用しています．コードはpython3.6，フレームワークはpytorchを使用しています．
今回は以下の2つのタスクに応用してみました．
・Animation(論文に紹介あり)
・Semantic segmentation(論文に紹介なし)

##Animation
ここでは,1枚の画像からgifを生成します．
論文では雷の例が使われていましたが,今回は先日のAdventCalenderで同期がクリスマスを意識した記事を作成していたので乗っかりたいなあと笑.
・[@Dai7Igarashi, FramerMotionでクリスマスっぽいものを作る！](https://qiita.com/Dai7Igarashi/items/84d75d7464b554a7dcf3)
・[@airagu950, Lottieを使ったAndroidのアニメーション実装](https://qiita.com/airagu950/items/9042f22f7a517b6e165a)

ということで、<font color="Salmon">一枚の学習画像からクリスマスっぽいアニメーションを作成してみます.</font>
![snow4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458845/9bfc169a-abab-07d2-8ea0-2fdb3ef723fd.png)

学習画像

![alpha=0.100000_beta=0.900000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458845/3b83baca-90ac-3f9f-1b4b-d249888a0218.gif)

生成アニメーション

スタイルを維持しつつ,雪っぽいものをランダムに生成している様子が確認できます.ではもう少し、スタイルが維持できているかを確認できるサンプルを使ってみましょう.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458845/6792fe89-808c-8a9c-a59a-c833cefe70e8.png)
学習画像
![alpha=0.100000_beta=0.850000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458845/535b3d8b-cbc3-2cb0-128a-4b130e1f689d.gif)
生成アニメーション

**雪だるまが形状を保持していることが確認できます**.このように画像内で大きな特徴をもつ情報は特徴保持が高度に行われており,逆に雪のように小さな特徴量のようなものはRandom samplingした際に入力のランダムノイズにより
微小な変化が発生することを確認できます.(雪が降ってる様子とかうんぬんは気にしない．)
これってすごく面白いと思いませんか？？


##Semantic Segmentation
Semantic Segmentationは論文中では提案されていないタスクであり，このタスクをOne-shotで実現することは非常に困難であると考えられます．
その大きな理由として，Segmentationは1画素毎に決められたラベルを付与する手法が一般的な点と，車載カメラによる画像→segmentation画像の変換を学習するわけではないという点が挙げられます．
**SinGANは教師画像から特徴を抽出することに長けており，テスト時の入力となる画像のこの部分が〇〇である確率が高い！という学習を行っていません．**

とはいえ，今回はどれだけの特徴抽出(特徴保持という表現の方が適切な気がする)ができるかを確認してみたかったので，originalのSinGANをSemantic Segmentationに応用してみました．
簡単に説明すると**image to image**を直接当てはめます．今回は車載カメラデータセット及び細胞画像データセットを使用してみました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458845/c2452eaa-1e7c-9aad-0c43-03e506571844.png)



実際のsegmentation結果は下図のようになりました．
大方予想はついていましたが，やはりsegmentationのタスクへの直接的な応用は難しいようです．
しかし，細胞画像に関しては一部，細胞核を識別できている箇所などが確認できます．細胞画像のように画像全体の構成が画像ごとに変化しにくいデータでは，多少segmentationの可能性を示しているのかなと思います．

いずれにしろ，本記事では単純に既存のSinGANのモデルに無理やりSegmentationを落とし込んでいます．
今後の発展に期待ですね．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458845/37268f39-8d96-ee9a-5113-98521f8a0d93.png)

# おわりに
本記事はSinGAN実践編でした．originalのSinGANで出来るタスクは多くどれもレベルが高く，one-shot learningとは思えないものもありました．他タスクへの応用や発展は面白い研究分野のひとつになりそうで楽しみです．

また今回はCyberAgent20新卒エンジニア[Advent Calender2019](https://adventar.org/calendars/3976)に2020年卒のCyberAgentの内定者として記事を投稿させていただいていますが，実は,<font color="Red">CyberAgentでは21卒のエンジニア採用がスタートしています！！</font>
私はCyberAgentの入社自体は長期のインターンを経由して入社を決めていますが，CyberAgentは**様々なサービスや事業とその繋がり**がとても面白いと感じていました．そういった環境は自己成長にはとても良い場所であると感じています. 自分の技術を磨き会社にも貢献する，これってワクワクしませんか？私はそこにやりがいと自分の成長を期待して入社を決めました．
少しでも興味がある人は是非！　視野が大きく広がるチャンス！
https://www.cyberagent.co.jp/careers/special/engineer2021/?utm_source=twitter&utm_medium=sns&utm_campaign=social