画像変換系NNモデルについて比較しながら調べてみた。 「Pix2PixやCycleGAN〜CUT（Contrastive Learning for Unpaired Image-to-Image Translation）まで」

## はじめに
対象とする読み手として、画像生成系のAIモデルであるGANの構造を理解しているものとしています。

もし、GANをいまいち理解できていない方には以下の参考サイトや動画がおすすめです。

- [今さら聞けないGAN（1）　基本構造の理解
](https://qiita.com/triwave33/items/1890ccc71fab6cbca87e)

- [GAN (Generative Adversarial Networks)：敵対的生成ネットワーク
](https://blog.negativemind.com/2019/06/22/generative-adversarial-networks/)

### Deep Learning入門：Generative Adversarial Networks (GAN)とは？

<iframe width="560" height="315" src="https://www.youtube.com/embed/2rC2_-HtpsQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 調査方法


- 元論文
- [Colaboratoryを使った挙動](https://github.com/ko4ro/paper_survey_colab)
- 参考記事

上記の３つから調査しました。

自身の研究に応用できるかどうか判断するため、pix2pixやCycleGAN、そしてCUT（Contrastive Learning for Unpaired Image-to-Image Translation）について調査し、簡単にまとめました。

あくまで、学生が自身の研究のために調べているので、記事の質についてはご容赦ください。


# 画像変換系NNモデルとは
画像変換の入力画像、出力画像に相当する2つの画像の対応関係を学習することで画像の変換を可能にするニューラルネットワーク（Neural Network: NN）モデルのことです。
写真の合成や白黒画像のカラー化に始まり、Googleマップの写真を航空写真にしたり、線画のスケッチを写真にしたりと、幅広い用途に対応しており、今後の実用例に期待が多い研究分野の一つです。
![pix2pix_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/cc96f947-952a-b72c-8f20-284864f92458.png)

なかでも、2014年にIan.Goodfellowらによって発表された「敵対的生成ネットワーク」（Genera tive Adversarial Networks：GAN）の登場以来、画像変換を行えるNNモデルは向上し、高精度な画像変換を行えるようになりつつあります。GANは生成モデルの一種で、データから特徴を学習することで、実在しないデータを生成したり、存在するデータの特徴に沿って変換できるNNモデルです。

今回はこのGANや**Conditional GAN**などから派生してできたpix2pixというモデルから現在までの画像変換系NNモデルの変遷を各モデルの違いなどに注目しながら見ていこうと思ます。

**Conditional GAN(CGAN)**：Generatorの入力にノイズベクトルだけでなく、条件ベクトルも与えており、Discriminatorも条件ベクトルに相当する条件データを入力できるよう改良されている条件付きのGANモデル

# Pix2Pix
Pix2Pixは入力画像と出力画像に相当する2つの画像の対応関係をGAN学習することで画像変換を可能にします。CGANとの違いとして、条件ベクトルの代わりに条件画像を使用します。

### 内部構造
**$G(Generator)$** は条件画像 **$X$** とノイズ **$Z$** から画像を生成し**<font color="ForestGreen">【Pseudo Flow】</font>**、**$D(Discriminator)$** は「条件画像 **$X$** と実画像 **$Y$** のペア」と「条件画像 **$X$** と生成画像 **$G(X,Z)$** のペア」を識別すること**【Actual Flow】**によって、**$G$** が条件画像 **$X$** から実画像 **$Y$** のような画像を生成できるように画像ペア間の関係を学習します。**<font color="ForestGreen">【Pseudo Flow】</font>**

![p2p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/755e09cb-6a2c-75ad-943d-7e3c39895efd.png)

※　ちなみに、Pix2pixはGeneratorにU-netを用いているだけで、ノイズ**$Z$**を入れていないように、感じるかもしれませんが、通常のU-netとは異なり、Dropoutをいれることで各層にノイズベクトル**$(z \subset Z)$**を与えている。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最内レイヤーはDropoutなしだった。 <a href="https://t.co/zEFSeBNBdF">pic.twitter.com/zEFSeBNBdF</a></p>&mdash; Teppei Kurita (@kuritateppei) <a href="https://twitter.com/kuritateppei/status/1248386644710789128?ref_src=twsrc%5Etfw">April 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 損失関数の定式
まず、**Adversarial Loss $\mathcal{L}_{adv}$**は**Conditional GAN**と同じ形をとる。

```math
\mathcal{L}_{adv}(G,D)=\mathbb{E}_{x,y}\bigl[\log D(x,y)\bigl]+ \mathbb{E}_{x,z}\bigl[\log (1 - D(x,G(x,z)\,)\,)\bigl]
```

そして、L1 Lossは

```math
\mathcal{L}_{L1}(G)=\mathbb{E}_{x,y,z}\bigl[\|y - G(x,y)\|_{1}\bigl]
```

上記を1つにまとめて、Pix2Pixの目的は最終的に以下の式である

```math
\arg \min_{G}\max_{D} \mathcal{L}_{adv}(G,D)+ \lambda\mathcal{L}_{L1}(G)
```

Pix2Pixでは、画像の全体像(低周波成分)はL1 Lossで捉え、画像の詳細なディティール(高周波成分)は**$D(Discriminator)$**であるPatchGANで捉えるようにして、**Adversarial Loss**で精度を向上させている。


### 課題
Pix2Pixは1対1で対応していないペア画像データ(**UnPaired**)では学習できませんでした。しかし、1対1で各ピクセルが対応したペア画像データ(**Paired**)を大量に入手できるケースは稀で、Pix2Pixのために新たに学習データを用意するコストが課題として残されていました。
![pix2pix_miss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/29a54ac4-776d-85d6-03ac-195dc49ad0df.jpeg)
> 画像引用元：https://software.intel.com/content/www/us/en/develop/articles/improving-cycle-gan-using-intel-ai-devcloud.html

# CycleGAN
Pix2Pixの課題を解決するため、CycleGANでは、2枚の画像の対応する各ピクセルの関係を学習するのではなく、2つの画像データセット同士の**ドメイン(分野、領域)**の関係を学習します。これによって、CycleGANは大量のペア画像(**Paired**)を用意しなくても、2つの違う画像データセット(**UnPaired**)からその関係を学習して画像変換を実現しました。

また、**Pix2Pix** のように1組の**$G$**と**$D$**で一方向の画像変換(画像生成)だけの場合、入力 $x$ を出力 $y$ へ変換する関係を学習することはできるが、$y$ から $x$ への逆変換を学習することができません。しかし、CycleGANでは$G$と$D$をもう1組加え、出力 $y$ から入力 $x$ への逆変換の学習も行い、双方向の画像変換を学習することができます。

### ドメインとは
集合論から、公開されている画像データセットにおいてもそれぞれ固有のドメインで収集されており、例えば、物体検出で用いられる有名な[ImageNet](http://www.image-net.org/)において、「馬」とラベル付けされた画像群は「馬というドメインの画像のデータセット」になります。そして、一方で「シマウマ」とラベル付された画像群は「シマウマというドメインの画像のデータセット」になり、CycleGANでは、この違うドメイン（「馬」、「シマウマ」）の画像データセット同士の関係性を学習します。

例えば、以下の図のように世の中の画像の中でもそれぞれのドメインがあります。

![domain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/7330d470-3a9b-457e-ca38-8c8fc6d088cd.png)
> 画像引用元：https://ai-scholar.tech/articles/treatise/frcnn-ai-228

### 内部構造
**$G$**と**$D$**が2組あり、GAN同様に、**$G$**は**$D$**を騙すようにし、**$D$**は**$G$**のFakeを見破るように学習します。

2種類のドメイン「馬(horse)」と「シマウマ(zebra)」の画像データセットがある場合、

**$G_{xy}$**は「シマウマ」の画像 **$x \in X$** を「馬」の画像 **$y\in Y$**へ変換し、**$D_{y}$**は画像が本物の**$y$** か **$G_{xy}(x)$** かを識別します。もう一方の**$G_{yx}$** は「馬」の画像**$y \in Y$** を「シマウマ」の画像**$x \in X$** へ変換し、**$D_{x}$**は画像が本物の **$x$** か **$G_{yx}(y)$** かを識別します。 

また、**$L_{cyc}$** (Cycle Consistency Loss) は、変換と逆変換を経て画像がどれだけ変換前と変わらないかの一貫性(Consistency)を測る指標として、**$G_{xy}$**と**$G_{yx}$**の関係を表します。


![cycle_consistency.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/b067fb80-93a1-d66f-5ab1-d4fd81b57d51.png)


### 損失関数の定式
まず、GANに則り、**$G$**と**$D$** の組はそれぞれ **Adversarial Loss**で学習する。ドメイン「シマウマ(zebra)」**$x \in X$** の画像をドメイン「馬(horse)」　**$y\in Y$**の画像へ変換する**$G_{xy}$**と、それを識別する**$D_{y}$**の関係は以下の式となり

```math
\mathcal{L}_{adv}(G_{xy},D_{y})=\mathbb{E}_{y\sim p_{data}(y)}\bigl[\log D_{y}(y)\bigl]+ \mathbb{E}_{x\sim p_{data}(x)}\bigl[\log (\,1 - D_{y}(G(x))\,)\bigl]
```

そして、CycleGANの目的は上式の $G_{xy}$ を最小化、$D_{y}$ を最大化することなので、


```math
\arg \min_{G_{xy}}\max_{D_{y}} \mathcal{L}_{adv}(G_{xy},D_{y})
```

同様に、逆変換のドメイン「馬(horse)」　**$y\in Y$**の画像をドメイン「シマウマ(zebra)」**$x \in X$** の画像に変換する**$G_{yx}$**と、それを識別する**$D_{x}$**は以下のようになる。

```math
\arg \min_{G_{yx}}\max_{D_{x}} \mathcal{L}_{adv}(G_{yx},D_{x})
```

また、**$L_{cyc}$** (Cycle Consistency Loss) は画像の変換前と変換後の違いなので、

```math
\mathcal{L}_{cyc}(G_{xy},G_{yx})=\mathbb{E}_{x\sim p_{data}(x)}\bigl[\|G_{yx}(G_{xy}(x))- x\|_{1}\bigl] +\,\mathbb{E}_{y\sim p_{data}(y)}\bigl[\|G_{xy}(G_{yx}(y))- y\|_{1}\bigl]
```

上記を1つにまとめて、CycleGANの目的関数は最終的に

```math
\arg \min_{G_{xy},G_{yx}}\max_{D_{x},D_{y}} \mathcal{L}_{total}（G_{xy},G_{yx}, D_{x}, D_{y}）
\\
\mathcal{L}_{total}（G_{xy},G_{yx}, D_{x}, D_{y}） = \mathcal{L}_{adv}(G_{xy},D_{y}) + \mathcal{L}_{adv}(G_{yx},D_{x}) + \lambda\,\mathcal{L}_{cyc}(G_{xy},G_{yx})
```
#### CycleGANにおけるIdentity Mapping Loss
CycleGANの論文における5.2. Applicationsの中で**$L_{identitiy}$** (Identity Mapping Loss)というものを損失関数の中に取り入れた方が、以下の表からわかるように視覚的により良い画像を生成したと述べられている。
![identity_comparison.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/7dfcd36c-0a29-672b-3878-3098c47a5979.png)


**$L_{identitiy}$** は次のような式でかける。

```math
\mathcal{L}_{identitiy}(G_{xy},G_{yx})=\mathbb{E}_{x\sim p_{data}(x)}\bigl[\|G_{yx}(x)- x\|_{1}\bigl] +\,\mathbb{E}_{y\sim p_{data}(y)}\bigl[\|G_{xy}(y)- y\|_{1}\bigl]
```

上記の新たな損失関数にて、**$L_{cyc}$**の重み係数の半分( $0.5 \lambda$ ) をかけて、足したものが以下のようなCycleGANの最終的に
目的関数となる。

```math
\mathcal{L}_{total}（G_{xy},G_{yx}, D_{x}, D_{y}） = \mathcal{L}_{adv}(G_{xy},D_{y}) + \mathcal{L}_{adv}(G_{yx},D_{x}) + \lambda\,\mathcal{L}_{cyc}(G_{xy},G_{yx})+ 0.5 \lambda\,\mathcal{L}_{identity}(G_{xy},G_{yx})

```

![identity_mapping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/9dfa3b54-ea2e-127c-eb5a-66134fac49b1.png)



### 課題
しかし、CycleGANでも、似た形状や同じポーズ、似た構図での色・テクスチャの変換をキレイに行うことができるが、形状の違うデータセットや画像内のある一部のみの変換では失敗してしまう場合が多いことがありました。

![cyclegan_miss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/e14fe1e7-f066-3e22-71df-37a6925b1aa5.png)

> 画像引用元：https://ichi.pro/uma-o-shimauma-ni-hon-yakusuru-cyclegan-119013860708179

# CUT
**Contrastive Learning for Unpaired Image-to-Image Translation**、通称**CUT**は、画像全体ではなく、パッチ単位かつ多層でContrastive Learningを行い、CycleGANにおける同じドメイン内での形状の違うもの（シマウマ単体ではなく人が騎乗しているもの）などの領域を考慮した画像変換を行えるモデルを構築しようとしました。 

![cut_patchnce.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363267/7bc23403-5d0d-c6d0-87bd-5b8895921994.gif)


> 画像引用元：http://taesung.me/ContrastiveUnpairedTranslation/

ネットワーク構造は上図のようになっておりパッチのNegativeサンプルは他の画像から得るのではなく、入力画像内からサンプリングしています。従来手法と比較して、性能を向上していることに加え、学習時間も短縮できることを実証している。さらには、それぞれの「ドメイン」が1枚のみであっても、学習できるような拡張がされています。

このネットワークに関しては以下の記事で詳しく記載しておりますので、そちらもあわせてご一読ください。

> [AI-SCHOLAR　より美しく、より鮮明な画像を作れる「CUT」を知ろう！](https://ai-scholar.tech/articles/gan/ko4ro)


# 各々の違いまとめ

|モデル名|学習方法|データセット|推論方向|損失関数|
|---|---|---|---|---|
|Pix2Pix|教師あり学習|Paired|one-sided(one-directional)|Adversarial(PatchGAN) + L1 |
|CycleGAN|教師なし学習|Unpaired|two-sided(bidirectional)|Adversarial(PatchGAN) + Consistency(L1) + Identity(L1)|
|CUT|自己教師あり学習|Unpaired|one-sided(one-directional)|Adversarial + PathNCE(Consistency, Identity)|


# まとめ

本記事ではペア画像変換系のモデルについて、変遷をたどりながら考察していきました。
自身の復習のために、今後もっと掘り下げて記事を改善することもあるかと思いますが、現状段階ではこのくらいにまとめておきますので、ご一読いただければと思います。