AlphaTree:一张RoadMap,四个层次,十个方向百份源码,带你详细了解Gan发展历程

0 / 447

“在机器学习过去的 10 年里,GAN 是最有趣的一个想法。” ——Yann LeCun


GAN

2019 年,是很重要的一年。在这一年里,GAN 有了重大的进展,出现了 BigGan,StyleGan 这样生成高清大图的 GAN,也出现了很多

这一切预示着 GAN 这个话题,马上就要被勤勉的科学家们攻克了。

从目标分类的被攻克,人脸识别的特征提取和 loss 改进,目标检测与分割的统一…… 深度学习的堡垒一个接一个的被攻克。一切都迅速都走上可应用化的道路。

深度学习的发展惊人,如果说互联网过的是狗年,一年抵七年,深度学习的发展一定是在天宫的,天上一天,地上一年。

本文参考 Mohammad KHalooei 的教程,也将 GAN 在图像上的应用分为 4 个 level,第四个 level 将按照应用层面进行拓展。

  1. Level 0: Definition of GANs GAN 的基础结构发展,时间主要是在 2014-2016 之间,很多重要的结构,概念在这段时间被提出。譬如 CGAN 等。这里列出了四篇论文。
  2. Level 1: Improvements of GANs training,GAN 的训练还不稳定,除了结构上的改进,也有很多在 loss、参数、权重的改进,2017 年有了重大的突破,大名鼎鼎的 WGAN 也诞生了。这里列出了五篇论文。包括 LSGAN WGAN WGAN-GP 等
  3. Level 2: Implementation skill 这个 level 主要讲 GAN 的实现。从 DCGAN,到 ProGAN,SAGAN,BigGAN,StyleGAN。我们可以看到这两年,无论是人脸的生成还是物体的生成都有了不小的进步。
  4. Level 3: GANs Applications in CV,这里先初步展示 图像翻译 (Image Translation),超分辨率 (Super-Resolution)和交互式图像生成。包含了 Pix2Pix ,CycleGAN,GauGAN 等有趣的 GAN

其他方向将会陆续放出。

生成式对抗网络(GAN, Generative Adversarial Networks )是近年来深度学习中复杂分布上无监督学习最具前景的方法之一。 监督学习需要大量标记样本,而 GAN 不用。 模型包括两个模块:生成模型(Generative Model)和判别模型(Discriminative Model),通过模型的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。

GAN 的目标,就是 G 生成的数据在 D 看来,和真实数据误差越小越好,目标函数如下:

从判别器 D 的角度看,它希望自己能尽可能区分真实样本和虚假样本,因此希望 D(x) 尽可能大,D(G(z)) 尽可能小, 即 V(D,G)尽可能大。从生成器 G 的角度看,它希望自己尽可能骗过 D,也就是希望 D(G(z)) 尽可能大,即 V(D,G) 尽可能小。两个模型相对抗,最后达到全局最优。

从数据分布来说,就是开始的噪声 noise,在 G 不断修正后,产生的分布,和目标数据分布达到一致:

[1] Ian Goodfellow. "Generative Adversarial Networks." arXiv preprint arXiv:1406.2661v1 (2014). [pdf] (https://arxiv.org/pdf/1406.2661v1.pdf)

http://www.iangoodfellow.com/

https://github.com/goodfeli/adversarial


“酒后脑洞”的故事…

2014 年的一个晚上,Goodfellow 在酒吧给师兄庆祝博士毕业。一群工程师聚在一起不聊姑娘,而是开始了深入了学术探讨——如何让计算机自动生成照片。

当时研究人员已经在使用神经网络(松散地模仿人脑神经元网络的算法),作为“生成”模型来创建可信的新数据。但结果往往不是很好:计算机生成的人脸图像要么模糊到看不清人脸,要么会出现没有耳朵之类的错误。

针对这个问题,Goodfellow 的朋友们“煞费苦心”,提出了一个计划——对构成照片的元素进行统计分析,来帮助机器自己生成图像。

Goodfellow 一听就觉得这个想法根本行不通,马上给否决掉了。但他已经无心再 party 了,刚才的那个问题一直盘旋在他的脑海,他边喝酒边思考,突然灵光一现:如果让两个神经网络互相对抗呢?

但朋友们对这个不靠谱的脑洞深表怀疑。Goodfellow 转头回家,决定用事实说话。写代码写到凌晨,然后测试…

Ian Goodfellow:如果你有良好的相关编程基础,那么快速实现自己的想法将变得非常简单。几年来,我和我的同事一直在致力于软件库的开发,我曾用这些软件库来创建第一个 GAN、Theano 和 Pylearn2。第一个 GAN 几乎是复制-粘贴我们早先的一篇论文《Maxout Networks》中的 MNIST 分类器。即使是 Maxout 论文中的超参数对 GAN 也相当有效,所以我不需要做太多的新工作。而且,MNIST 模型训练非常快。我记得第一个 MNIST GAN 只花了我一个小时左右的时间。

参考:

https://baijiahao.baidu.com/s?id=1615737087826316102&wfr=spider&for=pc

http://www.heijing.co/almosthuman2014/2018101111561225242


和监督学习的的网络结构一样,GAN 的发展 也主要包含网络结构性的改进 和 loss、参数、权重的改进。

Avinash Hindupur 建了一个 GAN Zoo,他的“动物园”里目前已经收集了近 500 种有名有姓的 GAN。 主要是 2014-2018 年之间的 GAN。 https://github.com/hindupuravinash/the-gan-zoo

那么问题来了:这么多变体,有什么区别?哪个好用?

于是,Google Brain 的几位研究员(不包括原版 GAN 的爸爸 Ian Goodfellow)对各种进行了 loss,参数,权重修改的 GAN 做一次“中立、多方面、大规模的”评测。 在此项研究中,Google 此项研究中使用了 minimax 损失函数和用 non-saturating 损失函数的 GAN,分别简称为 MM GAN 和 NS GAN,对比了 WGAN、WGAN GP、LS GAN、DRAGAN、BEGAN,另外还对比的有 VAE(变分自编码器)。为了很好的说明问题,研究者们两个指标来对比了实验结果,分别是 FID 和精度(precision、)、召回率(recall)以及两者的平均数 F1。

其中 FID(Fréchet distance(弗雷歇距离) )是法国数学家 Maurice René Fréchet 在 1906 年提出的一种路径空间相似形描述,直观来说是狗绳距离:主人走路径 A,狗走路径 B,各自走完这两条路径过程中所需要的最短狗绳长度,所以说,FID 与生成图像的质量呈负相关。

为了更容易说明对比的结果,研究者们自制了一个类似 mnist 的数据集,数据集中都是灰度图,图像中的目标是不同形状的三角形。

最后,他们得出了一个有点丧的结论:

No evidence that any of the tested algorithms consistently outperforms the original one. :

都差不多……都跟原版差不多……

Are GANs Created Equal? A Large-Scale Study Mario Lucic, Karol Kurach, Marcin Michalski, Sylvain Gelly, Olivier Bousquet https://arxiv.org/abs/1711.10337

http://www.dataguru.cn/article-12637-1.html

这些改进是否一无是处呢?当然不是,之前的 GAN 训练很难, 而他们的优点,主要就是让训练变得更简单了。

那对于 GAN 这种无监督学习的算法,不同的模型结构改进,和不同的应用领域,才是 GAN 大放异彩的地方。

此外,谷歌大脑发布了一篇全面梳理 GAN 的论文,该研究从损失函数、对抗架构、正则化、归一化和度量方法等几大方向整理生成对抗网络的特性与变体。 作者们复现了当前最佳的模型并公平地对比与探索 GAN 的整个研究图景,此外研究者在 TensorFlow Hub 和 GitHub 也分别提供了预训练模型与对比结果。 https://arxiv.org/pdf/1807.04720.pdf

原名:The GAN Landscape: Losses, Architectures, Regularization, and Normalization

现名:A Large-Scale Study on Regularization and Normalization in GANs

GitHub:http://www.github.com/google/compare_gan

TensorFlow Hub:http://www.tensorflow.org/hub

翻译 参见 http://www.sohu.com/a/241299306_129720


GAN 的很多研究,都是对 Generative modeling 生成模型的一种研究,主要有两种重要的工作: 1 Density Estimation 对原有数据进行密度估计,建模,然后使用模型进行估计 2 Sampling 取样,用对数据分布建模,并进行取样,生成符合原有数据分布的新数据。


Level 0: Definition of GANs

Level Title Co-authors Publication Links
Beginner GAN : Generative Adversarial Nets Goodfellow & et al. NeurIPS (NIPS) 2014 link
Beginner GAN : Generative Adversarial Nets (Tutorial) Goodfellow & et al. NeurIPS (NIPS) 2016 Tutorial link
Beginner CGAN : Conditional Generative Adversarial Nets Mirza & et al. -- 2014 link
Beginner InfoGAN : Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets Chen & et al. NeuroIPS (NIPS) 2016

模型结构的发展:

在标准的 GAN 中,生成数据的来源一般是一段连续单一的噪声 z, 在半监督式学习 CGAN 中,会加入 c 的 class 分类。InfoGan 找到了 Gan 的 latent code 使得 Gan 的数据生成具有了可解释性。

CGAN

[1411.1784]Mirza M, Osindero S,Conditional Generative Adversarial Nets pdf

通过 GAN 可以生成想要的样本,以 MNIST 手写数字集为例,可以任意生成 0-9 的数字。

但是如果我们想指定生成的样本呢?譬如指定生成 1,或者 2,就可以通过指定 C condition 来完成。

条件 BN 首先出现在文章 Modulating early visual processing by language 中,后来又先后被用在 cGANs With Projection Discriminator 中,目前已经成为了做条件 GAN(cGAN)的标准方案,包括 SAGAN、BigGAN 都用到了它。

https://github.com/znxlwm/tensorflow-MNIST-cGAN-cDCGAN

应用方向 数字生成, 图像自动标注等

LAPGAN

Emily Denton & Soumith Chintala, arxiv: 1506.05751

是第一篇将层次化或者迭代生成的思想运用到 GAN 中的工作。在原始 GAN 和后来的 CGAN 中,GAN 还只能生成 32X32 这种低像素小尺寸的图片。而这篇工作[16] 是首次成功实现 64X64 的图像生成。思想就是,与其一下子生成这么大的(包含信息量这么多),不如一步步由小转大,这样每一步生成的时候,可以基于上一步的结果,而且还只需要“填充”和“补全”新大小所需要的那些信息。这样信息量就会少很多,而为了进一步减少信息量,他们甚至让 G 每次只生成“残差”图片,生成后的插值图片与上一步放大后的图片做加法,就得到了这一步生成的图片。

IcGAN

Invertible Conditional GANs for image editing

通常 GAN 的生成网络输入为一个噪声向量 z,IcGAN 是对 cGAN 的 z 的解释。

利用一个 encoder 网络,对输入图像提取得到一个特征向量 z,将特征向量 z,以及需要转换的目标 attribute 向量 y 串联输入生成网络,得到生成图像,网络结构如下,

https://arxiv.org/pdf/1611.06355.pdf https://github.com/Guim3/IcGAN

ACGAN

为了提供更多的辅助信息并允许半监督学习,可以向判别器添加额外的辅助分类器,以便在原始任务以及附加任务上优化模型。

和 CGAN 不同的是,C 不直接输入 D。D 不仅需要判断每个样本的真假,还需要完成一个分类任务即预测 C

添加辅助分类器允许我们使用预先训练的模型(例如,在 ImageNet 上训练的图像分类器),并且在 ACGAN 中的实验证明这种方法可以帮助生成更清晰的图像以及减轻模式崩溃问题。 使用辅助分类器还可以应用在文本到图像合成和图像到图像的转换。

SemiGan /SSGAN Goodfellow

Salimans, Tim, et al. “Improved techniques for training gans.” Advances in Neural Information Processing Systems. 2016.

Theano+Lasagne https://github.com/openai/improved-gan

tf: https://github.com/gitlimlab/SSGAN-Tensorflow

https://blog.csdn.net/shenxiaolu1984/article/details/75736407


InfoGan OpenAI

InfoGAN - Xi Chen, arxiv: 1606.03657

提出了 latent code。

单一的噪声 z,使得人们无法通过控制 z 的某些维度来控制生成数据的语义特征,也就是说,z 是不可解释的。

以 MNIST 手写数字集为例,每个数字可以分解成多个维度特征:数字的类别、倾斜度、粗细度等等,在标准 GAN 的框架下,是无法在维度上具体指定生成什么样的数字。但是 Info Gan 通过 latent code 的设定成功让网络学习到了可解释的特征表示(interpretable representation)

把原来的噪声 z 分解成两部分:一是原来的 z;二是由若干个 latent variables 拼接而成的 latent code c,这些 latent variables 会有一个先验的概率分布,且可以是离散的或连续的,用于代表生成数据的不同特征维度,如数字类别(离散),倾斜度(连续),粗细度(连续)等。通过找到对信息影响最大的 c,来得到数据中最重要的特征。

InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets,NIPS 2016。

https://arxiv.org/abs/1606.03657

https://github.com/openai/InfoGAN


Level 1: Improvements of GANs training

然后看看 loss、参数、权重的改进:

Level Title Co-authors Publication Links
Beginner LSGAN : Least Squares Generative Adversarial Networks Mao & et al. ICCV 2017 link
Advanced Improved Techniques for Training GANs Salimans & et al. NeurIPS (NIPS) 2016 link
Advanced WGAN : Wasserstein GAN Arjovsky & et al. ICML 2017 link
Advanced WGAN-GP : improved Training of Wasserstein GANs 2017 link
Advanced Certifying Some Distributional Robustness with Principled Adversarial Training Sinha & et al. ICML 2018 link code

Loss Functions:

LSGAN(Least Squares Generative Adversarial Networks)

LS-GAN - Guo-Jun Qi, arxiv: 1701.06264

[2] Mao et al., 2017.4 pdf

https://github.com/hwalsuklee/tensorflow-generative-model-collections https://github.com/guojunq/lsgan

用了最小二乘损失函数代替了 GAN 的损失函数,缓解了 GAN 训练不稳定和生成图像质量差多样性不足的问题。

但缺点也是明显的, LSGAN 对离离群点的过度惩罚, 可能导致样本生成的'多样性'降低, 生成样本很可能只是对真实样本的简单模仿和细微改动。

WGAN

WGAN - Martin Arjovsky, arXiv:1701.07875v1

WGAN: 在初期一个优秀的 GAN 应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。

为啥难训练? 令人拍案叫绝的 Wasserstein GAN 中做了如下解释 : 原始 GAN 不稳定的原因就彻底清楚了:判别器训练得太好,生成器梯度消失,生成器 loss 降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以 GAN 才那么难训练。

https://zhuanlan.zhihu.com/p/25071913

WGAN 针对 loss 改进 只改了 4 点: 1.判别器最后一层去掉 sigmoid 2.生成器和判别器的 loss 不取 log 3.每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数 c 4.不要用基于动量的优化算法(包括 momentum 和 Adam),推荐 RMSProp,SGD 也行

https://github.com/martinarjovsky/WassersteinGAN

WGAN-GP

Regularization and Normalization of the Discriminator:

WGAN-GP:

WGAN 的作者 Martin Arjovsky 不久后就在 reddit 上表示他也意识到没能完全解决 GAN 训练稳定性,认为关键在于原设计中 Lipschitz 限制的施加方式不对,并在新论文中提出了相应的改进方案--WGAN-GP ,从 weight clipping 到 gradient penalty,提出具有梯度惩罚的 WGAN(WGAN with gradient penalty)替代 WGAN 判别器中权重剪枝的方法(Lipschitz 限制):

[1704.00028] Gulrajani et al., 2017,improved Training of Wasserstein GANspdf

Tensorflow 实现:https://github.com/igul222/improved_wgan_training

pytorch https://github.com/caogang/wgan-gp

参考 :

https://www.leiphone.com/news/201704/pQsvH7VN8TiLMDlK.html


Level 2: Implementation skill

GAN 的实现

Title Co-authors Publication Links size FID/IS
Keras Implementation of GANs Linder-Norén GitHub link
GAN implementation hacks Salimans paper & Chintala World research link paper
DCGAN : Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks Radford & et al. 2015.11-ICLR 2016 link paper 64x64 human
ProGAN:Progressive Growing of GANs for Improved Quality, Stability, and Variation Tero Karras 2017.10 paper link 1024x1024 human 8.04
SAGAN:Self-Attention Generative Adversarial Networks Han Zhang & Ian Goodfellow 2018.05 paper link 128x128 obj 18.65/52.52
BigGAN:Large Scale GAN Training for High Fidelity Natural Image Synthesis Brock et al. 2018.09-ICLR 2019 demo paper link 512x512 obj 9.6/166.3
StyleGAN:A Style-Based Generator Architecture for Generative Adversarial Networks Tero Karras 2018.12 paper link 1024x1024 human 4.04

指标:

1 Inception Score (IS,越大越好) IS 用来衡量 GAN 网络的两个指标:1. 生成图片的质量 和 2. 多样性

2 Fréchet Inception Distance (FID,越小越好) 在 FID 中我们用相同的 inception network 来提取中间层的特征。然后我们使用一个均值为 μμ 方差为 ΣΣ 的正态分布去模拟这些特征的分布。较低的 FID 意味着较高图片的质量和多样性。FID 对模型坍塌更加敏感。

FID 和 IS 都是基于特征提取,也就是依赖于某些特征的出现或者不出现。但是他们都无法描述这些特征的空间关系。

物体的数据在 Imagenet 数据库上比较,人脸的 progan 和 stylegan 在 CelebA-HQ 和 FFHQ 上比较。上表列的为 FFHQ 指标。

DCGAN

Deep Convolution Generative Adversarial Networks(深度卷积生成对抗网络)

Alec Radford & Luke Metz 提出使用 CNN 结构来稳定 GAN 的训练,并使用了以下一些 trick:

Batch Normalization 使用 Transpose convlution 进行上采样 使用 Leaky ReLu 作为激活函数 上面这些 trick 对于稳定 GAN 的训练有许多帮助

这是 CNN 在 unsupervised learning 领域的一次重要尝试,这个架构能极大地稳定 GAN 的训练,以至于它在相当长的一段时间内都成为了 GAN 的标准架构,给后面的探索开启了重要的篇章。

ImprovedDCGAN

GANs 的主要问题之一是收敛性不稳定,尽管 DCGAN 做了结构细化,训练过程仍可能难以收敛。GANs 的训练常常是同时在两个目标上使用梯度下降,然而这并不能保证到达均衡点,毕竟目标未必是凸的。也就是说 GANs 可能永远达不到这样的均衡点,于是就会出现收敛性不稳定。

为了解决这一问题,ImprovedDCGAN 针对 DCGAN 训练过程提出了不同的增强方法。 1 特征匹配(feature mapping)

为了不让生成器尽可能地去蒙骗鉴别器,ImprovedDCGAN 希望以特征作为匹配标准,而不是图片作为匹配标准,于是提出了一种新的生成器的目标函数

2 批次判别(minibatch discrimination)

GAN 的一个常见的失败就是收敛到同一个点,只要生成一个会被 discriminator 误认的内容,那么梯度方向就会不断朝那个方向前进。ImprovedDCGAN 使用的方法是用 minibatch discriminator。也就是说每次不是判别单张图片,而是判别一批图片。 3 历史平均(historical averaging) 4 单侧标签平滑(one-sided label smoothing)

PGGAN(ProGAN)

Progressive Growing of GANs for Improved Quality, Stability, and Variation

Tero Karras, Timo Aila, Samuli Laine, Jaakko Lehtinen

首次实现了 1024 人脸生成的 Progressive Growing GANs,简称 PGGAN,来自 NVIDIA。

顾名思义,PGGAN 通过一种渐进式的结构,实现了从低分辨率到高分辨率的过渡,从而能平滑地训练出高清模型出来。论文还提出了自己对正则化、归一化的一些理解和技巧,值得思考。当然,由于是渐进式的,所以相当于要串联地训练很多个模型,所以 PGGAN 很慢。

论文地址:https://arxiv.org/pdf/1710.10196.pdf 代码实现地址:https://github.com/tkarras/progressive_growing_of_gans

CelebA HQ 数据集

"随着 ResNet 在分类问题的日益深入,自然也就会考虑到 ResNet 结构在 GAN 的应用。事实上,目前 GAN 上主流的生成器和判别器架构确实已经变成了 ResNet:PGGAN、SNGAN、SAGAN 等知名 GAN 都已经用上了 ResNet

可以看到,其实基于 ResNet 的 GAN 在整体结构上与 DCGAN 并没有太大差别,主要的特点在于: 1) 不管在判别器还是生成器,均去除了反卷积,只保留了普通卷积层; 2) 通过 AvgPooling2D 和 UpSampling2D 来实现上/下采样,而 DCGAN 中则是通过 stride > 1 的卷积/反卷积实现的;其中 UpSampling2D 相当于将图像的长/宽放大若干倍; 3) 有些作者认为 BN 不适合 GAN,有时候会直接移除掉,或者用 LayerNorm 等代替。

然而,ResNet 层数更多、层之间的连接更多,相比 DCGAN,ResNet 比 DCGAN 要慢得多,所需要的显存要多得多。 ---苏剑林

SAGAN Ian Goodfellow

由于卷积的局部感受野的限制,如果要生成大范围相关(Long-range dependency)的区域会出现问题,用更深的卷积网络参数量太大,于是采用将 Self Attention 引入到了生成器(以及判别器)中,使用来自所有特征位置的信息生成图像细节,同时保证判别器能鉴别距离较远的两个特征之间的一致性,获取全局信息。 IS 从 36.8 提到了 52.52,并把 FID(Fréchet Inception Distance)从 27.62 降到了 18.65。

SAGAN 使用注意力机制,高亮部位为注意力机制关注的位置。

论文地址:https://arxiv.org/pdf/1805.08318v2.pdf

https://github.com/taki0112/Self-Attention-GAN-Tensorflow

pytorch https://github.com/heykeetae/Self-Attention-GAN

SELF-MOD

Self Modulated Generator,来自文章 On Self Modulation for Generative Adversarial Networks

SELF-MOD 考虑到 cGAN 训练的稳定性更好,但是一般情况下 GAN 并没有标签 c 可用,而以噪声 z 自身为标签好了,自己调节自己,不借助于外部标签,但能实现类似的效果。

BigGAN

BigGAN — Brock et al. (2019) Large Scale GAN Training for High Fidelity Natural Image Synthesis”

https://arxiv.org/pdf/1809.11096.pdf

BigGAN 模型是基于 ImageNet 生成图像质量最高的模型之一。BigGAN 作为 GAN 发展史上的重要里程碑,将精度作出了跨越式提升。在 ImageNet (128x128 分辨率)训练下,将 IS 从 52.52 提升到 166.3,FID 从 18.65 降到 9.6。 该模型很难在本地机器上实现,而且 BigGAN 有许多组件,如 Self-Attention、 Spectral Normalization 和带有投影鉴别器的 cGAN,这些组件在各自的论文中都有更好的解释。不过,这篇论文对构成当前最先进技术水平的基础论文的思想提供了很好的概述,论文贡献包括,大 batchsize,大 channel 数,截断技巧,训练平稳性控制等。(暴力出奇迹)

这篇文章提供了 128、256、512 的自然场景图片的生成结果。 自然场景图片的生成可是比 CelebA 的人脸生成要难上很多

GitHub:https://github.com/AaronLeong/BigGAN-pytorch

参考 https://mp.weixin.qq.com/s/9GeryvW5PI93FCmTpuFEPQ 此外 https://mp.weixin.qq.com/s?__biz=MzIwMTc4ODE0Mw==&mid=2247495491&idx=1&sn=978f0afeb0b38affe54fc9e6d6086e3c&chksm=96ea30c3a19db9d52b735bdfee3f535ce68bcc6ace230b452b2ef8d389e66d32bba38e1574e3&scene=21#wechat_redirect

Spectral Normalization 出自 《Spectral Norm Regularization for Improving the Generalizability of Deep Learning》 和 《Spectral Normalization for Generative Adversarial Networks》,是为了解决 GAN 训练不稳定的问题,从“层参数”的角度用 spectral normalization 的方式施加 regularization,从而使判别器 D 具备 Lipschitz 连续条件。

StyleGAN NVIDIA

A Style-Based Generator Architecture for Generative Adversarial Networks

被很多文章称之为 GAN 2.0,借鉴了风格迁移的模型,所以叫 Style-Based Generator

新数据集 FFHQ。

ProGAN 是逐级直接生成图片,特征无法控制,相互关联,我们希望有一种更好的模型,能让我们控制生成图片过程中每一级的特征,要能够特定决定生成图片某些方面的表象,并且相互间的影响尽可能小。于是,在 ProGAN 的基础上,StyleGAN 作出了进一步的改进与提升。

StyleGAN 首先重点关注了 ProGAN 的生成器网络,它发现,渐进层的一个潜在的好处是,如果使用得当,它们能够控制图像的不同视觉特征。层和分辨率越低,它所影响的特征就越粗糙。简要将这些特征分为三种类型: 1、粗糙的——分辨率不超过 8^2,影响姿势、一般发型、面部形状等; 2、中等的——分辨率为 16^2 至 32^2,影响更精细的面部特征、发型、眼睛的睁开或是闭合等; 3、高质的——分辨率为 64^2 到 1024^2,影响颜色(眼睛、头发和皮肤)和微观特征;

tf: https://github.com/NVlabs/stylegan

不存在系列:

人 : https://thispersondoesnotexist.com/

动漫: https://www.thiswaifudoesnotexist.net/

https://www.obormot.net/demos/these-waifus-do-not-exist-alt

猫: http://thesecatsdonotexist.com/

Estimated StyleGAN wallclock training times for various resolutions & GPU-clusters (source: StyleGAN repo)

GPUs 1024x2 512x2 256x2 [March 2019 AWS Costs19]
1 41 days 4 hours [988 GPU-hours] 24 days 21 hours [597 GPU-hours] 14 days 22 hours [358 GPU-hours] [$320, $194, $115]
2 21 days 22 hours [1,052] 13 days 7 hours [638] 9 days 5 hours [442] [NA]
4 11 days 8 hours [1,088] 7 days 0 hours [672] 4 days 21 hours [468] [NA]
8 6 days 14 hours [1,264] 4 days 10 hours [848] 3 days 8 hours [640] [$2,730, $1,831, $1,382]

BigBiGAN DeepMind

https://arxiv.org/pdf/1907.02544.pdf

大规模对抗性表示学习 DeepMind 基于最先进的 BigGAN 模型构建了 BigBiGAN 模型,通过添加编码器和修改鉴别器将其扩展到表示学习。

BigBiGAN 表明,“图像生成质量的进步转化为了表示学习性能的显著提高”。

研究人员广泛评估了 BigBiGAN 模型的表示学习和生成性能,证明这些基于生成的模型在 ImageNet 上的无监督表示学习和无条件图像生成方面都达到了 state of the art 的水平。

介绍

PS: O-GAN 可以加入其它的 loss 将生成器 变为编码器。

通过简单地修改原来的 GAN 模型,就可以让判别器变成一个编码器,从而让 GAN 同时具备生成能力和编码能力,并且几乎不会增加训练成本。这个新模型被称为 O-GAN(正交 GAN,即 Orthogonal Generative Adversarial Network),因为它是基于对判别器的正交分解操作来完成的,是对判别器自由度的最充分利用。

Arxiv 链接:https://arxiv.org/abs/1903.01931

开源代码:https://github.com/bojone/o-gan

https://kexue.fm/archives/6409

TL-GAN : 找到隐藏空间中的特征轴(如 BigGAN PGGAN 等,然后在特征轴上调节) zhihu zhihu

日本的开源 GAN 插件,局部定制毫无压力 | Demo


Level 3: GANs Applications in CV

3.1 图像翻译 (Image Translation)

图像翻译,指从一副(源域)输入的图像到另一副(目标域)对应的输出图像的转换。它代表了图像处理的很多问题,比如灰度图、梯度图、彩色图之间的转换等。可以类比机器翻译,一种语言转换为另一种语言。翻译过程中会保持源域图像内容不变,但是风格或者一些其他属性变成目标域。

有标注数据的,被称为 Paired Image-to-Image Translation,没有标注数据的,被称为 Unpaired Image-to-Image Translation。

  • Paired two domain data
  • Unpaired two domain data

1. Paired two domain data

成对图像翻译典型的例子就是 pix2pix,pix2pix 使用成对数据训练了一个条件 GAN,Loss 包括 GAN 的 loss 和逐像素差 loss。而 PAN 则使用特征图上的逐像素差作为感知损失替代图片上的逐像素差,以生成人眼感知上更加接近源域的图像。

Pix2Pix

Image-to-Image Translation with Conditional Adversarial Networks

https://arxiv.org/pdf/1611.07004v1.pdf

传统的 GAN 也不是万能的,它有下面两个不足:

  1. 没有用户控制(user control)能力 在传统的 GAN 里,输入一个随机噪声,就会输出一幅随机图像。但用户是有想法滴,我们想输出的图像是我们想要的那种图像,和我们的输入是对应的、有关联的。比如输入一只猫的草图,输出同一形态的猫的真实图片(这里对形态的要求就是一种用户控制)。
  2. 低分辨率(Low resolution)和低质量(Low quality)问题 尽管生成的图片看起来很不错,但如果你放大看,就会发现细节相当模糊。 ----------------朱俊彦(Jun-Yan Zhu) Games2018 Webinar 64 期 :Siggraph 2018 优秀博士论文报告

Pix2Pix 对传统的 CGAN 做了个小改动,它不再输入随机噪声,而是输入用户给的图片:

通过 pix2pix 来完成成对的图像转换(Labels to Street Scene, Aerial to Map,Day to Night 等),可以得到比较清晰的结果。

代码:

官方 project:https://phillipi.github.io/pix2pix/

官方 torch 代码:https://github.com/phillipi/pix2pix

官方 pytorch 代码(CycleGAN、pix2pix):https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

第三方的 tensorflow 版本:https://github.com/yenchenlin/pix2pix-tensorflow

https://github.com/affinelayer/pix2pix-tensorflow

demo: https://affinelayer.com/pixsrv/

Edges2cats: http://affinelayer.com/pixsrv/index.html

http://paintschainer.preferred.tech/index_zh.html

Pix2Pix HD

High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs

https://arxiv.org/pdf/1711.11585v2.pdf

Ming-Yu Liu 在介入过许多 CV 圈内耳熟能详的项目,包括 vid2vid、pix2pixHD、CoupledGAN、FastPhotoStyle、MoCoGAN

1 模型结构 2 Loss 设计 3 使用 Instance-map 的图像进行训练。

官方代码 :https://github.com/NVIDIA/pix2pixHD

pix2pix 的核心是有了对应关系,这种网络的应用范围还是比较广泛的,如草稿变图片,自动上色,交互式上色等。

2. Unpaired two domain data

对于无成对训练数据的图像翻译问题,一个典型的例子是 CycleGAN。CycleGAN 使用两对 GAN,将源域数据通过一个 GAN 网络转换到目标域之后,再使用另一个 GAN 网络将目标域数据转换回源域,转换回来的数据和源域数据正好是成对的,构成监督信息。

CycleGan /DiscoGan /DualGan

CycleGan: Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

朱俊彦

https://arxiv.org/abs/1703.10593

同一时期还有两篇非常类似的文章,同样的 idea,同样的结构,同样的功能:DualGAN( https://arxiv.org/abs/1704.02510 ) 和 DiscoGAN( Learning to Discover Cross-Domain Relations with Generative Adversarial Networks : https://arxiv.org/abs/1703.05192)

CycleGan 是让两个 domain 的图片互相转化。传统的 GAN 是单向生成,而 CycleGAN 是互相生成,一个 A→B 单向 GAN 加上一个 B→A 单向 GAN,网络是个环形,所以命名为 Cycle。理念就是,如果从 A 生成的 B 是对的,那么从 B 再生成 A 也应该是对的。CycleGAN 输入的两张图片可以是任意的两张图片,也就是 unpaired。

官方 pytorch 代码(CycleGAN、pix2pix):https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

有趣的应用: 地图转换 风格转换 游戏画风转换:Chintan Trivedi 的实现:用 CycleGAN 把《堡垒之夜》转成《绝地求生》写实风。

StarGan

StarGAN 的引入是为了解决多领域间的转换问题的,之前的 CycleGAN 等只能解决两个领域之间的转换,那么对于含有 C 个领域转换而言,需要学习 Cx(C-1)个模型,但 StarGAN 仅需要学习一个

https://arxiv.org/pdf/1711.09020.pdf

pytorch 原版 GitHub 地址:https://github.com/yunjey/StarGAN tf 版 GitHub 地址:https://github.com/taki0112/StarGAN-Tensorflow

CoGAN (CoupledGAN)

CoGAN:Coupled Generative Adversarial Networks

CoGAN 会训练两个 GAN 而不是一个单一的 GAN。

当然,GAN 研究人员不停止地将此与那些警察和伪造者的博弈理论进行类比。所以这就是 CoGAN 背后的想法,用作者自己的话说就是:

在游戏中,有两个团队,每个团队有两个成员。生成模型组成一个团队,在两个不同的域中合作共同合成一对图像,用以混淆判别模型。判别模型试图将从各个域中的训练数据分布中绘制的图像与从各个生成模型中绘制的图像区分开。同一团队中,参与者之间的协作是根据权重分配约束建立的。这样就有了一个 GAN 的多人局域网竞赛

CoupledGAN 通过部分权重共享学习到多个域图像的联合分布。生成器前半部分权重共享,目的在于编码两个域高层的,共有信息,后半部分没有进行共享,则是为了各自编码各自域的数据。判别器前半部分不共享,后半部分用于提取高层特征共享二者权重。对于训练好的网络,输入一个随机噪声,输出两张不同域的图片。

值得注意的是,上述模型学习的是联合分布 P(x,y),如果使用两个单独的 GAN 分别取训练,那么学习到的就是边际分布 P(x) 和 P(y)。。

论文:

https://arxiv.org/abs/1606.07536

代码:

https://github.com/mingyuliutw/CoGAN

博客:

https://wiseodd.github.io/techblog/2017/02/18/coupled_gan/

FUNIT

Few-Shot Unsupervised Image-to-Image Translation

https://arxiv.org/pdf/1905.01723.pdf

小样本(few-shot)非监督图像到图像转换。

https://github.com/NVlabs/FUNIT


3.2 超分辨率 (Super-Resolution)

超分辨率的问题研究由来已久,其目标是将低分辨率图像恢复或重建为高分辨率图像,随着 GAN 的发展,使得这个问题有了惊人的进展。这项技术得以广泛应用于卫星和航天图像分析、医疗图像处理、压缩图像/视频增强及手机摄像领域,有着明确商业用途。SR 技术存在一个有趣的“悖论”,即还原或重建后的高分辨率图像与原图相似度越高,则肉眼观察清晰度越差;反之,若肉眼观察清晰度越好,则图像的失真度越高。导致这一现象的原因在于畸变(Distortion)参数和感知(Perception)参数之间侧重点选择的不同。

传统方法有 Google 发布的 RAISR: Rapid and Accurate Image Super Resolution(2016 paper ) 国内也同期都发布了自己的算法,如腾讯发布的 TSR(Tencent Super Resolution),华为的 HiSR 等。

超分辨率的比赛 为 NTIRE

客观指标:Peak signal-to-noise ratio (PSNR)

主观指标:在纯的超分辨领域,评价性能的指标是 PSNR(和 MSE 直接挂钩),所以如果单纯看 PSNR 值可能还是 L2 要好。如果考虑主观感受的话估计 L1 要好。

SR 可分为两类:从多张低分辨率图像重建出高分辨率图像和从单张低分辨率图像重建出高分辨率图像。基于深度学习的 SR,主要是基于单张低分辨率的重建方法,即 Single Image Super-Resolution (SISR)。

SISR 是一个逆问题,对于一个低分辨率图像,可能存在许多不同的高分辨率图像与之对应,因此通常在求解高分辨率图像时会加一个先验信息进行规范化约束。在传统的方法中,这个先验信息可以通过若干成对出现的低-高分辨率图像的实例中学到。而基于深度学习的 SR 通过神经网络直接学习分辨率图像到高分辨率图像的端到端的映射函数。

较新的基于深度学习的 SR 方法,包括 SRCNN,DRCN, ESPCN,VESPCN 和 SRGAN 等。(SRCNN[1]、FSRCNN[2]、ESPCN[3]、VDSR[4]、EDSR[5]、SRGAN[6])

  1. (SRCNN) Image super-resolution using deep convolutional networks
  2. (DRCN) Deeply-recursive convolutional network for image super-resolution
  3. (ESPCN) Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network
  4. (VESPCN) Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation
  5. Spatial transformer networks
  6. Photo-realistic single image super-resolution using a generative adversarial network (SRGAN)

3.2.1 单张图像超分辨率(Single Image Super-Resolution)

StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks Zhang & et al. ICCV 2017

GAN 对于高分辨率图像生成一直存在许多问题,层级结构的 GAN 通过逐层次,分阶段生成,一步步提生图像的分辨率。典型的使用多对 GAN 的模型有 StackGAN,GoGAN。使用单一 GAN,分阶段生成的有 ProgressiveGAN。

SRGAN

SRGAN,2017 年 CVPR 中备受瞩目的超分辨率论文,把超分辨率的效果带到了一个新的高度,而 2017 年超分大赛 NTIRE 的冠军 EDSR 也是基于 SRGAN 的变体。

SRGAN 是基于 GAN 方法进行训练的,有一个生成器和一个判别器,判别器的主体使用 VGG19,生成器是一连串的 Residual block 连接,同时在模型后部也加入了 subpixel 模块,借鉴了 Shi et al 的 Subpixel Network 思想,重点关注中间特征层的误差,而不是输出结果的逐像素误差。避免了生成的高分辨图像缺乏纹理细节信息问题。让图片在最后面的网络层才增加分辨率,提升分辨率的同时减少计算资源消耗。

胡志豪提出一个来自工业界的问题 在实际生产使用中,遇到的低分辨率图片并不一定都是 PNG 格式的(无损压缩的图片复原效果最好),而且会带有不同程度的失真(有损压缩导致的 artifacts)。很多算法包括 SRGAN、EDSR、RAISR、Fast Neural Style 等等都没法在提高分辨率的同时消除失真。 Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network (https://arxiv.org/abs/1609.04802, 21 Nov, 2016)这篇文章将对抗学习用于基于单幅图像的高分辨重建。基于深度学习的高分辨率图像重建已经取得了很好的效果,其方法是通过一系列低分辨率图像和与之对应的高分辨率图像作为训练数据,学习一个从低分辨率图像到高分辨率图像的映射函数,这个函数通过卷积神经网络来表示。

得益于 GAN 在超分辨中的应用,针对小目标检测问题,可以通过 GAN 生成小目标的高分辨率图像从而提高目标检测精度

TensorFlow 版本:https://github.com/buriburisuri/SRGAN

Torch 版本:https://github.com/leehomyc/Photo-Realistic-Super-Resoluton

Keras 版本:https://github.com/titu1994/Super-Resolution-using-Generative-Adversarial-Networks

ESRGAN

ECCV 2018 收录,赢得了 PIRM2018-SR 挑战赛的第一名。

其他应用 : Google 马赛克去除 ( Pixel Recursive Super Resolution https://arxiv.org/abs/1702.00783)


3.3 交互式图像生成

iGAN

基于 DCGAN,Adobe 公司构建了一套图像编辑操作,能使得经过这些操作以后,图像依旧在“真实图像流形”上,因此编辑后的图像更接近真实图像。

具体来说,iGAN 的流程包括以下几个步骤:

1 将原始图像投影到低维的隐向量空间

2 将隐向量作为输入,利用 GAN 重构图像

3 利用画笔工具对重构的图像进行修改(颜色、形状等)

4 将等量的结构、色彩等修改应用到原始图像上。

值得一提的是,作者提出 G 需为保距映射的限制,这使得整个过程的大部分操作可以转换为求解优化问题,整个修改过程近乎实时。

Theano 版本:https://github.com/junyanz/iGAN

[24] Jun-Yan Zhu, Philipp Krähenbühl, Eli Shechtman and Alexei A. Efros. “Generative Visual Manipulation on the Natural Image Manifold”, ECCV 2016.

GANpaint

GAN dissection

MIT、香港中文大学、IBM 等学校/机构的 David Bau、朱俊彦、Joshua B.Tenenbaum、周博磊

http://gandissect.res.ibm.com/ganpaint.html?project=churchoutdoor&layer=layer4

GauGAN(SPADE) Nvidia

你画一幅涂鸦,用颜色区分每一块对应着什么物体,它就能照着你的大作,合成以假乱真的真实世界效果图。 通过语义布局进行图像的生成 Segmentation mask,算法是源于 Pix2PixHD,生成自然的图像。

数据来源是成对的,通过自然场景的图像进行分割,就可以得到分割图像的布局,组成了对应的图像对。 但是区别在于,之前的 Pix2PixHD,场景都很规律,如室内,街景,可以使用 BN,但是后来发现 Pix2PixHD 在 COCO 这些无限制的数据集训练结果很差。如果整张天空或者整张的草地,则计算通过 BN 后,结果很相似,这样合成会出现问题。于是修改了 BN,这种方法称为空间自适应归一化合成法 SPADE。将原来的 label 信息代入到原来 BN 公式中的 γ 和 β

Semantic Image Synthesis with Spatially-Adaptive Normalization--CVPR 2019。

这篇论文的一作,照例还是实习生。另外几位作者来自英伟达和 MIT,CycleGAN 的创造者朱俊彦是四作。

在基于语义合成图像这个领域里,这可是目前效果最强的方法。

paper:https://arxiv.org/abs/1903.07291

GitHub:https://github.com/NVlabs/SPADE

项目地点:https://nvlabs.github.io/SPADE/

https://nvlabs.github.io/SPADE/demo.html https://nvlabs.github.io/SPADE/

https://36kr.com/p/5187136

demo:

https://nvlabs.github.io/SPADE/demo.html http://nvidia-research-mingyuliu.com/gaugan


最后,之前说全民 AI 的时代即将到来,现在发现全民 GAN 的时代也不远了。希望大家继续努力学习~ 加油鸭

如果对深度学习的基础模型感兴趣的朋友,可以看之前的文章:Gingo:AI 应用之深度学习算法总览

最近 GitHub 上做了很多完善,也用 PlotNeuralNet 画了一些模型,

author 的

源码地址如下,如果喜欢别忘记右上角 star 一下哦:

weslynn/AlphaTree-graphic-deep-neural-network​github.com图标