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′=si∗wi,j,k
w
、
w
′
w、w'
w、w′分别表示原始的参数跟缩放后的参数,
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,k∑w′i,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γEx∼pdata[(∣∣∇xD(x)∣∣2−1)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,y∼N(0,I)(∣∣JwTy∣∣2−a)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 y∈RM(M=3wh,即RGB图像维度),而对于 J w T ∈ R L × m \mathbf{J}_w^T\in R^{L\times m} JwT∈RL×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)