モルカーをCycleGANで現実の車っぽくしてみた

PUI PUI モルカー
---------
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403868/b3ee9b93-a652-4490-bdaf-262cc9b6e825.png)

毎週火曜に数分のショートアニメが放送されている”PUI PUI モルカー”．

パペットキャラ・アニメとして，愛らしいモルモットの姿をした車『モルカー』の愛嬌~~と，その裏に存在する人間の愚かさ~~を見事に表現した作品です．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">2月14日は <a href="https://twitter.com/hashtag/%E3%83%90%E3%83%AC%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%B3%E3%83%87%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#バレンタインデー</a> 💞<br><br>チョコ🍫ポテト🥔シロモ🥬のバレンタインカードをプレゼント！<br><br>チョコレートに沿えるもよし、メッセージを書き込むもよし。ぜひ、週末のバレンタインにご活用ください💌<br> <a href="https://twitter.com/hashtag/%E3%83%A2%E3%83%AB%E3%82%AB%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#モルカー</a> <a href="https://t.co/qXMjUs90Oa">pic.twitter.com/qXMjUs90Oa</a></p>&mdash; PUI PUI モルカー【公式】 (@molcar_anime) <a href="https://twitter.com/molcar_anime/status/1360061063144865792?ref_src=twsrc%5Etfw">February 12, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


今回，このモルカーと現実の車の画風を入れ替えるとおもしろそうなのでは？と思ったのと，またちょうど試してみたいGANもあったので実験してみました．
CycleGAN
---------
今回使用したのは**CycleGAN**です．
このGANは，ある入力領域（ソースドメイン）$X$から別の領域（ターゲットドメイン）$Y$に画像の変換を行います．
![teaser.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403868/e3de4958-565f-f0a9-a80d-8817c14e1ee9.jpeg)
<details><summary>ICCV 2017
["Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks"](https://arxiv.org/abs/1703.10593)
Jun-Yan Zhu, Taesung Park, Phillip Isola, Alexei A. Efros 
Berkeley AI Research (BAIR) laboratory, UC Berkeley </summary>

図のように，シマウマの画像をウマに変換したり，モネの絵を実写風に変換したり，その逆変換だったり...と，『画像特有の特徴』を学習し，自動的に変換を行います．

そもそもGANとは？ですが，簡潔に述べると2つの学習モデルがお互いに競い合いながら学習を進めあう，**敵対的生成ネットワーク（Generative Adversarial Networks）**と呼ばれるニューラルネットワークの一種です．
詳しい説明は省かせていただきます．ググったらわんさか記事が出てくるのでお許しください．

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403868/808c5788-6d1e-c0a5-a03d-177ba1a6acc2.png)
上図のように，入力された画像を別の領域に変換するGenerater(図ではG)と，入力された画像がGeneraterが生成した画像か，本当の学習用データかを分類するDiscriminator（図ではD）とが，お互いの出力，評価を基準に学習を進めていく構造となっています．

では,どのように画像の特徴だけをとらえきれるのか？には通常のGANには存在しない三つの評価基準が存在するためです．初学者向けに数式をあまり使わずにシンプルに説明しますが，詳しくは本論文や他の記事を参照してみてください．

###評価関数
CycleGANは，3つの損失関数をもち，この損失関数を減らす方向に学習を進めていきます．

1つが**妥当性損失(validity)**.これは通常のGANにもあるように，Generatorが生成した画像がどれくらいDiscriminatorを欺いたか？によって定義されます．

次に**復元性損失(reconstruction)**.これは領域Aから領域Bに変換するGenerator($G_{AB}$)と，それとは逆方向に変換するGenerator($G_{BA}$)を順に適用したとき，どれくらい元の画像に近づくか，によって定義されます．$A$➡$B$➡$A$となるため元の画像の特徴に戻るのは当たり前ですよね．

最後に**同一性損失(identity)**.これは領域Aの画像をGenerator $G_{BA}$に適用したとき，画像がどれだけ変化しないか？によって定義されます．
余談ですが，同一性損失これがなくてもCycleGAN自体は作用するよ～と書いてる記事を多く散見するんですが，これがあるとないとでは生成される画像の質が全然違います．これがないとリンゴとミカン変換するモデルで葉っぱが赤，オレンジ色に変わったりします．



これらの損失関数をもとに，画像の領域変換を行っています．数式で説明してくれ～って方は[こちらの記事](https://qiita.com/merry1221/items/5ea0d809540248b04042)を参考にしてみてください．

準備
------
データセットを集めます．今回は車とモルカーの変換ですので，車の画像とモルカーの画像を集めます．

###車画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403868/9ea7fc21-fb9a-7a63-1226-92e74eb8de24.png)
[Cars Dataset](http://ai.stanford.edu/~jkrause/cars/car_dataset.html)


スタンフォードAI研究所から提供されている自動運転AI学習用の車の外面画像を使わせていただきました．今から君たちにはモルカーになってもらいます．


###モルカー画像
![37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403868/bc5ee230-d5ab-6227-026a-3e485fe5d5f9.png)

アニメ1～3話までのyoutube見逃し配信から，モルカーが大きく映っている画面をトリミングしてデータセットとし，画像をおよそ100枚ほど集めました．~~1~3話を50回以上繰り返して視聴して集めたのでその日の夜シロモが夢に出てきました.~~
また，データオーグメンテーションとして画像の反転処理を施しています．

学習
-----
今回のデータセットの内訳は次のようになっています．

| | Real Car | MarCar |
|:-----------|------------:|:------------:|
| Training Images     |  140枚      | 138枚        |
| Test Images     |    27枚   |  36枚     |
全て256*256にリサイズ処理を施しています．

CycleGANの元コードはGithubからクローンし，モルカー変換用に少し変更します．
[CycleGAN-tensorflow-2](https://github.com/LynnHo/CycleGAN-Tensorflow-2)

パラメータは以下の通り．
バッチサイズ...1
epoch数...150
epoch_decay...100
Adamオプティマイザ学習係数…0.0002
$β$...0.5
cycle_loss_weight=10.0
identity_loss_weight=5.0

ほぼデフォルトと変わりませんが，時間の関係上すこしepoch数を減らしての学習となっています．画像枚数が極端に少ないためこの程度でも十分学習は進むとの考えでした．
あとデフォルトでidentity_loss_weightが０に設定されているので，これを5.0に設定．これで同一性も保たれるはずです．


結果
-----


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403868/a7f4c5d3-a0a4-3210-ed4a-fea60b4f94f8.png)
2000iteration．図は左:元画像　真ん中:CycleGANが領域を変換した画像　右:もう一度変換し元の領域に戻したもの　となっています．
Real Carのほうはすでにかなりモルカーの世界観に近づいています．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403868/f4acd1d8-c4e6-b8e3-0a85-27f3885ce1b4.png)
10000iteration．色味も大きく変換されています．ただReal Carの背景色も大きく変換されており，車本体以外のところからも特徴を抽出していることがわかります．現に，MarCar画像の背景は現実に即した灰色に変化しています．

まとめ
------

学習画像が極端に少なかったですがモルカーと現実の変換がうまくできているように感じました．
もう少しアニメの話数が追加されたらその分データセットも追加できるので今後に期待です．
みんなもモルカーを見よう！！（宣伝）