簡介
3D 人臉是非常有趣的研究領域。face3D 是一個基於 Python 的開源項目(https://github.com/YadiraF/face3d),實現了 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
開始使用
- 克隆倉庫:
git clone https://github.com/YadiraF/face3d
cd face3d
- 如果不是使用numpy版,需要編譯c++文件:
cd face3d/mesh/cython
python setup.py build_ext -i
- 如果要使用3DMM模型,需要准備 BFM 文件,可參考 https://github.com/YadiraF/face3d/blob/master/examples/Data/BFM/readme.md 。
接下來,就可以嘗試一些例子。
例子
進入example文件夾,直接運行一些例子:
3DMM
直接輸入python 2_3dmm.py
就能看到3dmm的運行示例。
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 的代碼和原理。