人脸检测发展:从VJ到深度学习(上)

  VJ人脸检测器中,相级联的多个分类器在学习的过程中并不会产生直接的联系,其关联仅体现在训练样例上:后一级分类器的训练样例一定要先通过前一级分类器。不同分类器在学习时的独立性会带来两方面的坏处:一是在每个分类器都是从头开始学习,不能借鉴之前已经学习好的分类器的经验;二是每个分类器在分类时都只能依靠自己,不能利用其它分类器已经获得的信息。为此,出现了两种改进的方案:链式Boosting方法和嵌套式Boosting方法。两种方案都在学习新一级的分类器时,都考虑之前已经学好的分类器,区别在于链式Boosting方法直接将前面各级分类器的输出进行累加,作为基础得分,新分类器的输出则作为附加得分,换言之,前面各级分类器实际上是新分类器的一个“前缀”,所有的分类器通过这种方式链在了一起;嵌套式Boosting方法则直接将前一级分类器的输出作为新分类器第一个弱分类器的特征,形成一种嵌套的关系,其特点是只有相邻的分类器才会互相影响。还有一种和嵌套式Boosting方法相类似的方案:特征继承,即从特征而不是分类器的角度来关联不同的分类器,具体而言,新的分类器在学习时会先继承前一级分类器的所有特征,基于这些特征学习弱分类器,再此基础上再考虑增加新的弱分类器,这一方案的特点在于其只引入了分类器学习时的相互影响,而在分类时分类器之间仍然是相互独立的。

  相关的任务之间往往会相互产生促进作用,相辅相成,而和人脸检测密切相关的一个任务就是特征点定位:预测脸部关键点的位置,这些关键点可以是双眼中心、鼻尖、嘴角等。基于这样一种想法,在2014年出现了Joint Cascade,即把检测人脸所需要的分类器和预测特征点位置的回归器交替级联,同时进行人脸检测和特征点定位两个任务。用特征点定位辅助人脸检测的关键在于形状索引特征的引入,即特征不再是在整个窗口中提取,而是在以各个特征点为中心的局部区域进行提取,这样的好处就在于提高了特征的语义一致性。不同的人脸其对应的特征点位置是不同的,反过来看,也就是说相同的位置实际上对应于脸部的不同区域,那么在相同区域提取的特征实际上表示的是不同的语义,简单地说,就是在拿鼻子去和嘴巴匹配。采用形状索引特征可以很好地避免这个问题,从而增大人脸和非人脸窗口之间的区分性。对于一个给定的窗口,我们并不知道特征点的位置,因此采用一个“平均位置”作为初始位置,即基于标注有特征点坐标的人脸样例集,计算出的每个点坐标的平均值;在平均位置的基础上,我们提取特征预测各个特征点真实的位置,不过一次预测往往是不准确的,就好像跑步的时候我们没法直接从起点跳到终点一样,所以需要不断基于当前确定的特征点位置来预测新的位置,逐步向其真实的位置靠近。这个过程很自然地形成了一种级联结构,从而能够和人脸检测器耦合在一起,形成一种不同模型交替级联的形式。

  针对分类器学习过程中的每一个环节,人们都进行了细致而充分的探索,除了上面提到的几个方向,在分类器分类阈值的学习、提升分类器学习的速度等问题上,也出现了很多出色的研究工作。大部分在分类器及其学习方法上进行改进的工作关注的还是Boosting方法(AdaBoost方法是Boosting方法的一个杰出代表)和相对简单的分类器形式,如果能够引入具有更强分类能力的分类器,相信能给检测器带来进一步的性能提升,这一点在后文会有所涉及。

  级联结构的演化

  分类器的组织结构也是人们关心的一个重要问题,尤其是在面临多姿态人脸检测任务的时候。人脸的姿态是指人脸在三维空间中绕三个坐标轴旋转的角度,而多姿态人脸检测就是要将带旋转的人脸给检测出来,不管是斜着的(绕x轴旋转)、仰着的(绕y轴旋转)还是侧着的(绕z轴旋转)。不同姿态的人脸在表观特征上存在很大的差异,这给检测器带来了非常大的挑战,为了解决这一问题,通常采用分治的策略,即分别针对不同姿态的人脸单独训练分类器,然后组合起来构建成多姿态人脸检测器。

  最简单的多姿态人脸检测器就是将针对不同姿态人脸的分类器采用并列式的结构进行组织,其中并列的每一个分类器仍然采用原来的级联结构(我们称这种分类器为级联分类器);在检测人脸的过程中,一个窗口如果被其中一个级联分类器分为人脸窗口,则认为其确实是一个人脸窗口,而只有当每一个级联分类器都将其判别为非人脸窗口时,才将其排除掉。这种并列式的组织架构存在两方面的缺陷:一是造成了检测时间的成倍增长,因为绝大部分窗口是非人脸窗口,这些窗口需要经过每一个级联分类器的排除;二是容易造成整体分类准确度的降低,因为整个检测器分错的窗口包含的是所有级联分类器分错的窗口。