Deep LearningのGANで打線組んでみた【画像生成】

##はじめに
Deep Learningの基礎を学習した人であればGAN（敵対的生成ネットワーク）をご存知でしょうか。Goodfellow氏によるGenerative Adversarial Nets(GAN)発表以来、特に画像生成の領域ではトレンドが続いています。

さて、毎月百以上の新しいGANが発表される昨今。2018年も終わった節目にこれまでに世界各国で生み出されてきたGANで打線を組んでみました。

#打線発表
1(一) cGAN
2(遊) ACGAN
3(二) InfoGAN
4(中) DCGAN
5(右) starGAN
6(三) WGAN
7(左) LSGAN
8(捕) SAGAN
9(投) cycleGAN

それでは簡単に解説していきます。（各図は論文から引用しています。）

## 解説
###１．cGAN( Conditional GAN )
条件付きのGAN。入力する画像と共にラベル情報を追加することで、狙った条件の画像を生成できる。画像を条件として与えたpix2pixもcGANの一種である。

![スクリーンショット 2019-01-27 1.25.59.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/eb0ca770-b8c7-de06-8e60-0ccc859d95d3.jpeg)

参考：ペアで2つのドメインの画像変換を学習させるpix2pix 
![teaser_v3.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/3c73085d-6176-f735-10ab-82841b809ef7.jpeg)


###２．ACGAN
Generatorに入力画像のclass情報を同時に与え、Discriminatorは、生成画像の真偽だけでなくclassの判別も行う。Imagenetの画像を対象に、通常のDCGANより高精度な画像生成を実現した。

![スクリーンショット 2019-01-27 1.26.07.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/9ddffe02-daf2-8369-13ac-f4446d1bcb00.jpeg)
参考：Imagenetで学習した対象クラスの画像の生成
![スクリーンショット 2019-02-07 22.34.38.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/6a8c9a11-aff7-e496-a5eb-7804149d9aa1.jpeg)


###３．InfoGAN
教師なし学習で、生成画像の中で利用価値の高い特徴を勝手に学習する。cGANのようにラベル付けをしたデータの準備は不要である。潜在変数と画像分布の相互情報量を評価関数に導入し、生成画像分布に大きな影響を与える潜在変数の獲得を目指す。

![スクリーンショット 2019-01-27 1.26.12.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/bfe528e7-24ad-d7ba-bc73-6061d0baa2cb.jpeg)
参考：教師なし学習だが潜在変数を変化させることで回転角や幅を連続的に変化させられる。
![スクリーンショット 2019-02-07 22.43.04.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/f117a30f-2b2e-0beb-3bbf-86ea7c494493.jpeg)


###４．DCGAN
入力ノイズとして与えたベクトルzを元にDeepCNNを介して画像を生成する。Generatorが生成した画像の真偽の判別をDiscriminatorが行い、画像生成をターゲットとしたあらゆるGANのベースとなっている。

![スクリーンショット 2019-01-27 1.25.51.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/a1c7924d-198f-9d75-32b0-24f4ed09dc7a.jpeg)


[参考]DCGANによってゼロから生成されたベッドルーム画像
<img width="600" alt="e382b9e382afe383aae383bce383b3e382b7e383a7e38383e38388-2018-07-08-23-08-27.png" src="https://qiita-image-store.s3.amazonaws.com/0/113129/e611cce5-fc9a-32f5-ffce-9b74cbd5f699.png">



###５．StarGAN
複数のドメイン変換を単一のGeneratorとDiscriminatorで学習することができる。CycleGANとACGANを組み合わせた考え方で、G(x,c)→yを複数のドメインラベルのcでできるように学習する。ACGANで用いられるDomain Classification LossとCycleGANのReconstruction Lossを損失関数として導入する。

<img width="500" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35313637332f36356235666435312d336532632d383864352d326132372d6264386262386165353565662e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/113129/1be2ab84-9174-8e1c-b90a-f11b780f3725.png">
[参考]入力画像に対して任意のラベル特徴を反映させて出力できる
<img width="600" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35313637332f38356332383737642d376438372d633165662d393235382d3862343563333734653431612e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/113129/431d5fa6-782d-7075-0528-fcc075c96721.png">


###６．WGAN
GANの学習の安定性を向上させるため、Wasserstein距離を導入。従来のJensen-Shannon Divergence(JSD)を指標とした場合、勾配消失問題が発生する。JSDの代わりにWasserstein距離を用いることで高速化と学習の安定が期待できる。

![スクリーンショット 2019-01-27 1.56.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/49292f08-fa64-5515-eb91-5e009e68cd01.jpeg)

###７．LSGAN
GANの課題である勾配消失、泥沼であるmode collapseを回避するために目的関数を工夫。従来のsigmoidクロスエントロピー誤差ではなく、二乗誤差を用いることで学習の安定を図ることができる。
![スクリーンショット 2019-01-27 1.56.29.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/55d277f0-de4b-56aa-8610-8491daceb924.jpeg)
参考：生成画像の比較
![スクリーンショット 2019-02-07 22.56.27.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/425dc006-188d-7780-2d89-559390a29516.jpeg)


###８．SAGAN
GANの父Goodfellowも共著者に含まれる。画像全体の中で関連が強い領域を重視するSef-attention機構をネットワーク内に導入し、畳込みでは受容野が限られるという弱点を克服した。
![スクリーンショット 2019-02-07 22.49.29.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/af58db32-0317-51e1-244c-e59d038a9e33.jpeg)

[参考]attention map の可視化
![スクリーンショット 2019-01-27 1.49.11.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/7d345697-fb5d-10fe-b104-e96afcc51442.jpeg)

###９．CycleGAN
「ウマ」↔「シマウマ」のように画像のドメインを変換することができるGAN。従来のように１体１で対応するペア画像を学習することなく、２つのドメイン分布間のマッピングを自動で学習することができる。X→YとY→Xという真逆の２つの変換器をサイクルで回しながら学習を進める。
![スクリーンショット 2019-02-07 22.58.00.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/b0036494-0716-a715-7765-ef015c9824e9.jpeg)


[参考]多様な２つのドメイン変換を実現
<img width="600" alt="e382b9e382afe383aae383bce383b3e382b7e383a7e38383e38388-2018-07-08-14-49-53.png" src="https://qiita-image-store.s3.amazonaws.com/0/113129/aa903202-1479-6467-874f-344f7bd91559.png">


#さいごに
数百種類と発表されているGANの中から選りすぐりのラインナップとしました。毎年新たにおもしろいGANのアイデアが登場するのでまた違う記事もあげたいと思います。

ブログでもGANについて書いたりしているのでよければご覧ください。
・[GANで学習がうまくいかないときに見るべき資料](https://gangango.com/2018/11/16/post-322/)
・[画像変換まとめ](https://gangango.com/2019/05/19/post-458/)


##参考
GAN model collections : https://github.com/hwalsuklee/tensorflow-generative-model-collections
The GAN zoo: https://github.com/hindupuravinash/the-gan-zoo
## 論文
GAN: https://arxiv.org/abs/1406.2661
cGAN: https://arxiv.org/abs/1411.1784
pix2pix: https://arxiv.org/abs/1611.07004
ACGAN: https://arxiv.org/abs/1610.09585
InfoGAN: https://arxiv.org/abs/1606.03657
DCGAN: https://arxiv.org/abs/1511.06434
StarGAN: https://arxiv.org/abs/1711.09020
SAGAN: https://arxiv.org/abs/1805.08318
LSGAN: https://arxiv.org/abs/1611.04076
WGAN: https://arxiv.org/abs/1701.07875
cycleGAN: https://arxiv.org/abs/1703.10593