人脸重建速览,从3DMM到表情驱动动画

10,872 阅读7分钟

欢迎关注收藏或分享,转载请注明出处。
个人专栏


18.gif
人脸重建是计算机视觉比较热门的一个方向,3d人脸相关应用也是近年来短视频领域的新玩法。不管是Facebook收购的MSQRD,还是Apple研发的Animoji,底层技术都与三维人脸重建有关。

同时,实现人脸重建及相关应用需要深入了解优化算法等,工程量也不小,是学习cv的一个很好切入点。

01.jpg

▲ Apple推出Animoji[0]

02.jpg

▲ Facebook收购MSQRD[1]

这里的人脸重建指,通过二维人脸图像重建出该人脸的三维模型。 大概有以下几种方法: 通过多视图几何来重建,这个需要采集不同角度的人脸,对设备的要求也比较高; 通过RGBD或RGB相机,用3D Morphable Model(3DMM)方法来重建。这种方法也有局限性,由于模型特点所致,无法生成模型细节(皱纹等); 还有近年来出现的使用深度学习方法来重建(有的是结合传统3DMM方法,训练其人脸模型参数)。

本文主要讲讲单目RGB相机的3DMM方法。这种方法对设备要求低,算法简单,易于移动端实现实时重建。这里的前提是我们已经有了图像人脸检测的关键点。输入图像及检测到的人脸关键点,输出人脸三维网格。

概述

3DMM方法由Blanz[2]99年首次提出,往后的改进通常是基于他们的工作。这种方法有一个关于人脸模型的”先验知识“,即可形变模型。因此不管人脸处于什么角度,都能得到较完整的人脸。

现在比较常见的人脸模型有Basel Face Model(BFM)、Surrey Face Model(SFM)、FaceWarehouse、Large Scale Facial Model (LSFM)等。其中,LSFM可能是如今最精准的模型。BFM比较容易获取,很多人用它进行实验。SFM的开源框架也为社区做出了巨大贡献。同时,浙大团队的FaceWarehouse以及一系列相关的文章都值得一读。

03.png

▲1999年提出的3DMM方法[2]

首先需要了解参数化人脸模型blendshape模型两个概念。

参数化人脸模型

在Blanz的方法中,他们扫描200张成年人的人头模型,每个模型包含大约70000个顶点。经过PCA处理,制作成参数化人脸模型,每张人脸模型的拓扑结构相同,只是顶点位置或颜色有所差异。你可以把各个特征向量看作是人脸不同的特征,比如脸的长短,胖瘦等。

这里人脸模型分成两个向量:

形状:S = (X_1, Y_1, Z_1, X_2, ..., Y_n, Z_n)^T \in R^{3n}
纹理:T = (R_1, G_1, B_1, R_2, ..., G_n, B_n)^T \in R^{3n}

因此任意新的一个人脸都可由这些特征向量线性组合生成:

S = \bar S + \sum_{i=1}^{m}a_iS_i
T = \bar T + \sum_{i=1}^{m}b_iT_i
\sum_{i=1}^{m}a_i = \sum_{i=1}^{m}b_i = 1

04.png

▲参数化人脸模型[2]

blendshape表情模型

blendshape是3d软件里用来做模型形变的一种技术,通过调整权重,设计师可以将目标模型变化成一系列预定义的模型,或者这些模型的任意线形组合。

05.gif

▲blendshape模型,调整权重形成新的表情

在数字制作行业,通常用blendshape来制作表情,即用一组脸部基本表情合成新表情。同样,这些模型的拓扑结构一致,改变的只是顶点位置。为了不出现崩坏扭曲的表情,对权重做限制。

B = \sum_{i=0}^{m}w_iB_i; \sum_i = 1

在人脸重建时,通常会使用delta blendshape,即各个表情与正常表情的差值。

B = B_0 + \sum_{i=1}^mw_i(B_i - B_0) = B_0 + \sum_{i=1}^mw_iD_i

将blendshape和参数人脸模型结合起来就有:

S = \bar S + \sum_{i=1}^{m}a_iS_i + \sum_{i=1}^mw_iD_i

S表示一张有着某人脸特征和某表情的脸部模型。

06.png

​ ▲包含形状特征和表情的人脸模型[3]

重建

根据给定图像来“估计”人脸模型,有点像渲染的逆过程。因此,除了人脸模型,还得考虑相机参数。

这里采用弱透视投影

弱透视投影使用与正交投影相同的原则,但乘以一个缩放参数来实现近大远小的效果。

可看作透视投影和正交投影的混合体。[4]

07.gif

​ ▲三维模型的弱透视投影

重建算法的关键在于找出合适的参数 s, R, t, \vec a, \vec b, \vec w,使三维人脸模型在平面的投影尽可能接近原图像。如果不考虑纹理,可简化为**“使人脸模型关键点在平面上的投影与2d人脸关键点的位置尽可能接近”**。

08.png

▲人脸图像与模型关键点一一对应

有一点需要注意,常见的人脸关键点检测结果一般是二维点。也就是说,脸的朝向不同,检测到的脸部边缘点也会不一样,2d人脸边缘点并不在真正的脸颊边缘线上

详情可看下图。上排图像的蓝点是二维人脸检测点(2d)。下排图像蓝点是模型关键点(3d),红点是对应的2d点。可以清楚看出,图像检测出的2d边缘点与模型本身3d边缘点不同。因此,在迭代过程中,需要不断更新模型的3d边缘点索引,使二者一一对应。

09.png

▲三维模型边缘点与人脸检测边缘点不同[5]

有很多方法可以找出三维模型在当前视角下的边缘点。

可以用凸包算法求出边缘线,也可以根据法线与视线夹角,求出脸部切线。或者参考[5]中描述,在一组预先保存的脸部线条上求出最外侧的点。

通过以上描述,我们已经将重建问题转为最优化问题。

E = \sum_{i=0}^n ||(s*R*S + t)_{i_{3d}} - Y_{i_{2d}}||_2^2

其中,S是人脸模型,s是缩放尺度,R是旋转矩阵,t是位移向量,Y是人脸检测点,n为人脸关键点个数。i_{2d}i_{3d}分别是人脸图像关键点及人脸三维模型点的索引。

由于投影变化存在,这是个非线性最小二乘问题。可以用Gauss-Newton ,Levenberg-Marquardt等算法求解,这里不展开讲。

还有另外一种比较简单的方法。

先利用2d与3d点集估计出模型的相机参数,带入上式转为线性问题。然后分阶段求出人脸参数和表情参数。整个迭代过程都是固定一部分参数,更新其他参数。

人脸形状特征参数和表情参数都需要控制在一定范围内(视模型而定),不然可能会出现不合理的模型形状。在视频场景中,还需要考虑帧间稳定性以及前后人脸特征一致等问题。

10.gif

▲重建出人脸模型

应用

完成重建后,我们可获得人脸三维网格、模型在图像中的位置,以及当前人脸的blendshape表情参数。 基于以上信息,可以实现各种有意思的效果,下面根据这几组参数分别举一些例子。

三维网格和空间位置

有了三维模型和位置信息,我们可以在渲染时把人脸模型遮挡掉,做出三维贴纸的效果,诸如戴头饰、眼镜之类。

11.GIF

▲在三维建模工具中建好模型,调整与人脸的相对位置

12.GIF

▲实时效果

模型和纹理

绘制模型uv贴图,再把人脸模型渲染出来。可以利用这种方法给人脸加上胡子、彩绘、面具等。

13.png

▲模型的uv贴图

14.png

​ ▲渲染出带有贴图的人脸模型

人脸模型参数与表情参数

可以将计算出的表情权重迁移到相同设置的blendshape模型上,用人脸去驱动模型动画,实现类似animoji的效果。也可以改变人脸原有的表情参数,让照片动起来。

15.jpg

▲模型的blendshape需要与人脸的blendshape一致(表情相同)[6]

16.GIF

▲人脸驱动模型动画

17.gif

▲让照片“活”起来

大概写到这,其他方法或细节以后有机会再补充。


参考

[0] Apple just unveiled 'Animoji' — emojis that talk and sync to your face
[1] Facebook buys popular face swapping app for silly selfies
[2] A Morphable Model For The Synthesis Of 3D Faces
[3] Face Transfer with Multilinear Models
[4] 3D projection
[5] High-Fidelity Pose and Expression Normalization for Face Recognition in the Wild
[6] iPhone X Facial Capture – Apple blendshapes