原文链接:https://zhuanlan.zhihu.com/p/97564880
原始论文:https://gravis.dmi.unibas.ch/publications/Sigg99/morphmod2.pdf
算法主要思想是:利用一个人脸数据库构造一个平均人脸形变模型,在给出新的人脸图像后,将人脸图像与模型进行匹配结合,修改模型相应的参数,将模型进行形变,直到模型与人脸图像的差异减到最小,这时对纹理进行优化调整,即可完成人脸建模。
改论文主要有两个步骤:
- 构建人脸形变模型
- 三维人脸重建
一、三维形变人脸模型
作者将人脸分为两种向量:形状向量和纹理向量。
形状向量(shape-vector),包含了 坐标信息:
where: n代表的是模型的顶点数。
纹理向量(texture-vector), 包含了 颜色值信息:
假设所有面孔都是完全对应的,建立三维形变的脸部模型由 个脸部模型组成,其中每一个都包含相应的 两种向量。这样在表示新的三维脸部模型的时候,我们可以用以下的方式表示:
, ,
这样一个新的脸部模型就可以由已有的脸部模型线性组合,因此也可以把新的脸部模型进行如下的表示 ,其中 .
在参数化模型之后,就可以通过改变 和 来生成新的脸部模型。
为了从已有的mmm个人脸数据模型中找到一个平均脸部特征,利用Principal Component Analysis(PCA)方法来找到这样一个平均脸部模型。
以下的步骤均为PCA算法流程:
- 计算
- 中心化人脸数据,求得
- 分别计算协方差矩阵
- 求得相应协方差矩阵的特征值和特征向量
在完成以上步骤的后,新的脸部模型的就可以用以下的公式进行表示:
其中, 分别是协方差矩阵 的特征值和特征向量。
系数 的概率分别为:
二、匹配形变模型到2D人脸图像
在有了形变模型之后,对于一张给定的人脸照片,我们需要将模型与人脸照片进行配准,然后对模型的参数进行调整,使其与照片中的人脸差异值达到最小。简单而言,不断依据模型与输入的人脸照片进行比对,不断进行迭代,使两者之间的比对误差达到最小,这个时候,我们可以近似认为该模型即为对应输入的人脸照片的三维模型。
为了可以使形变模型与输入的照片进行量化比较,需要利用模型重建出模型照片,使得模型图片 与输入的图像 直接的欧式距离最小,即 最小:
由 系数决定好的脸部模型,在渲染的时候我们还需要的参数 ,它包括了相机参数,对象尺寸,图像的旋转和平移,环境的光照强度等等,因此我们可以继续将脸部模型扩充表示为 。
所以原问题可以转化为,寻找到相应的参数 ,使得条件概率 达到最大值。
根据贝叶斯定理, 在考虑到输入图片中存在噪声的情况,引入标准误差 ,可以得出:
因此,最大化该条件概率可以转化为最小化以下代价函数:
在寻找最优解的时候,计算 的时候回产生的问题是,此时的model是一个Mesh网格,如何提取出相应的 坐标的属性值,
上式中, 是光照的方向, 是相机位置和三角中心位置的正交化差值, 是反射光的方向向量, 表示表面的反射率, 控制镜面反射的角分布。如果存在阴影投影到一个三角形的中心位置的时候,以上公式可以化简为: ,对于高分辨率的三维网格(即更密的三维网格)的时候,每个三角形之间的差异会变得很小,因此 可以由以下的公式近似得到:
是三角形 对应的图像区域,在进行计算的时候,使用随机梯度下降的方法来达到最优值,为了避免由于噪声出现的陷入局部最优的情况,每次计算的时候,从 随机取出子集进行计算,然后进行以下的计算:
配准流程:
- 对输入图像进行down-sample(下采样)处理;
- 先从 进行优化,然后加入 ,在每次的子迭代过程中,逐步添加需要的元素和组件;
- 先尝试较大值 (高斯噪音的标准差),然后逐渐减小 ;
- 在最后的迭代过程中,脸部模型的分解为小的Segment, 这个时候固定好 ,然后对于每一个Segment,分别对 和 参数进行优化,这样可以得到脸部的细节特征达到一个较好的优化。
找到最优值 后,相应的三维脸部模型就可以按照参数建立得到。
多视角图像的生成:
将此技术扩展到一个人的多个图像可用的情况是很简单的,形状和表情接收同一个共同 基控制,分割出不同的 来控制不同的图片输入角度, 替换为每对输入图像和模型图像的图像欧式距离之和,并同时优化所有参数,如下图:
最后放论文中一个效果图:
参考:
1.https://blog.csdn.net/qq_39426225/article/details/97671694
2.https://blog.csdn.net/likewind1993/article/details/79177566