人脸检测算法综述
作者:SIGAI
2018.05.03
原创声明
本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不能用于商业目的。
SIGAI
问题描述
导言
人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一,它在安防监控,人
证比对,人机交互,社交和娱乐等方面有很强的应用价值,也是整个人脸识别算法的第一步。
在本文中,SIGAI 将和大家一起回顾人脸检测算法的整个发展历史。
人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形在图
像中的坐标,可能还包括姿态如倾斜角度等信息。下面是一张图像的人脸检测结果:
虽然人脸的结构是确定的,由眉毛、眼睛、鼻子和嘴等部位组成,近似是一个刚体,但
由于姿态和表情的变化,不同人的外观差异,光照,遮挡的影响,准确的检测处于各种条件
下的人脸是一件相对困难的事情。
人脸检测算法要解决以下几个核心问题:
1.人脸可能出现在图像中的任何一个位置。
2.人脸可能有不同的大小。
3.人脸在图像中可能有不同的视角和姿态。
4.人脸可能部分被遮挡
评价一个人脸检测算法好坏的指标是检测率和误报率。我们将检测率定义为:
误报率定义为:
算法要在检测率和误报率之间做平衡,理想的情况是有高检测率,低误报率。
经典的人脸检测算法流程是这样的:用大量的人脸和非人脸样本图像进行训练,得到一
个解决 2 类分类问题的分类器,也称为人脸检测模板。这个分类器接受固定大小的输入图片,
判断这个输入图片是否为人脸,即解决是和否的问题。人脸二分类器的原理如下图所示:
SIGAI
由于人脸可能出现在图像的任何位置,在检测时用固定大小的窗口对图像从上到下、从
左到右扫描,判断窗口里的子图像是否为人脸,这称为滑动窗口技术(sliding window)。
为了检测不同大小的人脸,还需要对图像进行放大或者缩小构造图像金字塔,对每张缩放后
的图像都用上面的方法进行扫描。由于采用了滑动窗口扫描技术,并且要对图像进行反复缩
=检测出的人脸数检测率图像中所有人脸数=误报个数误报率图像中所有非人脸扫描窗口数
放然后扫描,因此整个检测过程会非常耗时。
由于一个人脸附件可能会检测出多个候选位置框,还需要将检测结果进行合并去重,这称为
非极大值抑制(NMS)。多尺度滑动窗口技术的原理如下图所示:
SIGAI
即要检测一张图片需要扫描大于 120 万个窗口!!!计算量惊人,因此有必要采取某种
以 512x512 大小的图像为例,假设分类器窗口为 24x24,滑动窗口的步长为 1,则总共
需要扫描的窗口数为:
措施提高效率,具体解决方案本文会给出。
典型应用
人脸检测是机器视觉领域被深入研究的经典问题,在安防监控、人证比对、人机交互、社交
等领域都有重要的应用价值。数码相机、智能手机等端上的设备已经大量使用人脸检测技术
实现成像时对人脸的对焦、图集整理分类等功能,各种虚拟美颜相机也需要人脸检测技术定
位人脸,然后才能根据人脸对齐的技术确定人脸皮肤、五官的范围然后进行美颜。在 SIGAI
之前的文章人脸识别的流程中,人脸检测是整个人脸识别算法的第一步。
早期算法
我们将整个人脸检测算法分为 3 个阶段,分别是早期算法,AdaBoost 框架,以及深度
学习时代,在接下来将分这几部分进行介绍。
早期的人脸检测算法使用了模板匹配技术,即用一个人脸模板图像与被检测图像中的各
个位置进行匹配,确定这个位置处是否有人脸;此后机器学习算法被用于该问题,包括神经
网络,支持向量机等。以上都是针对图像中某个区域进行人脸-非人脸二分类的判别。
早期有代表性的成果是 Rowley 等人提出的方法[1][2]。他们用神经网络进行人脸检测,
()()22512512512512512235122323232323......1.11.11.11.11200000−−+−−+−−
用 20x20 的人脸和非人脸图像训练了一个多层感知器模型。文献[1]的方法用于解决近似正
面的人脸检测问题,原理如下图所示:
文献[2]的方法解决多角度人脸检测问题,整个系统由两个神经网络构成,第一个网络
用于估计人脸的角度,第二个用于判断是否为人脸。角度估计器输出一个旋转角度,然后用
整个角度对检测窗进行旋转,然后用第二个网络对旋转后的图像进行判断,确定是否为人脸。
系统结构如下图所示:
SIGAI
AdaBoost 框架
Rowley 的方法有不错的精度,由于分类器的设计相对复杂而且采用的是密集滑动窗口
进行采样分类导致其速度太慢。
接下来介绍 AdaBoost 框架之后的方法,boost 算法是基于 PAC 学习理论(probably
approximately correct)而建立的一套集成学习算法(ensemble learning)。其根本思想在于通过
多个简单的弱分类器,构建出准确率很高的强分类器,PAC 学习理论证实了这一方法的可
行性,感谢大神 Leslie-Valiant!!我们首先来看 FDDB 上各种检测算法的 ROC 曲线,接下
来的介绍将按照这些 ROC 曲线上的算法进行展开。
SIGAI
在 2001 年 Viola 和 Jones 设计了一种人脸检测算法[10]。它使用简单的 Haar-like 特征和
级联的 AdaBoost 分类器构造检测器,检测速度较之前的方法有 2 个数量级的提高,并且保
持了很好的精度,我们称这种方法为 VJ 框架。VJ 框架是人脸检测历史上第一个最具有里程
碑意义的一个成果,奠定了基于 AdaBoost 目标检测框架的基础,所以作为重点和大家唠唠。
用级联 AdaBoost 分类器进行目标检测的思想是:用多个 AdaBoost 分类器合作完成对候
选框的分类,这些分类器组成一个流水线,对滑动窗口中的候选框图像进行判定,确定它是
人脸还是非人脸。
在这一系列 AdaBoost 分类器中,前面的强分类器设计很简单,包含的弱分类器很少,
可以快速排除掉大量的不是人脸的窗口,但也可能会把一些不是人脸的图像判定为人脸。如
果一个候选框通过了第一级分类器的筛选即被判定为人脸,则送入下一级分类器中进行判
定,以此类推。如果一个待检测窗口通过了所有的强分类器,则认为是人脸,否则是非人脸。
下图是分类器级联进行判断的示意图:
这种思想的精髓在于用简单的强分类器在初期快速排除掉大量的非人脸窗口保证高召
回率,使得最终能通过所有级强分类器的样本数很少。这样做的依据是在待检测图像中,绝
大部分都不是人脸而是背景,即人脸是一个稀疏事件,如果能快速的把非人脸样本排除掉,
则能大大提高目标检测的效率。
出于性能考虑,弱分类器使用了简单的 Haar-like 特征,这种特征源自于小波分析中的
Haar 小波变换,Haar 小波是最简单的小波函数,用于对信号进行均值、细节分解。这里的
Haar-like 特征定义为图像中相邻矩形区域像素之和的差值。下图是基本 Haar-like 特征的示
意图:
SIGAI
Haar-like 特征是白色矩形框内的像素值之和,减去黑色区域内的像素值之和。以图像中
第一个特征为例,它的计算方法如下:首先计算左边白色矩形区域里所有像素值的和,接下
来计算右边黑色矩形区域内所有像素的和,最后得到的 Haar-like 特征值为左边的和减右边
的和。
这种特征捕捉图像的边缘、变化等信息,各种特征描述在各个方向上的图像变化信息。
人脸的五官有各自的亮度信息,很符合 Haar-like 特征的特点。
为了实现快速计算,使用了一种称为积分图(Integral Image)的机制。通过积分图可以
快速计算出图像中任何一个矩形区域的像素之和,从而计算出各种类型的 Haar-like 特征。
假设有一张图像,其第 i 行第 j 列处的像素值为 ,积分图定义为:
即原始图像在任何一点处的左上角元素之和。在构造出积分图之后,借助于它可以快速
计算出任何一个矩形区域内的像素之和,以下图中的矩形框为例:
ijx11jiijpqpqsx===
在上图中,要计算黑色矩形框内的像素值之和。假设上面四个矩形的右下角的坐标分别
为
黑色色矩形框内的像素值之和为:
SIGAI
之所以这样,是因为黑色区域内的像素值之和等于这 4 个矩形框内的像素值之和,减去
上面两个矩形框的像素值之和,再减去左边两个矩形框的像素值之和,这样做的话,左上角
的矩形框被减了两遍,因此要加一遍回来。在计算出任何一个矩形区域的像素值之和后,可
以方便的计算出上面任何一种 Haar-like 特征。下图是通过 AdaBoost 算法自动筛选出来的对
区分人脸和非人脸有用的 Haar-like 特征,基本符合人类的直观感受:
弱分类器采用最简单的深度很小的决策树,甚至只有一个内部节点。决策树的训练算法
此处不做详细的阐述,需要注意的是这里的特征向量是稀疏的,即每一棵决策树只接受少量
特征分量的输入,根据它们来做决策。
强分类器和前面讲述的是一样的,不同的是这里的强分类器加上了一个调节阈值:
其中 为阈值,它通过训练得到。每一级强分类器在训练时使用所有的人脸样本作为正
()()()()11223344,,,,,,,ijijijij44223311ijijijijssss−−+1(x)(x)NiiFf==−
样本,并用上一级强分类器对负样本图像进行扫描,把找到的虚警中被判定为人脸的区域截
取出来作为下一级强分类器的负样本。
假设第 i 级强分类器的检测率和误报率分别为 和 ,由于要通过了所有强分类器才
被判定为正样本,因此级联分类器的误报率为:
上式表明增加分类器的级数可以降低误报率,类似的级联分类器的检测率为:
这个式子表明增加分类器的级数会降低检测率。对于前者,可以理解为一个负样本被每
一级分类器都判定为正样本的概率;对于后者,可以理解为一个正样本被所有分类器都判定
为正样本的概率。
在 VJ 算法问世之后,较好的解决了近似正面人脸的检测问题。此后出现了大量改进方
案,在深度学习技术出现之前,一直是人脸检测算法的主流框架。这些方案的改进主要在以
下几个方面:
新的特征,包括扩展的 Haar 特征[4],ACF 特征[15]等,它们比标准的 Haar-like 特征有
更强的描述能力,同时计算成本也很低。
使用其他类型的 AdaBoost 分类器。VJ 框架中采用的是离散型的 AdaBoost 算法,除此
之外,还有实数型,Logit 型,Gentle 型等各种方案。实数型、Logit 型和 Gentle 型 AdaBoost
算法不仅能输出分类标签值,还能给出置信度,有更高的精度。
分类器级联结构,如 Soft Cascade,将 VJ 方法的多个强分类器改成一个强分类器。另
外,检测处于各种角度和姿态的人脸是研究另一个重点,VJ 方法的分类器级联只有一条路
径,是瀑布模型,改进的方案有树状级联,金字塔级联等,篇幅所限这里不做过多解释,各
种级联方案如下图所示:
SIGAI
idifiFf=iDd=