3DMM的模型组成
3DMM是一类参数化3D建模的模型系列,其中最常用的就是来自巴塞尔大学的BFM模型。不同的3DMM模型的区别主要在于PCA的选择不一样。
BFM家族的3DMM不是一步创建的,它实际上是由多个不同的研究成果组成。最早的BFM只有Shape, 不能够模拟表情。从MSRA的使用神经网络进行三维重建的代码中,我们可以了解到目前使用3DMM的传统优化算法所需要使用到的全部数据。
3DMM的数据组成
我们主要参考https://github.com/microsoft/Deep3DFaceReconstruction 里面构建3DMM的方法来说明构建BFM所需的数据: https://github.com/microsoft/Deep3DFaceReconstruction/blob/80066b54507e98652e7efb2d4213146632380a05/load_data.py#L40
- BFM09模型
代码中是original_BFM = loadmat('BFM/01_MorphableModel.mat')
, 我们主要使用它的shape basis以及texture basis.
- 下载: https://faces.dmi.unibas.ch/bfm/main.php?nav=1-0&id=basel_face_model
从这里我们只使用01_MorphableModel.mat这一个文件即可。
- Expression模型,用于模拟各种表情
代码中是Expbin = open('BFM/Exp_Pca.bin','rb')
以及expEV = np.loadtxt('BFM/std_exp.txt')
,表情基及其特征值。特征值对于PCA模型是比较重要的,用于衡量这个基的重要性,后面在优化的时候,某个基的参数a的约束就是 $(a/e)^2 \le \theta$, 因此特征值越大,该基的分量$a$就可以越大。
下载:https://github.com/Juyong/3DFace 这里第一个链接https://drive.google.com/file/d/0B0A9UsiwtVTHY0p4em5qUzRISW8/view 就是Coarse_Dataset.zip (4.7GB),抽出里面的Exp_Pca.bin, 特征值std_exp.txt在这里是没有的,只有MSRA自带的那个有,是需要跑sample code来算出来的。这个表情来自文章: 3DFaceNet: Real-time Dense Face Reconstruction via Synthesizing Photo-realistic Face Images.
[optional 2]: 3DDFA这个数据集上面还有一个expression基: Model_Expression.mat, 但是现在不用。来自文章: Face Alignment Across Large Poses: A 3D Solution, 链接: http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm
- 下标关系
我们还需要3DMM的顶点的下标关系,三角形结构等一系列信息,从而获得面部的每个区域对应的顶点下标。这些信息原始的BFM那个文件是没有的。MSRA自带就有。实际上MSRA的信息也是来自3DDFA,可以参考这里第3点: https://github.com/YadiraF/face3d/blob/master/examples/Data/BFM/readme.md
Download raw BFM model
website: https://faces.dmi.unibas.ch/bfm/main.php?nav=1-2&id=downloads
copy 01_MorphabelModel.mat to raw/
Download extra BFM information from 3DDFA(Face Alignment Across Large Poses: A 3D Solution) and HFPE(High-Fidelity Pose and Expression Normalization for Face Recognition in the Wild)
website: http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm
download [Face Profiling] and [3DDFA]
website: http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/HPEN/main.htm
download [HPEN]
copy *.mat to 3ddfa/
在Face Profiling/ModelGeneration下面有model_info.mat, 里面有三角形信息,以及对应68点的下标信息。至此,我们拿到了所有的mat,可以开干了。如果需要106点或者其他关键点的对应信息一般是需要手动在maya中选点了。
数学原理
3DMM的传统拟合方法就是从3DMM中挑出部分关键点,优化一个相机矩阵A和PCA的参数,使得这部分点投影在平面上与2D的关键点检测器的结果一致。这些选的点可以是学术界常用的68点,也可以是工业界常用的106点或者其他的合适的点。记这些3D点为p3d, 同时,我们记其投影到2D上的点为p2d.。
给定一张图片,我们首先通过关键点检测算法算出p2d的坐标位置。 由于p3d是由3DMM的参数coeff唯一确定的,所以我们需要根据p2d以及p3d,求出相机矩阵P以及3DMM各个PCA的参数。注意这里p3d的坐标是随着迭代不断更新的。
因此,我们的优化目标是:
其中$\theta$就是coeff。 如果需要限制coeff的大小,我们需要增加一个约束条件,使得每个基的参数$\sum(\theta_i/EV_i)^2 < R$,那么问题改为
注意到A·PCA是固定的,这里我们用$\Phi$表示,同时用y表示p2d使用拉格朗日乘子法,那就是:
我们这里比较特殊的是,$\Phi$的每一维已经乘上EV了,因此$\theta$天生就不需要再除以EV,也就是
对$\theta$求导令为0即可得到:
整个过程连解方程都不需要,就能够得到最后的结果。注意,这里我们是强制指定$\lambda$的大小,看做一个固定值,实际上这个会变成调参的大坑,最好还是用迭代的方法不断更新$\lambda$, 不过效率也就下去了。
这里我们需要注意,原本的PCA可是3w多维的或者五万多维,比如说(35049*3, 80), 也就是一共有35049个点,80个基。 但是我们只使用比如68个点,因此这里的PCA也需要先挑选出相应的68个基,也就是我们所用的$\Phi$实际上就是(68x3, 80)的维度, 这个映射可以用一个矩阵来完成,并且该矩阵是一个固定的值,因此不影响整体的优化算法。