DCT-Net 水记(用于 人脸风格化 的 小样本 图像翻译,无需反演,无需构造配对图片)

DCT-Net 水记(用于 人脸风格化 的 小样本 图像翻译,无需反演,无需构造配对图片)

《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 。

图像翻译网络不需要成对的图片来训练。

个人总结

分三个模块

在这里插入图片描述

内容矫正网络 (CCN)

给定在源域预训练的 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 较早的层混合起来作为一个生成器,生成出很多目标域图像。

几何扩展模块 (GCM)

其实就是随机仿射变换(缩放旋转),对源域和扩增出的目标域都进行仿射变换,把 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

纹理翻译网络 (TTN)

用未配对图像来训练的图片翻译网络,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} Mst ,将图像从 源域 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 会用在最终的推理中。

内容矫正网络 (CCN)

在这个模块中,我们将一个用足够样本训练的网络 迁移到 少量样本的有偏分布。与之前工作不同[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^tXt ),还用一个现有的人脸识别模型 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] 中举例说明了 “失真-可编辑性的权衡” 。图像翻译中的反演过程会损失额外的身份和结构细节。

几何扩展模块 (GCM)

由于源域(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π]

纹理翻译网络 (TTN)

纹理翻译网络的目标是用无监督的方法学习 ( X ~ s , X ~ t ) (\tilde X_s,\tilde X_t) (X~s,X~t) 之间的关联。 我们引入一个 U-Net 结构 的 映射网络 M s → t M_{s\to t} Mst 。因为源域有足够的图像,我们认为 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~tX~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} Mst 合成与 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(1Ds(Fsty(Mst(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(Mst(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=hwc1u(xg)+v(xg)

其中, u u u v v v 分别表示垂直和水平方向。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DCT-II(离散余弦变换II)是一种常用的信号压缩技术,可以将信号从时域转换到频域。在实现DCT-II时,需要对信号进行归一化处理,以确保变换后的系数具有良好的统计特性。下面介绍如何通过旋转矩阵实现归一化的DCT-II。 DCT-II的变换矩阵可以通过旋转矩阵构造得到。假设N为信号长度,则DCT-II的变换矩阵可以表示为: $$ \mathbf{T}_N=\sqrt{\frac{2}{N}}\begin{bmatrix} \cos\frac{\pi}{2N} & \cos\frac{3\pi}{2N} & \cdots & \cos\frac{(2N-1)\pi}{2N}\\ \cos\frac{3\pi}{2N} & \cos\frac{9\pi}{2N} & \cdots & \cos\frac{(6N-3)\pi}{2N}\\ \vdots & \vdots & \ddots & \vdots\\ \cos\frac{(2N-1)\pi}{2N} & \cos\frac{(6N-3)\pi}{2N} & \cdots & \cos\frac{(N^2-N)\pi}{2N} \end{bmatrix} $$ 将信号向量$\mathbf{x}$与变换矩阵$\mathbf{T}_N$相乘,可以得到变换后的系数向量$\mathbf{y}$: $$ \mathbf{y}=\mathbf{T}_N\mathbf{x} $$ 为了实现归一化,我们需要将变换矩阵$\mathbf{T}_N$乘以一个归一化矩阵$\mathbf{D}$,使得$\mathbf{T}_N\mathbf{D}$的每一行的范数为1。归一化矩阵$\mathbf{D}$可以表示为: $$ \mathbf{D}=\text{diag}\left(\frac{1}{\sqrt{2}},1,\ldots,1\right) $$ 将归一化矩阵$\mathbf{D}$与变换矩阵$\mathbf{T}_N$相乘,即可得到归一化后的变换矩阵$\mathbf{T}_N^{\prime}$: $$ \mathbf{T}_N^{\prime}=\mathbf{T}_N\mathbf{D}=\sqrt{\frac{2}{N}}\begin{bmatrix} \frac{1}{\sqrt{2}}\cos\frac{\pi}{2N} & \cos\frac{3\pi}{2N} & \cdots & \cos\frac{(2N-1)\pi}{2N}\\ \cos\frac{3\pi}{2N} & \cos\frac{9\pi}{2N} & \cdots & \cos\frac{(6N-3)\pi}{2N}\\ \vdots & \vdots & \ddots & \vdots\\ \cos\frac{(2N-1)\pi}{2N} & \cos\frac{(6N-3)\pi}{2N} & \cdots & \cos\frac{(N^2-N)\pi}{2N} \end{bmatrix} $$ 然后,将信号向量$\mathbf{x}$与归一化后的变换矩阵$\mathbf{T}_N^{\prime}$相乘,即可得到归一化后的系数向量$\mathbf{y}^{\prime}$: $$ \mathbf{y}^{\prime}=\mathbf{T}_N^{\prime}\mathbf{x} $$ 归一化后的DCT-II可以通过以下Python代码实现: ``` python import numpy as np def normalize_dct2(x): N = len(x) D = np.diag([1/np.sqrt(2)] + [1]*(N-1)) T = np.sqrt(2/N) * np.array([[np.cos((i+0.5)*j*np.pi/N) for j in range(N)] for i in range(N)]) T_norm = np.matmul(T, D) y = np.matmul(T_norm, x) return y ``` 其中,x为输入的信号向量,y为归一化后的系数向量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值