AIによる風景の†異世界変換†

# はじめに（†ホラー変換†）
| 変換前 | 変換後 |
|:-:|:-:|
| ![tenmonkan_A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/0ac59d9a-0351-d6ad-f465-cd90338e83e7.png)  | ![tenmonkan_B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/ba6bebc4-88c8-3f4b-5c97-6d1f36f5919a.png) |

おわかり、いただけたでしょうか。

こちらはGAN（敵対的生成ネットワーク）を活用し、写真に**「ホラー」**の特徴を与え、**変換**しています。

原理についてはひとまず置いておいて、まずはGANの可能性をご覧ください！

##季節変換、オーロラ変換、花火変換
| 変換前 | 変換後 |
|:-:|:-:|
| ![epoch100_real_A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/db646e75-2e42-27d6-f4a8-de970c61ca52.png)| ![epoch100_fake_B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/84849c69-0321-4eae-5159-c915e0b78610.png)|
| ![IMG_20161001_220428_real.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/4ebc0e91-f1d9-8804-d03a-cf77f299790d.png) | ![auroraB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/dadb3cce-95a5-afc4-7a0a-b61e82f71124.png)|
| ![epoch027_real_A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/d3e05a3a-0ea6-0dee-70bc-38062a6182c2.png)| ![epoch027_fake_B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/39f2ae88-5f53-c3de-faac-eb70c9b24fa9.png)|
|![IMG_20161001_220428_real.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/547f19e4-c250-f168-5703-ceab7c839f77.png)|![IMG_20161001_220428_fake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/1a5e6f98-6479-6a84-eb71-3bdbf2c2e45f.png)

これらは[CycleGAN](https://arxiv.org/abs/1703.10593)[1]を利用して「夏と春」「雲とオーロラ」「空と花火」などのペアで**特徴の入れ替え**を行っています。
ただ色彩を変えるわけでなく、言わば「画像の翻訳（変換）」のように原型を保ちながら変換が行われています。

CycleGANの原理について詳しく知りたい方は、[こちらの記事](https://qiita.com/itok_msi/items/b6b615bc28b1a720afd7)を参考にしてください。私も大変お世話になりました。

# 風景の†異世界変換†
今回、私はこの技術を写真の**「風景変換」**に……否！！

**「†異世界変換†」**に活用しました！！

4ヶ月に渡る奮闘と、その成果をご覧ください。

##†ファンタジー変換†
まずは†ファンタジー変換†です。
「風景（鹿児島）」と「ファンタジー・幻想的」のペアでデータセットを作成し学習しました。
やはり抽象的な表現は難しく、画像の選別に大変苦労しましたね。

| 変換前 | 変換後 |
|:-:|:-:|
| ![kagoshimaA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/b47c916f-4125-61e0-0952-7194e8684d2f.png)  | ![kagoshimaB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/bec5dff0-cf40-c149-102a-3dd132dbb167.png)  |
|  ![epoch100_real_A_real.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/74728cad-a278-6ecc-46c3-bd04a592a731.png) |  ![epoch100_real_A_fake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/68774729-3c30-b35c-7d6f-b3d935c92095.png)|
| ![BP19-113432D_real.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/41ddf8a5-79b3-22ec-ee97-f60c20ae4e83.png) | ![BP19-113432D_fake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/14dcefee-113a-ea29-bdfd-804b9d4a87c5.png)

出ました！
ただでさえ美しい鹿児島の風景が、更に**幻想的で神秘的**に！？
光の粒は「ただのノイズ」か……？
いやいやいや、私の目には**「妖精が飛んでいる」**ように見えますね。
全体的に**青色がとっても綺麗**です。

##†ホラー変換†
続いては、冒頭でもご紹介した†ホラー変換†です。

**※※※閲覧注意※※※**ですよ。

| 変換前 | 変換後 |
|:-:|:-:|
| ![tenmonkan_A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/0ac59d9a-0351-d6ad-f465-cd90338e83e7.png)  | ![tenmonkan_B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/ba6bebc4-88c8-3f4b-5c97-6d1f36f5919a.png) |
| ![epoch111_real_a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/063e2270-ee9c-3372-a17f-2db8638286e2.png) | ![epoch111_fake_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/6b500189-1208-1b74-499e-281d5a1f47dd.png) |
| ![epoch171_real_a_360.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/8878e477-f7d4-d206-1553-9493c5f7f7d2.png) | ![epoch171_real_a_360_fake (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/0393995a-281a-4f5f-9a33-6757cc6a097b.png)

ご覧下さいこの街並みを……！！
**貴方に足を踏み入れる勇気はありますか？**
このままホラーゲームのテクスチャとして使いたいほどです。

こちらは「街並み」と「ホラー映像」のペアでデータセットを作成し学習しました。
もっと言うと「SIREN」「サイレントヒル」のプレイ画面を学習AIに見せ続けました。
全体的に街並みが**赤黒い**理由がこれです（何枚か試してみましたが川は赤くなりませんでした。残念）。

##†海底都市変換†
続いて、†海底都市-Atlantis-変換†です。
**『「風景」に「水中」の特徴を混ぜたら「海底都市」になるのでは？』**
という安直な発想からデータセットを作成し学習しました。

| 変換前 | 変換後 |
|:-:|:-:|
| ![atlantisA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/a0862fe2-e8be-bae6-9784-331c74ab9182.png) | ![atlantisB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/084b4f20-2084-dd30-72cc-6ca6359ad093.png) |
| ![epoch126_real_A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/4eb55a79-b087-4523-5d3a-c140938a50a0.png) | ![epoch126_fake_B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/5df6ec34-ed27-97d3-1d1d-f6905099fd00.png) |
| ![kutsu_180523sogi02_real.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/ae429a8a-e0ba-df56-0275-0e23e5aca1c3.png) | ![kutsu_180523sogi02_fake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/67dcfbb1-4814-35d6-39ba-1f13843fcd96.png)

見事ですね……！
**竜宮城の入り口**……とでも言えましょうか？
後ろの木もまるでサンゴ礁のようですね。
**水の神よ……感謝。**
†海底都市-Atlantis-変換†では「ただの海中」画像だけでなく「ダイビング」画像からも集めたことから、
優秀なデータセットを作ることができました。


##†氷山変換†
つい先日、アナ雪2のスペシャル企画で「富士山や桜島を氷漬けにする」キャンペーンがありました。
**GANで同様のことを行うと、どうなるでしょうか？**
「桜島」と「氷山」のペアでデータセットを作成し学習しました！

| 変換前 | 変換後 |
|:-:|:-:|
| ![epoch055_real_A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/bcfa3d3e-8428-3c01-d4aa-0590486bb25f.png) | ![epoch055_fake_B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/1962ad2c-41dd-effd-3dc1-e8160c95a3a2.png)|
| ![epoch085_real_A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/a897c4ce-7a98-2783-ca86-d2c560e71893.png)| ![epoch085_fake_B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/2f3030c5-babb-8fb8-a3b2-6b8eed6772b7.png)|
| ![epoch086_real_A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/6513d49a-4497-c183-5222-a423d30727fc.png)| ![epoch086_fake_B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247671/7403f527-f788-f2aa-9d0b-b6f5b58f3e4f.png)

**いや、やりすぎでしょ。**
ウキウキで変換結果見に行った時、一面氷河期になってて怖すぎて泣いちゃいました。

これがAIの反逆か……？
もっと丁寧にデータセットを作成し山の形を学習すれば、ここまで恐ろしい結果にはならなかったかもしれません。
**†氷河期変換†**と開き直れば見事この上ない完成度です。

# 学習方法について


## 学習データセット用の画像収集
CycleGANは**教師なし学習**です。ラベル付け等は必要ありません。
背景や構図がバラバラでも、数さえ揃えば上手く学習できるのがCycleGANのすごいところです。
今回の変換では**それぞれ1000枚**を目処に画像を収集し、データセットを作成しています。
普段の街並み1000枚を「trainA」、異世界の街並み1000枚を「trainB」といった形です。

そうは言っても**異世界の住民**ではないので、カメラの中に**異世界の写真**は1000枚もありません……。

そこで、私は主に下記2つの手法で学習用データセットを作成しました。

### ①グーグル画像検索で画像を集める
pythonのライブラリ「icrawler」が便利です。
詳しくは[こちらの記事](https://qiita.com/tkt989/items/84c6581dfa1d9a42dc2d)をご覧ください。大変お世話になりました。

「オーロラ」等のキーワードで画像を検索し、データセットを作成しました。

---
### ②動画を撮ってフレーム単位で画像を切り出す
①の手法では検索ワードによってはノイズデータが混ざりすぎて、学習用画像の選別が大変困難になってしまいます。
こんな時はOpenCV等でスタイル変換のイメージとなる動画をフレーム単位で画像化してあげると楽です。
詳しくは[こちらの記事](https://qiita.com/sayo0/items/3f9a1a42bd5caadd2c0d)をご覧ください。大変お世話になりました。

例えば「ホラー変換」では、私がホラーゲームで一番怖かったシーンを合計30分ほど録画して、1000枚を目処に画像を切り出しました。

## CycleGANで学習
いよいよCycleGANで学習です。
自身のPCでぶん回すのも良いのですが、**Google Colabratory**がすごいです。
Jupyter Notebookをクラウドで使えるようなサービスです。
詳しくは[こちらの記事](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)をご覧ください。大変お世話になりました。

ざっくり説明すると**無料でGPUを貸してくれる**クラウドIDEです。すごい。
運が良ければTesla P100（約90万円のGPU）も無料でお借りできちゃいます。すごい。
クラウドIDEなので場所や自身のマシンスペックに左右されません。バックグラウンドで学習し放題です。すごい。
快適すぎてGoogleドライブに課金しちゃいました。アイラブグーグル。

### ソースコード
https://colab.research.google.com/drive/1KmwC-eOU3Z02ZiCmgFv-rDG4HxzK-8zG
↑こちらが私が実際に**†異世界変換†**の学習に使っていたノートです。
[Pytorch版のCycleGAN](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix)[2]をGoogle Colabratory上に実装しています。
まだまだ知識があやふやですが、自分へのメモがてら解説を挟んでいるので参考になれば幸いです！
まずはサンプルの定番の「ウマ→シマウマ」のスタイル変換から是非。

# Webアプリ公開
近いうちゴリゴリ書きます
ngrokってすごいのよ！

# 参考文献
[1]Jun-Yan Zhu, Taesung Park, Phillip Isola, Alexei A. Efros, Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks, arXiv preprint arxiv:1703.10593, 2017.

[2]@inproceedings{CycleGAN2017,
  title={Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networkss},
  author={Zhu, Jun-Yan and Park, Taesung and Isola, Phillip and Efros, Alexei A},
  booktitle={Computer Vision (ICCV), 2017 IEEE International Conference on},
  year={2017}
}
@inproceedings{isola2017image,
  title={Image-to-Image Translation with Conditional Adversarial Networks},
  author={Isola, Phillip and Zhu, Jun-Yan and Zhou, Tinghui and Efros, Alexei A},
  booktitle={Computer Vision and Pattern Recognition (CVPR), 2017 IEEE Conference on},
  year={2017}
}