3DMM的传统优化方法

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

  1. BFM09模型
    代码中是original_BFM = loadmat('BFM/01_MorphableModel.mat'), 我们主要使用它的shape basis以及texture basis.
  1. Expression模型,用于模拟各种表情
    代码中是Expbin = open('BFM/Exp_Pca.bin','rb')以及expEV = np.loadtxt('BFM/std_exp.txt'),表情基及其特征值。特征值对于PCA模型是比较重要的,用于衡量这个基的重要性,后面在优化的时候,某个基的参数a的约束就是 $(a/e)^2 \le \theta$, 因此特征值越大,该基的分量$a$就可以越大。
  1. 下标关系
    我们还需要3DMM的顶点的下标关系,三角形结构等一系列信息,从而获得面部的每个区域对应的顶点下标。这些信息原始的BFM那个文件是没有的。MSRA自带就有。实际上MSRA的信息也是来自3DDFA,可以参考这里第3点: https://github.com/YadiraF/face3d/blob/master/examples/Data/BFM/readme.md
  1. Download raw BFM model

    website: https://faces.dmi.unibas.ch/bfm/main.php?nav=1-2&id=downloads

    copy 01_MorphabelModel.mat to raw/

  2. 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)的维度, 这个映射可以用一个矩阵来完成,并且该矩阵是一个固定的值,因此不影响整体的优化算法。

0%