《DCT-Net: Domain-Calibrated Translation for Portrait Stylization》
主页:https://menyifang.github.io/projects/DCTNet/DCTNet.html
论文:https://arxiv.org/abs/2207.02426
项目:https://github.com/menyifang/DCT-Net
这篇文章用的符号有点混乱,前后不一致,文字表述也有点前后不一致(莫非是两个人写的?),文档还有严重的文字错位,说实话看的有点难受…
人脸风格化任务,小样本条件
先用小样本做迁移学习,得到一个GAN用来扩增目标域图片,然后训练图像翻译网络
亮点是:
用两个相同初始化的 StyleGAN2 加上约束,小样本地迁移出了一个目标域的 StyleGAN2 。
图像翻译网络不需要成对的图片来训练。
给定在源域预训练的 StyleGAN2 和少量 目标域图像,迁移学习训练出一个目标域的 StyleGAN2,用于扩增目标域的数据集。
训练方法是,用复制两个一样的预训练的 StyleGAN2,称为 G s G_s Gs 和 G t G_t Gt ,我们只训练 G t G_t Gt 。每次迭代先采样 z z z ,两个网络用同一个 z z z 生成图像 x ^ s \hat x_s x^s 和 x ^ t \hat x_t x^t ,我们用对抗损失令 x ^ t \hat x_t x^t 接近目标域,用身份损失令 x ^ t \hat x_t x^t 和 x ^ s \hat x_s x^s 接近。这样就训练出目标域的 StyleGAN2。然后,将 G s G_s Gs 和 G t G_t Gt 较早的层混合起来作为一个生成器,生成出很多目标域图像。
其实就是随机仿射变换(缩放旋转),对源域和扩增出的目标域都进行仿射变换,把 x ^ t \hat x_t x^t 变成 x ~ t \tilde x_t x~t ,把 x s x_s xs 变成 x ~ s \tilde x_s x~s 。
用未配对图像来训练的图片翻译网络,U-Net 架构。网络输入源域 x ~ s \tilde x_s x~s ,输出 x g x_g xg 。
用了解耦的损失函数,风格损失和内容损失,然后还用了面部感知损失。
风格损失:其实也应该算是对抗损失。用 [Wang and Yu 2020] 抽取出 x g x_g xg 和 x ~ t \tilde x_t x~t 的风格特征,用判别器 D s D_s Ds 使两个风格特征属于同一分布。
内容损失:就是 VGG16 特征的 L1 损失。
面部感知损失:先定义面部表情参数,他们用了三个参数,分别表示左右眼和嘴的开闭程度。用已经训练好的 R e x p \mathcal{R}_{exp} Rexp 提取面部表情参数,然后算 L2 损失。
讲道理,我觉得他用面部感知损失是因为他的内容损失不够解耦。
而且他的面部感知损失居然能适应风格化人脸,这个东西不用做域迁移吗?
给定少量目标风格的样本,我们的目标是学习一个函数 M s → t M_{s\to t} Ms→t ,将图像从 源域 X s X_s Xs 映射到 目标域 X t X_t Xt 。输出图像 x g x_g xg 的纹理风格应该与 目标示例 x t x_t xt 相似,同时保留 源图片 x s x_s xs 的内容细节(比如结构和身份)。
图3展示了模型的概览:
我们的 pipeline 由三个模块组成:内容矫正网络 (CCN) ,几何扩展模块 (GCM) ,纹理翻译网络 (TTN) 。
第一个模块,CCN ,负责在内容维度上校准目标分布,方法是,用 迁移学习 调整 预训练的源生成器 G s G_s Gs 的目标风格 。
第二个模块,GCM ,分别对源分布和目标分布做几何扩展,并且为后续的 翻译 提供 多尺度 和 不同旋转角度 的 几何对称特征。
第三个模块,TTN ,利用 校准的分布,我们用 纹理翻译网络 去学习 域间关联,使用 多表征约束 和 局部感知损失。
CCN 和 TTN 是独立训练的,只有 TTN 会用在最终的推理中。
在这个模块中,我们将一个用足够样本训练的网络 迁移到 少量样本的有偏分布。与之前工作不同[Pinkney and Adler 2020; Richardson et al . 2021; Song et al . 2021],他们用 StyleGAN2 和 反演方法 做图像翻译。我们利用 预训练的 StyleGAN2 的强大先验 用增强的内容对称性 来 重建 目标域。
我们有两个生成器 G s G_s Gs 和 G t G_t Gt 。 G s G_s Gs 是一个在 真实人脸 上训练 的 StyleGAN2 。 G t G_t Gt 是 G s G_s Gs 的复制品 ,用 G s G_s Gs 的权重初始化,我们会调整 G t G_t Gt 来生成目标域 X t X_t Xt 。
在 CCN 的训练阶段,我们会用判别器 D t D_t Dt 微调 G t G_t Gt (保证 x ^ t ∈ X t \hat x_t \in X_t x^t∈Xt ),还用一个现有的人脸识别模型 R i d R_{id} Rid 来保留 x ^ t \hat x_t x^t 和 x ^ s \hat x_s x^s 之间的个人身份。
在 CCN 的推理阶段,我们将 G s G_s Gs 的前 k k k 层和 G t G_t Gt 中的对应层混合,这种方案被证明可以高效地保留源域中的更多信息 [Pinkney and Adler 2020] 。
这样,我们可以在 源域 和 目标域 中产生 内容对称 的图像,也就是 x ^ s \hat x_s x^s 和 x ^ t \hat x_t x^t 。
流程图如图4所示:
值得注意的是,我们直接从 z z z 空间采样 并用 内容对称 的方法重建出 ( X ^ s , X ^ t ) (\hat X_s,\hat X_t) (X^s,X^t) (也就是说用同一个 z z z 不同的解码路径)。没有使用真实人脸,因为需要反演且会导致累积误差。由于有足够的真实世界图片,分布 X ^ s \hat X_s X^s 会很接近真实分布 X s X_s Xs 。
与我们的方法相反,[Pinkney and Adler 2020; Richardson et al . 2021; Song et al . 2021],他们用 StyleGAN2 和 反演方法 [Abdal et al. 2020; Tov et al. 2021] ,将源图像映射到 z z z 空间 或者 W / W + \mathcal{W}/\mathcal{W}^+ W/W+ 空间并用生成器合成对应结果。然而,这样很难保证任意肖像(比如域外图像)都能反演,[Roich et al . 2021; Tov et al. 2021] 中举例说明了 “失真-可编辑性的权衡” 。图像翻译中的反演过程会损失额外的身份和结构细节。
由于源域(FFHQ)已经与标准脸部姿态 align ,这导致网络会过于依赖位置语义,限制网络在真实图像上的处理能力。我们对源样本 x ^ s / x s \hat x_s/x_s x^s/xs 和 目标样本 x ^ t / x t \hat x_t/x_t x^t/xt 都使用 几何变换 T G e o T_{Geo} TGeo ,产生几何扩展后的图像 x ~ s \tilde x_s x~s 和 x ~ t \tilde x_t x~t 。 T G e o T_{Geo} TGeo 使用随机缩放比例 μ ∈ [ 0.8 , 1.2 ] \mu\in [0.8,1.2] μ∈[0.8,1.2],随机旋转角度 γ ∈ [ − π 2 , π 2 ] \gamma\in[-\frac{\pi}{2},\frac{\pi}{2}] γ∈[−2π,2π]
纹理翻译网络的目标是用无监督的方法学习 ( X ~ s , X ~ t ) (\tilde X_s,\tilde X_t) (X~s,X~t) 之间的关联。 我们引入一个 U-Net 结构 的 映射网络 M s → t M_{s\to t} Ms→t 。因为源域有足够的图像,我们认为 X s X_s Xs 和 X ^ s \hat X_s X^s 非常相似,所以我们直接用真实图像(做几何变换后)和 X ~ t \tilde X_t X~t 做对称翻译(对称翻译什么鬼,你这个明明只有单向的翻译好吗?)。这样,对称特征可以从图像层次转化到域层次。
值得注意的是,TTN可以用无监督的方法训练,使用未配对的图像。我们使用真实图像,但是不对其做反演。我们使用随机采样的风格化图像 x ~ t ∈ X ~ t \tilde x_t \in \tilde X_t x~t∈X~t ,不是作为 ground truth,而是作为风格表征,用于逃离局部最小值。必须指出的是,我们在图3中对所有模块用同一个样本,只是为了简单好理解。
受 [Wang and Yu 2020] 中 表征解耦 方法的启发,我们用纹理和表面解耦,从 x ~ t \tilde x_t x~t 和 x g x_g xg 中提取风格表征 F s t y \mathcal{F}_{sty} Fsty ,用判别器 D s D_s Ds 引导 M s → t M_{s\to t} Ms→t 合成与 x ~ t \tilde x_t x~t 风格相似的 x g x_g xg 。
风格损失:
L s t y = E x ~ s [ log ( 1 − D s ( F s t y ( M s → t ( x ~ s ) ) ) ) ] + E x ~ t [ log ( D s ( F s t y ( x ~ t ) ) ] \begin{aligned} \mathcal{L}_{s t y}=&\mathbb{E}_{\tilde{x}_{s}}\left[\log \left(1-D_{s}\left(\mathcal{F}_{s t y}\left(\mathcal{M}_{s \rightarrow t}\left(\tilde{x}_{s}\right)\right)\right)\right)\right] \\ &+\mathbb{E}_{\tilde{x}_{t}}\left[\log \left(D_{s}\left(\mathcal{F}_{s t y}\left(\tilde{x}_{t}\right)\right)\right] \right. \end{aligned} Lsty=Ex~s[log(1−Ds(Fsty(Ms→t(x~s))))]+Ex~t[log(Ds(Fsty(x~t))]
也就是用一个判别器约束 x g x_g xg 和 x ~ t \tilde x_t x~t 的风格特征属于同一个分布。
我们用预训练的 VGG16 网络用于提取 内容表征 F c o n \mathcal{F}_{con} Fcon ,用内容表征的 L1 距离作为内容损失:
L c o n = ∥ V G G ( x ~ s ) , V G G ( M s → t ( x ~ s ) ) ∥ 1 \mathcal{L}_{c o n}=\left\|V G G\left(\tilde{x}_{s}\right), V G G\left(\mathcal{M}_{s \rightarrow t}\left(\tilde{x}_{s}\right)\right)\right\|_{1} Lcon=∥VGG(x~s),VGG(Ms→t(x~s))∥1
也就是说 x g x_g xg 与 x ~ s \tilde x_s x~s 的内容应该是一样的。
为了进一步鼓励网络产生具有夸张结构变形的风格化肖像(比如简化的嘴和大眼睛),我们引入一个 辅助表情回归器 R e x p \mathcal{R}_{exp} Rexp 来引导生成过程。也就是说,我们用 R e x p \mathcal{R}_{exp} Rexp 约束 x g x_g xg 的面部表情,以此隐含地鼓励局部结构变形。 R e x p \mathcal{R}_{exp} Rexp 会更关注脸部的组件(比如嘴和眼睛)。
具体地说, R e x p \mathcal{R}_{exp} Rexp 由特征提取器 E f \mathcal{E}_{f} Ef 上的 n n n 个回归头组成,其中 n n n 表示表情参数的数量。 E f \mathcal{E}_{f} Ef 和 D s D_s Ds 都使用 PatchGAN 结构。为了更快训练,我们用已经训练好的回归器。
面部感知损失如下:
L p e r = ∥ R exp ( x g ) − α ∥ 2 \mathcal{L}_{p e r}=\left\|\mathcal{R}_{\exp }\left(x_{g}\right)-\boldsymbol{\alpha}\right\|_{2} Lper=∥Rexp(xg)−α∥2
其中, α = α 1 , . . , α n \boldsymbol{\alpha}=\boldsymbol{\alpha}{1}, . ., \boldsymbol{\alpha}{n} α=α1,..,αn 表示从 x ~ s \tilde x_s x~s 中提取的表情参数。我们定义 α i ∈ [ 0 , 1 ] \boldsymbol{\alpha}_i\in[0,1] αi∈[0,1] ,设定 n = 3 n=3 n=3 表示左右眼和嘴巴的开合角度。使用从 x ~ s \tilde x_s x~s 中提取的面部点 p p p ,可以通过计算特定面部组件的 bounding box 的高宽比,轻松得出 α i \boldsymbol{\alpha}_i αi
给定 x ~ s \tilde x_s x~s 和 x ~ t \tilde x_t x~t ,网络输入 x ~ s \tilde x_s x~s ,输出 x g x_g xg 。
计算损失函数如下,包括风格损失、内容损失、面部感知损失、total-variation损失:
L total = L s t y + λ con L c o n + λ p e r L p e r + + λ t v L t v \mathcal{L}_{\text {total }}=\mathcal{L}_{s t y}+\lambda_{\text {con }} \mathcal{L}_{c o n}+\lambda_{p e r} \mathcal{L}_{p e r}++\lambda_{t v} \mathcal{L}_{t v} Ltotal =Lsty+λcon Lcon+λperLper++λtvLtv
其中, L t v \mathcal{L}_{t v} Ltv 表示 total-variation 损失,用于光滑化 x g x_g xg (也就是去噪),计算方法如下:
L t v = 1 h ∗ w ∗ c ∥ ∇ u ( x g ) + ∇ v ( x g ) ∥ \mathcal{L}_{t v}=\frac{1}{h * w * c}\left\|\nabla_{u}\left(x_{g}\right)+\nabla_{v}\left(x_{g}\right)\right\| Ltv=h∗w∗c1∥∇u(xg)+∇v(xg)∥
其中, u u u 和 v v v 分别表示垂直和水平方向。