迈向快速、精确且稳定的 3D 稠密人脸对齐
By Jianzhu Guo, Xiangyu Zhu, Yang Yang, Fan Yang, Zhen Lei and Stan Z. Li. The code repo is owned and maintained by Jianzhu Guo.
[Updates]
2021.7.10: 在 Gradio 上在线运行 3DDFA_V2。2021.1.15: 借用 Dense-Head-Pose-Estimation 的实现以加快网格渲染(速度提升约 3 倍,15ms -> 4ms),详见 utils/render_ctypes.py。2020.10.7: 在 latency.py 中添加完整管线的延迟评估,只需运行python3 latency.py --onnx,详见 Latency 评估。2020.10.6: 为 FaceBoxes 添加 onnxruntime 支持以降低人脸检测延迟,只需附加--onnx操作以启用,详见 FaceBoxes_ONNX.py。2020.10.2: 添加 onnxruntime 支持以大幅降低 3dmm 参数推理延迟,在运行demo.py时只需附加--onnx操作,详见 TDDFA_ONNX.py。2020.9.20: 添加包括姿态估计以及序列化为 .ply 和 .obj 在内的功能,见 demo.py 中的pose、ply、obj选项。2020.9.19: 添加 PNCC(Projected Normalized Coordinate Code)和 uv 纹理映射功能,见 demo.py 中的pncc、uv_tex选项。
引言
本工作扩展了 3DDFA,命名为 3DDFA_V2,题为 Towards Fast, Accurate and Stable 3D Dense Face Alignment,已被 ECCV 2020 接收。补充材料见 此处。上方的 gif 展示了在实验室场景下追踪结果的摄像头演示。本仓库是 3DDFA_V2 的官方实现。
与 3DDFA 相比,3DDFA_V2 实现了更好的性能和稳定性。此外,3DDFA_V2 采用了快速人脸检测器 FaceBoxes 而非 Dlib。该仓库还包含一个由 c++ 和 cython 编写的简单 3D 渲染器。该仓库支持 onnxruntime,使用默认骨干网络回归 3DMM 参数时,以单张图像作为输入,延迟约为 CPU 上 1.35ms/图像。如果您对该仓库感兴趣,请在此 **google colab 上尝试!欢迎提出有价值的 issue、PR 和讨论 😄
快速入门
需求
参见 requirements.txt,已在 macOS 和 Linux 平台上测试。Windows 用户可参考 FQA 解决构建问题。请注意,本仓库使用 Python3。主要依赖项包括 PyTorch、numpy、opencv-python 和 onnxruntime 等。如果您使用 --onnx 标志运行演示以进行加速,可能需要先安装 libomp,例如在 macOS 上执行 brew install libomp。
用法
- 克隆此仓库
git clone https://github.com/cleardusk/3DDFA_V2.git
cd 3DDFA_V2
- 构建 NMS、Sim3DR 和更快的网格渲染的 cython 版本
sh ./build.sh
- 运行演示
# 1. running on still image, the options include: 2d_sparse, 2d_dense, 3d, depth, pncc, pose, uv_tex, ply, obj
python3 demo.py -f examples/inputs/emma.jpg --onnx # -o [2d_sparse, 2d_dense, 3d, depth, pncc, pose, uv_tex, ply, obj]
# 2. running on videos
python3 demo_video.py -f examples/inputs/videos/214.avi --onnx
# 3. running on videos smoothly by looking ahead by `n_next` frames
python3 demo_video_smooth.py -f examples/inputs/videos/214.avi --onnx
# 4. running on webcam
python3 demo_webcam_smooth.py --onnx
跟踪的实现仅通过对齐完成。如果头部姿态 > 90° 或运动过快,对齐可能会失败。使用一个阈值来粗略检查跟踪状态,但它不稳定。
您可以参考 demo.ipynb 或 google colab 获取在静态图像上运行的分步教程。
例如,运行 python3 demo.py -f examples/inputs/emma.jpg -o 3d 将得到以下结果:
另一个例子:
在视频上运行将给出:
更多结果或演示可查看:Hathaway.
功能(迄今为止)
| 2D sparse | 2D dense | 3D |
|---|---|---|
![]() | ![]() | ![]() |
| 深度 | PNCC | UV 纹理 |
![]() | ![]() | ![]() |
| 姿态 | 序列化为 .ply | 序列化为 .obj |
![]() | ![]() | ![]() |
配置
默认骨干网络为 MobileNet_V1,输入尺寸为 120x120,默认预训练权重为 weights/mb1_120x120.pth,详见 configs/mb1_120x120.yml。本仓库提供了另一个配置 configs/mb05_120x120.yml,其 widen factor 为 0.5,模型更小且速度更快。你可以通过 -c 或 --config 选项来指定配置。发布的模型如下表所示。请注意,论文中 CPU 上的推理时间是使用 TensorFlow 评估的。
| Model | Input | #Params | #Macs | Inference (TF) |
|---|---|---|---|---|
| MobileNet | 120x120 | 3.27M | 183.5M | ~6.2ms |
| MobileNet x0.5 | 120x120 | 0.85M | 49.5M | ~2.9ms |
令人惊讶的是,onnxruntime 的延迟要小得多。不同线程数下 CPU 上的推理时间如下所示。结果是在我的 MBP(13 英寸 MacBook Pro 上的 i5-8259U CPU @ 2.30GHz)上测试的,使用的是 1.5.1 版本的 onnxruntime。线程数通过 os.environ["OMP_NUM_THREADS"] 设置,更多详情请参阅 speed_cpu.py。
| Model | THREAD=1 | THREAD=2 | THREAD=4 |
|---|---|---|---|
| MobileNet | 4.4ms | 2.25ms | 1.35ms |
| MobileNet x0.5 | 1.37ms | 0.7ms | 0.5ms |
延迟
onnx 选项大幅降低了整体 CPU 延迟,但人脸检测仍占据大部分延迟时间,例如,对于 720p 图像,延迟为 15ms。3DMM 参数回归对于单个人脸大约需要 1~2ms,而密集重建(超过 30,000 个点,即 38,365 个点)对于单个人脸大约需要 1ms。跟踪应用可能受益于快速的 3DMM 回归速度,因为并非每一帧都需要进行检测。延迟是在我的 13 英寸 MacBook Pro(i5-8259U CPU @ 2.30GHz)上测试的。
默认 OMP_NUM_THREADS 设置为 4,您可以通过设置 os.environ['OMP_NUM_THREADS'] = '$NUM' 或在运行 python 脚本前插入 export OMP_NUM_THREADS=$NUM 来指定它。
FQA
-
训练数据是什么?
我们使用 300W-LP 进行训练。您可以参考我们的 论文 以获取有关训练的更多详细信息。由于训练数据 300W-LP 中闭眼图像较少,因此在闭眼时眼部关键点不准确。网络摄像头演示中的眼部部分效果也不佳。
-
在 Windows 上运行。
您可以参考 此评论 以了解如何在 Windows 上构建 NMS。
致谢
- FaceBoxes 模块修改自 FaceBoxes.PyTorch。
- 3D 稠密人脸对齐或重建的先前工作列表:3DDFA, face3d, PRNet。
- 感谢 AK391 托管 Gradio 网络应用。
其他实现或应用
- Dense-Head-Pose-Estimation:用于人脸网格、头部姿态、关键点等的 Tensorflow Lite 框架。
- HeadPoseEstimate:基于 3D 面部关键点的人脸姿态估计系统。
- img2pose:借用本仓库中 Sim3DR 的渲染器实现。
引用
如果您的工作或研究受益于本仓库,请引用以下两个 bib 文件 : ) 并 🌟 本仓库。
@inproceedings{guo2020towards,
title = {Towards Fast, Accurate and Stable 3D Dense Face Alignment},
author = {Guo, Jianzhu and Zhu, Xiangyu and Yang, Yang and Yang, Fan and Lei, Zhen and Li, Stan Z},
booktitle = {Proceedings of the European Conference on Computer Vision (ECCV)},
year = {2020}
}
@misc{3ddfa_cleardusk, author = {Guo, Jianzhu and Zhu, Xiangyu and Lei, Zhen}, title = {3DDFA}, howpublished = {\url{https://github.com/cleardusk/3DDFA}}, year = {2018} }
联系方式
Jianzhu Guo (郭建珠) [Homepage, Google Scholar]: guojianzhu1994@foxmail.com 或 guojianzhu1994@gmail.com 或 jianzhu.guo@nlpr.ia.ac.cn (此邮箱即将失效)。








