人脸三维重建与表观建模(四)如何训练3d morphable model三维形变模型
有了3d morphable model三维形变模型,那么问题是怎么能够训练这个模型,
上面这个流程图是《FaceWarehouse: a 3D Facial Expression Database for Visual Computing》中的一张流程图。
首先是用深度采集设备,如kinect,获取一个人在不同表情下的几何结构,这是一个点云的形式。
然后通过kinect fusion把缺失的部分补齐,这个点云的几何结构不能直接用, 这是会做一个标准的人脸模型,这个人脸模型拓扑结构是定义好的,然后把这个标准的人脸几何模型,通过非刚性的形变就能把它形变到采集到的点上,就得到了用标准的人脸拓扑结构表示采集到的人脸的几何模型。
有一个问题是假设要求模特做10种或者20种表情,每个人的理解是不同的,如张嘴动作,张嘴每个人张的大小不一致,这时候就需要一个facial rigging的过程,提前定义一个标准的表情模版,通过标准表情模版和采集数据的模版之间的匹配,就可以得到不同的人在标准表情下对应的几何机构,然后把这个流程重复在许多人身上,就可以得到一个数据集,再对这个数据集进行pca分解,就可以得到三维形变模型中的向量,这样就完成了整个模型构建的过程。
有了构建好的模型,这时三维人脸重建的过程就退化成对模型中参数回归的过程,参数有4个
第一个确定人脸几何结构要选择投影矩阵的方式,用弱视透视投影或者透视投影,这里用Π表示。
第二个和第三个参数就是与人脸长相相关的两个参数,一个是个人的长相,一个是表情
第四个是否恢复人的肤色颜色,如果用肤色,还要用肤色模型。
有了这些,通过一张输入图片,对以上固定的参数进行回归的问题。常用的两个约束如下:
这两个约束,一个是人脸特征点,一个是人脸皮肤颜色。人脸特征点是在三维人脸模型上预先定义好的,就是68个常用的特征点,通过2d特征点检测器在输入图像上也检测到对应特征点,这种成像通过投影矩阵,把3维模型的特征点映射到2维图像像素上对齐。这个过程就能构建人脸几何结构的约束。
另外一个约束,三维模型上每一个点所属的颜色,,与它投影到2维图像上的像素的颜色是一致,通过它构建一个约束。
通过以上两个约束,就可以得到一个三维图像比较好的构建效果。
上图是2018年今EGSR Eurographics Symposium on Rendering Wiley/ Blackwell 会议上发表的,可以看上面左边的feature,是以人脸特征点作为约束做的重建效果已经做的非常好,加上颜色信息会在一些细节上呈现更好的重建效果。
在做人脸三维重建的过程中有一个重要的选择是选择投影矩阵,选择弱透视投影或者透视投影。
弱透视投影或者透视投影的区别,透视投影能呈现近大远小的效果,问题是计算复杂,正交矩阵不能呈现近大远小的效果,为了能呈现近大远小,又不需要带来很大的计算量,透视投影引入了一个数:
就是上图公式中的f,如果一个人离镜头比较近,那脸看上去比较大,就会给他一个很大的skill,如果一个人离镜头比较远,那脸看上去比较小,就会给他一个很小的skill,通过控制f,可以实现近大远小的效果。但是弱透视投影忽略了相机的投影过程。
在人脸三维重建过程中,当采集到人脸离相机比较近的图像,会有一个问题。你可以打开手机的前置摄像头,你离前置摄像头更近的过程,慢慢就会被你的脸颊挡住,随着你离前置摄像头远离,你会慢慢出现图像当中。这就是透视投影的效果,
弱透视投影不管人脸和相机的距离远近都会投影到屏幕上,人脸离相机比较近她的拟合效果是不好的。相反用透视投影就没有这个问题。但是做透视投影会碰到一个问题,要恢复相机的内参矩阵,相机内参矩阵包括相机的焦距(fx和fy),
和光芯位置(相机光轴在图像坐标系中的偏移量)cx和cy。一般在做产品过程中会假设相机的光芯就是输入图像的光芯,这个假设的问题是在深度学习框架下,输入的人脸图片 很有可能是从其他相机拍摄的图片上crop 下来了,在整个裁剪的过程中已经破坏了相机内参矩阵,
这时再去恢复一个假设像机的内参矩阵,得到的内参矩阵并不完全正确。
另外一个问题是拍摄的人物离镜头比较远,这时透视投影矩阵就会退化成弱透视投影矩阵,这时候透视投影矩阵和弱透视投影矩阵已经没有多大的区别。在实际做产品过程中,如自拍应用是必须要考虑透视投影矩阵的效果,也是实际工程当中采用的普遍思路。
参看前文:
飘哥:人脸三维重建与表观建模(一)什么是三维人脸重建飘哥:人脸三维重建与表观建模(二)工业领域的三维人脸重建飘哥:人脸三维重建与表观建模(三)用一张人脸图片进行三维人脸重建