论文笔记:3DDFA(TPAMI2018)

论文:《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)=fPrRS+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结果图,作为后续卷积操作的特征输入
    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
基于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=ZBuffer(V(p),NCC),V(p)=RS+[t2d,0]T
PNCC

网络设计 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(pgpk)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(pgp0))Tdiag(w)(Δp(pgp0))w=(w1,w2,...,wi,...,wp)wi=ZV(pde,i)V(pg)pde,i=(p1g,...,pi1g,(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(pgp0))Tdiag(w)(Δp(pgp0))w=argminwV(pc+diag(w)(pgpc))V(pg)2+λdiag(w)(pgpc)2s.t.0w1,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)(pgpc))的这一部分表示模型需要调整多少CNN权重来预测每个参数。

总结

这篇论文主要是将二维的人脸特征标记问题转为了二维图像与三维模型的拟合问题。主要是通过级联的卷积神经网络,将二维人脸图像与三维变形模型进行拟合。
在这里插入图片描述
如上图所示,左边是输入的侧脸人脸图像,右边是基于训练得到的参数,使用3D变形模型构建得到的三维人脸并映射到二维人脸图像上的结果。
在这里插入图片描述
上图右边的图则是特征标记点的结果图。蓝色的表示可见的部分,红色表示不可见的部分。

那么这篇论文的重点还是在于大姿势人脸的一个三维重建,主要学习的也是三维映射所需要的各种参数。从而使得正面的三维人脸在映射过程中随着各个参数的变化而转变人脸呈现的角度。

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 3ddfa人脸项目是一种基于深度学习和计算机视觉技术的人脸检测和姿态估计的项目。通过传入一张人脸图像,项目可以准确地检测出人脸的位置和姿态,并根据检测结果将人脸进行三维重建。 在项目运行时,首先需要加载训练好的神经网络模型,并将待处理的人脸图像输入到网络中。通过前向传播,网络会输出人脸关键点的位置和姿态参数。这些关键点位置可以用来确定人脸的轮廓和主要特征点,而姿态参数可以用来描述人脸的旋转和偏转情况。 接下来,根据人脸的关键点和姿态参数,项目会使用三维重建算法将人脸从二维图像转化为三维点云。这个过程涉及到相机标定、三维点的表达和三维点的映射等步骤,最终得到一个表达人脸形状和姿态的三维模型。 最后,将得到的三维模型进行可视化,可以通过投影到二维图像平面上或展示为三维模型的旋转视图。此外,项目还可以提供各种人脸属性的估计,比如年龄、性别和表情等。 3ddfa人脸项目的运行需要一定的计算资源和数据集支持。在数据集的训练阶段,需要大量的标注好的人脸图像和相应的姿态标签。而在项目使用阶段,需要一个能够处理图像计算的设备,如计算机或移动设备。 综上所述,3ddfa人脸项目通过深度学习和计算机视觉技术实现了人脸检测和姿态估计,具有广泛的应用前景,比如人脸识别、人机交互等领域。项目的运行需要合适的数据集和计算资源支持。 ### 回答2: 3DDFA人脸项目是一个用于进行三维人脸重建和参数估计的深度学习模型。运行该项目需要进行一系列步骤。 首先,需要准备一台运行Python程序的计算机,并安装所需的软件和库,如Python环境、PyTorch、NumPy等。 接下来,必须下载3DDFA人脸项目的代码和预训练模型。可以从GitHub或其他开源平台上获取相关代码和模型。 在运行项目之前,确保安装了项目所需的依赖项。可以使用pip工具安装缺少的依赖库,以确保项目的正常运行。 运行项目时,首先加载预训练的3DDFA模型。这个模型将用于从输入图像中提取人脸的参数。 接下来,选择一张人脸图像作为输入,并进行预处理。预处理的步骤可能包括图像尺寸调整,人脸检测和裁剪等。 将预处理后的图像输入到模型中,并通过前向传播计算人脸的参数。这些参数可能包括形状参数、姿态参数等。 最后,根据求得的参数,可以进行三维人脸重建或其他人脸相关的应用。例如,可以将参数应用于实时人脸追踪、表情识别等。 总之,运行3DDFA人脸项目需要准备计算机环境、下载代码和模型、安装依赖库,并按照指定的流程加载模型、处理输入图像、计算参数以及应用参数在人脸领域进行相关应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值