这篇文章是我对论文 Real-time Facial Surface Geometry from Monocular Video on Mobile GPUs 的摘抄,你可以在这里找到原文:https://arxiv.org/pdf/1907.06724.pdf

这篇来自Google的论文预印本发表于2019年,描述了基于深度学习的3D人脸网格重建过程。该面部网格包含468个端点,在移动端的GPU上可以获得100+ FPS的检测速度,并已经应用在了Google ARCore中。

文章中的模型输出结果

面部特征点检测大致可以分为两个方向。一种是给出图像中人脸特征点的二维像素坐标,例如项目cnn-facial-landmark里所展示;另一种是给出一个三维形变模型(3D morphable model, 3DMM)的具体参数,通常使用主成分分析(Principal component analysis, PCA)来实现。论文作者使用深度神经网络来直接输出面部网格468个端点的3D坐标。这468个端点并非均匀分布,在多变且重要的区域密度更高,例如眼周与嘴唇。之后使用Catmull-Clark算法将网格转换为光滑曲面。

3D网格示例。作者:Yury Kartynnik, et al.

图像处理流程

  1. 待检图像首先由人脸检测器处理得到面部区域以及少量特征点,然后旋转面部区域使得双眼连线与面部边界框的水平边平行。我猜这样可以降低难度。
  2. 将面部区域裁出并缩放到指定大小作为网络输入(完整模型为256×256像素,轻量模型为128×128像素)。模型的输出包含两部分,一部分为一个向量,即网格端点的3D坐标;另一部分为一个标量,类似质量分数。

网络输出的所有端点的x坐标与y坐标均为图像中的像素坐标,而z坐标则是该点与通过网格质心参考平面的距离。

数据集与训练过程

训练过程使用了约3万张在全球实地采集的手机照片。训练过程中除了使用裁切等标准增强方法,还引入了图像传感器噪声、直方图随机非线性变换来模拟极端光照环境。3D网格的468个端点坐标是工作的一大难点。作者使用如下方法来制作:

  1. 使用两个不同的数据来源训练初始模型。第一个为真实人脸图像对应的合成三维形变模型端点的一部分子集。第二个为分布在真实人脸图像中有意义边界上的部分二维端点,这部分数据由神经网络的一个独立分支输出。经过训练的第一个模型可以处理数据集中30%的图像,并满足后续处理的需求。
  2. 始终使用最新模型输出的x与y坐标来自我迭代优化,不断去除输出质量满足要求的样本。这一步有人工标注的参与。优化的过程不包含z坐标。

模型架构

对于网格的输出作者使用了定制化的残差网络,并且在早期实现了激进的降采样。作者认为这样做的好处是早期的感受野会覆盖较大的范围,由于padding的作用,在图像边缘处其相对位置可以隐式地提供有价值信息。这样深层神经元可以更好的区分口相关及眼相关特征。

针对视频的时域稳定滤波

为了克服视频中逐帧检测造成的坐标点抖动,作者引入了Euro filter来稳定检测结果,并按照特定时间窗口内人脸尺寸的变化速度来更新滤波器参数。这样处理可以消除肉眼可见抖动。

测试数据结果

模型评价以模型预测结果与实际数据的平均绝对距离(Mean absolute distance)为依据,并针对瞳距进行归一化。评价只包含x与y坐标,不含z坐标。在1700份测试数据上的结果如下:

Model MAD Time, ms (iPhone XS) Time, ms (Pixel 3)
Full (256×256) 3.96% 2.5 7.4
Light (128×128) 5.15% 1 3.4
Lightest (128×128) 5.29% 0.7 2.6

11位人类标注员的平均MAD为2.56%。

最后是两张应用的示例图片:

左图为材质贴图,右图为虚拟眼镜。作者:Yury Kartynnik, et al.

关键来了,该论文的复现可能性有多大?

如果要是原样复现的话,我觉得有几个难点。

  1. 训练数据。z坐标完全来自人脸三维形变模型,如何针对真实人脸图像生成该模型论文没有细讲。
  2. 训练的过程是迭代的,且包含了大量的人工修正。普通人估计很难短时间内完成11个数据标注员的工作量。
  3. 文章只是冰山一角,还有看不见的坑在后边等着。

不过,如果不是要原样复现论文的研究过程,只是复现一个有着类似功能的模型呢?

如果你也对这项工作感兴趣,欢迎一起来讨论!

(或许应该建个微信群)