项目作者:Yao Feng Github: https://github.com/YadiraF/face3d
简介
3D 人脸是非常有趣的研究领域。face3D 是一个基于 Python 的开源项目,实现了 3D 人脸研究的众多功能。它可以处理网格数据,用形变模型生成 3D 人脸,从单张二维人脸图片和关键点重建三维图像,渲染不同光照条件的人脸。 face3D 非常轻量化,最开始完全是基于 Numpy 写的。但有些函数(比如光栅化)不能用向量化进行优化,在 Python 中非常慢。这部分函数作者改用 C++ 编写,没有调用 OpenCV、Eigen 等大型的库,再用 Cpython 编译以供 Python 调用。 项目作者考虑到初学者刚开始学习时应该聚焦在算法本身,同时让研究人员能够快速修改和验证他们的想法,Numpy 版本也被保留下来。此外,作者也尽量在每个函数中添加了引用的公式,以方便初学者学习基础知识、理解代码。更多的 3D 人脸研究信息,包括论文和代码,也可以在项目Github中找到。
结构
克隆项目仓库后,可以看到有 examples 和 face3d 两个文件夹。 example 文件夹提供了不同例子,包括代码、图像数据。 face3D 中有 mesh、mesh_numpy 和 morphable_model 3个文件夹,mesh 是网格处理的主要部分,mesh_numpy 是 mesh 的纯 Numpy 版本,morphable_model 提供了 3DMM 方法的实现。3DMM 是非常流行的3D人脸生成和重建的一个方法,具体可以参考《Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network》这篇论文。
开始使用
环境要求
- Python 2 或 3 - Python包: - numpy - skimage - scipy - matplotlib - Cython
简短说明
1. 克隆仓库:
git clone https://github.com/YadiraF/face3d
cd face3d
2. 如果不是使用numpy版,需要编译c++文件:
cd face3d/mesh/cython
python setup.py build_ext -i
3. 如果要使用3DMM模型,需要准备 BFM 文件,可参考:
https://github.com/YadiraF/face3d/blob/master/examples/Data/BFM/readme.md 。 接下来,就可以尝试一些例子。
例子
进入 example 文件夹,直接就能运行一些例子:
3DMM
直接运行2_3dmm.py就能看到3dmm的运行示例。
python 2_3dmm.py
3DMM生成的随机例子:
使用了68个关键点生成的例子:
变换
python 3_transform.py
修复相机位置并使用正交投影;然后变换人脸(缩放,改变pitch、yaw、roll 姿态角):
修复obj position并使用透视投影 (fovy = 30);然后移动相机位置并旋转相机(从远到近,向下和向上,向左和向右,旋转相机):
Image map
python 4_light.py
渲染图像像素中的不同属性,深度、pncc和uv坐标:
uv map
python 7_uv_map.py
在uv坐标中渲染不同的属性,颜色(纹理贴图)、位置(2D面部图像和相应的位置图):
结语
尝试完一些例子,如果要进行更深入的研究,建议按顺序阅读例子的代码,然后阅读 mesh_numpy 的代码和当中的原理。 3D图像是非常有趣的玩意,后续会有更多开源项目或文献的介绍。
记得关注 AI 实验室,开启 AI 动手之旅!