Face Alignment 总结(长期更新)

由于先前做过一段时间的face方面的工作,觉得face方面的工作还是比较有意思的。在这里先对自己曾经学过的face alignment的内容做一个总结,如果有什么不对的地方,希望大家能够在评论区指出。


先来说说什么是face alignment,face alignment做的就是通过一定量的训练集(人脸图像和每个图像上相对应的多个landmarks),来得到一个model,使得该model再输入了一张任意姿态下的人脸照片后,能够对该照片中的关键点进行标记。

上图中,左边就是一系列的训练集,通过他们train出一个prediction model,然后通过model就得到了任意人脸的landmark标注。


一:ASM方法

asm全称是active shape model的方法,该方法是一种基于点分布(point distribution model)模型的算法。在PDM中,我们可以将手,人脸等器官的几何形状通过寻找相应的若干关键特征点的坐标依次串联形式一个形状向量来表示

如上图所示,图中白色的点就是上面所说的关键特征点,标记出来关键特征点的目的是在人脸检测的基础上,进一步能够确定人力各个脸部特征的具体位置的,为后续做face recognition等工作奠定基础。

而定位算法的基本思路就是:人脸的纹理特征和各个特征点之间的位置约束结合。两个比较经典的算法就是ASM和AAM。

这里就先讲讲ASM算法。

ASM算法总的来说,是通过对训练集标记的人脸特征点进行建模学习,然后在测试集上搜索最佳匹配的点,对人脸特征点进行定位。具体可以分为训练和搜索两个步骤。

  • 在训练的阶段:主要是构建各个特征点的位置约束,构建各个特征点的局部特征
  • 在搜索的阶段:主要是迭代到对应的特征点

先来讲讲训练阶段主要做的事情:

  • 首先构建形状模型(shape model):
    • 采集n个人脸的训练样本
    • 并且对每个训练样本必须有landmarks标记
    • 然后将这些landmarks的坐标取出来,串联成一个形状模型向量
    • 在对这个形状向量进行归一化和对齐
    • 在对这个经过归一化和对齐后的形状向量进行PCA处理
    • 接着,对于每个landmarks构建局部特征,这样做是在为后续的搜索阶段做准备,因为如果找到一个landmark以后,下一个step的搜索点就是以该landmarks为领域的一个矩形区域内来寻找

然后再来讲讲搜索阶段做的事情:

  • 为了提高算法的效率和鲁棒性,通常采用多分辨率的搜索策略,关于多分辨率不熟悉的读者,可以去看看我在的 图像处理与计算机视觉 中的高斯金字塔和拉普拉斯金字塔相关的章节来进行学习。
  • 通过在一个coarse的图像中第一次搜索对象,然后在一系列更加fine的区域内提炼具体的位置。
  • 一个新的landmarks和通过训练集训练好的局部特征点之间的相似度可以通过马氏距离来衡量
  • 在低分辨率的图像中以大的step去定下初始的搜索区域,然后在高的分辨率下,通过小的step去寻找较为精细的局部特征

上述方法中设计到的,多分辨率图像分析,PCA,马氏距离等方法都在我的模式识别和图像处理专栏里有讲,这里就不详细展开了,毕竟是一个以总价为向导的article,有兴趣的读者,可以去我的相关专栏进行学习。


二:CPR方法

前面刚刚讲过的ASM和AAM方法,其实都是基于形状约束的方法。还有另外一条主线,以及今后各个会议和期刊都使用的,那就是基于回归的方法。后面还有一系列的关于回归的非常精彩的做法,但是大都是基于CPR为基础做的改进和提升,那么我们对于CPR的总结就显得非常有必要了。

CPR全称是Cascaded Pose Regression。

首先,给图像一个initial shape(通常采用平均shape),然后通过多次的回归把shape回归到ground truth的地方。算法结构很简单,但是效果确实非常好:

回归过程如下:

  • 首先提取特征,采用的是Pose-indexed point features的方式
  • 通过提取的特征来train一个回归函数,文中叫做 random regressor
  • 然后通过回归出来的偏移量,加上当前阶段的shape,得到下一个阶段的shape
  • 反复上述过程,直到达到迭代上限,或者error不再变化为止。
  • random regressor的过程有点像一个随机森林,相当于一个贝叶斯分类器。


三:ESR方法

ESR方法来自 Face alignment by explicit shape regression。

我们首先先来讲讲训练阶段:

  • 首先是输入,输入的I就是人脸图像, S_i 表示的是通过landmarks的坐标排成的性状向量模型,也就是ground truth shape, \hat{S_i} 表示的是从N个人脸图像中,随机挑选出20张人脸图像,然后将他们的ground truth shape做平均,得到的initial shape。那么这样一来,我们的training数据集就扩展了20倍。这样做,就相当于做了data augmentation,从而提高了model的泛化性能,减少overfitting的风险。
  • 对于第t个stage来说,首先算出来该 S_i\hat{S_i} 的差,得到 \Delta\hat{S^t_i} ,然后通过shaped-indexed features的提取手段得到 f^t_i
  • 然后通过特征训练回归函数,(可以采用线性回归,CART,随机森林都行)作者在文中使用的是一个叫做regressor 的东西来训练回归函数的。
  • 对regressor的理解,他的大体形式有点类似随机森林,是一个贝叶斯模型。
  • 再通过ML中经常见到的,uz最小化Loss function来得到误差最小的regressor
  • 然后通过第t阶段的stage得到的 \hat{S^t_i}\Delta\hat{S^t_i} 得到第t+1阶段的 \hat{S_i}
  • 将T个stage中训练得到的所有regressor保存起来,用于test阶段

再来看看test阶段:

  • 首先,还是将第t-1个stage中的性状向量 S^{t-1} 和原始图像,通过shaped-indexed features的提取方式得到相对应的 f^t
  • 然后,通过训练得到相应的regressor,通过估计得到 \Delta S
  • 通过将 \Delta S 加上当前阶段的 S 得到下一个阶段的新的 S
  • 直到不断地迭代,得到最终的ground truth

通过上面的总结,我们可以看出,整个ESR的过程都是在利用向量相加,不仅非常有效,而且计算复杂度较低。

然后,通过图来讲述下上述过程:

  1. 首先通过人脸检测,得到图片中的人脸的具体位置

2. 然后通过将训练集中的平均人脸及其landmarks匹配到我们需要的测试图像上。

3. 然后随机找到400个pixel,并且使用第一个stage训练出来的regressor进行调整

4. 然后不断重复上述过程:

5.最终在最后一个stage,我们就可以看到此时的landmarks已经和原图非常接近了


总结起来就是:双层的random regressor回归器 + shape indexed feature


四:LBF方法:

LBF方法来自于Face Alignment at 3000 FPS via Regressing Local Binary Features这篇paper

它和之前的ESR都使用了同样的cascade的方式,将alignment的过程都分成了T个stage来做,每个stage的alignment都依赖于上一个stage得到的shape。

每个stage做的工作也是一样的:

  1. 先提取特征 (shape-indexed-feature)
  2. LBF编码
  3. 得到 \Delta S

先说说这篇paper的大体思路。

  • 整个过程分为T个stage来完成
  • 通过在training集上算出的真实\Delta S,利用linear regression来训练每个stage中的regressor
  • 然后在test集上对于每个stage中得到的regressor,来得到 \Delta S ,通过前一个stage的S,结合 \Delta S ,一步一步的更新,得到最终的S。

再来讲讲什么是shape-indexed-feature

作者认为,一个landmark和他周围的这些pixel是几何不变的,也就是说,特征和现有的一系列标定点是相关的。这篇paper的做法就是在一个landmark周围随机找出两个偏移量,形成两个点,用这两个点之间的像素作为特征。如下图中红色点表示landmark,绿色点表示选择出来的两个特征。

刚刚开始训练的时候,由于shape和ground truth之间的差距比较大,那么蓝色圈的半径应该尽可能大一些,越是训练到最后,shape和ground truth之间的差距就变小了,那么蓝色圈的半径也应该随之减小。如下图所示。

接下来就是LBP编码的过程

通过随机森林来做回归,每个stage都有k棵树,每棵树的深度为D,内部结点的分裂准则是最大方差减小。这篇paper并没有使用随机森林直接输出 \Delta S ,而是通过随机森林对特征进行编码。

关于每棵树是怎么训练的,记着论文中好像是用了一个叫做 最大方差减小的节点分裂准则来训练每一个tree。

然后得到的每一个tree都会有leafNum个叶子节点,所有的这些叶子节点又形成了一个leafNum维的向量:

  • 通过把训练sample通过每一棵树,最终总会落在其中一个叶子节点,sample落在哪个叶子节点,就把哪个位置标1,其他位置标0
  • 直到该sample通过k棵树后,把得到的这K个leafNum维向量连接起来,就得到了最终的K维的特征向量
  • 通过观察,可以看到,这些向量是非常稀疏的,只有很少位置是1,大多数位置都为0


Global Linear Regression:

通过LBF得到的编码为训练集中的所有landmark所公用,然后通过求解下面的式子,我们就能够得到权重W




五:3DDFA方法:

3DDFA方法,来自Face Alignment Across Large Poses: A 3D Solution

先来讲讲这篇paper解决的主要问题,由于在极端姿态下,包括各种角度的人脸,一些特征点变得不可见了,此时。同一个人,不同姿态下的人脸表现也存在了巨大的差异性,如果此时,还是通过前面的方法来做landmarks的定位的话,几乎来说是不可能了。为了解决上述问题,就出现了一种基于3D人脸形状的定位方法,也是将 deep learning 引入到了face alignment这个领域。

算法框架如下:


再来讲下算法的具体执行步骤:

  • 算法的输入为一个100*100的RGB图像和PNCC特征
  • 关于PNCC(Projected Normalized Coordinate Code)的计算与当前的3D人脸形状有关,可以反映人脸的shape信息
  • 算法的输出就是3D人脸的shape信息。
  • 引入CNN来作为一个强力拟合函数,通过拟合出input到output的映射函数。
  • 网络包含4个conv layer,3个pooling layer,和2个fc layer。通过级联多个CNN直到整个网络在训练集上收敛,其实和上述CPR,ESR,LBF都是非常相似的做法。
  • PNCC的作用:根据当前预测的情况,对人脸的shape信息进行更新,并作为下一级卷积神经网络的输入。
  • 当然,loss function也经过了精心的设计,通过对于shape信息中的不同参数引入权重,让他们优先去拟合那些在形变过程中重要的参数,比如说,尺度参数,旋转参数,平移参数等。
  • 通过相关的实验证明了这样按照重要性去拟合参数能够提升模型的定位精度
  • 训练3DDFA模型,需要大量的多姿态人脸样本。作者基于已有的数据集如300W,利用3D信息虚拟生成不同姿态下的人脸图像,核心思想为:先预测出人脸图像的deep信息,通过3D旋转来生成不同姿态下的人脸图像,从而生成一个large pose 数据集。

编辑于 2019-04-18