【深度学习】图像风格混合——StyleGAN2原理解析

1、前言

上一篇文章,我们详细讲解了StyleGAN的原理。这篇文章,我们就来讲解一下StyleGAN2,也就是StyleGAN的改进版。

原论文:Analyzing and Improving the Image Quality of StyleGAN

参考代码:①Pytorch版本,非官方

②StyleGan 2 (labml.ai)

​ PS:推荐看代码②,里面对每行都进行了注释。

视频:【图像风格混合——StyleGAN2原理解析-哔哩哔哩】

2、StyleGAN存在的问题

在StyleGAN中,大多数的生成的图像容易产生一个类似水滴状的伪影,并且这些伪影在64 x 64 后就便存在在特征图中

在这里插入图片描述

3、StyleGAN2的改进点

3.1、模型图改进

针对上面的问题,作者对模型进行了修改,具体情况如下图

作者经过实验发现,AdaIN的归一化操作,是造成水滴伪影出现了根本原因,于是,作者把AdaIN层里面的归一化去掉。又经过实验,发现,将噪声B和偏置项b移动出style模块之外,取得的效果更好。经过此操作后,作者发现归一化和A映射的时候,只需要标准差就可以了(舍弃均值),如下图的图(c)

在这里插入图片描述

图(a)是传统StyleGAN的生成网络;图(b)是StyleGAN生成网络的细节拆分;图(c)是StyleGAN2的生成网络;

对图(c),首先随机生成一个常数特征图c,然后把它与w latent Code映射成的A进行Mod std操作。由于仅仅是对常数c进行缩放操作,所以可以把这个缩放直接写入到下一个层(Conv 3 x 3),也就是直接对Conv这参数进行缩放
w i , j , k ′ = s i ∗ w i , j , k w'_{i,j,k} = s_i*w_{i,j,k} wi,j,k=siwi,j,k
w 、 w ′ w、w' ww分别表示原始的参数跟缩放后的参数, s s s表示从w latent Code映射过来的缩放权重, i i i表示第几张特征图, j j j表示输出特征图, k k k代表卷积核

同样的,在下面的实例归一化中,作者去掉了减去均值的操作,只对输出值进行缩放而已,所以同样可以写入到卷积层的参数中
w i , j , k ′ ′ = w i , j , k ′ ∑ i , k w ′ i , j , k 2 + ϵ w''_{i,j,k}=\frac{w'_{i,j,k}}{\sqrt{\sum\limits_{i,k}{{w'}^2_{i,j,k}}+\epsilon}} wi,j,k′′=i,kwi,j,k2+ϵ wi,j,k
其中, ϵ \epsilon ϵ一个很小的常数,防止分母为0

于是乎,StyleGAN2的模型图就从图(c)简化成了图(d)

除此之外,在StyleGAN中,每个分辨率都注入两次风格信息w,这些w都是一样的。在StyleGAN2中,作者提出生成不同的w,每次都注入不同的w。记为w+

所以对于StyleGAN中,w latent Code ∈ R [ b a t c h , , 512 ] \in R^{[batch,,512]} R[batch,,512],w+ latent Code ∈ R [ b a t c h , 18 , 512 ] \in R^{[batch,18,512]} R[batch,18,512],因为分辨率从4x4开始上采样8次,每个分辨率注入两次风格信息,再加上在4 x 4 也要注入两次,所以得到 18 x 512 维度的w+。

3.2、损失函数改进

3.2.1、Lazy regularization(惰性正则化)

在StyleGAN中,判别网络,除了正常的判别损失,还加上了一个正则化项,其公式如下
R 1 = γ 2 E x ∼ p d a t a [ ( ∣ ∣ ∇ x D ( x ) ∣ ∣ 2 − 1 ) 2 ] R_1=\frac{\gamma}{2}\mathbb{E}_{x \sim p_{data}}\left[\left(||\nabla_xD(x)||_{2} -1\right)^2\right] R1=2γExpdata[(∣∣xD(x)21)2]
其中, γ \gamma γ是一个自己设定的超参数, P d a t a P_{data} Pdata表示真实数据的分布, ∇ x D ( x ) \nabla_xD(x) xD(x)表示对 D ( x ) D(x) D(x)关于 x x x求梯度

这个正则化项的做法,是为了防止梯度消失或者爆炸而提出的,将其梯度限定在1。

而在StyleGAN2中,作者发现,这个正则化项的计算频次要低于主要的损失函数,经过实验,每16个minbatchs执行一次正则化项即可,这样可以大大降低计算成本和总内存的使用。

3.2.2、Path length regularization(路径长度正则化)

**论文原话翻译:**我们鼓励固定大小的步长????在图像中产生非零的、固定大小的变化。我们可以通过在图像空间中步入随机方向并观察相应的????梯度来根据经验测量与该理想的偏差。无论????图像空间方向如何,这些梯度的长度都应该接近相等,这表明从潜在空间到图像空间的映射是有条件的。

其实就是在生成网络中加入另一个损失项,其公式如下
E w , y ∼ N ( 0 , I ) ( ∣ ∣ J w T y ∣ ∣ 2 − a ) 2 \mathbb{E}_{w,y\sim\mathbf{N(0,\mathbf{I})}}\left(||\mathbf{J}^T_{w}\mathbb{y}||_2-a\right)^2 Ew,yN(0,I)(∣∣JwTy2a)2
其中, J w \mathbf{J}_w Jw是生成图像对w的雅可比矩阵,即 J w = ∂ g ( w ) / ∂ w \mathbf{J}_w=\partial{g(w)}/\partial{w} Jw=g(w)/w。y是从标准正态分布中采样出来的随机图像。为了避免雅可比矩阵的显式运算,对其进行恒等变化 J w T y = ∇ w ( g ( w ) ∗ y ) \mathbf{J}^T_{w}\mathbb{y}=\nabla_w(g(w)*y) JwTy=w(g(w)y) a a a J w T y \mathbf{J}^T_{w}\mathbb{y} JwTy的指数移动平均。

这个公式怎么理解呢,emmmmm…

我们从矩阵与向量的乘法角度去理解吧,y是一个随机图像,其维度为 y ∈ R M y \in R^M yRM(M=3wh,即RGB图像维度),而对于 J w T ∈ R L × m \mathbf{J}_w^T\in R^{L\times m} JwTRL×m J w \mathbf{J}_w Jw代表的是生成图像在w上面的变化,y为随机采样出来的图像,这两个值做矩阵乘法,就是将图像y映射到 J w \mathbf{J}_w Jw所在空间,其实也就是将变化送到图像y中,取L2范数,代表的就是图像变化的长度。减去 a a a再取平方自然就是希望图像变化的长度等于 a a a

最最最最最重要的是,作者在论文里面证明,当 J w \mathbf{J}_w Jw这个矩阵正交,损失达到最小。当矩阵正交时,意味着w的各个分量之间相互正交垂直,线性无关,也就达到了解耦的目的。

怎么证明的?emmmmm…我看了很多人的文章,想找到其中推导,都未曾找到…感兴趣的自己看论文吧,在下才疏学浅,资质驽钝,未能参透。

3.3、训练方式改进

在StyleGAN中,使用的是PGGAN的渐进式训练方法,这种方法可以很好地生成高分辨率大图,但是,他有一个缺陷,即某些细节丧失了移动不变性。

在这里插入图片描述

当人脸旋转的时候,牙齿却没有跟着旋转。作者认为,造成这种情况的原因是,每个分辨率都会生成一张图像,在低分辨率的时候,生成器会尽量生成细节,如果在低分辨率区域生成很多次中间牙齿,这会导致在中间层(中分辨率)的时候,中间牙齿的频率过高,没有办法调节过来。

作者提出其他训练方法取代渐进式训练

在这里插入图片描述

图(a)代表的是MSG-GAN的模型训练方法,中间的虚线将模型分为生成网络(上)和判别网络两部分(下),作者对其进行简化,在每一个分辨率tRGB后直接与上一个分辨率的上采样图像简单相加,即图(b),Ps:图(b)里面的上采样和下采样均使用双线性插值。

而图(c)是经过图(b)进一步修改成残差网络的。

作者经过实验发现,残差网络对判别器的作用很大。但是,将残差网络用在生成器却造成了损害。于是,作者使用图(b)作为生成器结构和图(c)作为判别器结构。

除此之外,里面的tRGB等等操作,与StyleGAN中的不一样,具体的在代码中有体现,更具体的,请参考StyleGan 2 (labml.ai)

4、Projection of images to latent space(将图像投影到隐空间)

其实就是把我们现实的真实图像投影到w空间,将图像的风格信息提取出来,然后对该风格进行修改,以达到修改我们真实图像的目的

论文里面没有对具体方法进行展开,但是我在拜读其他人的文章时,里面提到了两种具体方法StyleGAN 和 StyleGAN2 的深度理解 - 知乎 (zhihu.com)

①在训练StyleGAN的时候,训练一个编码器,将真实图片喂进去,输出隐空间的向量。

②将预训练好的StyleGAN,随机采样z latent Code映射成w latent Code,然后生成的图像与真实图像计算损失,更新w latent Code,直到收敛。

显然,第一个方法不能处理训练数据集以外的图像;而第二种虽然可以,但是每次都要迭代训练更新w,也颇为麻烦。

论文里面用到的时第二种,对这些感兴趣的,参考论文Image2StyleGAN: How to Embed Images Into the StyleGAN Latent Space?

5、结束

以上,便是StyleGAN的全部内容,如有问题,还望指出,阿里嘎多!

在这里插入图片描述

6、参考

图像生成典中典:StyleGAN & StyleGAN2 论文&代码精读 - 知乎 (zhihu.com)

StyleGAN 和 StyleGAN2 的深度理解 - 知乎 (zhihu.com)

StyleGan 2 (labml.ai)

上一篇:主干网络篇 | YOLOv8更换主干网络之VanillaNet | 华为方舟实验室提出全新轻量级骨干架构


下一篇:Hive:开窗函数