cvpr2022 code and paper
背景
现有的stylegan finetuning的人物风格化方法,基本上是将source domain变换到target domain,这要求target domain至少上百张质量较高的样本,并且只能实现一种风格化。
DualStyleGAN在stylegan-ffhq的基础上,同样是finetuning,但是增加了condition,引入dual style path以及有效的监督,使得可以利用风格模板,生成符合模板风格的人脸图像。
Method
DualStyleGAN整体分成2个大的部分:
- 原始的stylegan,其中mapping network成为intrinsic style path,指的是真实人脸的风格
- Extrinsic style path:控制风格
除此之外,还有一个Encoder,用于提取指定的真实或者风格图像的code ∈R18×512\in R^{18 \times 512}∈R18×512,
extrinsic style path还有ModRes,Ts, Tc这3类模块,每个模块的作用后面再说。
原始的stylegan在整个训练过程中都是fixed,存在参数更新优化的只有橘色的部分。
intrinsic style path接受3种输入:
- 正太分布随机采样的z
- 风格图用E提取出来的latent code zi+z_i^+zi+?
- 真实图用E提取出来的latent code z+z^+z+
Extrinsic style path有两种输入:
- 风格图用E提取出来的latent code ze+z_e^+ze+?,捕捉语义信息,比如风格图的头发颜色,脸型等
- 从高斯噪声中采样的z,通过N映射得到的code
生成图像的过程如下:
G(E(I),E(S),w)G(z1,N(z2),w)G(E(I), E(S), w) \\ G(z1, N(z2), w)G(E(I),E(S),w)G(z1,N(z2),w)
w∈R18w \in R^{18}w∈R18是控制两路style的混合权重,默认为1,当w为0是,模型就退化为原始的stylegan ffhq。
dualstylegan的Extrinsic style path得到code有两个:
- structure code
- color code
color作用于8-18层,用于控制细粒度的风格
structure code组用于前7层,控制shape等粗粒度的风格。
color transfer
mapping network得到的color code,经过一个TcT_cTc?模块(参与训练的FC层),得到的均值方差会和stylegan原始的intrinsic style code按照比例混合。
structure control
在粗分辨率层(1-7),使用modulative residual blocks去调整stylegan的卷积特征,本质上是一个带有adain的ResBlock。这里的设计思想是从无监督finetuning式风格化方法中总结得到。
toonify的成功,是在target domain上的finetuning。但在finetuning前后,两种模型共享隐空间。继而可以推测FT前的特征和FT后的特征其实是相关。而且FT之后,模型权重也改变了。因此作者认为,可以通过让特征变化来模拟在FT过程中的权重变化。
因此作者使用了ResBlock,模拟FT之前的特征变化,这样既可以在训练初期,不改变特征空间,使得预训练模型有效;还能在训练过程中让domain迁移。
训练方式
作者使用了3阶段训练法,使用课程学习逐渐加大训练的难度,让pretrain模型更加稳定完成domain迁移。
stage 1: color transfer on source domain
先将modelRes的权重设置为0,这样残差为0,其实不改变原来的特征,不影响预训练模型的FT稳定性。TcT_cTc? 的权重初始化为单位阵,所以不改变原来的FFHQ的latent code。这样,第一阶段的训练,其实和带有style mixing的标准训练没有区别。
从上图可以看出,第一阶段的FT结果,仍保留了原图的shape,但是颜色等细节和风格图一致。
stage 2:structure transfer on source domain
这个stage目的是让dualstylegan学习到风格图的中级风格。
随机采样z1z1z1和z2z2z2,其中z~2\tilde{z}_2z~2?是从{z2,E(g(z2)}\{z_2, E(g(z_2)\}{
z2?,E(g(z2?)}采样,小ggg是stylegan-ffhq(w=0);zl+z_l^+zl+?是z1,z2z1,z2z1,z2的stylemixing,lll是stylemixing的起始层数。lll会逐渐从7变成5。
min?Gmax?DλadvLadv+λperc Lperc (G(z1,z~2,1),g(zl+))\min _{G} \max _{D} \lambda_{\mathrm{adv}} \mathcal{L}_{\mathrm{adv}}+\lambda_{\text {perc }} \mathcal{L}_{\text {perc }}\left(G\left(\mathbf{z}_{1}, \tilde{\mathbf{z}}_{2}, \mathbf{1}\right), g\left(\mathbf{z}_{l}^{+}\right)\right) Gmin?Dmax?λadv?Ladv?+λperc ?Lperc ?(G(z1?,z~2?,1),g(zl+?))
pS:如果没有这个perception loss,又会如何呢?这个监督有点鸡肋的感觉,强行加个监督。
PS:而且为啥要用g(zl+)g\left(\mathbf{z}_{l}^{+}\right)g(zl+?)作为vgg loss的gt。因为g是原始ffhq的生成器,这是要让模型再次生成真实人脸吗?
stage3:style transfer on target domain
前两个stage都算是在source domain的迁移,他们的效果仍然保留了真实的特征,只是颜色等微观属性倾向于是风格图。stage3就要将模型想domain迁移了。
首先,用风格图S的两路style code重构S:
Lperc (G(zi+,ze+,1),S)\mathcal{L}_{\text {perc }}\left(G\left(\mathbf{z}_{i}^{+}, \mathbf{z}_{e}^{+}, \mathbf{1}\right), S\right) Lperc ?(G(zi+?,ze+?,1),S)
然后,使用style loss,包含content loss和feature matching loss,其中content loss就是ID loss和modelRes正则的和
Lsty =λCXLCX(G(z,ze+,1),S)+λFMLFM(G(z,ze+,1),S)\mathcal{L}_{\text {sty }}=\lambda_{\mathrm{CX}} \mathcal{L}_{\mathrm{CX}}\left(G\left(\mathbf{z}, \mathbf{z}_{e}^{+}, \mathbf{1}\right), S\right)+\lambda_{\mathrm{FM}} \mathcal{L}_{\mathrm{FM}}\left(G\left(\mathbf{z}, \mathbf{z}_{e}^{+}, \mathbf{1}\right), S\right) Lsty ?=λCX?LCX?(G(z,ze+?,1),S)+λFM?LFM?(G(z,ze+?,1),S)
Lcon=λIDLID(G(z,ze+,1),g(z))+λreg∥W∥2\mathcal{L}_{\mathrm{con}}=\lambda_{\mathrm{ID}} \mathcal{L}_{\mathrm{ID}}\left(G\left(\mathbf{z}, \mathbf{z}_{e}^{+}, \mathbf{1}\right), g(\mathbf{z})\right)+\lambda_{\mathrm{reg}}\|W\|_{2} Lcon?=λID?LID?(G(z,ze+?,1),g(z))+λreg?∥W∥2?
这篇论文还有细节需要深究,文中提到的Destylization的作用、多个z的定义,以及反复使用原始的ffhq的g,为什么这么设计,其实笔者也没有搞清楚。