顔写真をゆゆ式風に変換してみたかった。

# 1. はじめに
この記事は、[ゆゆ式AdventCalender2019](https://adventar.org/calendars/4096)の24日目の記事です。


# 2. やりたいこと
* ~~ゆゆ式の世界に行きたい~~  
→**顔写真をゆゆ式風に変換したい**


去年のAdventCalenderでは、CycleGANで白黒の漫画への自動着色を試しました。([CycleGANで漫画をカラーにしてみる～ゆゆ式を例に～](https://qiita.com/navist99/items/a08aaec58a1737cf60c1))
CycleGANは、色やテクスチャを変えるなどのスタイル変換は得意な一方で、形状変換は苦手という特徴がありました。

そこで今年は、スタイル変換と形状変換の両方を実現するGANである[U-GAT-IT](https://arxiv.org/abs/1907.10830)を用いて、顔写真からゆゆ式風のイラストを生成してみます。

イメージはこんな感じ↓
<img width="873" alt="example.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/376d9705-df28-71a7-3613-59a543788b80.png">
([mantan-web](https://mantan-web.jp/photo/20150603dog00m200056000c.html?page=007)より引用)


# 3. U-GAT-IT

<img width="885" alt="model.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/0f3457dc-5b56-d313-3343-3ca1446041e0.png">

U-GAT-ITでは、CycleGANが苦手としていた形状変換も行えるようになっています。


以下は、著者が論文で公開している結果です。
一番左が元の写真ですが、猫→犬などの形状変換を伴う変化も上手く行えていることがわかります。
<img width="559" alt="result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/47e10a01-1dcf-b639-e139-4c3bed9093da.png">



図は全て [U-GAT-IT: Unsupervised Generative Attentional Networks with Adaptive Layer-Instance Normalization for Image-to-Image Translation](https://arxiv.org/abs/1907.10830) より引用

# 4. ゆゆ式
<img width="350" alt="スクリーンショット 2019-12-23 23.08.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/b1e0219c-ba39-f380-926f-ae44709a8558.png">
[ゆゆ式](https://www.yuyushiki.net)は、まんがタイムきららにて連載中の三上小又先生による4コマ漫画です。


# 5. 学習
学習はGoogle Colaboratoryで行いました。
学習は[こちらのリポジトリ](https://github.com/taki0112/UGATIT)から、util -> ops -> UGATIT -> mainの順にNotebookのセルに貼り付けて実行していけば良いです。

ただしNotebookで実行する際にはparserがエラーになるので、以下のように変更します。

```python
#以下をコメントアウト
#parser = argparse.ArgumentParser(description=desc)
#途中略
#parser.add_argument(...)

#以下を追加
!pip install easydict
import easydict
args = easydict.EasyDict({
       'phase': 'train',
       'light': False,
       'dataset': 'yuyu',
       ###以下略
})
```

データセットは、カレントディレクトリ直下に以下のように配置します。

```
└─ dataset
    └─ yuyu
        ├─ trainA  #学習用の女性の写真(selfie2animeから転用)
        ├─ trainB  #学習用のゆゆ式キャラの写真
        ├─ testA   #テスト用の(ry
        └─ testB   #テスト用の(ry
```

さて、ここまで用意できたら学習を開始します！

このモデルは非常に大きく、100枚ほどしかないデータセットでも、メモリに乗らないというエラーが頻発しました。。
そんな時はargsの'light'をTrueにすると、lightバージョンで学習を行ってくれます。(精度とトレードオフですが、、)
今回は100iterationを1500epoch学習しました、ちょっと過学習気味です。

**○結果**
元写真/変換結果写真です。
![female12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/0753ce1a-0429-6c60-f24c-229562567b9c.png)![female12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/8e9e23e3-9f42-e9c0-0bcc-5b4be2b713f9.png)
![female77.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/cbb190f1-cbba-29fa-2e0b-f94c2cdc7433.png)![female77.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/5dedbd54-c092-bfed-af94-39e08a48f3e1.png)
![female66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/d30c8ca5-3610-e836-89f3-01d40def6611.png)![female66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304057/dd3c5b15-1129-b9a7-66de-b0d76eeceb7e.png)

確かにゆゆ式タッチの絵ですが、微妙ですね...

# 6. 終わりに
今回は、なかなか思うような結果が得られませんでした。 
モデルの性能をうまく引き出せず申し訳ないです。

学習データセットが小さすぎることが大きな要因だと思います。リソースの限界を感じています。。
(誰かゆゆ式データセットを作って欲しいです)
<br>
明日は最終日です。
みなさん良いクリスマスを！