StyleGAN2发展介绍 & 花卉图像生成 & 模型修改

第一部分-----StyleGAN2发展介绍

stylegan发展:gan要做的事情是通过生成器由简单分布生成复杂图像分布,生成的图片分布和真实图片分布的差距越小越好,这一步通过判别器实现。生成大的、质量高的图任务量大,由此产生由小至大、逐级生成的想法,这就是proGAN的思路,但是这里说的逐级生成不是连接(连接的思想是stackgan),而是变化,即生成器内的网络只有一个,训练中网络结构动态变化,此处的动态变化使用了PGGAN提出的平滑过渡技术实现。再然后,人们想控制图像每一级的特征,便产生了stylegan。

StyleGAN介绍:网络结构如下,首先使用 Mapping Network 将输入向量编码为中间变量 w 进行特征解缠,然后中间变量传给生成网络得到18个控制变量,使得该控制变量的不同元素能够控制不同的视觉特征。
 视觉特征可以简单分为三种:(1)粗糙的——分辨率不超过82,影响姿势、一般发型、面部形状等;(2)中等的——分辨率为162至322,影响更精细的面部特征、发型、眼睛的睁开或是闭合等;(3)高质的——分辨率为642到10242,影响颜色(眼睛、头发和皮肤)和微观特征;
StyleGAN亮点
(1)使用Mapping Network进行特征解缠:由8个全连接层组成,并且输出与输入层(512×1)的大小相同。Mapping Network 能够学习到特征解缠的原因:简单来说,如果仅使用输入向量来控制视觉特征,能力是非常有限的,因此它必须遵循训练数据的概率密度。例如,如果黑头发的人的图像在数据集中更常见,那么更多的输入值将会被映射到该特征上。因此,该模型无法将部分输入(向量中的元素)映射到特征上,这就会造成特征纠缠。然而,通过使用另一个神经网络,该模型可以生成一个不必遵循训练数据分布的向量,并且可以减少特征之间的相关性。

(2)样式模块AdaIN :生成器由于从 4*4,变换到 8*8,并最终变换到 1024*1024,所以它由 9 个生成阶段组成,而每个阶段都会受两个控制向量(A)对其施加影响,其中一个控制向量在 Upsample之后对其影响一次,另外一个控制向量在 Convolution 之后对其影响一次,影响的方式都采用 AdaIN(自适应实例归一化)。因此,中间向量 W' 总共被变换成 18 个控制向量(A)传给生成器。 

 (3)删除传统输入:StyleGAN 生成图像的特征是由 W' 和 AdaIN 控制的,那么生成器的初始输入可以被忽略,并用常量值替代。这样做的理由是,首先可以降低由于初始输入取值不当而生成出一些不正常的照片的概率(这在 GANs 中非常常见),另一个好处是它有助于减少特征纠缠,对于网络在只使用 W' 不依赖于纠缠输入向量的情况下更容易学习。


(4)随机变化:人们的脸上有许多小的特征,可以看作是随机的,例如:雀斑、发髻线的准确位置、皱纹、使图像更逼真的特征以及各种增加输出的变化。将这些小特征插入 GAN 图像的常用方法是在输入向量中添加随机噪声。为了控制噪声仅影响图片样式上细微的变化,StyleGAN 采用类似于 AdaIN 机制的方式添加噪声,即在 AdaIN 模块之前向每个通道添加一个缩放过的噪声,并稍微改变其操作的分辨率级别特征的视觉表达方式。加入噪声后的生成人脸往往更加逼真与多样。


(5)style mixing:StyleGAN 生成器在合成网络的每个级别中使用了中间向量,这有可能导致网络学习到这些级别是相关的。为了降低相关性,模型随机选择两个输入向量,并为它们生成了中间向量 W' 。然后,它用第一个输入向量来训练一些网络级别,然后(在一个随机点中)切换到另一个输入向量来训练其余的级别。随机的切换确保了网络不会学习并依赖于一个合成网络级别之间的相关性。虽然它并不会提高所有数据集上的模型性能,但是这个概念能够以一种连贯的方式来组合多个图像。该模型生成了两个图像A 和 B,然后通过从 A 中提取低级别的特征并从 B 中提取其余特征再组合这两个图像,这样能生成出混合了 A 和 B 的样式特征的新人脸。


(6)截断技巧:很早的GAN中就提出了这个技巧。为了避免生成较差的图像,StyleGAN 截断了中间向量 W' ,迫使它保持接近“平均”的中间向量(上图左 4)。对模型进行训练之后,通过选择多个随机的输入,用映射网络生成它们的中间向量,并计算这些向量的平均值,从而生成“中间向量”的平均值 W' avg。当生成新的图像时,不用直接使用映射网络的输出,而是将值 W' 转换为 W' new =  W' avg + Ψ( W' - W' avg),其中Ψ的值定义了图像与“平均”图像的差异量(以及输出的多样性)。在仿射转换块之前,通过对每个级别使用不同的Ψ,模型可以控制每个级别上的特征值与平均特征值的差异量。

StyleGAN2对StyleGAN的改进StyleGAN存在瑕疵,少量生成的图片有明显的水珠,这个水珠也存在于feature map上,如下图。导致水珠的原因是 AdaIN 操作,AdaIN对每个feature map进行归一化,因此有可能会破坏掉 feature 之间的信息。

改进具体有三点
(1)Weight Demodulation: v1使用AdaIN来控制source vector W 对生成人脸的影响程度,同BN层类似,其目的是对网络中间层的输出结果进行scale和shift,以增加网络的学习效果,避免梯度消失。相对于BN是学习当前batch数据的mean和variance,Instance Norm则是采用了单张图片。AdaIN则是使用learnable的scale和shift参数去对齐特征图中的不同位置,该方法能够显著地解耦(remarkable disentanglement) low-level的"style"特征和high-level的"content"特征,AdaIN的出现使得风格迁移任务从受限于一种风格或者需要lengthy optimization process的情况中摆脱了出来,仅通过归一化统计就可以将风格(style)和内容(content)结合起来。 生成器通过将信息sneaking在这些层中来克服信息丢失的问题,但是这却带来了水印问题(water-droplet artifacts),但是判别器却无法判别出来,为了解决伪影的问题,v2将AdaIN重构为Weight Demodulation。


(2)No Progressive growth:StyleGAN使用的Progressive growth会有一些缺点,如下图,当人脸向左右偏转的时候,牙齿却没有偏转,即人脸的一些细节如牙齿、眼珠等位置比较固定,没有根据人脸偏转而变化,造成这种现象是因为采用了Progressive growth训练,Progressive growth是先训练低分辨率,等训练稳定后,再加入高一层的分辨率进行训练,训练稳定后再增加分辨率,即每一种分辨率都会去输出结果,这会导致输出频率较高的细节,如下图中的牙齿,而忽视了移动的变化。


(3)Path Length Regularization:在生成人脸的同时,我们希望能够控制人脸的属性,不同的latent code能得到不同的人脸,当确定latent code变化的具体方向时,该方向上不同的大小应该对应了图像上某一个具体变化的不同幅度。为了达到这个目的,设计了 Path length regularization ,它的意义是使得latent space的插值变得更加smooth和线性。简单来说,当在latent space中对latent vector进行插值操作时,我们希望对latent vector的等比例的变化直接反映到图像中去。即:“在latent space和image space应该有同样的变化幅度(线性的latent space)”。文中通过对生成器(Generator) 增加了一个loss项来达到这个目标。

 

第二部分----花卉图像生成实验

官方开源代码https://github.com/NVlabs/stylegan2-ada-pytorch

数据选取:由102类产自英国的花卉组成,每类由40-258张图片组成,共有8189张jpg格式图像。分类的细节和每类花卉的数量见【这里】,下载地址见【这里】。尺寸不统一,大概500*600

 实际训练数据:对图像resize到128*128,resize的大小随意,但是输入要求是方形,我的选择是由于显卡显存限制。下图是为了方便查看由随机选取的子集进行拼接得到。

效果:下图是800个epoch的效果,已经生成的非常好了。 

 模型修改:更改了Mapping Network 层数 8 → 4,输入向量维度 512 → 256。生成器参数量 23M → 20M,训练效果差距不大。

  • 2
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值