CycleGANで漫画をカラーにしてみる～ゆゆ式を例に～

#1. はじめに
本記事は、[ゆゆ式AdventCalender2018](https://adventar.org/calendars/3137"ゆゆ式AdventCalender2018")の最終日の記事です。
 
今日はクリスマスということで街は色付いています。
色付くと言えば、皆さんは週刊雑誌の巻頭カラーやセンターカラーが、何故単行本に収録されるときには白黒になってしまうのか疑問におもったことはありませんか？(←~~強引すぎる話の持っていき方~~) 
おそらく印刷の問題とかなのでしょうが、せっかくならカラーで読みたい！
 
**そこでこの記事では、CycleGAN[^1]を用いて白黒漫画をカラーにすることを目標としています。**

#2. CycleGANとは
CycleGANは、2つの画像群を学習することで、相互に変換する関数を得ます。この変換によって生成された画像が判別機を騙せる様に、かつ以下の図においてAからBに変換した画像をもう一度BからAに変換した時に元画像に戻る様に学習していく学習器になります。

つまり、白黒画像とカラー画像を学習させれば、白黒画像からカラー画像を得る関数を得ることができる、ということになります。(逆も然り)
![CycleGAN_1.png](https://qiita-image-store.s3.amazonaws.com/0/304057/bf175dde-46aa-97c8-53ce-f5a0f0d191b7.png)

pix2pixと似ていますが、2つの画像群には複数の画像を用意すればよく、それぞれが1対1に対応している必要はありません。
使用している損失関数の都合上、CycleGANはテクスチャ変更が得意な一方で、形状変化は苦手とするようです。[元論文](https://arxiv.org/pdf/1703.10593.pdf)での実験結果はこんな感じ。
![CycleGAN.png](https://qiita-image-store.s3.amazonaws.com/0/304057/f107dc88-dc68-43a8-fcc0-d99b03040a0b.png)

ここでは概要のみ説明しました。
CycleGANの詳しい説明は
[PyTorch(15)CycleGAN(horse2zebra) - 人工知能に関する断創録](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=2ahUKEwiauYXH28TeAhUBwrwKHdU4DfMQFjABegQIBRAB&url=http%3A%2F%2Faidiary.hatenablog.com%2Fentry%2F20180324%2F1521896184&usg=AOvVaw1iL-mFjTEP6e31Qk7qACCE "PyTorch(15)CycleGAN(horse2zebra) - 人工知能に関する断創録")
をご参照ください。

#3. ゆゆ式とは
ゆゆ式はまんがタイムきららにて連載中の漫画で、2013年にはテレビアニメ化されました。今年は連載開始から10周年の年に当たります。おめでたい。
![yuyu_0.png](https://qiita-image-store.s3.amazonaws.com/0/304057/149a2942-1a01-7727-7239-31e6ff15d14a.png)
[公式サイト](http://www.yuyushiki.net "TVアニメ「ゆゆ式」公式サイト")より引用


>私はそれについて尋ねられなければゆゆ式が何か知っている。尋ねられればそれを知らない。
>by ~~変な人~~

#4. 実装＆学習
###動作環境
今回は動作環境として、Googleの[Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja "Colaboratory")を利用しました。Colaboratoryはオンラインで動作するJupyter Notebook環境で、無料でGPUを使用することができます。(時間制限有り)

実装はCycleGANをTensorFlowで実装している[こちら](https://github.com/xhujoy/CycleGAN-tensorflow)を参考にしました。
全てのpythonファイルの中身をJupyter Notebookに移して、それぞれのファイルのimport文をコメントアウトすれば動きますが、実行の順番に注意してください。
utils -> ops -> module -> model -> main の順です。

1つ注意点として、Jupyter Notebookでは

```python:main.py
args = parser.parse_args()
```

でエラーとなってしまうので、[こちらの記事](https://qiita.com/LittleWat/items/6e56857e1f97c842b261 "普通のpython実行ファイル(argparseを含むファイル)をJupyter notebookで実行するときのメモ書き")を参考にソースコードを以下のように変更する必要があります。

```python:main.py
#以下をコメントアウト
#parser = argparse.ArgumentParser(description='')
#途中略
#args = parser.parse_args()

#以下を追加
!pip install easydict
import easydict
args = easydict.EasyDict({
       'dataset_dir': 'yuyu',
       'epoch': 200,
       'epoch_step': 100,
       'batch_size': 1,
       'train_size': 1e8,
       'load_size': 143, #デフォルトでは286
       'fine_size': 128, #デフォルトでは256
       'ngf': 64,
       'ndf': 64,
       'input_nc': 3,
       'output_nc': 3,
       'lr': 0.0002,
       'beta1': 0.5,
       'which_direction': 'AtoB', #逆変換はBtoA
       'phase': 'train', #テストの際には'test'
       'save_freq': 1000,
       'print_freq': 100,
       'continue_train': False,
       'checkpoint_dir': './checkpoint',
       'sample_dir': './sample',
       'test_dir': './test',
       'L1_lambda': 10.0,
       'use_resnet': True,
       'use_lsgan': True,
       'max_size': 50
})
#続く
```

###データセット
ゆゆ式の単行本[^2]から、それぞれ50枚の白黒のコマ画像とカラーのコマ画像を取得し学習用に用います。今回は、情報処理部の3人(ゆずこ、唯、縁)についてのみ学習させます。データセットとしては心許ない枚数ではありますが、リソースの制約上とりあえずこれで学習してみます。またそれ以外に色を付けたい(or色を消したいコマ)をテスト用として取得します。それらを以下のような階層構造となるようにカレントディレクトリ直下に配置します。

```
└─ datasets
    └─ yuyu
        ├─ trainA  #学習用の白黒のコマ
        ├─ trainB  #学習用のカラーのコマ
        ├─ testA  #テスト用の白黒のコマ
        └─ testB  #テスト用のカラーのコマ
```



ここまで来たら準備は終わりで、いよいよ学習です。
main.pyの内容を実行すると学習が始まります。

またこの実装において画像サイズは256×256ですが、学習時間の短縮の為128×128に変更して学習を行いました。

#5. 結果
今回は、学習epoch数を200/500/1000と変えて実行してみました。

まずは200epochsの学習結果からです。
元画像/出力画像の順に並べています。
###200epochs(学習時間：約1.3時間)
![yuyu_1.png](https://qiita-image-store.s3.amazonaws.com/0/304057/0fb620dd-779f-536d-91a1-96048f1dbeb0.png)![yuyu_2.png](https://qiita-image-store.s3.amazonaws.com/0/304057/7c77f059-aaa6-9544-6fc3-3a9f6d268cb3.png)
3人のサンタコスを赤色に塗ってくれているのは偶々でしょうか。。訓練データにサンタ服は無かったはずなんですが、、
髪の色もちゃんと塗り分けられている感じ。

次に500epochs。

###500epochs(学習時間：約3.3時間)
![yuyu_3.png](https://qiita-image-store.s3.amazonaws.com/0/304057/d95b00ef-41fb-6e32-9cbd-b309692bd04f.png)![yuyu_4.png](https://qiita-image-store.s3.amazonaws.com/0/304057/25aeb981-6cb4-ac8b-731a-a10ba7435e11.png)
色は鮮やかになったけど、文字がぼやけている。

![yuyu_5.png](https://qiita-image-store.s3.amazonaws.com/0/304057/514a6750-8286-6369-af39-fac1ba454789.png)![yuyu_6.png](https://qiita-image-store.s3.amazonaws.com/0/304057/da20ff48-e119-d21d-e85f-1c7486a533f3.png)
半分(ゆ)ずっこ。

最後に1000epochs。

###1000epochs(学習時間：約7時間)
![yuyu_7.png](https://qiita-image-store.s3.amazonaws.com/0/304057/c1cbf52c-1b2e-0191-f0e5-1f004b97ac33.png)![yuyu_8.png](https://qiita-image-store.s3.amazonaws.com/0/304057/4d76fa57-bbbf-9f3f-2de7-f453ed7a3466.png)
背景の塗り分けが面白い。

![yuyu_9.png](https://qiita-image-store.s3.amazonaws.com/0/304057/1f8a6663-8926-2d98-712c-6644e3c3d8d1.png)![yuyu_10.png](https://qiita-image-store.s3.amazonaws.com/0/304057/2b5a6419-de82-194a-4450-63ada933251a.png)![yuyu_11.png](https://qiita-image-store.s3.amazonaws.com/0/304057/a9925a7d-0601-5843-3e84-4b8873848a17.png)
文字もちゃんと復元できている。背景の違う2パターン。

![yuyu_12.png](https://qiita-image-store.s3.amazonaws.com/0/304057/a9b76103-f3c2-6d17-82ee-6ca53f64c6f3.png)![yuyu_13.png](https://qiita-image-store.s3.amazonaws.com/0/304057/1903c60f-760b-07fb-5c7f-751418bf092c.png)![yuyu_14.png](https://qiita-image-store.s3.amazonaws.com/0/304057/2923aed3-a51e-6aed-a798-3e21e7ad99ed.png)
学習データに入れていない、あいちゃん・ふみおかもいい感じに塗れてる？


####おまけ
![yuyu_15.png](https://qiita-image-store.s3.amazonaws.com/0/304057/26f20647-0fe3-6ba7-00eb-c6c7522d441e.png)![yuyu_16.png](https://qiita-image-store.s3.amazonaws.com/0/304057/d71c54d2-158e-a570-15ad-060d0151b594.png)![yuyu_17.png](https://qiita-image-store.s3.amazonaws.com/0/304057/bd25434c-9d80-b8ae-4e40-480559fdfd44.png)

細かいパーツの塗り分けもできているように思われる。





#6. おわりに
今回はCycleGANを使って、白黒漫画に色付けを行いました。その結果、1000epochsも学習させるとそれなりに正しく色を塗れているように感じました。また、少ない枚数の画像セットでもそれなりに学習できることに驚きました。これからもGANの発展とゆゆ式から目が離せません。

ゆゆ式AdventCalender2018に参加した皆さん、お疲れ様でした。
それでは、メリークリスマス＆良いお年を！

#参考文献
[^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]: 「ゆゆ式 第1~9巻」 三上小又 芳文社