本文主要基于开源项目Face2face
[1](中间会提及到face3d
[2]和eos
[3]),对采用传统优化方法从二维图片拟合3DMM
的三维人脸重建算法整体流程做一个介绍。由于项目作者没有给出参考文献,笔者是从代码推论出来的整个算法,如有错误,欢迎指正。
一.算法流程
如图一所示,整个算法包含三个步骤,其中人脸关键点检测,用于获取二维图像上人脸的语义点,连同图片本身作为拟合问题的真值,而估计相机变换和估计身份、表情、纹理和光照系数则是拟合问题待求解的参数。
二.具体步骤
1.人脸关键点检测
项目中采用了dlib
或openpose
进行提取。非重点,这里就略过了。
2.估计相机变换参数
根据上述检测到的2D人脸关键点和当前估计的3DMM
人脸的3D关键点,采用黄金标准算法来估计相机变换参数,包括旋转、平移和尺度(对应项目代码位于face2face/optimize/camera.py)
。
当采用射影摄像机时,算法如下(见[4] P123P{123}P123)
当采用仿射摄像机时,算法如下(见[4] P126P_{126}P126)
与sfm
中估计基础矩阵或者本质矩阵的方法一样,这两种不同的相机模型下求解变换矩阵时也需要进行图像点和空间点归一化(见[4] P122P_{122}P122)
3.估计身份、表情、纹理和光照参数
构建目标函数
采用了投影2d关键点损失ElandE_{land}Eland、像素损失EpixelE_{pixel}Epixel和正则化损失Eid/exp/texregE_{id/exp/tex_{reg}}Eid/exp/texreg:
Etotal=w1Eland+w2Epixel+w3Eidreg+w4Eexpreg+w5EtexregE_{total}=w_1E_{land}+w_2E_{pixel}+w_3E_{id_{reg}}+w_4E_{exp_{reg}}+w_5E_{tex_{reg}}Etotal=w1Eland+w2E