分享

人脸对齐 Face Alignment Methods

 waston 2020-04-17

      内容说明:本博客内容主要是对一篇关于人脸对齐方法的综述性论文《 An Empirical Study of Recent Face  Alignment  Methods 》的简要概括,刚接触这方面内容,如有错误之处,还望各位不吝指教,如有疑问之处,欢迎一起探讨。

      论文链接:An Empirical Study of Recent Face Alignment Methods  (详细内容请阅读英文原文)

一、简单介绍

      近些年有很多新的人脸对齐的方法被提出来,而且在标准数据集(如,300W)上表现出良好的性能,但是这些方法之间存在一些差异,主要表现为:(1)实验设置不一样;(2)评估指标不一样;(3)缺少细节介绍,使得评估相关指标更加困难。所以,本文主要做出如下贡献:(1)提出一个针对整个测试图片集的评估指标;(2)扩展了300W数据集;(3)做了人脸对齐方法的灵敏度分析;(4)研究两个重要的影响因素并提出实际建议。

二、人脸对齐方法概述

      论文作者主要根据是否针对单个的检测点(individual landmark)使用检测器,将其分为三种方法:(1)基于局部的方法(local-based methods);(2)基于整体的方法(holistic-based methods);(3)混合方法(hybird methods)。论文中主要介绍了前两种。

2.1  基于局部的方法(local-based methods)

      这里作者又分为两个小的类,一个是Local Expert ,一个是Shape Model 。 前者重在描述每个landmark周围的“模样”,后者重在描述人脸形状的变化。详细算法请查阅英文原文的参考文献。
      
      Local Expert 主要有三类:
      (1)基于分类的方法(classification-based),如SVMs,SIFT,DRMP等;
      (2)基于回归的方法(regression-based),如SVRs,CCNF等;
      (3)基于投票的方法(voting-based),如基于回归森林的投票等;
      Shape Model 典型的有局部约束模型(CLM),其他的有RANSAC,GNDPM等。
      基于局部的方法的主要缺点:
      (1)计算量大,尤其是当landmarks很多的时候;
      (2)很难平衡局部响应(local responses)和全局约束(global constraints)。

2.2  基于整体的方法(holistic-based methods)

      基于整体的部分方法如下,详细算法请查阅英文原文的参考文献。
       
      大多数基于整体的方法采用级联方式(cascaded way)和由精到细模式(coarse-to-fine fashion)。
      级联方式:和经典的AAM算法类似,这种方法一般是将landmarks的坐标串起来描述人脸形状。
      由精到细模式:下图为原文的第16个参考文献的一个程序步骤,可以说明此问题。
                                 
      给定一个图像I和初始形状S0,通过不断迭代来估计第T次的形状ST,迭代过程如下:
      (1)根据原始图像I和前一个估计图像的图像提取当前特征;
      (2)根据特征计算出形变量;
      (3)将形变量加上上一个形状估计得到当前形状估计。
      大多数基于整体的方法都有着上述的框架结构,他们之间主要的区别有如下三点:(TABLE 2 有详细给出)
      (1)初始化方法(initialization): 主要有random,mean shape ,supervised 三种;
      (2)采用的特征(features):像素pixel,SIFT特征,HOG特征,auto-encoder,LBF等;
      (3)回归量(regressor):随机蕨(random ferns),随机树(random tree),线性回归(linear)等。

2.3  混合方法(hybird methods)

      几种混合方法,如基于遮挡检测的方法(occlusion detection based methods),weakly supervised method 等。

三、数据准备及评估指标

      扩展了300W标准数据集以及提出了一个针对整体测试集的评估指标。

3.1  300W数据集的扩展

      300W数据集包括有AFW,LFPW,HELEN以及IBUG,总共有3148个训练样本和689个测试样本。原始的ground truth 的人脸边框有两种,一种是the tight bounding box ,一种是由mixture trees model (慢且不高效)检测出来的。作者分别通过Viola-Jones(From MATLAB),HeadHunter和HOG+SVM(From Dlib)以及IBUG。同时提出一个深度卷积网络(ConvNet)方法来检测上面几个检测器漏检的人脸。

3.2  评估指标AUC

         
      说明:(左侧为累积误差分布(CED)曲线,右侧人脸蓝色点为真实位置,白色点为估计位置)
      归一化误差ex是指估计位置与真实位置的距离除以两眼真实距离。
      CED曲线横轴表示归一化误差值e,纵轴表示小于归一化e的landmarks占所有landmarks的比例。如:横坐标
e=0.10时表示所有归一化误差小于0.10的landmarks占整体landmarks的比例。而AUC是对e取积分,积分上限可根据需要自己设定。这是个极好的评估标准,克服了取平均值的方法中由于极少数误差太大造成的评估不好的情况。

四、实验

      主要利用上面的AUC指标分析比较。我这里直接贴实验结果图,并作简单描述相关结论,详细情况请看原文。

4.1 现成(off-the-shelf)的方法的比较

      这里列出11种方法,其中 GNDPM,DRMF,CCNF为local-based的方法,其余的为holistic-based方法。值得注意的是:
      (1)这里的PCPR和LBF的代码不是从作者那里获得的,其他的都是从作者那里获得的;
      (2)这里各个算法的实现语言是不一样的,个人认为很大程度上是不可比较的。 
      每种方法的最佳边框、landmarks数、训练集、性能如下表格所示。特别提醒,2014年出来的LBP算法是很火的一种算法,速度可达3000FPS,这里可能由于实现语言是MATLAB,所以和LBF原作者的结果相差甚远。
      
      上述11种算法的AUC等指标结果如下:
      
      实验结果:
      (1)对比(a)和(b),可知TREES,CFAN等性能较好,DRMF性能较差;
      (2)由(c)可知CFAN的平均误差比PCPR,CFSS等都大,但是AUC指标CFAN较好;再对比(c)和(d),去掉最大
               错误的5个样本(不足1%)后,平均错误下降了0.73,比原本CFAN和PCPR之间0.55的差异还大,说明用
               平均值的指标来衡量人脸对齐的性能不及AUC这一指标的好。

4.2 现成(off-the-shelf)方法的灵敏度分析

4.2.1    人脸中心的偏移(face centre shifts)

      实验方法:以红色的VJ检测到的人脸框为标准,以其框中心为中心,然后分别在半径为[0.01:0.02:0.21]共十个半径上分别随机选取10个点,然后把以该点为中心的框作为人脸检测到的框,取10次的均值作为对应半径上的AUC指标。对比结果如下。
                    
      实验结果:TREES和PCPR等对人脸边框中心的偏移不敏感,而DRMF和GNDPM对人脸框中心的偏移非常敏感。

4.2.2    人脸框大小的改变(face scale changes)

      实验方法:红色框为标准框,分别取该标准框尺寸的[0.8:0.05:1.20]实验,计算AUC指标,对比结果如下。
                   
      实验结果:TREES等对人脸框大小变化的鲁棒性要好,而DRMF等较差。

4.2.3    人脸检测器的变化(real face detection shifts)

      实验方法:分别使用4种不同的人脸检测器检测人脸,分析对应的人脸对齐的AUC指标。对比结果如下。
                   
      实验结果:只能说明不同的方法的最佳人脸框不太一样。而且他们的最佳框不一定是真实的框IBUG。

4.3  重新训练(off-the-shelf)的方法的灵敏度分析

      实验方法:作者这里选用了其中较好的4种方法,统一他们的实验训练集为300W++,以及人脸检测器为HOG+SCM方法。对比结果如下。
                   
     实验结果:结果分析方法同上。

4.4  重要的影响因素(important factors)

     实验方法:作者在这里对比了ESR和TREES,分别对初始条件(initialization)和级联数(cascade level)进行分析。结果如下。
                   
      实验结果:
      (1)测试时初始化为MS(mean shape)总是有用的,不管训练集初始化如何;
      (2)级联数超过一定的时候,AUC指标几乎不随级联数的增加而增大。

五、总结

      这篇论文主要是一个综述性的论文,做出了一些对比实验,得到了一些值得借鉴的结论,以及提出了一个评估指标,但这里只是做了简单的概括,详情还建议参考论文原文。如有错误之处,还望各位不吝指教。

Active Shape Model ---Their Training and Application

       内容说明:本博客内容主要是针对T.F. Cootes早期的关于ASM的论文《Active Shape Models ---Their Training and Application》介绍个人的理解,算是个人的学习总结,ASM是比较早的算法,我是结合论文原文和相关中文资料来理解的,主要参考内容的链接也将给出。本人初学者,难免会有理解不透彻或理解错误之处,还望各位不吝指教。

       论文链接:Active Shape Model --- Their Training and Application (详细内容请阅读英文原文)

       博客链接:ASM(Active Shape Model)算法介绍 (这是一篇很好的关于ASM的博客,但是我还是对很多公式或者符号的含义不太清楚,本文则是以原文电阻的示例来对一些公式符号进行理解)

一、简单介绍

       论文原文开头介绍了ASM的发展历程,从"Hand Crafted" Model 到 Articulated Models 再到Active Contour Models (“Snake”)等等,才发展到ASM算法。虽然接下来的主要内容是以电阻模型为示例介绍ASM的训练(Training)和测试(Testing)和相关应用,但是我觉得对这些发展过程的了解是很重要的(请参考原文)。

       ASM是一种基于统计的点分布模型(Point Distribution Models),在PDM中,一个物体的几何形状可以通过若干关键特征点的坐标按照一定次序串联形成一个向量来表示,如电阻、人脸、心脏图等等。下面过程以电阻为例。

二、ASM训练

       ASM训练的主要步骤:

       Step1 :  建立形状模型

                 (1)训练数据的获取,即大量的已标定特征点的电阻图片;

                 (2)获取特征向量,即将每一个用于训练的电阻照片的特征点按照一定的顺序串联成一个向量;

                 (3)对形状进行归一化和对齐(对齐采用Procrustes方法);

                 (4)将对齐后的形状做PCA处理,获得形状模型。

       Step2 :  为每个特征点(landmark)构建局部特征。

2.1  训练数据的获取

       如下图所示,左边为训练集(如总样本数n=200)中的一些训练样本(每个样本中的landmarks都是已经标定好了的),右边是其中一个样本,有k=32个landmarks。仔细观察电阻形状,容易发现,有上下端长短不一的,有上下端左右弯曲程度不一样的,这些特征的直观意义将在后面图形化解释【标注1】。针对右边单个样本,提出问题:

       【问题1:关键特征点landmarks是如何选取的呢?特征点的个数又是如何确定的呢?(见本博客第五部分)】

                       

2.2  获取特征向量

       

2.3  对形状进行归一化和对齐

       目的:消除图片中电阻由于不同角度,距离远近和姿态变化等外界因素造成的干扰,使得点分布模型更加有效。

       方法:Procrustes方法。此处,简言之,就是把n=200个训练样本的形状模型通过适当的平移、旋转、缩放变换,在不改变点分布模型的基础上,对齐到同一个点分布模型(比如第一个样本的PDM)上。从而改变获得的原始数据杂乱无章的顺序,减小非形状因素的干扰。

       详细过程:

        

       

       这里的W权重矩阵为2k*2k的对角矩阵,2k-1和2k位置上的值均为wk。

       对于整个训练集,对齐流程如下:

       (1)将所有的n个样本对齐到第一个样本;

       (2)计算集合中所有对齐后的样本的平均形状a;

       (3)将求得的平均形状a归一化;

       (4)再将集合中所有人脸样本对齐到(3)所得平均形状a;

       (5)循环执行(2)(3)(4)直到a收敛。

       【问题2:为什么要对平均形状归一化处理?那为何不是对每一个样本归一化?(见本博客第五部分)】

        对齐过程后,有用的数据只是每个形状对齐后的形状向量,构成我们PCA处理的原始数据集,过程中其它变量(如仿射变换参数)都是不用作后边处理的。

       下图是论文中电阻的示例,是将对齐后的所有训练样本的landmarks的坐标绘制出来的图:

                   

       你会发现有些点很密集,有些点比较分散,又对应着模型的那个参数呢?【标注2】

2.4  将对齐后的形状进行PCA处理

       

       上面是PCA处理过程,实验结果分析如下:

       左图为电阻例子中计算得到的特征值比例,值越大,所对应的特征越明显,也说明训练集中该特征区分度高;图2列出前两个特征对应的b1和b2值,分布比较随机,说明它们之间的相关性较小。

                     

       下图分别为前三个特征,形状随着权值b的变化而变化的趋势。这里可以对应标注1,我们比较容易观察到训练集中差异较大的地方都对应着这比较靠前的一些特征,如上下端的长短,上下端的弯曲程度等等;对应标注2,上下端的点最分散,这是由于每个样本上下端的点差异较大。这里Dmax=2。

       稍微解释一下为什么要对b值进行限制,从下图很容易看到,对于b1,如果太大的话,上端过长而下端会消失不见;对于b2,如果太大的话,上下两端会同时变短甚至消失,而这样的话和我们的训练中的形状相似度很小了,这里的Dmax是一个经验值。

               

2.5  为每个点构建局部特征

        构建局部特征是为了在搜素的时候能够不断更新位置,也就是说每个landmark要确定一个新的位置的依据就是这个局部特征,构建局部特征的方法有很多种,文中利用的是目标边缘的强度,如下右图,越在目标点边缘的地方,边缘强度(梯度)就越大,通过提取局部纹理更新位置。

                 

局部特征方法的详细过程来自链接博客,对于第i个特征点landmark,其局部特征创建过程如下:

                         

       如上图所示,在第j个训练图像上的第i(i=29)个特征点两侧,沿着垂直与该点前后两个特征点连线的方向上分别

选择m个像素构成一个长度为2m+1的向量,对该向量所包含的像素的灰度值求导得到一个局部纹理gij,对训练集中的

其他样本图像上的第i个特征点进行同样的操作,便可得到第i个特征点的n个局部纹理gi1,gi2,...,gin。

        

三、ASM测试

        ASM测试的主要步骤:

        (1)给定一个初始形状,然后用它在给定图像中不断搜索,搜索过程由后3步完成;

        (2)计算特征点的局部特征,不断更新每个特征点的位置;

        (3)更新仿射变换参数;

        (4)重复(2)(3)直至仿射变换参数收敛。

3.1  确定初始形状

       确定初始形状的方法有很多,比如可以使用遗传算法获得一个和目标比较近似的形状。文中使用的是将训练集中的平均形状进行一个仿射变换得到一个比较粗糙的形状:

        

        这里的a0为初始时刻的当前形状,以后的当前形状均用a表示。

        虽然ASM测试时不需要初始化一个很接近目标的一个形状,但是上述初始化方法的参数对最后的搜索影响大吗?

        【问题3: 如何确定初始化旋转角度和缩放尺度?随机选取不会导致最后搜索偏差较大吗?(未解决)】

3.2  计算特征点局部特征,更新特征点位置

       特征点更新,示意图如下:

                             

       对于模型中第i个特征点,在垂直于其前后两个特征点连线方向上,以其为中心两边各选择l(l>m)个像素,然后计算这1个像素的灰度值倒数并归一化,从而得到一个局部特征,包括2(l-m)+1个子局部特征,然后利用前面的公式计算这些子局部特征与当前特征点的局部特征之间的马氏距离,使得马氏距离最小的那个子局部特征的中心即为当前特征点的新位置,这样就会产生一个位移。为所有特征点找到新的位置,并将他们的位移组成一个向量:

       

                       

3.3  更新仿射变换参数至收敛

        

        【注意:这里不要混淆dX和da,dX是我们通过局部特征更新特征点前后的差值,我们需要计算最佳的仿射变换参数使得最与X+dX接近,但是不会完全和X+dX重合,如果在a加上这个偏差da后使得完全相等,我们期望的就是这个偏差值da接近于0。】

        

        

        在搜素的过程中,不断更新仿射变换参数和b,直到他们的值变化不大(即增量接近0)或者到达设定的迭代次数就可以停止搜索。db接近为0,说明dx接近为0,即调节偏差接近为零,自然可以理解为已经足够接近目标形状。

        【问题4: 最后这些更新参数的权值是如何确定的?(未解决)】

3.4  实验结果分析

       之前这里没有将文中实验结果给出,在老师的建议下,加上这部分内容,主要是文中电阻,心脏,手掌例子。

       电阻示例如下:a:原图;b:初始化形状;c、d、e、f:分别为迭代30,60,90,120次的匹配结果。

                              

       心脏图示例如下:a:原图;b:初始化形状;c、d:分别为迭代80、200次的结果。

                             

       手掌示例如下:a:初始化形状;b、c、d:分别为迭代100、200、350次的结果。

                           

四、ASM应用于人脸特征点检测

       立足于原文,上面示例主要是以电阻为例,如果换成是人脸的特征点检测,过程是与上面的是一致的。

4.1  训练

       Step1 :  建立形状模型

                 (1)训练数据的获取,即大量的已标定特征点的人脸图片,如上篇综述提到的300W数据集;

                 (2)获取特征向量,即将每一个用于训练的人脸照片的特征点按照一定的顺序串联成一个向量;

                 (3)对形状进行归一化和对齐(对齐采用Procrustes方法);

                 (4)将对齐后的形状做PCA处理,获得形状模型。

       Step2 :  为每个特征点(landmark)构建局部特征。

4.2  测试

        (1)给定一个初始形状,然后用它在给定图像中不断搜索,搜索过程由后3步完成;

        (2)计算特征点的局部特征,不断更新每个特征点的位置;

        (3)更新仿射变换参数和参数b;

        (4)重复(2)(3)直至仿射变换参数和参数b收敛。

五、问题总结

5.1  问题1 : 关键特征点landmarks是如何选取的呢?特征点的个数又是如何确定的呢?

       特征点当然是指形状中比较重要的点,文中大致把这些landmarks分为3种,如下:

       (1)points marking parts of the object with particular application-dependent significance ,比如边角点等;

       (2)points marking  application-dependent things ,比如特殊方向的最高点,曲率极值点等;

       (3)上述两种点的内插点。

         下图的电阻,0,3,5,10等为类型(1);4,11等点就是曲率较大的点,为类型(2);6-9等为类型(3)。

                

       关键点的选取是极其重要的,这些关键点得能够很好地描述一个形状,当然特征点的个数问题是个经验问题,对于复杂一点的形状就需要用多一点的点,简单点的就少用一点。

5.2  问题2 : 为什么要对平均形状归一化处理?

       将平均形状归一化到一个默认的形状,是为了确保迭代过程中慢慢收敛,本质上是增加了约束条件。我这样理解文中的说法:如果不将形状归一化,那么每次对齐到平均形状,都会有4N个变量(N个样本,每个样本4个参数),但实际上只有4(N-1)个约束,比如刚开始对齐到第一个样本时以第一个为参考,它对其它N-1个样本构成约束【不确定这种理解对不对】。如果少了约束条件,最后求的平均形状就会不收敛。

5.3  问题3 : 如何确定初始化旋转角度和缩放尺度?随机选取不会导致最后搜索偏差较大吗?

       这种算法对初始化的形状要求很低,大抵是任意初始化都能得到一个理想的结果,但是没有试验过,不清楚任意的初始化会不会陷入局部最优,希望能有大神指点。

5.4  问题4 :  最后这些更新参数的权值是如何确定的?

       这些权值都是大小都是决定参数变化速度,我觉得是个经验值,在不断的实验中找到较好的值,因为缺少实践,还望实践过的朋友指点指点。


Face Alignment by Explicit Shape Regression

       内容说明:本博客主要是针对微软亚洲研究院Jian Sun组2012发表在CVPR上的《Face Alignment by Explicit Shape Regression》介绍个人理解,参考网上代码一些人实现的代码,自己在此基础上扩展了一些小实验,记录在这里,算是个人学习总结,难免会有错误之处,还望各位不吝指教。

       论文链接:

http://research.microsoft.com/pubs/206636/Face%20Alignment%20by%20Explicit%20Shape%20Regression.pdf

       参考资料:1: 基础算法(一):Random Ferns 分类器原理及应用   2: Face Alignment by Explicit Shape Regression 训练测试    3:http://blog.csdn.net/santo_wong_94/article/details/49330295

       文字及公式太多,方便起见,直接将word转换成图片上传,欢迎各位对文中的实验结论进行讨论。算法核心代码用C++实现,在Linux环境中运行,其他处理结果的语言有python,matlab等。

       ESR算法对于正脸的效果还是相当好的,对于侧脸有遮挡等脸的效果就不理想了。

       主要参考的代码链接:http://www./thread-550-1-1.html,在此基础上修改了少数部分代码,扩展了实验。

       文中若有描述不当或错误的地方,还望各位不吝指出。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多