一、总述
根据Yang,Kriegman,and Ahuja(2002)的分类,人脸检测的方法分为基于特征的、基于模板的和基于表观的方法。
基于特征的方法,尝试寻找有区分性的图像特征的位置,比如眼睛、鼻子和嘴,然后在合理的几何布局上验证这些特征是否存在,这类方法包括一些早期的人脸识别方法以及最新的一些基于模块特征空间的方法、局部滤波器束方法、支持向量机方法和Bossting方法。
基于模板的方法,比如活动表观模型,能够处理姿态和表情较大范围的变化。
基于表观的方法,扫描图像的小的有重叠的矩形区域寻找似人脸的候选区域,然后用一组更昂贵但具选择性的检测算法的层叠求精。为了处理尺度缩放,图像通常转化为一个子八度金字塔,然后在每层上分别扫描。现在大多数基于表观的方法很依赖于在标定的人脸和非人脸的集合上训练检测器。
由于人脸检测在实际应用中的重要意义,早在上世纪70年代就已经有人开始研究,然而受当时落后的技术条件和有限的需求所影响,直到上世纪90年代,人脸检测技术才开始加快向前发展的脚步,在新世纪到来前的最后十年间,涌现出了大量关于人脸检测的研究工作,这时期设计的很多人脸检测器已经有了现代人脸检测技术的影子,例如可变形模板的设计(将人脸按照五官和轮廓划分成多个相互连接的局部块)、神经网络的引入(作为判断输入是否为人脸的分类模型)等。这些早期的工作主要关注于检测正面的人脸,基于简单的底层特征如物体边缘、图像灰度值等来对图像进行分析,结合关于人脸的先验知识来设计模型和算法(如五官、肤色),并开始引入一些当时已有的的模式识别方法。
虽然早期关于人脸检测的研究工作离实际应用的要求还有很远,但其中进行检测的流程已经和现代的人脸检测方法没有本质区别。给定一张输入图像,要完成人脸检测这个任务,我们通常分成三步来进行:
1.选择图像上的某个(矩形)区域作为一个观察窗口;
2.在选定的窗口中提取一些特征对其包含的图像区域进行描述;
3.根据特征描述来判断这个窗口是不是正好框住了一张人脸。
检测人脸的过程就是不断地执行上面三步,直到遍历所有需要观察的窗口。如果所有的窗口都被判断为不包含人脸,那么就认为所给的图像上不存在人脸,否则就根据判断为包含人脸的窗口来给出人脸所在的位置及其大小。
但是,要判断图像上的某个位置是不是一张人脸,必须要观察了这个位置之后才知道。因此,选择的窗口应该覆盖图像上的所有位置。显然,最直接的方式就是让观察的窗口在图像上从左至右、从上往下一步一步地滑动,从图像的左上角滑动到右下角——这就是所谓的滑动窗口范式。
虽然这种用窗口在图像上进行扫描的方式非常简单粗暴,它的确是一种有效而可靠的窗口选择方法,以至于直到今天,滑动窗口范式仍然被很多人脸检测方法所采用,而非滑动窗口式的检测方法本质上仍然没有摆脱对图像进行密集扫描的过程。
对于观察窗口,我们认为一个窗口是一个人脸窗口当且仅当其恰好框住了一张人脸,即窗口的大小和人脸的大小是一致的,窗口基本贴合人脸的外轮廓。那么我们该如何选择窗口的大小呢?一种做法当然是采用多种不同大小的窗口,分别去扫描图像,但是这种做法并不高效。换一个角度来看,其实也可以将图像缩放到不同的大小,然后用相同大小的窗口去扫描——这就是所谓的构造图像金字塔的方式。图像金字塔这一名字非常生动形象,将缩放成不同大小的图像按照从大到小的顺序依次往上堆叠,正好就组成了一个金字塔的形状。
通过构建图像金字塔,同时允许窗口和人脸的贴合程度在小范围内变动,我们就能够检测到不同位置、不同大小的人脸了。另外需要一提的是,对于人脸而言,我们通常只用正方形的观察窗口,因此就不需要考虑窗口的长宽比问题了。
由于采用滑动窗口的方式需要在不同大小的图像上的每一个位置进行人脸和非人脸窗口的判别,而对于一张大小仅为480*320的输入图像,窗口总数就已经高达数十万,面对如此庞大的输入规模,如果对单个窗口进行特征提取和分类的速度不够快,就很容易使得整个检测过程产生巨大的时间开销,也确实就因为如此,早期所设计的人脸检测器处理速度都非常慢,一张图像甚至需要耗费数秒才能处理完成——视频的播放速度通常为每秒25帧图像,这给人脸检测投入现实应用带来了严重的障碍。
二、突破:VJ算法
人脸检测技术的突破发生在2001年,两位杰出的科研工作者Paul Viola和Michael Jones设计了出了一个快速而准确的人脸检测器:在获得相同甚至更好准确度的同时,速度提升了几十上百倍——在当时的硬件条件下达到了每秒处理15张图像的速度,已经接近实时速度25fps(即25帧每秒)。这不仅是人脸检测技术发展的一个里程碑,也标志着计算机视觉领域的研究成果开始具备投入实际应用的能力。为了纪念这一工作,人们将这个人脸检测器用两位科研工作者的名字命名,称之为Viola-Jones人脸检测器,或者简称为VJ人脸检测器。
VJ人脸检测之所以器能够获得成功,极大地提高人脸检测速度,其中有三个关键要素:
特征的快速计算方法——积分图(Haar特征反映了局部区域之间的相对明暗关系,能够为人脸和非人脸的区分提供有效的信息,例如眼睛区域比周围的皮肤区域要暗,通过Haar特征就可以将这一特点表示出来。但是由于提取Haar特征时每次都需要计算局部区域内多个像素点灰度值之和,因此在速度上其并不快,为此VJ人脸检测器引入了积分图来加速Haar特征的提取。);
有效的分类器学习方法——AdaBoost;
以及高效的分类策略——级联结构的设计(造成人脸检测速度慢的根本原因还在于输入规模过大,动辄需要处理几十上百万的窗口,如果这样的输入规模是不可避免的,那么有没有可能在处理的过程中尽快降低输入规模呢?如果能够通过粗略地观察快速排除掉大部分窗口,只剩下少部分窗口需要进行仔细的判别,则总体的时间开销也会极大地降低。从这样的想法出发,VJ人脸检测器采用了一种级联结构来达到逐步降低输入规模的目的。)。
三、计算机视觉里的识别问题
计算机视觉里的识别问题可以沿几个不同的轴拆解。
物体检测(object detection)涉及快速扫描图像以确定可能出现匹配的位置。
实例识别(instance recognition)即已知物体如地理位置和平面物体的再识别,如果有将要识别的一个特定的刚性物体,我们可以寻找一些特有的特征点,然后验证它们在几何上可行的对齐方式。实际上所谓的人脸识别就属于这个问题范畴。
类别识别(class recognition)是最具挑战性的识别问题,这个问题可能涉及到差异极大的类别的实例。交织在类别识别的各种方法中的一个主题是学习,这是因为,给定问题的复杂度,手工制作特定物体的识别器似乎是没有出路的方法。有些检测问题强调精度,把这类问题看作更有挑战性的一般类物体识别的一个变形。本文所讲的人脸检测就属于这一类问题范畴。
四、模式识别里的识别问题
模式(Pattern),在物体或事件上,产生一种规律变化与自我重复的样式与过程。在模式之中,某些固定的元素不断以可预测的方式周期性出现。最基本而常见的模式,称为密铺,具备重复性以及周期性两大特征。找寻出固定模式是人类基本的认知功能之一。
这个世界最有趣的一面是可以把他看成是由各种模式组成的。模式在本质上是一种排列,他是由元素顺序而不是这些元素的固有性质来表征的。
————诺伯特·维纳
在模式识别里,模式是由描绘子(ml概念里的特征)组成的,具有共同属性的一族模式称为模式族,由机器完成的模式识别是对不同的模式赋予不同的类别的技术。
模式识别方法包含两大类:
- 决策理论方法——使用定量描述子;
- 结构方法——使用定性描绘子;
实践中常用的三种模式组合有向量(用于定量描述)和串、树(用于结构描述)。串描述适于生成其结构是基于基元的较简单的连接,并且通常是和边界形状有关系的目标模式和其他实体模式。
决策理论方法的思想大致为:通过一个决策(判别)函数找到一个决策边界从而实现模式分类。基于决策理论方法的识别大致可以分为三类:
- 匹配(基于匹配的识别技术通过一个原型模式向量来表示每个类,再根据一种预先定义的度量,将一个未知模式赋予最接近的类);
- 最佳统计分类器;
- 神经网络。
识别的核心问题是通过样本模式进行“学习”这一概念。
从模式识别的角度出发,可以将人脸检测算法分为两大类:基于统计的方法(决策理论方法——使用定量描述子)、基于结构特征的方法(结构方法——使用定性描绘子)。
方法1 基于直方图粗分割和奇异值特征的人脸检测算法(基于统计的方法)
适应:复杂背景下的人脸检测
方法:在灰度基本均匀的平面上,双眼、鼻、口成一定结构分布特征。先根据平滑的直方图对图像进行粗分割,再根据一定的灰度空间对人眼进行定位,进而确定出人脸区域。
第一步:用高斯函数对直方图进行平滑处理;
第二步:眼睛的定位;
第三步:基于奇异值特征的人脸验证。
效果:检测率较高,但耗时较长,平均每个图像需10~15秒,而且待检测的图像中人脸姿势、表情等比较固定,当脸部光照变化较大或脸部有阴影(特别是眼部区域)时,图像很难被检测到。
方法2 基于二进小波变换的人脸检测(基于统计的方法)
二进小波变换得到的低频分量和高频分量不是下采样型的,他们具有平移不变性。而二进小波变换有两个过程组成:学习过程和检测过程。
缺点:在统计学习的过程中,对原始图像的要求比较高,当图像的背景相对复杂时,比如从侧面拍摄人脸时,水平方向的和垂直方向的高低频分量很难获取,这将直接影响到自由参数的准确性,从而很大程度上影响人脸检测的检准率。
方法3 基于AdaBoost算法的人脸检测(基于统计的方法)
2001年viola和Jones引入积分图的概念,提出了基于Haar-like特征、级联结构的AdaBoost算法,成功应用于模式识别领域,实现了实时人脸检测,使人脸检测技术取得了突破性进展。为适应背景的复杂性,研究者提出了将肤色等人脸特征和AdaBoost算法相结合的人脸检测新算法。算法首先结合人脸特征,利用人脸特征确定人脸的大致方向,然后用级联结构的AdaBoost算法进行验证。下图为该算法的人脸检测流程图
第一步:肤色区域检测;
肤色的差别主要是亮度的差别而非我们表面认知的色彩差别,因此检测肤色区域时极容易受光照的影响,采用YCbCr色彩空间,可以使肤色有较好的聚类性。
第二步:人脸候选区域分割;
在YCbCr色彩空间中,眼睛与皮肤的Cb和Cr分量有很大的差异,眼睛的灰度值相对较低,Y分量集中分布在(0,120)内,而且眼睛的Cb分量普遍比Cr分量的值高,由此将眼睛的色彩和亮度映射结合起来就能检测出眼睛区域的大小和位置。多数情况下嘴巴的方向和人脸的方向一致,具有很强的稳定性,嘴巴检测的情况类似眼睛的检测,此时Cb比Cr分量的值高很多,也就是说,嘴巴相对眼睛更容易检测到。最后根据人体学特征,根据人脸各部件的大体位置很容易确定人脸候选区域。
第三步:人脸候选区域分类;
这一步利用AdaBoost算法,通过对人脸候选区域进行积分图计算,快速计算Harr-like特征,利用AdaBoost算法将Harr-like特征生成的弱分类器叠加成为强分类器,再将多个强分类器级联成人脸检测分类器。
方法4 基于面部双眼结构特征的人脸检测(基于统计的方法)
首先在原始灰度图像上计算各像素点的梯度方向对称性,然后以梯度方向对称性高的点为特征点,并进一步组合成特征块,通过一种简单的抑制方法,滤去大部分孤立的非人脸部件的特征点,再运用一定的规则对各个特征块进行组合得到候选人脸区域最后对候选人脸进行人脸部件的验证,剔除假脸,得到真正的人脸区域。
第一步:梯度方向对称分布特征点的提取;
第二步:双眼特征块的提取;
第三步:人眼的验证;
可以看出实际上上述常见四种方法都是基于统计的方法,也就是对应于模式识别里决策理论方法,事实上当前条件下,实现结构方法依然是非常困难的。
五、几个基于表观的人脸检测器
Sung and Poggio(1998)和Rowley,Baluga,and Kanade(1998a)提出了最早的两个基于表观的人脸检测器,并提出了很多在其他人的后续工作中广为使用的新方法。
Sung and Poggio | 1998 | 聚类和PCA | 多层感知器 | 利用DIFS和DFFS准则,产生24个马氏距离度量作为MLP的输入。 |
Rowley,Baluga,and Kanade | 1998a | 感受野 | 多层感知器 | |
Osuna,Freund,and Girosi | 1997 | 聚类和PCA | SVM | 核方法 |
Paul Viola and Michael Jones | 2001 | Harr特征 | Adaboost | 层级分类器 |
六、VJ算法成功的关键
为了计算Haar特征,需要对矩形区域的所有像素求和,一个图像所能形成的矩形区域有大有小,如果每个矩形区域都用遍历所有像素再求和的运算方法,无疑这个运算负担将非常巨大,所以VJ人脸检测算法用到了一种非常巧妙的数据结构,称为积分图像。积分图像的原理非常简单,总得来说,就是对于图像中的任何一点,该点的积分图像值等于位于该点左上角的所有像素之和。有了积分图像,就可以很方便的计算图像中任何一个矩形区域的像素和。
一个24×24的图像使用Harr特征最终会产生162336个矩形特征,这个维度远远高于图像本身的维度。不可能将所有的矩形特征都使用,所以后续需要做特征选择,这个选择过程间接地由层级分类器实现。
在一张正常的图像中,包含人脸的区域只占整张图像中很小的一部分,如果所有的局部区域都要遍历所有特征的话,这个运算量非常巨大,也非常耗时,所以为了节省运算时间,应该把更多的检测放在潜在的正样本区域上。所以有了层级分类器的概念,层级分类器就是为了将任务简化,一开始用少量的特征将大部分的negative区域剔除,后面再利用复杂的特征将false positive区域剔除。
在层级分类器架构中,每一层次含有一个”强”分类器,所有的矩形特征被分成几组,每一组都包含部分矩形特征,这些矩形特征用在层级分类器的每一阶段,层级分类器的每一阶段都会判别输入的区域是不是人脸,如果肯定不是,那么这个区域会被立即舍弃掉,只有那些被判别为可能是人脸的区域才会被传入下一阶段用更为复杂的分类器进一步的判别。其流程图如下所示:
我们利用AdaBoost训练分类器的时候,目标函数是分类误差,分类误差不能同时反映检测率与false positive rate, 我们可以通过改变阈值的方法来调整检测率与false positive rate, 一般来说,高阈值的分类器的检测率以及false positive rate 都会比较低,而低阈值的分类器的检测率及false positive rate都很高。此外,测试更多的特征将使得分类器提高识别率同时降低false positive rate, 但是测试更多的特征,也会耗费更多的时间。所以一个层级分类器,将综合考虑以下几个因素:
- 层级分类器的层次,即需要多少个分类器;
- 每一层分类器需要测试的特征数;
- 每一层分类器的阈值。
七、计算机视觉里常用的几个特征
- Harr特征
- LBP特征
- HOG特征
- SIFT特征
- SURF特征
harr特征
Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑白两种矩形框组合成特征模板,在特征模板内用黑色矩形像素和减去白色矩形像素和来表示这个模版的特征值。例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。
对于一幅图像来说,通过改变特征模板的大小和位置,可穷举出大量的特征来表示一幅图像。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。
LBP特征
LBP(Local Binary Pattern)指局部二值模式,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。它是由T. Ojala, M.Pietikäinen, 和 D. Harwood在1994年提出,由于LBP特征计算简单、效果较好,因此LBP特征在计算机视觉的许多领域都得到了广泛的应用,LBP特征比较出名的应用是用在人脸识别和目标检测中,在计算机视觉开源库Opencv中有使用LBP特征进行人脸识别的接口,也有用LBP特征训练目标检测分类器的方法,Opencv实现了LBP特征的计算,但没有提供一个单独的计算LBP特征的接口。
原始的LBP算子定义在像素3*3的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经过比较可产生8位二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,LBP值共有28种可能,因此LBP值有256种。中心像素的LBP值反映了该像素周围区域的纹理信息。
备注:计算LBP特征的图像必须是灰度图,如果是彩色图,需要先转换成灰度图。
HOG特征
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。
在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。
与其他的特征描述方法相比,HOG有很多优点。首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。
SIFT特征
尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。此算法有其专利,专利拥有者为英属哥伦比亚大学。
局部影像特征的描述与侦测可以帮助辨识物体,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。
SIFT算法的特点有:1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。
SIFT算法可以解决的问题:
目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:
1. 目标的旋转、缩放、平移(RST)
2. 图像仿射/投影变换(视点viewpoint)
3. 光照影响(illumination)
4. 目标遮挡(occlusion)
5. 杂物场景(clutter)
6. 噪声
SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
Lowe将SIFT算法分解为如下四步:
1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。
SURF特征
Speeded Up Robust Features(SURF,加速稳健特征),是一种稳健的局部特征点检测和描述算法。最初由Herbert Bay发表在2006年的欧洲计算机视觉国际会议(Europen Conference on Computer Vision,ECCV)上,并在2008年正式发表在Computer Vision and Image Understanding期刊上。
Surf是对David Lowe在1999年提出的Sift算法的改进,提升了算法的执行效率,为算法在实时计算机视觉系统中应用提供了可能。与Sift算法一样,Surf算法的基本路程可以分为三大部分:局部特征点的提取、特征点的描述、特征点的匹配。
但Surf在执行效率上有两大制胜法宝——一个是积分图在Hessian(黑塞矩阵)上的使用,一个是降维的特征描述子的使用。
特征与人脸检测
Haar特征本质上是局部区域像素值的一种线性组合,其相对应的更一般的形式则是不指定线性组合的系数,允许系数为任意实数,这被称之为线性特征——这里的组合系数可以基于训练样例来进行学习,类似于学习分类器参数的过程。
稀疏粒度特征也是一种基于线性组合来构造的特征,与线性特征所不同的是,稀疏粒度特征是将不同尺度(将100*100的图像放大到200*200,它和原本大小就为200*200的图像是处于不同的尺度上)、位置和大小的局部区域进行组合,而线性特征只是组合同一个局部区域内的像素值。
LBP特征是一种二值编码特征,其直接基于像素灰度值进行计算,特点是在编码时考虑的是两个值的相对大小,并且按照一定的空间结构来进行编码,局部组合二值特征就是在LBP特征的启发下设计的;从计算上来看,提取LBP特征比提取Haar特征要快,但是Haar特征对于人脸和非人脸窗口的区分能力更胜一筹。
简化的SURF特征是一种和Haar特征相类似的特征,但是其计算的是局部区域中像素点的梯度和,并在求和的过程中考虑了梯度方向;SURF特征比Haar特征更为复杂,因此计算代价更高,但是由于其表达能力更强,因此能够以更少数目的特征来达到相同的区分度,在一定程度上弥补了其在速度上的不足。
HOG特征也是一种基于梯度的特征,其对一个局部区域内不同方向的梯度进行统计,计算梯度直方图来表示这个区域。
积分通道特征和多通道的Haar特征有些类似,但是其使用的通道更加多样化,将通道的概念推广为由原图像变换而来并且空间结构和原图像对应的任何图像。
聚合通道特征则在积分通道特征的基础上进一步加入了对每个通道进行下采样的操作,实现局部区域信息的聚合。
在过去十几年的探索过程中,涌现出的特征不胜枚举,这里所有列举的特征都有一个共同的特点:都由科研工作者根据自己的经验手工设计,这些特征的设计反映了人们对问题的理解和思考。虽然随着不断的改进,设计出的特征已经日臻完善,但直到现在,人们在特征上的探索还远没有结束。
八、人脸检测的评估方法
在不断对人脸检测器进行改进的过程中,有一个问题是不容忽视的:如何科学地比较两个人脸检测器的优劣?简单地说,出一套考题让所有的检测器进行一场考试,谁得分高谁就更好。对于人脸检测器而言,所谓考题(测试集)就是一个图像集合,通常其中每张图像上都包含至少一张人脸,并且这些人脸的位置和大小都已经标注好。关于得分,需要考虑检测器两方面的表现,一是检测率,也即对人脸的召回率,检测出来的人脸占总人脸的比例——测试集中一共标注了100张人脸,检测器检测出其中70张人脸,则检测率为70%;二是误检(也称为虚警)数目,即检测器检测出来的人脸中出现错误(实际上不是人脸)的数目——检测器一共检测出80张人脸,然而其中有10个错误,只有70个是真正的人脸,那么误检数目就是10。在这两个指标上,我们所希望的总是检测率尽可能高,而误检数目尽可能少,但这两个目标之间一般是存在冲突的;在极端的情况下,如果一张脸也没有检测出来,那么误检数目为0,但是检测率也为0,而如果把所有的窗口都判别为人脸窗口,那么检测率为100%,而误检数目也达到了最大。在比较两个检测器的时候,我们通常固定一个指标,然后对比另一个指标,要么看相同误检数目时谁的检测率高,要么看相同检测率时谁的误检少。
对于每一个检测出的人脸,检测器都会给出这个检测结果的得分(或者说信度),那么如果人为地引入一个阈值来对检测结果进行筛选(只保留得分大于阈值得检测结果),那么随着这个阈值的变化,最终得检测结果也会不同,因而其对应得检测率和误检数目通常也会不同。通过变换阈值,我们就能够得到多组检测率和误检数目的值,由此我们可以在平面直角坐标系中画出一条曲线来:以x坐标表示误检数目,以y坐标表示检测率,这样画出来的曲线称之为ROC曲线(不同地方中文译法不一,如接收机曲线、接收者操作特征曲线等,这里直接采用英文简写)。ROC曲线提供了一种非常直观的比较不同人脸检测器的方式,得到了广泛的使用。
评测人脸检测器时还有一个重要的问题:怎么根据对人脸的标注和检测结果来判断某张人脸是否被检测到了?一般来说,检测器给出的检测框(即人脸窗口)不会和标注的人脸边框完全一致,而且对人脸的标注也不一定是矩形,例如还可能是椭圆形;因此当给定了一个检测框和一个标注框时,我们还需要一个指标来界定检测框是否和标注框相匹配,这个指标就是交并比:两者交集(重叠部分)所覆盖的面积占两者并集所覆盖面积的比例,一般情况下,当检测框和标注框的交并比大于0.5时,我们认为这个检测框是一个正确检测的人脸。
在早期的人脸检测工作中,一般采用MIT-CMU人脸检测数据集作为人脸检测器的测试集,来比较不同的检测器。这个测试集只包含几百张带有人脸的图像,并且人脸主要是清晰且不带遮挡的正面人脸,因而是一个相对简单的测试集,现在几乎已经不再使用。在2010年,美国麻省大学的一个实验室推出了一个新的人脸检测评测数据集:FDDB,这个集合共包含2845张带有人脸的互联网新闻图像,一共标注了5171张人脸,其中的人脸在姿态、表情、光照、清晰度、分辨率、遮挡程度等各个方面都存在非常大的多样性,贴近真实的应用场景,因而是一个非常具有挑战性的测试集。FDDB的推出激发人们在人脸检测任务上的研究热情,极大地促进了人脸检测技术的发展,在此后的几年间,新的人脸检测方法不断涌现,检测器在FDDB上的表现稳步提高。从100个误检时的检测率来看,从最初VJ人脸检测器的30%,发展到现在已经超过了90%——这意味着检测器每检测出50张人脸才会产生一个误检,这其中的进步是非常惊人的,而检测器之间的比拼还在继续。
九、人脸检测技术的发展现状
自动人脸检测技术是所有人脸影像分析衍生应用的基础,这些扩展应用细分有 人脸识别、 人脸验证、 人脸跟踪、 人脸属性识别, 人脸行为分析、 个人相册管理、 机器人人机交互、 社交平台的应用等。从应用领域上可以分为:①以企事业单位管理及商业保密为主的商用人脸检测;②大规模联网布控的多角度多背景的安防人脸检测;③反恐安全、调查取证、刑事侦查为主的低分辨率尺度多样的军用/警用人脸检测;④当然还有基于互联网社交娱乐应用等的一般人脸检测。
在学术研究中分为约束环境人脸检测和非约束环境人脸检测,如下图。
所谓人脸检测,就是给定任意一张图片,找到其中是否存在一个或多个人脸,并返回图片中每个人脸的位置和范围。人脸检测的研究在过去二十年里取得了巨大进步,特别是Viola and Jones提出了开创性算法,他们通过Haar-Like特征和AdaBoost去训练级联分类器获得实时效果很好的人脸检测器,然而研究指出当人脸在非约束环境下,该算法检测效果极差。这里说的非约束环境是对比于约束情况下人脸数单一、背景简单、直立正脸等相对理想的条件而言的,随着人脸识别、人脸跟踪等的大规模应用,人脸检测面临的要求越来越高(如上图):人脸尺度多变、数量冗大、姿势多样包括俯拍人脸、戴帽子口罩等的遮挡、表情夸张、化妆伪装、光照条件恶劣、分辨率低甚至连肉眼都较难区分等。用经典VJ人脸检测器(2010年更新)在非约束评测集FDDB中验证显示:当限定误检数为10个时,准确率不超过10%;为500个时,检测率仅仅为52.8%。所以丞待更好的算法以应用于大规模安防布控等非约束人脸检测场景。
14年底微软美国研究院首席研究员张正友等在CVIU上发表了非约束人脸检测专题综述,文中指出 过去十年里,当限定误检数为0或不超过10个时,人脸检测算法的查准率也就是准确率(true positive rate)提高了65%之多(最新基于CNN的算法和传统Vj-boosting算法的对比结果)。文中总结了现今出现的优异算法主要得益于以下四点:
①越来越多的鲁棒特征提取方法:LBP、SIFT、HOG、SURF、DAISY等;
②开放的数据库和评测平台:LFW、FDDB(报告中性能对比主要用的一个,更新于2016.4.15)、WIDER(汤晓欧团队发布的,更新于2016.4.17,不完整);
③机器学习方法的发展和应用:boosting、SVM、深度学习等;
④高质量的开源视觉代码库的良好发展与维护:OpenCV、DPM、深度学习框架-caffe等。
人脸检测算法以往被分为基于知识的、基于特征的、基于模板匹配的、基于外观的四类方法。随着近些年DPM算法(可变部件模型)和深度学习CNN(卷积神经网络)的广泛运用,人脸检测所有算法可以总分为两类:①Based on rigid templates:代表有boosting+features和CNN ②Based on parts model:主要是DPM。
基于深度学习的人脸检测方法可以作为第一类方法的代表,同时也是检测某一种深度学习架构或新方法是否有效的评测标准。往往一个简单的卷积神经网络在人脸检测就能获得很好效果,同时有文献验证了深度卷积神经网络的第一层特征和SIFT类型特征极其相似。
DPM算法由Felzenszwalb于2008年提出的一种基于部件的检测方法,对目标的形变具有很强的鲁棒性,目前已成为分类、分割、动态估计等算法的核心组成部分。应用DPM的算法采用了改进后的Hog特征、SVM分类器和滑动窗口检测思想,在非约束人脸检测中取得极好效果。而其缺点主要是计算复杂度过高。
随着DNN的发展,基于深度学习的方法获得了state of art的效果,可见未来人脸检测算法主要的发展将围绕DPM和DCNN展开。同时将DPM和DCNN结合的方法也将是研究趋势。
在实际中,作为安防企业,人脸检测(识别)技术的研发应用在两方面:
1.基本的人脸考勤和门禁等,这一类属于有约束情况,用传统改进算法足以满足性能;
2.安防实时监控,智能视频人脸分析,海量人脸搜索验证、人群数量统计,防踩踏预警等,这类属于非约束情况,不仅对检测算法的精度(包括误检率)要求很高,而且要确保实时性。
调研发现,人脸检测(识别)实战的场景逐渐从室内演变到室外,从单一路况发展到广场、车站、地铁口等。目前基于后者场景,精度若能稳定达到80%以上就属于顶尖技术了(很难达到)。可以想象,雾霾天戴着口罩,冬天戴着帽子,夏天戴着墨镜等,传统算法的检测是比较难的。
十、深度学习与目标检测
人脸检测作为一种特定类型目标的检测任务,一方面具有其自己鲜明的特点,需要考虑人脸这一目标的特殊性,另一方面其也和其它类型目标的检测任务具有一定的共性,能够直接借鉴在通用目标检测方法上的研究经验。
目标检测任务作为一个分类问题,其不仅受益于计算机视觉领域相关技术的不断发展,在机器学习领域的研究进展同样也对目标检测任务具有推波助澜的作用。事实上,从2006年开始逐步蔓延开的深度学习大爆发给目标检测的研究带来了强劲的助推力,使得通用的目标检测以及各种特定类型目标的检测任务得到了跨越式地发展。
R-CNN
在2013年底,深度学习给目标检测任务点起了一把火,这个火种就是R-CNN,其中R对应于“Region(区域)”,意指CNN以图像区域作为输入,这个工作最终发展成了一个系列,也启发和衍生出了大量的后续工作,这一场大火简直烧红了计算机视觉领域的半边天。
R-CNN的提出变革了目标检测方法中很多旧有的做法,同时在标准的目标检测评测数据集上使检测精度得到了前所未有的提升。在检测方法上的变革,首当其冲的是抛弃了滑动窗口范式,取而代之的是一个新的生成候选窗口的环节。对于给定的图像,不再用一个滑动窗口去对图像进行扫描,枚举所有可能的情况,而是采用某种方式“提名”出一些候选窗口,在获得对待检测目标可接受的召回率的前提下,候选窗口的数量可以控制在几千个或者几百个。从某种意义上讲,VJ 人脸检测器中多个分类器相级联,每一级分类器都在为接下来的一级分类器提名候选窗口,但是这和 R-CNN 所采用的生成候选窗口的方式有一个重要的区别:实际上所有的窗口仍然都被检查了一遍,只是不断在排除,这是一种减法式的方案。相比之下,R-CNN 采用的候选窗口生成方式,是根据图像的某些特征来猜测可能有哪些地方存在待检测的目标,以及这些目标有多大,这是一种从无到有的加法式的方案。Selective Search是一种典型的候选窗口生成方法,其采用了图像分割的思路,简单地说,Selective Search方法先基于各种颜色特征将图像划分为多个小块,然后自底向上地对不同的块进行合并,在这个过程中,合并前后的每一个块都对应于一个候选窗口,最后挑出最有可能包含待检测目标的窗口作为候选窗口。
除了引入候选窗口生成方法,第二点非常大的改变在特征提取上:不再采用人工设计的特征,而是用CNN来自动学习特征。特征提取过程就是从原始的输入图像(像素颜色值构成的矩阵)变换到特征向量的过程,之前的如Haar 特征等是科研工作者根据自己的经验和对研究对象的认识设计出来的,换言之人工定义了一个变换,而新的做法是只限定这个变换能够用CNN来表示——事实上CNN 已经可以表示足够多足够复杂的变换,而不具体设计特征提取的细节,用训练数据来取代人的角色。这种自动学习特征的做法是深度学习一个非常鲜明的特色。自动去学习合适的特征,这种做法的好处和让分类器自动去学习自己的参数的好处是类似的,不仅避免了人工干预,解放了人力,而且有利于学习到更契合实际数据和目标的特征来,特征提取和分类两个环节可以相互促进,相辅相成;不过缺点也是有的,自动学习出的特征往往可解释性比较差,不能让人直观地去理解为什么这样提取出特征会更好,另外就是对训练集会产生一定程度的依赖。
还有一点值得一提的是,R-CNN在检测过程中引入了一个新的环节:边框回归,检测不再仅仅是一个分类问题,它还是一个回归问题——回归和分类的区别就在于回归模型输出的不是离散的类别标签,而是连续的实数值。边框回归指的是在给定窗口的基础上去预测真实检测框的位置和大小,也就是说,有了候选窗口之后,如果其被判别成了一个人脸窗口,那就会进一步被调整以得到更加精确的位置和大小——和待检测目标贴合得更好。边框回归一方面提供了一个新的角度来定义检测任务,另一方面对于提高检测结果的精确度有比较显著的作用。
用R-CNN进行目标检测的流程是:先采用如 Selective Search等方法生成候选窗口,然后用学习好的CNN提取候选窗口对应的特征,接着训练分类器基于提取的特征对候选窗口进行分类,最后对判别为人脸的窗口采用边框回归进行修正。
虽然R-CNN带来了目标检测精度的一次巨大提升,然而由于所采用的候选窗口生成方法和深度网络都具有比较高的计算复杂度,因而检测速度非常慢。为了解决R-CNN的速度问题,紧接着出现了Fast R-CNN和Faster R-CNN,从名字上可以看到,它们的速度一个比一个快。
Fast R-CNN
第一步加速是采用了类似于 VJ 人脸检测器中积分图的策略,积分图是对应整张输入图像计算的,它就像一张表,在提取单个窗口的特征时,直接通过查表来获取所需要的数据,然后进行简单的计算即可,在R-CNN中每个候选窗口都需要单独通过CNN来提取特征,当两个窗口之间有重叠部分时,重叠部分实际上被重复计算了两次,而在 Fast R-CNN 中,直接以整张图像作为输入,先得到整张图对应的卷积特征图,然后对于每一个候选窗口,在提取特征时直接去整张图对应的卷积特征图上取出窗口对应的区域,从而避免重复计算,之后只需要通过所谓的RoIPooling层来将所有的区域放缩到相同大小即可,这一策略的使用可以提供几十甚至上百倍的加速。第二步加速,Fast R-CNN利用了一种名为 SVD 的矩阵分解技术,其作用是将一个大的矩阵(近似)拆解为三个小的矩阵的乘积,使得拆解之后三个矩阵的元素数目远小于原来大矩阵的元素数目,从而达到在计算矩阵乘法时降低计算量的目的,通过将 SVD应用于全连接层的权值矩阵,处理一张图片所需要的时间能够降低30%。
Faster R-CNN
第三步加速,Faster R-CNN开始着眼于生成候选窗口的环节,其采用 CNN 来生成候选窗口,同时让其和分类、边框回归所使用的 CNN 共享卷积层,这样使得两个步骤中可以使用同样的卷积特征图,从而极大地减少计算量。除了采用各种策略进行加速,从R-CNN到Faster R-CNN,检测的框架和网络结构也在不断发生改变。R-CNN从整体框架上来说,和传统的检测方法没有本质区别,不同的环节由单独的模块来完成:一个模块生成候选窗口(Selective Search),一个模块进行特征提取(CNN),一个模块对窗口进行分类(SVM),除此之外还增加了一个模块做边框回归。到Fast R-CNN的时候,后面三个模块合并成了一个模块,全部都用CNN来完成,因此整个系统实际上只剩下两个模块:一个模块生成候选窗口,另一个模块直接对窗口进行分类和修正。再到Faster R-CNN,所有的模块都整合到了一个CNN中来完成,形成了一种端到端的框架:直接从输入图像通过一个模型得到最终的检测结果,这种多任务在同一个模型中共同学习的做法,能够有效利用任务之间的相关性,达到相辅相成、相得益彰的效果。
从 R-CNN 到 Faster R-CNN,这是一个化零为整的过程,其之所以能够成功,一方面得益于CNN强大的非线性建模能力,能够学习出契合各种不同子任务的特征,另一方面也是因为人们认识和思考检测问题的角度在不断发生改变,打破旧有滑动窗口的框架,将检测看成一个回归问题,不同任务之间的耦合。尽管目前 Faster R-CNN在速度上仍然无法和采用非深度学习方法的检测器相比,但是随着硬件计算能力的不断提升和新的CNN加速策略的接连出现,速度问题在不久的将来一定能够得到解决。
全卷积网络和 DenseBox
卷积层是CNN区别于其它类型神经网络的本质特点,不过CNN通常也不仅仅只包含卷积层,其也会包含全连接层,全连接层的坏处就在于其会破坏图像的空间结构,因此人们便开始用卷积层来“替代”全连接层,通常采用1 × 1的卷积核,这种不包含全连接层的CNN称为全卷积网络(FCN)。FCN最初是用于图像分割任务,之后开始在计算机视觉领域的各种问题上得到应用,事实上,Faster R-CNN中用来生成候选窗口的CNN就是一个FCN。FCN 的特点就在于输入和输出都是二维的图像,并且输出和输入具有相对应的空间结构,在这种情况下,我们可以将 FCN 的输出看成是一张热度图,用热度来指示待检测目标的位置和覆盖的区域:在目标所处的区域内显示较高的热度,而在背景区域显示较低的热度,这也可以看成是对图像上的每一个像素点都进行了分类:这个点是否位于待检测的目标上。DenseBox是一个典型的基于全卷积网络的目标检测器,其通过 FCN得到待检测目标的热度图,然后根据热度图来获得目标的位置和大小,这给目标检测又提供了一种新的问题解决思路。
十一、基于CNN的人脸检测器
上面提到的都是通用的目标检测器,这些检测器可以直接通过人脸图像来学习从而得到人脸检测器,虽然它们没有考虑人脸本身的特殊性,但是也能够获得非常好的精度,这反映出不同类型目标的检测其实是相通的,存在一套通用的机制来处理目标检测问题。也有一部分工作是专门针对人脸检测任务的,有的考虑了人脸自身的特点,有的其实也是比较通用的目标检测方法,可以自然地迁移到各种类型目标的检测任务中去。
FacenessNet是专门针对人脸设计的一个检测器,其考虑了头发、眼睛、鼻子、嘴巴和胡子这五个脸部特征,简单地说,对于一个候选窗口,FacenessNet 先分析这五个部分是否存在,然后再进一步判断是不是一张人脸。
这种方法一方面同时利用了整体和局部的信息,能够从不同的角度对图像内容进行刻画,使得人脸和非人脸能够更好地被区分;另一方面增强了对遮挡的鲁棒性,人脸的局部遮挡会影响整体表现出的特征,但是并不会对所有的局部区域造成影响,因而增强了检测器对遮挡的容忍度。
随着越来越多的检测器开始采用深度网络,人脸检测的精度也开始大幅地提升。在2014年,学术界在FDDB上取得的最好检测精度是在100个误检时达到84%的检测率,达到这一精度的是JointCascade 人脸检测器。到2015年,这一纪录被FacenessNet 打破,在100个误检时,检测率接近88%,提升了几乎4个百分点。不仅如此,工业界的最好记录已经达到了100个误检时92.5%的检测率,检测率达到 90%以上的公司还不止一家,并且这些结果都是通过基于深度网络的人脸检测器所获得的。
在大幅提升人脸检测精度的同时,深度学习实际上还降低了包括人脸检测技术在内的各种目标检测技术的门槛,几乎到了只要采用深度网络就能获得不错的检测精度的地步;在精度方面,相比于基于非深度学习方法的检测器,基于深度学习方法的检测器在起点上就要高出一截。不过在检测速度方面,基于深度学习方法的检测器还难以达到实际应用的需求,即使是在GPU上,也还不能以实时的速度(25fps)运行;而反过来看,一旦速度问题能够得到解决,那么深度学习也一定会在目标检测任务上有更广泛和更大规模的应用。
传统的人脸检测技术优势在于速度,而在精度上则相比基于深度网络的方法要略输一筹,在这种情况下,一个自然的想法就是:能否将传统的人脸检测技术和深度网络(如CNN)相结合,在保证检测速度的情况下进一步提升精度?
Cascade CNN可以认为是传统技术和深度网络相结合的一个代表,和VJ人脸检测器一样,其包含了多个分类器,这些分类器采用级联结构进行组织,然而不同的地方在于,Cascade CNN采用CNN作为每一级的分类器,而不是用AdaBoost方法通过多个弱分类器组合成的强分类器,并且也不再有单独的特征提取过程,特征提取和分类都由CNN来统一完成。在检测过程中,Cascade CNN采用的还是传统的滑动窗口范式,为了避免过高的计算开销,第一级的CNN仅包含一个卷积层和一个全连接层,并且输入图像的尺寸控制在12*12,同时滑动窗口的步长设置为4个像素,在这种情况下,一方面每张图像上候选窗口的数量变少了,窗口数量随着滑动步长的增大是按照平方规律下降的,另一方面每个窗口提取特征和分类的计算开销也受到了严格控制。经过第一级CNN之后,由于通过的窗口中人脸和非人脸窗口之间更加难以区分,因此第二级CNN将输入图像的尺寸增大到了24*24,以利用更多的信息,并且提高了网络复杂度——虽然仍然只包含一个卷积层和一个全连接层,但是卷积层有更多的卷积核,全连接层有更多的节点。第三级CNN也采用了类似的思路,增大输入图像大小的同时提高网络的复杂度——采用了两个卷积层和一个全连接层。通过引入CNN,传统的级联结构也焕发出了新的光彩,在FDDB上,Cascade CNN在产生100个误检的时候达到了85%的检测率,而在速度上,对于大小为640*480的图像,在限定可检测的最小人脸大小为80*80的条件下,Cascade CNN在CPU上能够保持接近10fps的处理速度。Cascade CNN中还采用了一些其它的技术来保证检测的精度和速度,如多尺度融合、边框校准、非极大值抑制等,限于篇幅,这里不再继续展开。
十二、当前人脸检测的困境
经过几十年的研究和发展,人脸检测方法正日趋成熟,在现实场景中也已经得到了比较广泛的应用,但是人脸检测问题还并没有被完全解决,复杂多样的姿态变化,千奇百怪的遮挡情况,捉摸不定的光照条件,不同的分辨率,迥异的清晰度,微妙的肤色差,各种内外因素的共同作用让人脸的变化模式变得极其丰富,而目前还没有检测器可以同时对所有的变化模式都足够鲁棒。
目前的人脸检测器在FDDB上已经能够取得不错的性能,不少检测器在100个误检时的检测率达到了80%以上,这意味着它们检测出40个以上的人脸才会出现一个误检。然而,要更为客观地看待FDDB上的评测结果,我们还需要考虑另外一点:FDDB测试图像上的人脸和实际应用场景的差异性,换言之,我们需要思考这样一个问题:人脸检测器在FDDB上所达到的精度能否真实反映其在实际应用场景中的表现?
FDDB中测试图像上的人脸包含了从表情到姿态、从光照到遮挡等各个方面的变化,因而是一个相对通用的数据集,但是在实际应用中,不同场景下人脸往往呈现出比较鲜明的特点,例如在视频监控场景下,由于摄像头架设位置较高和分辨率有限,同时在存储和传输过程中会引入噪声,因此图像上的人脸往往具有较大的俯仰角,且清晰度较低,在这种情况下,原来在FDDB上表现出色的检测器就未必能够达到令人满意的精度。在FDDB中,有大约10%的人脸其大小在40*40以下,而对于人脸识别等一些任务来说,太小的人脸并不适合,因此如果一个检测器因为在小脸上表现不好而导致其在FDDB上表现平平,而在较大的人脸上和表现更好的一些检测器没有太大差别,那么将其应用在人脸识别任务中是完全没有问题的,甚至还可能因为模型简单带来速度上的优势。总而言之,当面对具体的应用场景时,一方面,我们还需要具体问题具体分析,不能盲目地根据检测器在FDDB或者其它人脸检测数据集上精度来下结论;另一方面,我们需要基于当前的人脸检测器去适配实际所需要处理的数据,以使检测器能够在特定的场景下达到更好的精度。
虽然基于深度网络的检测器目前能够达到很高的检测精度,并且其通用性非常强,但其所付出的计算代价也非常高,因此这类检测器突破的关键在于深度网络的简化和加速。除此之外,如果单单考虑人脸检测,这个分类问题相对来说要简单一些,也存在一种可能性:直接学习一个小型的网络就能足够好地完成这个任务。对于采用非深度学习方法的检测器,其基础的检测精度相比会低不少,但是速度上会有明显的优势,因此其关键在于针对特定应用场景下的问题进行合理的改进和适配,以获得更好的检测精度。