前情分析
这里主要写一下二维人脸重建该人脸的三维模型的一些基础的知识。
主流做法
- 多视图几何重建。其需要采集不同角度的人脸,对设备的要求很高。
- 通过
RGBD
或者RGB
图像去重建,由模型特点所致,无法生成模型细节。
单张图像重建
3DMM方法
- 对设备要求低,算法简单,易于移动端时间实时重建。
- 基于模型的方法,重建的结果非常完整,拓扑结构已知(对于换脸,换表情之类很友好)。
- 基于模型的方法,对模型依赖太高。
这里的前提是我们已经有了输入图像人脸的关键点,已有模型的人脸关键点,输出人脸的三维网格。
在Blanz的方法中,他们扫描200张成年人的人头模型,每个模型包含大约70000个顶点。经过PCA处理,制作成参数化人脸模型,每张人脸模型的拓扑结构相同,只是顶点位置或颜色有所差异。你可以把各个特征向量看作是人脸不同的特征,比如脸的长短,胖瘦等。
这里人脸模型分成两个向量:
形状:(S = (X_1,Y_1,Z_1,X_2,dots,Y_n,Z_n)in R^{3n})
纹理:(T = (R_1,G_1,B_1,R_2,dots,G_n,B_n)in R^{3n})
因此任意一个新的人脸都可以由这些特征向量线性组合生成:
(S = ar S+sum^m_{i=1}a_iS_i; T=ar T+sum^m_{i=1}b_iT_j;)
(sum_{i=1}^ma_i=sum^m_{i=1}=1)
这样的话原本的任务就变成了对(a_i,b_i)的求解了。
其原理和这个动图演示的差不多,也是调整权重,对已有数据进行线性组合得到3D人脸。
blendshape是3d软件里用来做模型形变的一种技术,通过调整权重,设计师可以将目标模型变化成一系列预定义的模型,或者这些模型的任意线形组合。
根据给定的图像去得到人脸模型,比较像渲染的逆过程,重建算法的关键在与找出合适的参数,使三维人脸模型在平面的投影尽可能接近原图像。如果不考虑纹理特征,问题可以简化为"使人脸模型关键点在平面上的投影与2D人脸关键点的位置尽可能接近"
人脸关键点检测结果一般是二维点, 也就是说, 脸的朝向不同,检测到的脸部边缘点也会不一样,2d人脸的边缘点并不在真正的脸颊边缘线上。
详情可看下图,上排图像的蓝点是二维人脸监测点,下排图像蓝点是模型关键点。其中红色对应的是2d的点,可以清楚的看出,图像检测出的2d边缘点与模型本身3d边缘点不同。因此,在迭代工程中,需要不断更新模型的3d边缘点索引,使二者一一对应。