简介
NVIDIA在2017年提出的ProGAN解决了生成高分辨率图像(如1024×1024)的问题。ProGAN的关键创新之处在于渐进式训练——从训练分辨率非常低的图像(如4×4)的生成器和判别器开始,每次都增加一个更高的分辨率层。
存在的问题:与多数GAN一样,ProGAN控制生成图像的特定特征的能力非常有限。这些属性相互纠缠,即使略微调整输入,会同时影响生成图像的多个属性。所以如何将ProGAN改为条件生成模型,或者增强其微调单个属性的能力,是一个可以研究的方向。
解决方法:StyleGAN是NVIDIA继ProGAN之后提出的新的生成网络,其主要通过分别修改每一层级的输入,在不影响其他层级的情况下,来控制该层级所表示的视觉特征。这些特征可以是粗的特征(如姿势、脸型等),也可以是一些细节特征(如瞳色、发色等)
利用stylegan2生成的网红人脸(现实中不存在的假脸)
性别转换
stylegan
左边是传统生成器,右边为StyleGAN 生成器,由Mapping network和Synthesis network组成
Mapping network用于将Latent code z 转换为w,用来影响图像的style
Synthesis network用于生成图像
Mapping Network
输入维度为512x1,由8个全连接层组成,输出维度为512x1
z是符合均匀分布或者高斯分布的随机变量,所以变量之间的耦合性比较大,难以控制视觉特征。比如数据集中长头发的人很常见,那么更多的输入值便会映射到该特征上,那么z中其他变量也会向着该值靠近、无法更好地映射其他特征,因此通过Mapping network,生成一个不必遵循训练数据分布的向量w,减少了特征之间的相关性,完成解耦
latent code转换得到w后,经过仿射变换生成A,分别送入Synthesis network的每一层网络,进行控制特征,因为Synthesis network的网络层有18层,通过w生成得到了18个控制向量,用于控制不同的视觉特征
Synthesis network
Synthesis network按照输出维度可以分为4x4,8x8,16x16,32x32,64x64,128x128,256x256,512x512,1024x1024,同时每一个都包含两个卷积层,一个Upsample,一个3x3卷积特征学习,一共包含18层
-
利用512 * 4 * 4的输入代替传统初始输入
避免初始输入值取值不当而生成不正常图片
有助于减少特征纠缠 -
随机变化(添加噪声noise)
stylegan通过用噪声 ( noise ) 来影响头发丝、皱纹、肤色等细节部分,为了控制噪声仅影响图片样式上细微的变化, StyleGAN 采用类似于 AdaIN 机制的方式添加噪声(噪声输入是由不相关的高斯噪声组成的单通道数据,它们被馈送到生成网络的每一层)。 即在 AdaIN 模块之前向每个通道添加一个缩放过的噪声,并稍微改变其操作的分辨率级别特征的视觉表达方式。 加入噪声后的生成人脸往往更 加逼真与多样 -
自适应实例归一化(AdaIN)
此前的风格迁移方法,一种网络只对应一种风格,速度很慢。基于AdaIN可以“self modulate” the generator快速实现任意图像风格的转换
特征图的均值和方差中带有图像的风格信息。所以在这一层中,特征图减去自己的均值除以方差,去掉自己的风格。再乘上新风格的方差加上均值,以实现转换的目的。StyleGAN的风格不是由图像的得到的,而是w生成的
- 样式混合(通过混合正则化)
进一步明确风格控制(训练过程中使用)
在训练过程中,stylegan采用混合正则化的手段,即在训练过程中使用两个latent code w (不是1个)。通过Mapping network输入两个latent code z,得到对应的w1和w2(代表两个风格),接下来为它们生成中间变量w’。然后利用第一个w1映射转换后来训练一些网络级别,用另一个w2来训练其余的级别,于是便能生成混合了A和B的样式特征的新人脸
第一部分是 Coarse styles from source B,分辨率(4x4 - 8x8)的网络部分使用B的style,其余使用A的style, 可以看到图像的身份特征随souce B,但是肤色等细节随source A;
第二部分是 Middle styles from source B,分辨率(16x16 - 32x32)的网络部分使用B的style,这个时候生成图像不再具有B的身份特性,发型、姿态等都发生改变,但是肤色依然随A;
第三部分 Fine from B,分辨率(64x64 - 1024x1024)的网络部分使用B的style,此时身份特征随A,肤色随B
大致结论:低分辨率的style 控制姿态、脸型、配件 比如眼镜、发型等style,高分辨率的style控制肤色、头发颜色、背景色等style
- Truncation Trick
** Truncation Trick,截断技巧。从数据分布来说,低概率密度的数据在网络中的表达能力很弱,直观理解就是,低概率密度的数据出现次数少,能影响网络梯度的机会也少,网络学习到其图像特征的能力就会减弱。如何解决该问题呢,truncation trick大致做法如下**
** 首先找到数据中的一个平均点,然后计算其他所有点到这个平均点的距离,对每个距离按照统一标准进行压缩,这样就能将数据点都聚拢了(相当于截断了中间向量𝑊′,迫使它保持接近“平均”的中间向量𝑊′ 𝑎𝑣𝑔),但是又不会改变点与点之间的距离关系**
当生成新的图像时,不用直接使用映射网络(Mapping NetWork)的输出,而是将值𝑊′转换为𝑊′ 𝑛𝑒𝑤 = 𝑊′ 𝑎𝑣𝑔 +𝞧(𝑊′ − 𝑊′ 𝑎𝑣𝑔) ,其中 𝞧 的值定义了图像与“平均”图像的差异量(以及输出的多样性)。有趣的是,在仿射转换块之前,通过对每个级别使用不同的𝞧 ,模型可以控制每个级别上的特征值与平均特征值的差异量
-
微调超参数
** StyleGAN 的另外一个改进措施是更新几个网络超参数,例如训练持续时间和损失函数, 并将图片最接近尺度的缩放方式替换为双线性采样** -
如何量化解耦?
stylegan提出的新方法,不需要解码器,对于任何数据集和生成器都是可计算的。- 感知路径长度(Perceptual path length)
图像生成其实是学习从一个分布到目标分布的迁移过程,如下图,已知input latent code 是z1,或者说白色的狗所表示的latent code是z1,目标图像是黑色的狗,黑狗图像的latent code 是 z2。图中紫色的虚线是z1 到 z2 最快的路径,绿色的曲线是我们不希望的路径
Perceptual path length 是一个指标,用于判断生成器是否选择了最近的路线(比如上图紫色虚线,测量在潜在空间中执行插值时图像的变化程度,来了解隐空间到图像特征之间的纠缠度
- 线性可分性(linear separability)
训练特征,方便之后面部编辑,操纵图像特征,比如将男性图片变为女性
如果隐空间与图像特征足够解耦,那么隐空间中存在线性超平面,可以二分类两种特征。在stylegan的文章中,基于CelebA-HQ数据集,训练40种特征的分类器。然后用生成器生成200000张图像,用训练的分类器分类,去掉置信度最低的一半,得到隐变量和标签已知的100000张图像。对每个属性,用线性SVM拟合预测z的类别,判断z是否足够线性。线性关系用X和Y的分布差异衡量
增加mapping network的深度确实有助于提高w的线性可分性。映射网络对传统生成器有同样的提升,具备通用性。
stylegan2
stylegan2主要是为了解决stylegan的不足之处,最重要的一点就是stylegan生成的图像上容易出现“水滴”。
导致水滴的原因是Adain操作,Adain对每个feature map进行归一化,因此有可能破坏掉feature之间的信息,产生上述现象。而去除了Adain后,该问题便解决了
Adain问题解决 (水滴问题)
weight demodulation
在样式混合(style mixing)中,容易将某个特征放大一个数量级或更多,而在去除了Adain后,便无法有效控制这个问题(因为移除了mean),但style mixing又是stylegan的亮点,如何能够在保留style mixing的同时有效地解决特征放大问题呢?这便是weight demodulation设计的原因。
Lazy regularization
loss 是由损失函数和正则项组成,优化的时候也是同时优化这两项的。
lazy regularization就是正则项可以减少优化的次数,比如每16个minibatch才优化一次正则项,这样可以减少计算量,同时对效果也没什么影响。
Path length regularization
** 在生成人脸的同时,我们希望能够控制人脸的属性,不同的latent code能得到不同的人脸,当确定latent code变化的具体方向时,该方向上不同的大小应该对应了图像上某一个具体变化的不同幅度。为了达到这个目的,设计了 Path length regularization。**
stylegan3
在GAN的合成过程中,某些特征依赖于绝对像素坐标,这会导致:【细节似乎粘在图像坐标上,而不是所要生成对象的表面】而stylegan3从根本上解决了stylegan2图像坐标与特征粘连的问题,实现了真正的图像平移、旋转等不变性,大幅度提高了图像合成质量。
通过上图可以看出来stylegan2生成的毛发等细节会粘在屏幕上,和人物的形态变化不一致
这个问题的出现其实是GAN模型存在的一个普遍问题
生成的过程并不是一个自然的层次化生成。粗糙特征(GAN的浅层网络的输出特征)主要控制了精细特征(GAN的深层网络的输出特征)的存在与否,并没有精细控制它们的出现的精确位置。
简单来讲:如果训练集中大多数图片的眼睛出现在图片居中位置,那么哪怕你的浅层网络输出中图片的眼睛在其他位置,最终整个网络输出的图片眼睛还是基本会处于图片居中位置
作者们认为产生这个现象的根本问题是:目前的生成器网络架构是卷积+非线性+上采样等结构,而这样的架构无法做到很好的Equivariance(等变性)
这种糟糕的 “纹理粘附”在latent值变换的时候会更加明显:
在人脸平移时,对于某个固定的坐标切片,stylegan3可以随人脸移动变化纹理(比如右图那一块固定区域,在左图人脸平移时,也是在不断移动的),而stylegan2则是倾向于生成固定的纹理。
同时stylegan2也无法满足旋转一致性问题
通过实验表明,这些问题出现原因在哪里呢?
(1)使用图像边界参考(例如padding的使用实际上提示了图像的边界位置信息)
(2)像素的噪声输入(防止头发丝粘一起)
(3)位置编码和混叠(加入一些额外的位置信息)。
如何消除这些不需要的辅助信息,从而防止网络去组合、使用这些错误信息呢
针对边界问题,可以在稍大一点的图像边缘上进行操作。
针对像素的噪声输入,可以直接取消掉该操作。
而关于生成图像中的混叠,作者认为有两个可能的来源:
- 非理想上采样(如最近邻、双线性或空洞卷积)产生的像素网格的微弱的印记。 应用pointwise的非线性激活,如ReLU或者Swish。
- 网络会去放大哪怕是最轻微的混叠,并在多个尺度上进行组合,这就成为了固定在图像坐标中的那些混叠状网格的基础(解释了为何特征会依赖于坐标)。
而实验表明,在stylegan2时,当前的上采样滤波器在抑制混叠方面根本不够积极,而且需要具有超过100dB衰减的高质量滤波器。
而针对这个问题,stylegan3根据它们在连续域的影响,提出了一种解决点态非线性引起的混叠的原理,并对结果进行了适当的低通滤波。
傅里叶特征以及基线模型简化
(1) 利用Fourier特征(傅里叶特征)代替了stylegan2生成器的常数输入
(2) 删除了noise输入(特征的位置信息要完全来自前层粗糙特征)
(3) 降低了网络深度(14层,之前是18层),禁用mixing regularization和path length regularization,并且在每次卷积前都使用简单的归一化 (这里有点直接推翻了stylegan2的一些思想)
边界及上采样问题优化
(4) 理论上特征映射有一个无限的空间范围(就是特征不能局限固定在某些坐标域),引入了一个固定大小的boundaries来近似,每一层操作后再crop到这个扩展的空间。
用理想低通滤波器来代替双线性采样。
改进后的boundaries和upsampling得到了更好的平移性,但是fid变差了。
非线性滤波改进
(5) 工程化的操作,改进了非线性滤波,并将整个upsample-LReLU-downsample过程写到一个自定义的CUDA内核中
非临界采样改进
(6) 为了抑制 aliasing(混淆对于生成器的Equivariance很有害),可以简单地将截止频率降低,从而确保所有混叠频率都在阻带。【丢掉了浅层的高频细节,因为作者认为浅层中高频细节并不重要】
傅里叶特征改进
(7) 为了应对每层的全局变换能力有限的问题,加入了一个仿射层,通过输出全局平移和旋转参数输入傅里叶特征,稍微改善了FID
平移不变性
(8) 虽然提高了平移不变性,但是一些可见的伪影仍然存在。这是因为滤波器的衰减对于最低分辨率的层来说仍然是不够的,而这些层往往在其带宽限制附近有丰富的频率信息,这就需要有非常强的衰减来完全消除混叠。提出:跳频在最低分辨率层中较高,以最大化提高阻带的衰减;在最高分辨率层中较低,以匹配高层细节
旋转不变性
(9) 为了得到旋转不变性网络,做出来两个改进:
将所有层的卷积核大小从3 * 3替换为1 * 1
通过将feature map的数量增加一倍,用来弥补减少的特征容量
实验表明,一个基于 1 * 1的卷积操作能够产生强旋转的等变生成器,一旦适当地抑制了混叠,便可以迫使模型实现更自然的层次细化。
转载:https://blog.csdn.net/weixin_50973728/article/details/125780891