作者Hang Zhou 香港中文大学
多视角人脸合成技术,自监督模型
摘要:
仅使用野外单视图图像合成真实旋转人脸
key point: 3D空间中旋转并将其重新渲染至2D平面。
1.介绍
传统方法都采用了3DMM,困难是当旋转3D-fitted人脸时会有invisible区域。过去研究者普遍通过对称编辑和不可见区域充填(symmetric editing and invisible region filling)来解决该问题。这种充填方法会引入伪影(visible artifacts)导致结果并不真实。
基于重建的方法会丢失局部细节 eg.人脸纹理和形状(facial textures and shapes),这又导致了身份信息的混乱(confusion of identity information)。基于重建的方法最显著的缺点是必须提供同一个人多视图数据作为直接监督。(作者温馨小提示:Multi-PIE和300W-LP是好用的多视角数据集~)这个缺点造成的结果是训练结果无法泛化并且图像分辨率低于128*128。
提出了本文是一种仅使用单视图图像来合成任意角度的旋转人脸,缺点呐就是细节和身份信息在编码过程有丢丢退化了,作者就强烈建议了keep as much known information about the given face as possible with 3D model.[emmm, 大概可能也许是你提供比较多的3D人脸信息,退化就比较少了?一脸困惑?!]
key insight!!! 通过在3D空间内旋转人脸并重新渲染到2D平面作为自监督。使用了3DDFA和neural renderer。
一个姿态为
P
a
P_{a}
Pa的人脸将其3D-mesh旋转至任意姿态
P
b
P_{b}
Pb,然后将其渲染到2D空间获得2D渲染图像
R
d
b
Rd_{b}
Rdb。随后我们使用
R
d
b
Rd_{b}
Rdb提取的纹理将它旋转至原始位置并渲染至
R
d
a
′
Rd_{a'}
Rda′。最后,使用了图像到图像的转换网络(image-to-image translation network)填充了不可见部分,并将渲染的图片映射至真实图像域。好处是GAN可以修复遮挡的部分,原有的局部纹理信息被保留下来。
主要贡献:
(1). 可用于野外场景的无监督Rotate-and-Render框架,无需成对数据和标签
(2). 使用image-to-image translation network将不完整的渲染图像转为真实图像
(3). 验证结果在strong baseline models依然适用于大规模人脸识别
2.相关工作
2.1 Face Rotation and Multi-View Synthesis
人脸旋转目的是给定单个人脸图像合成多视角人脸图像,在当前研究工作中,大多研究了正面人脸。
基于重建的方法:DRGAN首次使用GAN利用encoder-decoder结构生成正面人脸,不使用多视图,有伪影。TP-GAN使用全局和局部网络,利用multi-task learning strategy生成正面人脸。CAPG-GAN使用了face heatmap指导生成多视图人脸。共同点是都用了Multi-PIE数据集,这样就会导致只适用于该数据集环境,不易推广。FNM结合了有标签数据和无标签数据,生成MultiPIE-like正面人脸。
基于3D几何方法:FF-GAN将3DMM系数的回归集成至网络。UV-GAN使用image-to-image translation完成UV-map,与本文类似。HF-PIM利用人脸纹理图和对应场实现高质量正面人脸。需要成对数据进行训练。
2.2 Image-to-Image Translation
图像到图像转换的目的是将来自于不同模态(modality)或者域(domain)的输入图像转换为相应的输出图像。其核心思想是通过编码器-解码器体系结构和低级连接直接预测像素值。
无监督image-to-image translation的循环一致性(cycle consistency):CycleGAN使用非成对数据。GANimation无监督生成动画。该论文采用了Cycle consistency思想,区别是其他论文专注于训练神经网络进行跨域映射,该论文操作时off-line。
(Question:mapping across domain与off-line的区别?)
Inpainting with GAN:利用GAN进行了图像平移和修复操作。
3.本文方法
三部分组成:3D人脸拟合,训练数据准备的旋转和渲染策略(rotate-and-render strategy for training data preparation),render-to-image translation module。
3.1 3D人脸模型和渲染
3D人脸拟合依赖于给定人脸进行粗略的3D参数拟合。
给定具有n个顶点的3D人脸模型一个定义,人脸的形状预测
V
=
[
v
1
,
v
2
,
.
.
.
,
v
n
]
V=[v_1,v_2,...,v_n]
V=[v1,v2,...,vn]表示器顶点在3D空间
v
i
=
[
x
i
,
y
i
,
z
i
]
T
v_i=[x_i,y_i,z_i]^T
vi=[xi,yi,zi]T的正则化位置。3D形状在2D图像上的投影可以写为
∏
(
V
,
P
)
=
f
∗
p
r
∗
R
∗
V
+
h
2
d
,
(
1
)
\prod(V,P)={f}*{p_r}*R*V+h_{2d},(1)
∏(V,P)=f∗pr∗R∗V+h2d,(1)
其中
∏
\prod
∏时将模型顶点映射到其2D位置的投影函数。矩阵乘法用“
∗
*
∗”表示。
f
f
f是比例因子,
p
r
p_r
pr是正交投影矩阵,R是旋转矩阵,
h
2
d
h_{2d}
h2d是2D位移。这里,将定义的所有与投影相关的参数视为面部相对姿势
P
=
{
f
,
R
,
h
2
d
}
P=\{f,R,h_{2d}\}
P={f,R,h2d}的联合表示。
获取纹理将完整的3D表示转换到2D空间时,纹理扮演了重要角色。对于每个顶点
v
i
v_i
vi在彩色脸上存在这关联的纹理
t
i
=
[
r
i
,
g
i
,
b
i
]
T
t_i=[r_i,g_i,b_i]^T
ti=[ri,gi,bi]T。我们使用最简单的垂直投影从原始图像
I
I
I中获得顶点颜色。每个顶点的颜色可以写成:
t
i
=
I
(
∏
(
v
i
,
P
)
)
,
(
2
)
t_i=I(\prod(v_i,P)),(2)
ti=I(∏(vi,P)),(2)
其中
∏
(
v
i
,
P
)
\prod(v_i,P)
∏(vi,P)是顶点
v
i
v_i
vi的投影2D坐标。我们可以获得所有相关的纹理
T
=
[
t
1
,
.
.
.
,
t
n
]
T=[t_1,...,t_n]
T=[t1,...,tn]。这个过程可以由图3来描述。我们将统一获取纹理的整个过程参考:
T
=
G
e
t
T
e
x
(
I
,
{
V
,
P
}
)
,
(
3
)
T=GetTex(I,\{V,P\}),(3)
T=GetTex(I,{V,P}),(3)
由于正交矩阵
P
r
P_r
Pr,投影结果
∏
(
V
,
P
)
\prod(V,P)
∏(V,P)与顶点z坐标无关。对于2D空间上每个位置
(
x
j
,
y
j
)
(x_j,y_j)
(xj,yj),在3D空间的线
{
x
=
x
j
和
y
=
y
j
}
\{x=x_j和y=y_j\}
{x=xj和y=yj}可能存在多个旋转顶点,为他们分配相同的纹理。对于所有
v
k
∈
{
v
∣
(
x
j
,
y
j
)
=
∏
(
v
k
,
P
)
}
v_k\in\{v|(x_j,y_j)=\prod(v_k,P)\}
vk∈{v∣(xj,yj)=∏(vk,P)},只有z轴值最大的最外面的一个可以获得正确的纹理。它的指数是
K
j
=
arg max
k
(
[
0
,
0
,
1
]
∗
v
k
)
,
(
4
)
K_j=\argmax_{k}([0,0,1]*v_k),(4)
Kj=kargmax([0,0,1]∗vk),(4)
其余的实际上是由于2D空间中的遮挡而不可见的顶点。我们保留了获取的纹理,并将其视为我们要处理的人工伪影。
渲染给定人脸{V, P, T}的一组3D表示,渲染就是将其映射到2D空间并生成图像。渲染过程与获取纹理相反,如图3(b)所示。与等式4相同,已知
K
j
K_j
Kj是给定二维点
(
x
j
,
y
j
)
(x_j,y_j)
(xj,yj)的最外层顶点的索引。渲染的彩色图像Rd可以计算为:
R
d
(
x
j
,
y
j
)
=
{
T
{
K
j
}
,
∃
K
j
∈
N
,
0
,
∄
K
j
∈
N
.
(
5
)
Rd(x_j,y_j)=\left\{ \begin{aligned} T\{K_j\}, \exists K_j \in N, \\ 0, \not\exists K_j \in N. \\ \end{aligned} \right. (5)
Rd(xj,yj)={T{Kj},∃Kj∈N,0,∃Kj∈N.(5)
最后,我们将整个渲染过程表示为
R
d
=
R
e
n
d
e
r
(
{
V
,
P
,
T
}
)
。
(
6
)
Rd=Render(\{V, P, T\})。(6)
Rd=Render({V,P,T})。(6)
使用开源Neural Mesh Renderer来执行渲染,无需任何训练。
3.2 旋转和渲染训练策略
目标是用正确的纹理填充不可见的顶点,以获得另一个面部视图。
提出了一个简单的策略来创建训练对称为旋转渲染(R&R)由两个旋转渲染操作组成。关键思想是创建因将遮挡的面部表面旋转到前方而产生的伪影。因此,利用自监督来训练网络,流程如图4。
给定输入图像
I
a
I_a
Ia,我们首先利用一个3D人脸拟合模型获得3D模型参数:
{
V
,
P
a
}
=
F
i
t
t
i
n
g
(
I
a
)
,
(
7
)
\{V, P_a\}=Fitting(I_a),(7)
{V,Pa}=Fitting(Ia),(7)
其中a表示该人脸在2D空间的当前视图,
P
a
=
{
f
,
R
a
,
h
2
d
}
P_a=\{f,R_a,h_{2d}\}
Pa={f,Ra,h2d}。其顶点的纹理可求为:
T
a
=
G
e
t
T
e
x
(
I
a
,
{
V
,
P
a
}
)
。
(
8
)
T_a=GetTex(I_a,\{V, P_a\})。(8)
Ta=GetTex(Ia,{V,Pa})。(8)
然后我们通过将
R
a
R_a
Ra与另一个旋转矩阵
R
r
a
n
d
o
m
R_{random}
Rrandom相乘,将该人脸的3D表示旋转到另一个随机2D视图b,得到
P
b
=
{
f
,
R
b
,
h
2
d
}
P_b=\{f,Rb,h_{2d}\}
Pb={f,Rb,h2d}。并且我们渲染当前的3D表示为
R
d
d
=
R
e
n
d
e
r
(
{
V
,
P
b
,
T
a
}
)
Rd_d=Render(\{V, P_b, T_a\})
Rdd=Render({V,Pb,Ta})。这就完成了第一个旋转和渲染操作。
在种情况下可以获得另一组纹理:
T
b
=
G
e
t
T
e
x
(
R
d
b
,
{
V
,
P
b
}
)
。
(
9
)
T_b=GetTex(Rd_b,\{V, P_b\})。(9)
Tb=GetTex(Rdb,{V,Pb})。(9)
我们发现在视图b下纹理正确的顶点集(Q:如何判断纹理正确???)是在视图a下纹理正确的顶点集的子集。因此,这里无需有监督,采用了以
T
b
T_b
Tb为输入来恢复
T
a
T_a
Ta。
具体的说,旋转3D位置下的
P
b
P_b
Pb到
P
a
P_a
Pa,并将其渲染至原始2D位置,利用如下公式:
R
d
a
′
=
R
e
n
d
e
r
(
V
,
P
a
,
T
b
)
。
(
10
)
Rd_{a'}=Render({V,P_a,T_b})。(10)
Rda′=Render(V,Pa,Tb)。(10)
其中
R
d
a
′
Rd_{a'}
Rda′基本上是通过在2D空间将人脸从视图b旋转至a而产生的伪影的渲染图像。通过这种方式,我们获得了用于训练的输入/真实对
{
R
d
a
′
,
I
a
}
\{Rd_{a'}, I_a\}
{Rda′,Ia}。
3.3 渲染到图像生成
为了消除伪影并将渲染图像
R
d
b
Rd_b
Rdb和
R
d
a
′
Rd_{a'}
Rda′从渲染域映射到真实图像域,我们建议渲染到图像生成模块使用生成器G创建
F
a
′
=
G
(
R
d
a
′
)
F_{a'}=G(Rd_{a'})
Fa′=G(Rda′)和
F
b
=
G
(
R
d
b
)
F_b=G(Rd_b)
Fb=G(Rdb),如图5所示。
生成器G采用了CycleGAN。多层判别器和感知损失采用Pix2PixHD。判别器损失函数包括对抗性损失:
L
G
A
N
(
G
,
D
)
=
E
I
[
l
o
g
D
(
I
a
)
]
+
E
R
d
[
l
o
g
(
1
−
D
(
G
(
R
d
a
′
)
)
)
]
。
(
11
)
L_{GAN}(G, D)=\mathbb{E}_I[logD(I_a)]+\mathbb{E}_{Rd}[log(1-D(G(Rd_{a'})))]。(11)
LGAN(G,D)=EI[logD(Ia)]+ERd[log(1−D(G(Rda′)))]。(11)
和一个特征匹配损失。特征匹配损失由多层判别器提取特征并规则化输入和生成图像之间的距离来实现。对于输入
I
I
I,我们使用
F
D
(
i
)
(
I
)
F^{(i)}_D(I)
FD(i)(I)来表示从鉴别器第
i
i
i层提取的特征。对于全部
N
D
N_D
ND层,特征匹配损失可以写为:
L
F
M
(
G
,
D
)
=
1
N
D
∑
i
=
1
N
D
∣
∣
F
D
(
i
)
(
I
a
)
−
F
D
(
i
)
(
G
(
R
d
a
′
)
)
∣
∣
1
。
(
12
)
L_{FM}(G, D)=\frac{1}{N_D}\sum_{i=1}^{N_D}||F_D^{(i)}(I_a)-F_D^{(i)}(G(Rd_{a'}))||_1。(12)
LFM(G,D)=ND1i=1∑ND∣∣FD(i)(Ia)−FD(i)(G(Rda′))∣∣1。(12)
感知损失通过使用ImageNet预先训练的VGG网络来实现。它用于正则化生成结果和生成的身份。感知损失与
L
F
M
L_{FM}
LFM非常相似,其特征由
F
v
g
g
(
i
)
F^{(i)}_{vgg}
Fvgg(i)表示,损失函数为:
L
v
g
g
(
G
,
D
)
=
1
N
v
g
g
∑
i
=
1
N
v
g
g
∣
∣
F
v
g
g
(
i
)
(
I
a
)
−
F
v
g
g
(
i
)
(
G
(
R
d
a
′
)
)
∣
∣
1
。
(
13
)
L_{vgg}(G,D)=\frac{1}{N_{vgg}}\sum_{i=1}^{N_{vgg}}||F^{(i)}_{vgg}(I_a)-F^{(i)}_{vgg}(G(Rd_{a'}))||_1。(13)
Lvgg(G,D)=Nvgg1i=1∑Nvgg∣∣Fvgg(i)(Ia)−Fvgg(i)(G(Rda′))∣∣1。(13)
最终的目标函数可以写为:
L
t
o
t
a
l
=
L
G
A
N
+
λ
1
L
F
M
+
λ
2
L
v
g
g
。
(
14
)
L_{total}=L_{GAN}+\lambda_1L_{FM}+\lambda_2L_{vgg}。(14)
Ltotal=LGAN+λ1LFM+λ2Lvgg。(14)
在测试过程,目标输出可以通过分配目标视图
P
c
P_{c}
Pc来形成
R
d
c
=
R
e
n
d
e
r
(
{
V
,
P
c
,
T
a
}
)
Rd_c=Render(\{V,P_c,T_a\})
Rdc=Render({V,Pc,Ta}),并将渲染
R
d
c
Rd_c
Rdc送入训练过的生成器G。
3.4 构建块详细信息
3D拟合工具 旋转的3D人脸模型是3D Morpohable Model (3DMM)。它的平顶矩阵V可以表示为
S
=
[
v
1
T
,
v
2
T
,
.
.
.
,
v
n
T
]
T
S=[v_1^T, v_2^T, ..., v_n^T]^T
S=[v1T,v2T,...,vnT]T。它对3D人脸的描述是基于PCA的:
S
=
S
‾
+
A
i
d
α
i
d
+
A
e
x
p
α
e
x
p
。
(
15
)
S=\overline{S}+A_{id}\alpha_{id}+A_{exp}\alpha_{exp}。(15)
S=S+Aidαid+Aexpαexp。(15)
这里
S
‾
\overline{S}
S是平均形状,
A
i
d
A_{id}
Aid和
A
e
x
p
A_{exp}
Aexp分别是身份ID和表情的主轴。
使用3DDFA的开源实现和预先训练的模型来进行3D人脸拟合。这是一个基于深度学习的模型,用于从单个2D人脸图像回归参数
[
P
T
,
α
i
d
,
α
e
x
p
]
[P_T,\alpha_{id},\alpha_{exp}]
[PT,αid,αexp]。因此,可以预测人脸的3D形状及其在2D空间{V,P}中的相对位置。请注意,这里没有训练3DDFA。它的使用仅限于快速应用,其在三维形状预测中的未对准会给最终结果带来影响。另一种方法是使用身份标签调整3D模型。然而,在完全无监督的情况下,我们建议使用一种新的腐蚀预处理来解决这个问题。
预渲染和腐蚀 由于3D拟合方法的不精确性,错误拟合的顶点的投影有时位于面的真实边缘之外。当这种3D未对齐发生时,背景像素将被分配给这些顶点。在旋转和渲染过程中,那些错误获取的纹理将被渲染到旋转的
R
d
b
Rd_b
Rdb(参见图6左栏)。然而,这样的伪影很难通过旋转和渲染过程直接在
R
d
a
′
Rd_{a'}
Rda′上创建,这意味着它们不存在于训练输入-输出对中。因此,生成器不能处理它们。
解决这一问题的方法是将拟合的3D表示
、
V
,
P
a
,
T
a
、{V,P_a,T_a}
、V,Pa,Ta预渲染到
R
d
a
0
Rd_{a0}
Rda0,并将渲染的图像侵蚀某些像素。侵蚀是基于所有顶点的平均颜色的V的投影边来执行的。然后将纹理
T
a
T_a
Ta更新为
T
a
=
G
e
t
T
e
x
(
e
r
o
d
e
(
R
d
a
)
,
{
V
,
P
a
}
)
。
(
16
)
T_a=GetTex(erode(Rd_a), \{V, P_a\})。(16)
Ta=GetTex(erode(Rda),{V,Pa})。(16)
因此
R
d
b
Rd_b
Rdb只能包含
R
d
a
′
Rd_{a'}
Rda′中存在的伪影。侵蚀后的输出可见图6。
4.实验过程
4.1 实验设置
实施细节 首先对所有数据集运行3DDFA,以获得所有图像的参数{V,P}。在已知V的情况下,能够知道人脸的关键点,并根据人脸的眼睛中心和鼻子进行人脸对齐。生成器G包含4个下采样块和4个上采样块以及9个残留块。对所有层应用Spectral Normalization和Batch Normalization。鉴别器由两个scales组成。
模型使用Pytorch在8个配备16 GB内存的Tesla V100 GPU上进行培训。两块图形卡用于渲染,另一块用于训练。旋转一张图像的时间约为0.1秒。权重λ1和λ2都设置为10。
数据集 CASIA-WebFace和MS-Celeb-1M被选为渲染到图像模块和人脸识别网络的训练集。具体来说,采用了在ArcFace中清理的名为MS1MV2的版本。在标准的LFW、IJBA(在视频中包含个人脸)和MegaFace 100万挑战上进行了测试。MegaFace是评估人脸识别结果的最具挑战性和应用最广泛的数据集。
4.2 定性结果
(1)基于3D方法的比较
(2)基于GAN方法的比较
(3)数值结果
4.3 人脸识别结果
人脸识别设置 使用了ArcFace和标准的ResNet18主干,用于人脸识别。给出了在CASIA和MS1MV2上训练的结果。提出了一种不同的方法来使用正面化数据来提高人脸识别的性能,方法是用我们生成的3D数据来扩充原始数据集。然后根据扩充的数据集对网络进行训练。
量化结果
4.4 消融研究
用相同的参数集和训练策略另外训练相同的网络,缺少(1)VGG损失;(2)使用多尺度鉴别器和特征匹配损失。在原始的Pix2Pix文件中将其更改为PatchGAN。在图像级别上增加了额外的L1损失用于正则化。
定量结果:利用FID度量生成图像域和真实图像域之间的距离。
定性结果
5.结论
自监督是本文的关键,采用了一个固定角度的人脸通过映射到任意角度姿势的3D人脸后旋转并渲染回原来角度的人脸形成自监督。优点:1)不需要多视图,不需要成对数据,不需要任何标签(包括身份信息)。2)单视图可以旋转到任意想要的角度,并非只有正面。3)保持了细节和光照条件。 4)可用于扩充数据集。
读后小结。
无需成对数据,保留纹理和身份信息。