摘要:本文介绍了一种人脸检测体系,它能够快速处理图像并达到较高的检测率。它具有三个关键性的贡献。第一个贡献就是引入一种叫做“积分图像”的新的图像表示法,它使得应用到我们检测器的特征能够被快速计算。第二个贡献是一种简单有效的分类器,它由 AdaBoost学习算法构建(Freund和Schapire,1995年),用来从一个庞大的潜在特征集中筛选出少量至关重要的视觉特征。第三个贡献就是一种以“级联”方式组合分类器的方法,它能够快速摒弃图像的背景区域从而花费更多的计算在类人脸(face-like)的区域上。本文给出了一系列人脸检测领域的实验。本系统产生的人脸检测性能可与最早的各体系(Sung 和Poggio, 1998年; Rowley等人,1998年; Schneiderman和Kanade, 2000年; Roth 等人2000年)相比拟。在常规的台式机上实现,人脸检测速度可以达到15帧每秒。
1. 介绍
这篇文章集新的算法和见解于一体,构建了一个鲁棒的非常快速的视觉检测体系。文章结尾我们构建了一种正面人脸检测系统,它能够达到与最好的已出版结果(Sung和Poggio, 1998年; Rowley 等人, 1998年; Osuna等人1997a; Schneiderman和Kanade, 2000年; Roth等人, 2000年)同样的检测率和误报率。在快速检测人脸的能力上,这个人脸检测系统明显地区别于以往的方法。在常规的700 MHz的英特尔奔腾Ⅲ上,对384288像素的图像进行操作,人脸检测速度达15帧每秒。在其他的人脸检测系统中,为取得较高的帧率需要用到额外的信息,比如视频序列中图像的差异,彩色图像中像素的颜色。我们的系统只需要利用单个灰度图像表示的信息就可以达到较高的帧率。这些可选择的信息来源也可以整合到我们的系统中以达到更高的帧率。
我们的人脸检测体系主要有三个贡献。下面我们将分别简介这三种方法,然后在接下来的各节再详细描述它们。
本文的第一个贡献是一种新的图像表示法——积分图像,它能够快速计算特征值。受到Papageorgiou (1998年)等人工作的部分启发,我们的检测体系不是直接工作于图像亮度。像这些作者一样,我们使用一组特征,这让我们联想起Harr基函数(尽管我们也使用比Harr 滤波器更复杂的相关滤波器)。为了能够在多尺度下快速计算这些特征值,我们引入积分图像表示法(积分图像与计算机图形学(Crow, 1984年)中纹理映射的区域求和表类似)。对图像中每个像素进行很少的操作就可以得到积分图像。类Harr特征值一旦被计算,那么任意尺度和位置的任何一个特征值都可以在常数时间内完成计算。
本文的第二个贡献是一个简单有效的分类器,它是通过AdaBoost算法(Freund 和 Schapire, 1995年)从一个庞大的潜在特征数据库中筛选少量重要的特征来建立的。在任何图像子窗口内,类Harr特征的总数是很大的,远远超过像素数。为了确保快速分类,学习的过程必须排除绝大多数可用的特征,而集中在少数至关重要的特征上。在Tieu 和Viola (2000年) 特征值筛选工作的推动下,利用AdaBoost学习算法只依赖一个单独的特征便可以构建一个弱分类器。于是,增强过程选取一个新的弱分类器,它的每一个阶段可以被看做是一个特征选取的过程。在泛化性能方面,AdaBoost提供了一种有效的学习算法和一个强大的边界。
本文的第三个主要贡献是一种方法,即在级联结构中连续不断地组合更复杂的分类器,它通过专注于可能的图像区域来显著提高检测速度。集中注意力过程的背后,是因为快速确定一幅图像中人脸可能出现的位置往往是可能的(Tsotsos等人, 1995年; Itti等人, 1998年; Amit 和Geman, 1999年; Fleuret 和Geman, 2001年)。更复杂的操作只针对这些可能的区域进行。这种方法的关键度量是注意力过程的“漏报”率。情况是这样的,所有,或几乎所有的人脸例子都是通过专注过滤器筛选的。
我们将介绍一种方法,训练一个非常简单又有效的分类器,它作为关注算子的一种“有监督的”聚焦[1]。人脸检测专注过滤器将滤除人脸图像的超过50%部分而保留人脸的99%(正如一个大的数据集上评估的)。这种过滤器十分有效;据评估为每位置/尺度20个简单操作(大约60个微处理器指令)。
那些没被初始分类器拒绝的子窗口会被一系列分类器处理,后一个分类器要比前一个分类器稍微复杂一点。如果任意一个分类器拒绝了子窗口,后续程序将不再处理它。级联检测程序的结构本质上是一种退化的决策树,这与Fleuret 和 Geman(2001), Amit 和 Geman (1999年)的工作相关。
完整的人脸检测级联包含38个分类器,总共超过80,000次操作。然而级联结构能达到非常短的平均检测时间。在一个包含507个人脸和7500万子窗口的复杂数据集上,检测每个子窗口的人脸平均使用270条微处理或指令。对比之下,这个系统大约比Rowley 等人 (1998年)构建的人脸检测系统快15倍。
一个快速的人脸检测器将会有广泛的实际应用。其中包括用户接口,图像数据库和电话会议。在某些系统上,进行实时人脸检测应用在以前是不可行的,而速度的提升将使其成为可能。在不要求快速帧率的应用中,我们的系统可以进行额外重要的后处理和分析。另外,我们的系统能在大量小型低功率的装置上得以实现,包括手握式和嵌入式处理器。在实验室,我们已经在缺少浮点运算硬件的200 mips低功率Strong Arm处理器上实现了这个人脸检测器,它能达到2帧每秒的检测速度。
1.1 概述
本文的余下各节将联系理论和实验介绍检测器的实现。第二节将详细介绍特征的形式和为快速计算而采用的一种新方法。第三节将讲述组合这些特征形成分类器的方法。所用的机器学习方法,AdaBoost的一种应用,也作为一种特征选择机制。这种方式构建的分类器计算和分类性能比较好,但是对于一个实时分类器来说太慢了。第四节描述一种构建级联分类器的方法,实现一个非常可靠且高效的人脸检测器。第五节将给出大量的实验结果,包括对实验理论的详细描述。最后,第六节将详细讨论这个系统和与其他相关系统的关系。
2. 特征
我们的人脸检测程序是基于简单的特征对图像进行分类的。有很多理由促使我们使用特征,而不是直接使用像素。最常见的原因是,特征可以采取编码特设的领域知识,而使用有限数量的训练数据进行编码这是很难的。对于这个系统,使用特征还有第二个原因:基于特征的系统运行速度远远超过基于像素的系统。
所用的简单特征,让人联想起已被用于Papageorgiou等人(1998年)的Haar基函数。更具体地说,我们使用三种特征。二矩形特征的值是两个矩形区域内的像素总和之间的差值。这两个区域具有相同的尺寸和形状,并在水平方向或垂直方向上相邻(参照图1)。三矩形特征的值是中心矩形的像素总和减去两头在外的矩形内像素的总和。最后,四矩形特征的值是计算对角线矩形对之间的差值。
给定检测器的基本分辨率为24×24,详尽的矩形特征集是相当大的,16万。请注意,不同于Haar基函数,矩形特征集是超完备的。
图1 图中显示了相对封闭的检测窗口的样本矩形特征。灰色矩形内的象素总和减去白色矩形内的像素总和。二矩形特征示于(A)和(B)。图(C)显示了三矩形特征,图(D)显示了四矩形特征。
2.1 积分图像
使用图像的中间表示法,矩形特征可以被非常迅速地计算出来,我们称之为积分图像。积分图像中坐标(x,y)的值包括x,y上面和左侧的像素总和:
其中,ii(x,y)是积分图像,i(x,y)是原始图像(参照图2)。使用以下递归方程组:
其中,s(x,y)是累计行和,s(x,-1)=0,和ii(-1,y)=0)积分图像可以利用传递过来的原始图像计算。
使用积分图像,任何矩形的像素总和都可以用四个数组引用计算(参照图3)。显然,两个矩形像素总和之间的差值,可以用八个数组引用计算。由于上述定义的二矩形特征涉及相邻的矩形像素和,它可以用六个数组引用计算,三矩形特征可以用八个数组引用计算,四矩形特征可以用九个数组引用计算。
图 2 在点(x,y)的积分图像的值是其上方和左侧的所有像素的总和。
图3 矩形D内的像素总和可以用四个数组引用计算。位置1的积分图像的值是矩形A的像素和。位置2的值是A + B,位置3的值是A + C,位置4的值是A + B + C + D。矩形D内的像素总和可以计算为4 + 1 -(2 + 3)。
积分图像的一个可供选择的动机来自Simard等人(1999)的“boxlets”工作。
作者指出,线性操作的情况下(例如f·g),如果它的逆被应用到这个结果,那么任意可逆线性操作都可以被应用到f或g。例如在卷积的情况下,如果导数算子被应用到图像和内核,那么结果必须是两次积分:
作者们继续展示,如果f和g的导数是稀疏的(或者可以使得),那么卷积可以被显著加速。一个类似的观点是如果g的逆被应用到g,那么f的一个可逆的线性操作可以应用到f:
从这个框架看,矩形像素和的计算可以表示为一个点积,i·r,其中i是图像,r是厢车图像(感兴趣的矩形内值为1,之外的值为0)。此操作可重写为:
积分图像实际上是图像的双重积分(先是沿行,然后沿列)。矩形的二阶导数(先在行,后在列)在矩形的拐角处产生四个δ函数。四个数组访问实现第二个点积计算。
2.2 特征讨论
矩形特征较其替代品是有些原始的,如可控滤波器(Freeman和 Adelson,1991年,Greenspan 等人,1994年)。可控波滤器,及其相关滤波器,对于边界的详细分析,图像压缩,纹理分析是很好的。然而矩形特征对边缘,条状和其他简单的图像结构的表示也是敏感的,不过相当粗糙。与可控滤波器不同的是,矩形特征可用的方向只有垂直的,水平的和对角的。由于正交性不以特征集为中心,我们选择生成一个非常大的可变的矩形特征集。通常情况下,表示形式约400倍超完备。超完备集提供任意方向比例的特征并具有精细的采样位置。从经验上来看,矩形特征集好像提出了支持有效学习的一种丰富的图像表示。矩形特征的极高的计算效率充分弥补了其局限性。
为更好地理解积分图像技术的计算优势,可以考虑更传统的方法来计算一个金字塔式的图像。像大多数的人脸检测系统一样,我们的探测器从许多尺度扫描输入图像;从基本尺度开始扫描,在一个大小为24×24像素的人脸图像上检测,一个384×288像素的图像在12个尺度上被扫描,每次均比上一个尺度大1.25倍。而传统的方法是计算12个图像的一个金字塔式,每个比之前的的图像小1.25倍。然后用一个固定尺度的探测器扫描这些图像。计算金字塔,虽然简单,但需要大量的时间。在常规的硬件上有效实现它(使用双线性插值缩放每层的金字塔)大约需要0.05秒计算一个这种规模的12级金字塔(用Intel PIII 700 MHz处理器)。
作为对照,我们已经定义了一个有意义的矩形特征集,它具有这样的性质,一个单一的特征可以在任何尺度和位置上在几步操作之内计算出来。我们将在第4节介绍,有效的人脸检测器可以用少到两个矩形特征构建。给定这些特征的计算效率,在整个图像上,人脸检测程序在每一个尺度上计算速度达到15帧每秒,单独计算12级图像金字塔大约需要相同的时间。需要计算这种类型金字塔的任何程序的运行速度一定慢于我们的探测器。
3. 学习分类函数
给定正负样本图像的特征集和训练集,任意数量的机器学习方法都可以学习分类函数。Sung 和 Poggio使用一种混合高斯模型(Sung 和Poggio,1998年)。 Rowley等人(1998年)使用简单图像特征的一小部分和神经网络。Osuna等人(1997b)使用支持向量机。更有甚者,最近Roth等人(2000年)提出了一种新的不同寻常的图像表示,并用于簸学习过程。
回想一下有160,000个与每个图像子窗口相关的矩形特征,数目远远大于像素数。尽管每个特征可以被非常有效地计算,但是计算一套完整的特征的代价也贵得离谱。我们假设,这已被实验证实,组合少量特征来形成一个有效的分类器。面临的主要挑战是要找到这些特征。
在我们的系统中,使用一个变种的AdaBoost算法来选择特征和训练分类器(Freund和Schapire,1995年)。在其原来的形式中,AdaBoost的学习算法是用来提升一个简单学习算法的分类性能(例如,它可能被用来提升一个简单感知器的性能)。它通过结合弱分类函数来形成一个更强的分类器。在增强简单学习算法的语言中,它被称为弱学习。因此,举例来说,感知学习算法在可能的感知器集合里进行搜索,以最低的分类错误率返回感知。这种学习之所以被称为弱的是因为我们并不指望它能够对训练数据进行很好的分类,即使是最好的分类函数(即,对一个给定的问题,最好的感知器可能只有51%的时间能对训练数据进行正确的分类)。为了提升弱学习,要求它解决一系列学习问题。经过第一轮的学习,样本重新加权,以强调那些被之前的弱分类器错误分类的样本。最终的强分类器采用感知器的形式,由阈值决定的弱分类器的加权组合而成。
AdaBoost的学习算法提供了强大的正式保证。 Freund和Schapire证明,强分类器的训练误差在回合数的指数上趋近于零。更重要的是,后来的大量结果证明了泛化性能(Schapire等人, 1997)。关键的见解是泛化性能与样本的幅度有关,AdaBoost实现大幅快速提升。
传统的AdaBoost算法可以很容易地解释为一个贪婪的特征选择过程。考虑提升的一般问题,其中使用一个加权的多数表决机制结合一大组的分类函数。面临的挑战是如何将好分类函数的大的权值和弱分类函数的小的权值联系起来。然而好的分类器也有多种,对于从好的分类函数中选择一小部分,AdaBoost是一个积极的选择机制。打个比方,在弱分类器和特征之间 ,AdaBoost是寻找少量好“特征”的一种有效的算法,但好“特征”也有多种。
完成这个类比的一个实用方法是限制弱分类器于只依赖单一特征的分类函数集中。支持这一目标,弱学习算法选择单一的矩形特征,更好地分离正负样本(这类似于Tieu and Viola (2000年)的在图像数据库检索领域的方法)。对于每个特征,弱学习决定最佳的阈值分类函数,以使最少数目的样本被错误分类。因此,一个弱分类器
这里,x是一个像素的图像子窗口。
实际上,没有一个单一的特征可以实现低误差的分类任务。分类过程前期选择的特征产生的误差率在0.1到0.3之间。后期选择的特征,任务变得更加困难,产生的误差率在0.4到0.5之间。表1给出了学习算法。
我们所使用的弱分类器(阈限的单个特征)可以被看作是单个节点决策树。这种结构在机器学习文献中被称为决策树桩。Freund和Schapire(1995年)的早期工作也利用提升的决策树桩进行实验。
表1 学习在线查询的提升算法。Ţ假设使用单一特征来构建。 最后的假设是T假设的加权线性组合,其中,权重与训练误差成反比。
● 给定样本图像(x1,y1),...,(),其中分别表示正负样本。
● 初始化权值, 其中,m和l分别是正负样本数。
● For t = 1, . . . , T :
1. 归一化权值,
2. 选择相对于加权误差来说最佳的弱分类器
请参阅3.1节关于有效实现的讨论。
3. 定义 ,其中 是的 最小值。
4. 更新权值:
其中,如果分类正确,ei=0,否则,ei=1, 。
● 最终的强分类器是:
3.1 学习讨论
表1中所描述的算法被用来从可能的弱分类器集中选择关键的弱分类器。
虽然AdaBoost过程是十分有效的,但是弱分类器集是非常大的。由于对于每个不同的特征/阈值的组合均有一个弱分类器,实际上就有KN个弱分类器,其中,K为特征的数量,N是样本的数目。为了更好地理解对N的依赖,假设样本被一个给定的特征分类。对于训练过程中处于相同样本组的任何两个阈值是等效的。 因此,不同阈值的总数是N,给定一个任务,N= 20000,K=160000,有32亿不同的二进制弱分类器。
这种包装方法也可以用来学习一个感知器,利用M个弱分类器(John等人,1994年)。此方法可以通过向每一轮的感知器中加入一个弱分类器逐步进行。该弱分类器添加到当前组中,要产生一个最低误差的感知器。每一轮至少需要O(NKN)(或60万亿次运算)的时间来枚举所有的二进制特征和用它们计算每个样本。这忽略了用来学习感知器权重的时间。即便如此,学习一个200个特征的分类器的最终工作量约为O(MNKN),1016次操作。
作为一种特征选择机制,AdaBoost超过竞争对手,比如包装方法,它的主要优势是学习的速度。基于AdaBoost 方法一个200个特征的分类器工作量为O(MNK),约1011次操作。一个关键的优势是,在每一轮中使用样本权值对先前选定的特征进行紧凑编码,完全依赖这些特征是有效的。这些权重可以被用来在固定时间内评估一个给定的弱分类器。
弱分类器选择算法的过程如下。对于每个特征,基于特征值对样本排序。该特征的AdaBoost最优阈值可以通过这个排序列表计算。对于排序列表中的每个元素,四个总和被保存和计算:正样本的权重总和T +,负样本的权重总和 T- ,低于当前样本的正样本权重总和S +和低于当前样本的负样本权重总和S-。排序列表中,分割当前样本和之前样本的阈值的误差为:
当前样本下面的标记为负,上面的标记为正的最小误差或通过误差取反。这些和值在搜索过程中很容易更新。
许多一般特征选择程序已经被提出(参见Webb(1999)的第8章,回顾一下)。我们的最终应用要求一个非常积极的过程,这将丢弃绝大部分特征。对于类似的识别问题,Papageorgiou等人(1998年)提出了一个方案,根据特征的差异进行特征选择。他们从1734个特征中选取了37个取得了很好的结果。虽然这是一个显著的减少,但是计算每个图像子窗口的特征数目仍然是相当大的。
Roth等人(2000年)提出了基于簸指数感知器学习规则的特征选择算法。
这些作者使用一个非常大的不同寻常的特征集,其中每个像素被映射成一个d维的二进制向量(当一个特定的像素值为x,取值范围为[0,,第x维被设置为1,其他维为0)。每个像素的二进制向量被连接起来以形成一个单一的nd维的二进制向量(n是像素的数目)。分类规则是一个感知器,它给输入向量的每个维度分配一个权重。簸学习过程收敛到一个解决方案,其中许多权重为零。然而大量的特征被保留(也许是几百或几千)。
3.2 学习结果
第5节给出了训练细节和最终系统的性能,几个简单的结果值得讨论。初步实验表明,由200个特征构造的分类器将产生合理的结果(参见图4)。给定检测率95%,在测试数据集上分类器产生1/14084的误报率。这是有希望的,但对于实际应用中的一个人脸检测,误报率要接近1/1000000。
对于人脸检测任务,AdaBoost选择的最初的矩形特征是有意义的并且容易理解。所选的第一个特征似乎注重于这个属性,眼睛区域通常比鼻子和脸颊区域要暗(参照图5)。与检测子窗口比较,此特征相对较大,而且对于人脸的尺寸和位置应该不敏感。所选的第二个特征依赖于眼睛比鼻梁要暗这个属性。
总之,200个特征的分类器初步证明,从矩形特征构建提升的分类器是一种有效的人脸检测技术。在检测方面,对于真实世界的许多任务,这些结果是令人信服的但不是充分的。在计算方面,这种分类器是非常快的,扫描一幅384288像素的图像只需要0.7秒。不幸的是,改善检测性能的最简单的技术,增加特征到分类器中,又直接增加了计算时间。
图4 200个特征的分类器的受试者工作特征曲线(ROC)。
图5 AdaBoost算法选择的第一个和第二个特征。这两个特征在顶行中显示,在底行中覆盖于一个典型的训练人脸上。第一个特征测量眼睛区域和脸颊上部区域的强度差。该特征利用了观察到的眼睛区域往往比脸颊暗的特点。第二个特征比较了眼睛区域和整个鼻梁的强度。
4. 注意力级联(The Attentional Cascade)
本节介绍了一种构建级联分类器的算法,它在提高检测性能的同时,能够大幅减少计算时间。关键是规模更小,因此更有效,增强的分类器在检测几乎所有的正样本图像时能够拒绝很多负样本的子窗口。先使用简单的分类器拒绝大多数的子窗口,然后用更复杂的分类器实现低误报率。
基于AdaBoost训练分类器来构建级联的各个阶段。从具有两个特征的强分类器开始,调整强分类器的阈值,以尽量减少漏报率,从而获得一种有效的人脸过滤器。最初的AdaBoost阈值,,旨在训练数据上产生一个低的错误率。较低的阈值可以产生较高的检测率和误报率。基于在验证训练集上已测的性能,两个特征的分类器可以调整到检测率100%,误报率50%。参照图5中关于两个特征分类器的描述。
两个特征分类器的检测性能远远没能达到人脸检测系统。尽管如此,分类器可以显著减少子窗口的数目,只需很少的操作再进行进一步的处理:
1. 计算矩形特征(要求每个特征有6到9个数组引用)。
2. 计算每个特征的弱分类器(每个特征需要一个阈值计算)。
3. 组合弱分类器(每个特征需要一次叠加,另外,最后得出一个阈值)。
两个特征的分类器累计约需60个微处理器指令。似乎很难想象任何更简单的过滤器能够实现更高的拒绝率。通过比较,扫描一幅简单的图像模板所需要的操作至少是每个子窗口的20倍。
检测过程的整体形态是一个退化的决策树,就是我们所说的“级联”(Quinlan,1986年)(参见图6)。来自第一个分类器的好的结果触发第二个分类器的计算,对其进行调整以达到非常高的检测率。来自第二个分类器的好的结果触发第三个分类器的计算,依此类推。任何节点上坏的结果都会被子窗口立即拒绝。
就像一个决策树一样,后续的分类器通过以前所有阶段使用的样本来训练。其结果是,第二个分级器比第一个分类器面临更加困难的任务。通过第一阶段的样本比一般的样本“更难”。深层次分类器所面临的更加困难的样本使得整个受试者工作特征(ROC)曲线下降。在给定检测率的情况下,分类器层次越深,相应的误报率越高。
4.1 训练分类器的级联
级联的设计过程来源于一组检测和性能指标。对于人脸检测任务,过去的系统取得了良好的检测率(85%到95%之间)和极低的误报率(数量级在或)。级联的级数和每级的大小必须满足在实现类似检测性能的同时,最大限度地减少计算量。
给定一个训练的级联分类器,误报率为
其中,F为级联分类器的误报率,K为分类器的数量,是样本通过第i个分类器的误报率。检测率为
其中,D为级联分类器的检测率,K为分类器的数量,是样本通过第i个分类器的检测率。