> ## Content Index
> Fetch the complete content index at: https://yinguobing.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# 深度学习3D人脸网格重建
- URL: https://yinguobing.com/blog/deep-learning-3d-face-mesh-prediction/
- Published: 2020-06-30T10:09:00.000Z
- Updated: 2022-05-29T06:05:50.000Z
- Description: Google AR人脸特效核心技术
- Author: 尹国冰
- Tags: 深度学习, TensorFlow, 图像处理

> 这篇文章是我对论文 *Real-time Facial Surface Geometry from Monocular Video on Mobile GPUs* 的摘抄，你可以在这里找到原文：[https://arxiv.org/pdf/1907.06724.pdf](https://arxiv.org/pdf/1907.06724.pdf?ref=yinguobing.com)

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

![](https://yinguobing.com/blog/content/images/2020/06/0.gif)

文章中的模型输出结果

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

![](https://yinguobing.com/blog/content/images/2020/06/1907.06724-p1.jpg)

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%。

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

![](https://yinguobing.com/blog/content/images/2020/06/1907.06724-p2.jpg)

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

---

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

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

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

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

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