取り急ぎpix2pixで遊んでみた(追記あり)

# 概要
* 先日発表された[pix2pix](https://github.com/phillipi/pix2pix "github")が楽しそうだったので実際に動かしてみた。
* 対象を絞れば学習画像が500枚程度でもそれなりに動く。
* 結論：GANすごい。

# はじめに
pix2pixとは、ざっくりと言えば、2画像間に潜む画像変換をDNNで表現してしまおう！というものです。変換前後の画像さえ用意できれば大体どんな変換でも対応可能らしく、例えば以下のようなことが可能らしいです。

* 航空写真 → 地図画像
* モノクロ画像 → カラー画像
* 線画 → カラー画像
* (上記すべて逆も可能)

何やら万能っぽい雰囲気！素晴らしいことにコードが公開されている（torchだけど）！しかも自前画像でも簡単に試せそう！
ということで試してみました。

# データ
flickrから収集したラーメン画像(1,000枚)を使用。多少のゴミは無視で。公式のソースコードに合わせて、各画像を中心でクロップ＆リサイズしておき、学習画像と評価画像は各500枚としました。
試した画像変換は「モノクロ画像 → カラー画像」です。
**追記：「線画 → カラー画像」も試しました。線画は元画像にblurやらcannyやらをかけて適当に作りました。**

# 実験条件
公式のソースコードそのままで変えていません。

# 結果
実行環境はUbuntu16.04＋GTX1060。買ってて良かったGPU。
評価結果の一部を以下に載せましたが、学習画像が500枚しかないことを考えると驚くべき結果が出ているように思います。

#### モノクロ画像 → カラー画像

| 入力 | 出力 | 正解 | 感想 |
|:---:|:---:|:---:|:---|
|![1_1_130549619_f67eb86411.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/d830356b-568f-592f-c2d5-7228be6018c6.jpeg)|![1_1_130549619_f67eb86411.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/e9767cf4-3ce3-0426-a4d3-e54339a99564.jpeg)|![1_1_130549619_f67eb86411.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/6622db22-6af6-b8a6-f7d6-ba5b1e38f90a.jpeg)|あまり違和感ない|
|![6_5541_11200931374_031cc1a615.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/4e44ddac-331e-a19d-ac0a-c132659d56f0.jpeg)|![6_5541_11200931374_031cc1a615.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/79c31fea-78ea-0541-2f1c-eb4d942e953f.jpeg)|![6_5541_11200931374_031cc1a615.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/580e1fbb-969e-b535-7175-813851f50aea.jpeg)|あまり違和感ない|
|![3_2249_2236609912_b14df4c866.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/3fbd559a-40f1-8ae7-9cd7-a0db3a1c31f3.jpeg)|![3_2249_2236609912_b14df4c866.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/2a1a5e65-cbe0-ff67-7b76-9cfb53f74635.jpeg)|![3_2249_2236609912_b14df4c866.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/2ccc1b9a-8433-2516-f59c-cca5dd8ddbab.jpeg)|肉味噌がネギ化している・・・|
|![8_7021_6769136483_ef08be1a44.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/6589dad7-b8ad-4198-3796-6776b71bd226.jpeg)|![8_7021_6769136483_ef08be1a44.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/d8b86d83-77fd-0bb9-cc19-652a34f7a8b1.jpeg)|![8_7021_6769136483_ef08be1a44.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/7511bafd-e418-2556-d2c2-8c5b06f30509.jpeg)|つけ麺もOK|
|![6_5513_11288220405_daa1102259.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/0258370c-a0c5-41fe-97ea-7b19db4a38de.jpeg)|![6_5513_11288220405_daa1102259.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/5f65b7d5-c17c-ac2f-8a74-1972e5ed320f.jpeg)|![6_5513_11288220405_daa1102259.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/cd21f59f-bf02-bbb0-b33d-ff8befdc4c3b.jpeg)|テーブルの木目調も頑張ってる|

#### **追記 ： 線画 → カラー画像**
明らかに無茶な問題設定ですね。やっぱりモノクロ画像のカラー化に比べると出来があまり良くないです。・・・でも、この入力画像からこの出力が出せているのは凄くないですか？（親心）
学習の経過を見ているとまだまだ学習できそうな印象です（DCGANの途中結果っぽい）。デフォルトだと200epoch回す設定なんですが、もう少し増やしてみても良かったかもしれません。

| 入力 | 出力 | 正解 | 感想 |
|:---:|:---:|:---:|:---|
|![1_1_130549619_f67eb86411.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/eb4c4440-e6e5-d62c-3952-b67a038d40a9.jpeg)|![1_1_130549619_f67eb86411.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/5a814f43-ea19-7e82-93fe-6837c3d3c27f.jpeg)|![1_1_130549619_f67eb86411.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/4ba847c2-4f85-2f57-75cc-e456d8d15887.jpeg)|海苔どこいった？|
|![3_2595_3741413135_d11c0303aa.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/3e0cb3a4-361c-09fb-b40f-bd0887af4db4.jpeg)|![3_2595_3741413135_d11c0303aa.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/1cb74ee3-171c-9275-e9e4-8674898946fc.jpeg)|![3_2595_3741413135_d11c0303aa.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/696c3a4a-f04c-3709-5720-874496fa65f6.jpeg)|正解画像とは違うけど結構自然っぽい？|
|![8_7314_12447330995_a6b17355f9.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/97af3617-9e3d-718b-63e6-a1c7f7e8db13.jpeg)|![8_7314_12447330995_a6b17355f9.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/87b640f7-0d6b-e0a5-ab43-45a4e3bd2b3e.jpeg)|![8_7314_12447330995_a6b17355f9.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/e8aaee5f-ae98-99af-05ef-442a4f3b2e78.jpeg)|幽体離脱・・・|
|![6_5568_14675666478_12b9a90dce.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/feaf9cad-c3d3-1448-1e87-28aee6918a95.jpeg)|![6_5568_14675666478_12b9a90dce.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/452db65f-980b-8ee4-e341-d0889f01f38d.jpeg)|![6_5568_14675666478_12b9a90dce.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/023c2655-7dfd-bf4d-d89b-e89c3d5d9811.jpeg)|こっちは麺がネギ化してる。ネギ麺。|
|![9_8529_8547928584_0e900a4e3a.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/9cf7f135-aa56-c1ac-5899-67b9439c1371.jpeg)|![9_8529_8547928584_0e900a4e3a.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/02a31783-6eeb-0fdb-5eec-03db91cd8f1d.jpeg)|![9_8529_8547928584_0e900a4e3a.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/68bdf1c0-f946-7f10-7b73-46955615dcbc.jpeg)|テーブルの情景を頑張って描こうとしているっぽい。けなげ。（親心）|

##### **さらに追記**
「結果が出来すぎてる。学習データ入れたんじゃね？」「500枚少なすぎじゃね？」というもっともな声を随所で見かけたので、コメント。

* TrainとTestはいちおう分けています。分けていますが、ラーメン画像にそもそもバリエーションが少ないので、よく似た画像は含まれていると思います。
 * 他の料理とか動物とかを混ぜると、この枚数では上手くいかないと思います。冒頭に「対象を絞れば」と書いたのは、そのためです。
 * 被写体の位置が変わるタイプの変換は苦手だと思います。単純に上下flipでも壊滅しそう。
 * ちなみに、公式サンプル（ラベル画像→建物）では、Trainはたった400枚です。
* 学習データ数が少なくてもそれなりに上手くいく理由は、ラーメン画像の多様性が少ないから、被写体の位置が変わらない変換をやっているから、入力が乱数ではなく画像だから、等々雑に考察しております。詳しい方がいらっしゃいましたらコメント頂きたいです。
* 参考までに、学習データの結果は↓です。「線画→カラー画像」は学習データの割にそんなに上手くいってないです（謎）。。

###### 学習データの結果
| 入力 | 出力 | 正解 | 感想 |
|:---:|:---:|:---:|:---|
|![1_6_7553134_29e2af632d.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/053c9c17-8a70-9464-5b07-87f349f9d430.jpeg)|![1_6_7553134_29e2af632d.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/4d9f97c9-67c3-5e37-3d7e-a9628c324509.jpeg)|![1_6_7553134_29e2af632d.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/a21852a5-4fd6-3be3-3cce-b1147f312391.jpeg)|やや赤みがかっているが、丸暗記の勢い。|
|![1_17_23517102_5de1772da3.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/b794742b-1d07-56de-4e76-8f1371462607.jpeg)|![1_17_23517102_5de1772da3.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/a2fd37db-2dd2-2383-286e-de2755fe0e22.jpeg)|![1_17_23517102_5de1772da3.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/ba4dba64-d999-ce7a-4f9b-68e5b82cebc9.jpeg)|丼の色を間違えているが、丸暗記の勢い。|
|![1_6_7553134_29e2af632d.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/268352be-a785-7e4b-8593-564718668ff0.jpeg)|![1_6_7553134_29e2af632d.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/1efd7515-279c-2db2-7ce8-85ac819d4910.jpeg)|![1_6_7553134_29e2af632d.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/81861cd4-b84b-0abb-9068-19539aec65d9.jpeg)|色味は丸暗記してそう。でも学習データの割にショボい。|
|![1_17_23517102_5de1772da3.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/b0e582ba-2bcb-87bf-9ce3-84707553b790.jpeg)|![1_17_23517102_5de1772da3.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/77db7eb0-1c5a-473f-0b02-9834dc713f01.jpeg)|![1_17_23517102_5de1772da3.jpg](https://qiita-image-store.s3.amazonaws.com/0/113462/211a03cd-deff-7420-8be2-7468d4e33b4a.jpeg)|色味は丸暗記してそう。でも学習デー（ｒｙ|


# おわりに
* 簡単・便利・楽しい。万能感ありますね。
* OpenImagesの画像をぶち込んでみたい。
* ~~論文をざっと見た感じあまり特別なことはしていないようなのでchainerとかで書いてみようかなぁ。でも誰かがやってそうだなぁ。~~
→[chainer実装](https://github.com/mattya/chainer-pix2pix)が公開されてました！感謝！これでもっと自由に遊べますね。
* 変換の種類を潜在変数的なアレで何やかんやすれば、複数の画像変換を同時に行うモデルも作れそう？
* MSCOCOのマスク画像を使って実験中です。面白い結果が出たら新たに投稿します。

__結論：GANすごい。__