CycleGAN

#pix2pixの欠点とCycleGANの登場


pix2pixの登場によって高精度なスタイル変換が可能となったが、pix2pixの学習データは変換前後のペアである必要があり、タスクによっては学習データをペアで準備することは難しいという現実があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/3f7ce647-a59d-d978-a80d-f451bd6da934.png)

その問題を解決したのがcycleGANである。生成器と識別器を二組用いることにより、学習データがペアでなくてもスタイル変換を可能にしたのである。

↓生成器と識別器が２つずつ！ループしている！
![スクリーンショット 2020-06-24 8.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/fd00724c-5b25-2518-a48b-e9e959be6476.png)
↓スタイル変換の学習に対して、pix2pixだと左のような変換前後のペアが必要だったが、CycleGANでは右のようにペアである必要がなくなった！

![スクリーンショット 2020-06-24 9.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/bcb695a1-447c-7e97-c815-0a9d2bf6a4af.png)



#具体的なCycleGANの仕組み
![スクリーンショット 2020-06-24 8.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/fd00724c-5b25-2518-a48b-e9e959be6476.png)
発想としては、

```math
F(G(x))≒x
G(F(y))≒y

```
 
と表される、循環による一貫性を満たすような写像（生成器）

```math
F,G
```
を考えてあげれば、二つの写像が互いに逆写像でかつ全単射となる。これはつまり、二つのドメイン内の要素

```math
x∈X, y∈Y
```

がお互いに意味のある対（スタイル変換）になっていることを示している。
じゃあこのような二つの写像（生成器）をどうやって学習するのか？

#様々な損失

二つの写像を学習するために、３つの損失関数を導入する。

#####・サイクル一貫性損失
#####・敵対性損失
#####・同一性損失

##1.サイクル性損失
![スクリーンショット 2020-06-24 9.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/100a21d2-27da-a0f5-ffb6-1d6874ccbab8.png)

CyclsGANの特徴的な損失関数。

```math
F(G(x))≒x
G(F(y))≒y

```
この関係を満たすような、

```math
F,G
```
になるように学習する。
そのためには、
![スクリーンショット 2020-06-24 9.32.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/502d5b1c-960d-6c85-9e6a-a0acf07dc56b.png)
上式の通り、

```math
変換前のデータx, Gで変換後にFで再構築したF(G(x))\\
変換前のデータy, Fで変換後にGで再構築したG(F(y))
```
の二組についてそれぞれL1ノルムを取る。
##2.敵対性損失
![スクリーンショット 2020-06-24 9.32.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/8a05cf5f-4bef-cf97-7940-5cb48353093d.png)
これは一般的なGAN(ex. DCGAN)などの損失関数と同じ。

```math
(G, Dy,X, Y)
```
と同様に、

```math
(F,Dx,X,Y)
```
についても考える。

##3. 同一性損失
（ここでは紹介程度にとどめる。）
正規化のための項を導入して生成画像の色合いが元画像と一貫したものになるようにするもの。
画像に対する不要な変更にペナルティを課す。
具体的にシマウマ⇄ウマのスタイル変換で考える。
ウマ→シマウマの写像に、シマウマの画像を入れた時にシマウマをさらにシマウマにスタイル変換させるような不要な変換に対してペナルティを課す、ということである。
これにより、CycleGANが画像全体の色構造を保存できるようになる。
この損失関数がなくてもCyclaGANは動作する。
##最終的な目的関数
![スクリーンショット 2020-06-24 9.33.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/b890d781-310e-89f3-0e6e-70e0e57fe06f.png)

λは、敵対性損失とサイクル一貫性パラメータのバランスを決めるハイパーパラメータ。
論文中では、λ＝10が使用されている。
最終的に、下式を考えることで生成器を学習する。
![スクリーンショット 2020-06-25 12.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/0923f909-90a6-8813-5755-c34a2791017b.png)

###CycleGANの成功例
apple⇄orange
![スクリーンショット 2020-06-25 12.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/70d3e89b-ed9e-fe0b-50bc-aa82647c6d97.png)
zebra⇄horse
![スクリーンショット 2020-06-25 12.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/e340f3f4-19aa-c930-727f-393d850348cf.png)
winter⇄summer
![スクリーンショット 2020-06-25 12.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/507b0f0e-9e31-064e-6a64-42144be05a8d.png)

#CycleGANの失敗例
![スクリーンショット 2020-06-25 12.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/2ecce963-0a01-5860-3638-d5704b16d990.png)
cat⇄dogで失敗している：CycleGANは入力画像の小さな変更しかできない。
horse⇄zebraで失敗している：訓練画像に、人が乗っている画像がなかったからだと考えられる。

他の例も見たい方は、こちらの[WebSite](https://junyanz.github.io/CycleGAN/)へGO!!!
#参考文献
・https://arxiv.org/pdf/1703.10593.pdf
・https://www.slideshare.net/yoheiokawa/cyclegan-88149870
・https://qiita.com/hikaru-light/items/98d06b21b4f3e2bb6ca4