3d 人脸重建论文解读

Accurate 3D Face Reconstruction with Weakly-Supervised Learning:From Single Image to Image Set 解读

最近看到一篇<>很不错的3d face重建文章,做个简单笔记。
这篇文章通过弱监督学习来实现人脸重建,并且支持基于多张图的人脸重建。
论文链接:https://arxiv.org/abs/1903.08527
官方实现(tensorflow):https://github.com/microsoft/Deep3DFaceReconstruction
Pytorch实现:https://github.com/yuhaoooo/Deep3DFaceReconstruction-Pytorch

论文创新点

这篇论文的主要创新点在:

  1. 提出了多种loss组合的方式进行弱监督学习,实现了细节层面和感知层面的监督。
    很多有监督学习的论文估计3d人脸参数时需要3d信息标签,比如,PRNet需要通过人脸3d坐标信息计算出uv map,用这个uv map监督网络的训练,3ddfa方法则需要人脸图片对应的BFM模型62维参数做监督。实际上,3d人脸数据还是很少的,要么用Kinect或者三维扫描仪获取,要么就是用2d face landmark加上人脸纹理,边缘等信息来拟合,这些方法也只能保证中小角度拟合出来的人脸数据误差不大,为了获取大角度人脸的3dmm参数,还需要使用face profiling等操作,将3d人脸旋转成大角度再投影到相平面上。所以,为了获取人脸的3d标签要很折腾,而本篇论文提出的方法则避免了这个问题。
  2. 实现了多张图片进行人脸重建方法,不同场景下的人脸图片能够相互补充,提供更丰富的信息。

网络架构

整个网络结构如下:

3d 人脸重建论文解读_第1张图片

R-Net是一个常规的回归网络,用来预测3d人脸相关参数,比如identity, 表情,纹理,姿态,光照。其中前4个类别是3dmm人脸定义需要的:

上式的alpha, beta为人脸的identical 和表情系数,这篇论文的identical和颜色参考的是BFM模型,只取了前80维数据(原始维度为199),而表情部分的系数则参考了Face Warehouse数据集给出的前64维。

东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。

同时,由于一张人脸在不同光照下在相机上呈现的效果是不一样的,所以论文里也考虑了光照,模型选择了Spherical Harmonics,包含9个参数。三维模型投影到二维平面上要经过MVP变换,相机不同的位置可以拍下不同角度的人脸,注意本文使用的是透视相机模型,前面说的PRNet和3ddfa使用的是弱正交投影模型,相机有6个自由度(3个旋转和3个平移)。
至此,R-Net要回归出来的有 80 + 80 + 64 + 9 + 6 =239个参数。如果是按照有监督学习训练的话,我们需要给网络一张图片,以及239个参数作为label,加个l2损失函数来训练,那么问题来了,怎么获取一张图片光照的参数呢?相机的位置参数又怎么确定呢?真实世界上是很难采集到这些参数的。
但是对于无监督学习来说,这个问题就迎刃而解了。

3d 人脸重建论文解读_第2张图片

由于我们可以通过上面说的人脸模型参数,光照模型参数以及相机模型参数,那么我们就可以用计算机图形学的知识将3d人脸投影到相平面上(上图的I’),最后通过多种loss共同约束网络的训练。

复合loss

R-Net的loss包括两大部分,图像级别的loss和感知级别的loss

  • 图像级别loss

这个级别的loss包括Photometric Loss,landmark loss,正则loss和纹理loss

Photometric loss


其中I_i为原图,I’为重构的图片,A_i为皮肤Attention系数,也就是说只对人脸皮肤位置计算loss,没必要让背景以及头发等不关注的地方参与计算。
那么如何获取脸部皮肤区域位置呢?其实网上也有一些人脸segmentation的模型可以用,不过这里作者使用了高斯混合模型训练了一个bayes分类器来做分割的。

Landmark loss

作者使用另一个强大的3d face landmark检测器(https://www.adrianbulat.com/face-alignment)给训练图片打上3d landmark标签q,然后将网络重构的人脸投影在相平面上获取预测的landmark q’,然后求他们的2范数即可。

上面的w_n是针对不同点的权重,对于鼻子,嘴角比较明显的位置权重为20,其他位置为1。

  • 感知级别loss

如果只有图像级别的loss,网络很容易陷入局部最小值,为了避免这一问题,作者加入了感知loss, 其实就是将输入图片和重建图片分别输入到人脸识别网络,获取两个特征向量,二者越相似则loss越小,具体定义如下:

  • 正则loss和纹理loss

为了防止过拟合,使用了常见的正则约束。

为了防止纹理变化太快,作者有添加了一个约束纹理变化的loss

最后,将上面说的所有loss加在一起。

从多张图做人脸三维重建

上面讲的都是如果从单张图片推理出3dmm参数进而重构人脸的,但实际情况时我们是有可能得到一个人不同姿态,表情下的图片的,这些不同类型的图片能对人脸信息做补充。比如net接受到的图片有带口罩未带眼镜的,有带眼镜未带口罩的,那么两种类型的数据完全可以相互补充,得到未带眼镜未带口罩的人脸信息。那么剩下的问题就是确认从图片推理出来的参数哪些是可信的,哪些是不可信的呢?
为了解决这个问题,作者提出了C-Net.从R-Net的第一层残差网络和全连接层,经过全局池化和全连接层后经过sigmoid激活函数最后输出为一个80维的向量,这个向量与R-Net输出80维的alpha向量一一对应,代表了alpha的置信度。有了每张图片的alpha的置信度,那么就可以从不同的图片提取出置信度最高的那些参数了。比如前面说的戴眼镜的图片前40维度置信度高,带口罩的图片后40维度置信度高,那么完全可以利用这两份数据拼凑出一份置信度都高的80维参数。聚合后的参数定义如下:

其中j表示某个人的第j张人脸图片,c^j 为C-Net输出的置信度,alpha^j 为bfm人脸模型identical系数。
注意,这里假设每张图片人脸的identical系数都是固定的,但是表情,光照可能是变的。

最后作者比较了在各种方法的人脸重建结果,自己提出的方法更优。

3d 人脸重建论文解读_第3张图片

3d 人脸重建论文解读_第4张图片
欢迎关注公众号:opencv520 ,会定期更新各种视觉相关文章哦.

你可能感兴趣的:(视觉算法,深度学习,python,人工智能,人脸识别)