论文:《Face Alignment in Full Pose Range: A 3D Total Solution》
文章目录
Face Alignment
Face Alignment 人脸对齐任务是基于一定量的训练集,得到一个模型,使得该模型对输入的一张任意姿态下的人脸图像能够进行特征点(landmark)标记。Face Alignment 任务一般的呈现方式是人脸特征点的检测与标记。一般的二维人脸图像 Face Alignment 得到的结果是特征点的二维位置坐标信息。
Full pose range
文中将人脸转动角度小于45度的姿势称为 small-medium pose,对于转动角度大于45度,小于等于90度的姿势称为 large pose。即,此篇论文解决的问题是大姿势下的人脸对齐任务。最极端情况则是整张人脸图像上只有侧脸信息。
通用的一些FA模型在大姿势的情况下会面临一些挑战:
- 这些模型假定所有的特征点可见;
- 随着姿势的变化,人脸呈现的角度也会发生变化,在大姿势的情况下无法保证所有特征点可见;
- 不同的姿势带来的特征点标记困难程度也会上升,而对于一些不可见的点,现有的办法大部分是靠猜。
3DDFA(3D Dense Face Alignment)
问题的转换
将常见的2D人脸特征点标记问题转换为3D拟合的任务。具体表现在需要求解的参数上。
- 2D人脸特征点标记得到的结果:一系列2D特征点位置坐标
- 3D拟合需要求解的参数
- pose 姿势参数:scale 缩放因子, rotation 旋转矩阵, translation 平移向量
- morphing 变形参数: shape 形状系数, expression 表情系数
人脸形状的表示——3DMM
选择3DMM对人脸形状进行表示。在传统3DMM的基础上,加入3DMM拓展模型的 identity 和 expression 参数。那么,人脸形状
S
S
S 的表示方式如下:
S
=
S
ˉ
+
A
i
d
α
i
d
+
A
e
x
p
α
e
x
p
S=\bar{S}+A_{id} \alpha_{id} + A_{exp} \alpha_{exp}
S=Sˉ+Aidαid+Aexpαexp
其中,
S
ˉ
\bar{S}
Sˉ表示平均人脸形状,
A
A
A表示主成分向量,
α
\alpha
α表示相应的系数。
参数估计方法——级联回归+CNN
级联回归:通过一系列回归器将一个指定的初始预测值逐步细化,每一个回归器都依靠前一个回归器的输出来执行下一步操作。联系到FA任务中,则是基于初始人脸形状,一般选择的是平均人脸形状,通过多次回归把参数回归到ground-truth的地方。其数学表达式子如下:
p
k
+
1
=
p
k
+
R
e
g
k
(
F
e
a
(
I
,
p
k
)
)
p^{k+1}=p^k+{Reg}^k (Fea(I,p^k))
pk+1=pk+Regk(Fea(I,pk))
卷积神经网络CNN:将人脸特征点标记看作从图像像素到特征点位置的回归操作。
3DDFA方法则是将级联回归中的回归器设置为CNN。即,
p
k
+
1
=
p
k
+
N
e
t
k
(
F
e
a
(
I
,
p
k
)
)
p^{k+1}=p^k+{Net}^k (Fea(I,p^k))
pk+1=pk+Netk(Fea(I,pk))
根据这个式子,需要了解的主要是四个部分:
- 回归目标,即参数 p p p
- 卷积神经网络的输入,即图像特征 F e a Fea Fea的设计
- 卷积神经网络的设计,即 N e t Net Net
- 代价函数的设计
参数 p p p
3D人脸表达式子:
S
=
S
ˉ
+
A
i
d
α
i
d
+
A
e
x
p
α
e
x
p
S=\bar{S}+A_{id} \alpha_{id} + A_{exp} \alpha_{exp}
S=Sˉ+Aidαid+Aexpαexp
3D坐标与2D坐标之间的转换计算:
V
(
p
)
=
f
∗
P
r
∗
R
∗
S
+
t
2
d
V(p)=f*Pr*R*S+t_{2d}
V(p)=f∗Pr∗R∗S+t2d,其中
P
r
=
(
1
0
0
0
1
0
)
Pr=\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \end{pmatrix}
Pr=(100100)。
f
f
f表示缩放因子,
R
R
R表示旋转矩阵,
t
2
d
t_{2d}
t2d表示平移向量。
那么,参数
p
p
p包含的内容如下:
p
=
[
f
,
R
,
t
2
d
,
α
i
d
,
α
e
x
p
]
p=[f,R,t_{2d},\alpha_{id},\alpha_{exp}]
p=[f,R,t2d,αid,αexp]
其中,此处的旋转矩阵表示方式为欧拉角 Euler angles,主要是yaw-pitch-roll(偏航-俯仰-滚转)三个角度。当然这只是欧拉角的一种表示方式,不代表都是这样表示。要强调的是,欧拉角第二个角度的操作是基于第一个角的操作结果进行的,同理,第三个角度基于第二个角度的结果进行操作。
欧拉角在表示旋转向量的时候,会有万向锁 gimbal lock 的问题。简单的理解就是:不同的角度操作会带来相同的结果。这无疑会产生表达歧义。
在这篇论文中使用的是四元数 quaternion 的表示方式。即,
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
q=q_0+q_1 i+q_2 j+q_3 k
q=q0+q1i+q2j+q3k,一个实部三个虚部的表示方式。且三个虚部满足以下要求:
{
i
2
=
j
2
=
k
2
=
−
1
i
j
=
k
,
j
i
=
−
k
j
k
=
i
,
k
j
=
−
i
k
i
=
j
,
i
k
=
−
j
\begin{cases} i^2=j^2=k^2=-1\\ ij=k,ji=-k \\ jk=i,kj=-i \\ ki=j,ik=-j \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
基于角度和旋转轴表示的四元数为
q
=
[
c
o
s
θ
2
,
n
x
s
i
n
θ
2
,
n
y
s
i
n
θ
2
,
n
z
s
i
n
θ
2
]
q=[cos \frac{\theta}{2},n_x sin \frac{\theta}{2}, n_y sin \frac{\theta}{2}, n_z sin \frac{\theta}{2}]
q=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ],反之,根据四元数可以得到相应的角度和旋转轴,即
{
θ
=
2
a
r
c
c
o
s
q
0
[
n
x
,
n
y
,
n
z
]
T
=
[
q
1
,
q
2
,
q
3
]
T
s
i
n
θ
2
\begin{cases} \theta = 2arccos q_0\\ {[n_x,n_y,n_z]}^T = \frac {{[q_1,q_2,q_3]}^T}{sin \frac{\theta}{2}} \end{cases}
{θ=2arccosq0[nx,ny,nz]T=sin2θ[q1,q2,q3]T
那么,采用四元数表示旋转向量之后,参数p则为:
p
=
[
q
0
,
q
1
,
q
2
,
q
3
,
t
2
d
,
α
i
d
,
α
e
x
p
]
p=[q_0,q_1,q_2,q_3,t_{2d},\alpha_{id},\alpha_{exp}]
p=[q0,q1,q2,q3,t2d,αid,αexp]
特征设计 F e a Fea Fea
PAF(Pose Adaptive Feature)
通过PAC(Pose Adaptive Convolution)操作得到PAF。PAC的特点在于:在面部的一些具有一致语义的位置进行卷积操作。具体步骤如下:
- 基于当前的参数 p p p,使用3DMM进行三维形状的构建,并计算每个点的柱坐标。在其上采样大小为 64 × 64 64\times 64 64×64的 feature anchor
- 将上一步得到的3D人脸形状投影到2D图像空间,由此得到两个大小为 64 × 64 64\times 64 64×64的 feature anchor,分别表示可见与不可见的部分
- 在每个 feature anchor 上裁剪大小为 d × d d\times d d×d的块,与原图连接成为扩展的二维图
- 在得到的图上进行卷积操作,得到大小为
64
×
64
64\times 64
64×64的PAF结果图,作为后续卷积操作的特征输入
PNCC(Projected Normalized Coordinate Code)
三维人脸形状上的顶点,不仅包含这一点的三维坐标信息,还包含此处的RGB取值。将3D平均人脸的顶点坐标和RGB取值进行归一化操作,即NCC操作。使得每个点的3D坐标可以在区间
[
0
,
0
,
0
]
−
[
1
,
1
,
1
]
[0,0,0]-[1,1,1]
[0,0,0]−[1,1,1]内被唯一的表示。
N
C
C
d
=
S
d
ˉ
−
m
i
n
(
S
d
ˉ
)
m
a
x
(
S
d
ˉ
)
−
m
i
n
(
S
d
ˉ
)
,
(
d
=
x
,
y
,
z
)
{NCC}_d=\frac {\bar{S_d}-min(\bar{S_d})} {max(\bar{S_d})-min(\bar{S_d})},(d=x,y,z)
NCCd=max(Sdˉ)−min(Sdˉ)Sdˉ−min(Sdˉ),(d=x,y,z)
基于NCC拓展得到PNCC。具体操作是:基于参数p,使用3DMM得到三维人脸模型,将三维向二维平面投影,使用Z-Buffer算法,基于NCC进行渲染,得到PNCC图。注意,结果是二维图,作为后续卷积操作的输入。
P
N
C
C
=
Z
−
B
u
f
f
e
r
(
V
(
p
)
,
N
C
C
)
,
V
(
p
)
=
R
∗
S
+
[
t
2
d
,
0
]
T
PNCC=Z-Buffer(V(p),NCC),\quad V(p)=R*S+{[t_{2d},0]}^T
PNCC=Z−Buffer(V(p),NCC),V(p)=R∗S+[t2d,0]T
网络设计 N e t Net Net
- 输入:当前的参数 p p p以及人脸图像
- 上面的分支:基于参数 p p p得到的特征图PNCC和输入的人脸图像组合作为卷积神经网络的输入
- 下面的分支:基于参数 p p p得到的带有 feature anchor 的图像输入PAC进行操作得到特征图PAF,将PAF作为后续卷积神经网络的输入
- 结果:两个分支的结果通过最后的全连接层得到
Δ
p
\Delta p
Δp,即
Δ
p
k
=
N
e
t
k
(
P
A
F
(
p
k
,
I
)
,
P
N
C
C
(
p
k
,
I
)
)
\Delta p^k = {Net}^k (PAF(p^k,I),PNCC(p^k,I))
Δpk=Netk(PAF(pk,I),PNCC(pk,I)),基于
Δ
p
\Delta p
Δp更新参数,即
p
k
+
1
=
p
k
+
Δ
p
k
p^{k+1}=p^k+\Delta p^k
pk+1=pk+Δpk。参数p主要包含以下信息:
- 6维的姿势参数 [ q 0 , q 1 , q 2 , q 3 , t 2 d x , t 2 d y ] [q_0,q_1,q_2,q_3,t_{2dx},t_{2dy}] [q0,q1,q2,q3,t2dx,t2dy]
- 199维的 identity 参数 α i d \alpha_{id} αid
- 29维的 expression 参数 α e x p \alpha_{exp} αexp
代价函数设计
PDC(Parameter Distance Cost)
设计目标:使得目前参数与ground-truth之间的距离越小越好
E
p
d
c
=
∥
Δ
p
−
(
p
g
−
p
k
)
∥
2
E_{pdc}={\lVert \Delta p - (p^g-p^k) \rVert}^2
Epdc=∥Δp−(pg−pk)∥2
p
p
p包含的信息较多,且不同参数对预测的3D人脸也会产生不同的影响。但是这一代价函数等同的优化其中的参数,会使得结果不是最优的。
VDC
设计目标:基于当前的参数投影到二维点,与ground-truth进行比较计算。
与前一个代价函数相比,有考虑到各个参数的语义。但是,这个函数本身不是凸函数,不能保证收敛。
E
v
d
c
=
∥
V
(
p
0
+
Δ
p
)
−
V
(
p
g
)
∥
2
E_{vdc}={\lVert V(p^0+\Delta p) - V(p^g) \rVert}^2
Evdc=∥V(p0+Δp)−V(pg)∥2
WPDC
设计目标:希望对不同的参数赋予不同的权重,以表示这一参数的重要性。
E
w
p
d
c
=
(
Δ
p
−
(
p
g
−
p
0
)
)
T
d
i
a
g
(
w
)
(
Δ
p
−
(
p
g
−
p
0
)
)
w
=
(
w
1
,
w
2
,
.
.
.
,
w
i
,
.
.
.
,
w
p
)
w
i
=
∥
V
(
p
d
e
,
i
)
−
V
(
p
g
)
∥
Z
p
d
e
,
i
=
(
p
1
g
,
.
.
.
,
p
i
−
1
g
,
(
p
0
+
Δ
p
)
i
,
p
i
+
1
g
,
.
.
.
,
p
p
g
)
E_{wpdc}={(\Delta p - (p^g-p^0))}^T diag(w) (\Delta p - (p^g-p^0)) \\ w=(w_1,w_2,...,w_i,...,w_p) \\ w_i =\frac{\lVert V(p^{de,i})-V(p^g) \rVert}{Z} \\ p^{de,i}=(p_1^g,...,p_{i-1}^g,{(p^0+\Delta p)}_i,p_{i+1}^g,...,p_p^g)
Ewpdc=(Δp−(pg−p0))Tdiag(w)(Δp−(pg−p0))w=(w1,w2,...,wi,...,wp)wi=Z∥V(pde,i)−V(pg)∥pde,i=(p1g,...,pi−1g,(p0+Δp)i,pi+1g,...,ppg)
第三个式子的分子部分表示的是:第
i
i
i个参数带来的误差。其中,基于当前参数进行投影映射,将得到的二维图像与ground-truth进行比较。在计算过程中,只有第
i
i
i个参数的值是基于前一轮的参数值加上这一轮得到的
Δ
p
\Delta p
Δp,其他参数均采用ground-truth的值。分母部分为
w
w
w中的最大值。
虽然这一代价函数做到了各个参数之间的重要性判断,但是忽略了参数之间的优先级问题。
以上图为例。图a是一张张着嘴的接近只有侧脸的图像。使用这一代价函数时,会赋予表情参数以及旋转参数具有较高的重要性。图b是进行一轮迭代后的结果。可以发现,在姿势足够准确之前就去估计表情参数没有太大意义。图c是CNN只关注pose参数时产生的结果,明显这一结果要优于图b。
那么基于此,对当前代价函数进行优化,即OWPDC。
OWPDC
E
o
w
p
d
c
=
(
Δ
p
−
(
p
g
−
p
0
)
)
T
d
i
a
g
(
w
∗
)
(
Δ
p
−
(
p
g
−
p
0
)
)
w
∗
=
a
r
g
m
i
n
w
∥
V
(
p
c
+
d
i
a
g
(
w
)
∗
(
p
g
−
p
c
)
)
−
V
(
p
g
)
∥
2
+
λ
∥
d
i
a
g
(
w
)
∗
(
p
g
−
p
c
)
∥
2
s
.
t
.
0
⩽
w
⩽
1
,
p
c
=
p
0
+
Δ
p
E_{owpdc}={(\Delta p - (p^g-p^0))}^T diag(w^*) (\Delta p - (p^g-p^0)) \\ w^*={argmin}_w {\lVert V(p^c+diag(w)*(p^g-p^c))-V(p^g) \rVert}^2 + \lambda {\lVert diag(w)*(p^g - p^c) \rVert}^2 \\ s.t. 0\leqslant w\leqslant 1, p^c=p^0+\Delta p
Eowpdc=(Δp−(pg−p0))Tdiag(w∗)(Δp−(pg−p0))w∗=argminw∥V(pc+diag(w)∗(pg−pc))−V(pg)∥2+λ∥diag(w)∗(pg−pc)∥2s.t.0⩽w⩽1,pc=p0+Δp
通过对比可以发现主要的改动是在权重的设计上。在当前参数的基础上,加上带有权重的参数更新值 ,也就是加上当前参数与ground-truth之间的差别,再去与ground-truth的结果进行比较,希望当前参数获得的人脸与ground-truth越接近越好。其中
d
i
a
g
(
w
)
∗
(
p
g
−
p
c
)
)
diag(w)*(p^g-p^c))
diag(w)∗(pg−pc))的这一部分表示模型需要调整多少CNN权重来预测每个参数。
总结
这篇论文主要是将二维的人脸特征标记问题转为了二维图像与三维模型的拟合问题。主要是通过级联的卷积神经网络,将二维人脸图像与三维变形模型进行拟合。
如上图所示,左边是输入的侧脸人脸图像,右边是基于训练得到的参数,使用3D变形模型构建得到的三维人脸并映射到二维人脸图像上的结果。
上图右边的图则是特征标记点的结果图。蓝色的表示可见的部分,红色表示不可见的部分。
那么这篇论文的重点还是在于大姿势人脸的一个三维重建,主要学习的也是三维映射所需要的各种参数。从而使得正面的三维人脸在映射过程中随着各个参数的变化而转变人脸呈现的角度。