“在机器学习过去的10年里,GAN是最有趣的一个想法。” ——Yann LeCun
GAN
2019年,是很重要的一年。在这一年里,GAN有了重大的进展,出现了 BigGan,StyleGan 这样生成高清大图的GAN,也出现了很多
这一切预示着GAN这个话题,马上就要被勤勉的科学家们攻克了。
从目标分类的被攻克,人脸识别的特征提取和loss改进,目标检测与分割的统一…… 深度学习的堡垒一个接一个的被攻克。一切都迅速都走上可应用化的道路。
深度学习的发展惊人,如果说互联网过的是狗年,一年抵七年,深度学习的发展一定是在天宫的,天上一天,地上一年。
本文参考Mohammad KHalooei的教程,也将GAN在图像上的应用分为4个level,第四个level将按照应用层面进行拓展。
- Level 0: Definition of GANs GAN的基础结构发展,时间主要是在2014-2016之间,很多重要的结构,概念在这段时间被提出。譬如CGAN等。这里列出了四篇论文。
- Level 1: Improvements of GANs training,GAN的训练还不稳定,除了结构上的改进,也有很多在 loss、参数、权重的改进,2017年有了重大的突破,大名鼎鼎的WGAN也诞生了。这里列出了五篇论文。包括LSGAN WGAN WGAN-GP等
- Level 2: Implementation skill 这个level主要讲GAN的实现。从DCGAN,到ProGAN,SAGAN,BigGAN,StyleGAN。我们可以看到这两年,无论是人脸的生成还是物体的生成都有了不小的进步。
- 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)
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
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也不是万能的,它有下面两个不足:
- 没有用户控制(user control)能力 在传统的GAN里,输入一个随机噪声,就会输出一幅随机图像。但用户是有想法滴,我们想输出的图像是我们想要的那种图像,和我们的输入是对应的、有关联的。比如输入一只猫的草图,输出同一形态的猫的真实图片(这里对形态的要求就是一种用户控制)。
- 低分辨率(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])
- (SRCNN) Image super-resolution using deep convolutional networks
- (DRCN) Deeply-recursive convolutional network for image super-resolution
- (ESPCN) Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network
- (VESPCN) Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation
- Spatial transformer networks
- 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/
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-networkgithub.com