SinGANで食べ物を動かしてみた

# はじめに
[物工/計数 Advent Calendar 2019](https://adventar.org/calendars/4128)の空き枠にお邪魔させていただきました.

最近, 「SinGAN」でいろいろと遊んでいたので, その結果を雑にまとめてみようと思います. 
SinGANは, ICCV 2019でベストペーパーに選ばれたことで話題になった論文です. 
たった1枚の画像で学習して, 同じ特徴を持った任意のサイズの画像を生成するほか, こんなこともできる優れものです. 
![Screenshot from 2019-12-24 18-23-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/a1f0fc61-418a-ade5-e41c-e28c17c7c84c.png)

論文: https://arxiv.org/abs/1905.01164
コード: https://github.com/tamarott/SinGAN
動画: https://youtu.be/xk8bWLZk4DU

しかも, **画像1枚・GPU1台で手軽に試せる**ところも嬉しいポイントです. GPU1台だと, 私の環境では毎回の学習に数時間かかりました. 

論文の内容については, ~~早く修論を書かなければならないので~~既に他に解説してくださっている方がいるので, ここでは割愛します. 
Qiitaだけでも数件見つかりました. 

- [【SinGAN】たった１枚の画像から多様な画像生成タスクが可能に](https://qiita.com/kuto/items/ff2a30ca939ffdcd3cc1)
- [【論文解説】SinGAN: Learning a Generative Model from a Single Natural Image](https://qiita.com/takoroy/items/27f918a2fe54954b29d6)
- [ICCV2019 Best Paper "SinGAN"さらっと読んで簡単にまとめてみた](https://qiita.com/Vision_Matsu_Run/items/5f9a958cbaf93bc7b171)

さて, 本記事では, SinGANの[README](https://github.com/tamarott/SinGAN)にしたがっていろいろな機能（主にAnimation）を試してみます. 再現したい方はレポジトリをクローンしておいてください. 

なお, SinGANで遊んでみた結果は適宜[#SinGAN](https://twitter.com/hashtag/SinGAN?src=hashtag_click)で細々とツイートしています. みなさんもぜひ. 

# Animation
静止画から動画を作るのは, こちらのコマンドで一発です. 

```
$ python animation.py --input_name <input_file_name> 
```

## ラーメン
まずは定番のラーメンから. 
こちらの美味しそうなラーメンが…
<img width="188" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/478582a3-7355-d6f1-f438-04e1ec6f5291.jpeg">
この通り. 活きが良くて美味しそうですね！
![alpha=0.100000_beta=0.850000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/5de6a874-84b1-edcc-9847-f9861c45e245.gif)

二郎系のラーメンはどうなるでしょうか？
こちらの冷やし中華が…
<img width="188" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/7f549167-41c5-de0f-1b07-9872d54351c8.jpeg">
この通り. 活きが良くて美味しそうですね！
![alpha=0.100000_beta=0.900000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/7c241aa3-6446-c79f-b17d-367ee540d741.gif)

## ピザ
こちらのピザが…
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/59e11287-c2b7-f4f5-55fb-49a8425cfd92.jpeg">
この通り. できたての熱々ですね！
![alpha=0.100000_beta=0.950000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/590212c2-c634-f53f-f3ee-a99b05273446.gif)

## 海鮮丼
こちらの海鮮丼が…
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/eec595cf-6235-5bc2-0ca7-8edee687a40d.png">
この通り. 新鮮ですね！
![alpha=0.100000_beta=0.950000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/080fbacf-5e30-72e7-95d5-6f1a1fc7a013.gif)

## ラテアート
こちらのカフェラテが…
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/c57b2131-b07d-becb-70a3-f39ebaaed05d.jpeg">
この通り. 活きが良くて美味しそうですね！
![alpha=0.100000_beta=0.850000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/36a9ec11-d62f-f072-d1a3-7ebf84970974.gif)

## 『叫び』
Munchの『叫び』が…
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/8b44da3f-19a4-ea6b-cbff-2f9fed5b5bcc.jpeg">
この通り. 自我が崩壊していますね！
![alpha=0.100000_beta=0.850000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/c9787736-c583-8a16-6b7c-6e74122bf842.gif)

## 青の洞窟（渋谷の方）
渋谷のイルミネーションが…
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/9e7e284c-9c99-fd1d-0038-3570be5d1962.jpeg">
この通り. これが最も正しい使い方だった気がします. 
![alpha=0.100000_beta=0.900000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/0b756f41-0f9a-1357-b1ca-2830a6e39173.gif)

# Harmonization
コラージュを自然にするには, まずモデルの学習が必要です. 背景となる画像を指定してください. 

```
$ python main_train.py --input_name <input_file_name>
```

2つめのコマンドで, 切り貼りした画像とマスク画像を指定してharmonizeします. こちらはすぐに完了します. 

```
$ python harmonization.py --input_name <training_image_file_name> --ref_name <naively_pasted_reference_image_file_name> --harmonization_start_scale <scale to inject>
```

マスク画像の作成にはこちらを参考にしました. 
[Gimpで特定領域の白黒マスク画像を作成する – Urusu Lambda Web](https://urusulambda.wordpress.com/2018/07/23/gimp%E3%81%A7%E7%89%B9%E5%AE%9A%E9%A0%98%E5%9F%9F%E3%81%AE%E7%99%BD%E9%BB%92%E3%83%9E%E3%82%B9%E3%82%AF%E7%94%BB%E5%83%8F%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/)

さて, 今回はMonetの『睡蓮』にサンタクロースを合成したいと思います. こちらの切り貼りした画像が…
![lilly_naive.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/a7611454-3d2e-3637-ff2f-54ac1c208c93.jpeg)
このようになりました. 小さくて見えづらいですね. 
![lilly_santa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/c92382f8-00cc-c5cc-d94f-61dea1d9ad96.png)

# Super Resolution
SinGANは超解像もできるので, 先ほどの画像を大きくしてみましょう. 
こちらのコマンドで一発です. 何も指定しないと縦横が4倍になります. 

```
$ python SR.py --input_name <LR_image_file_name>
```

![lilly_santa_HR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/9f61c563-8c1b-28e9-2a9e-4a1caeae60e0.png)

メリークリスマス！よいお年を！

# おまけ
HarmonizationとSRで有名絵画とポケモンをコラボレーションさせてみました.

伊藤若冲とホウオウ.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/759f6c4f-25b3-b609-180f-7d3b8f7f1779.png)

Turnerとルギア.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/b803ec43-2858-ee39-ff1b-02480cc02355.png)

どちらもイマイチな出来ですね. まだHarmonizationのコツがよくわかっていません.