基于AdaBoost算法的人脸检测简介人脸检测人脸检测(facedetection)是指对于任意一幅给定的图像,采用一定的策略对其进行搜索以确定其中是否含有人脸,如果是则返回人脸的位置、大小和姿态。典型的方法有模板法、基于示例学习、基于器官特征的方法、神经网络、彩色信息+形状分析、AdaBoost的方法等等。矩形特征,也叫Haar-Like特征。在AdaBoost算法中使用矩形特征作为特征模板。用一个5元组表示一个矩形特征(x,y,w,h,angle),其中(x,y)为矩形的左上角位置,(w,h)为矩形的宽和高,angle表示矩形的旋转角度。计算一个矩形特征对应的特征值有几种方法,例如,黑色部分与白色部分像素和的差、黑色部分与整个矩形面积的权重差等等。我们主要考虑以下四种举行特征(只含0angle特征,不包含45angle类型的矩形特征):(A)(B)(C)(D)将haar特征这种反映图像中灰度分布特点的特性引入人脸检测问题当中,问题就转换成如何找到较好的haar特征对人脸图像灰度分布的特点进行描述。下图中的3个特征就能很好的描述图像中人脸的眼部的灰度的分布特点。满足(s,t)条件的矩形的数量计算nm对于子窗口,我们只需要确定了矩形左上顶点和右下顶点,即可以确定一个矩形;如果这个矩形必须满足下面两个条件(称为(s,t)条件):(1)x方向边长能被自然数s整除。(2)y方向边长能被自然数t整除。满足(s,t)条件的矩形称为条件矩形。首先,确定左上角位置,则左上角可以选择的位置范围为:其次,根据左上角位置限定右下角位置范围为:其中:{1,2,...,,1}{1,2,...,,1}LULUxmsmsyntnt11LULUmxpsnyqt{1,21,...,(1)1,1}{1,21,...,(1)1,1}RDLULULULURDLULULULUxxsxsxpsxpsyytytyqtyqt则(m,n)图像窗口内满足(s,t)条件的矩形特征的数目:公式(1)11(,)(,)11111111111111111...1LULULULULULUmsntmnstxymsntLULUxymsntLULUxypqmxnystmxnystmmsnnssstt1...1tt),()1,3(),()3,1(),()1,2(),()2,1(nmnmnmnm所以mn子窗口中所有四种特征模板的特征总数量,就是满足四个(s,t)条件的矩形特征的数量的总和,即:代入公式(1)即可求得条件矩形的特征数量总和。积分图:利用矩形特征来计算选取人脸的特征有一种非常快速的算法,这种算法使用了一种间接的图像表示方法,称之为积分图。在一张积分图上,点i(x,y)的积分值ii(x,y)是原图像上该点的上方和左方所有点的亮度值的和。即:其中ii(x,y)为积分图,i(x,y)为原始图像。'''',(,)(,)xxyyiixyixy原图像积分图图像原图像部分像素值对应积分图图像部分像素值当采用下面两式,只需对原图像扫描一次即可计算出积分图:其中,,是对这一行及其以前行的像素值求和,并且有:(,)(,1)(,)sxysxyixy(,)(1,)(,)iixyiixysxy''(,)(,)xxsxyixy(,1)0,(1,)0sxiiy具体程序如下:求积分图程序AdaBoost算法训练部分AdaBoost算法学习第一步:弱分类器的选取一个弱分类器h(x,f,p,)由一个特征f,阈值和指示不等号方向的p组成:训练一个弱分类器(特征f)就是在当前权重分布的情况下,确定f的最优阈值以及不等号的方向,使得这个弱分类器(特征f)对所有训练样本的分类误差最低。具体方法如下:1()(,,,)0pfxphxfp其他对于每个特征f,计算所有训练样本的特征值,并将其排序。通过扫描一遍排好序的特征值,可以为这个特征确定一个最优的阈值,从而训练成一个弱分类器。具体来说,对排好序的表中的每个元素,计算下面四个值:1)全部人脸样本的权重的和;2)全部非人脸样本的权重的和;3)在此元素之前的人脸样本的权重的和;4)在此元素之前的非人脸样本的权重的和;TTSS这样,当选取当前任意元素的特征值作为阈值时,所得到的弱分类器就在当前元素处把样本分开——也就是说这个阈值对应的弱分类器将当前元素前的所有元素分类为人脸(或非人脸),而把当前元素后(含)的所有元素分类为非人脸(或人脸)。可以认为这个阈值所带来的分类误差为:于是,通过把这个排序的表扫描从头到尾扫描一遍就可以为弱分类器选择使分类误差最小的阈值(最优阈值),也就是选取了一个最佳弱分类器。同时,选择最小权重错误率的过程中也决定了弱分类器的不等式方向。min((),())STSSTSXYFwT(f)T(nf)S(f)S(nf)ABeX(1)010.20.60.400.20.20.80.2X(2)130.10.60.40.10.20.30.70.3X(3)040.20.60.40.10.40.10.90.1X(4)160.30.60.40.40.40.40.60.4X(5)190.10.60.40.50.40.50.50.5X(6)1100.10.60.40.60.40.60.40.4具体弱分类器学习演示表如下:通过演示表我们可以得到这个矩形特征的学习结果,这个弱分类器阈值为4,不等号方向为p=-1,这个弱分类器的权重错误率为0.1。()(()())ASfTnfSnf()(()())BSnfTfSf1ABmin(,)eAB其中:第二步:由弱分类器确定强分类器经过T次迭代后,得到T个最佳弱分类器,可以按照下面的方式组合成一个强分类器:其中。那么,这个强分类器对待一幅待检测图像时,相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果。1111()()20TTttttthxCx其他1logtt)(),...,(1xxhhT强分类器中包含弱分类器数T的确定fmaxdmin首先了解两个概念:(1)强分类器的训练检出率=被正确检出的人脸数与人脸样本总数的比例(2)强分类器的训练误判率=被误判为人脸的非人脸样本数与非人脸样本总数的比例设强分类器训练误判率目标值为,训练检出率的目标值为。AdaBoost算法将根据和来确定强分类器包含的弱分类器数目T。fmaxdmin预设强分类器包含的弱分类器个数为,然后根据个训练一个强分类器,统计其检出率和误判率,当满足且时,可认为满足条件,不必再训练弱分类器。若不满足上述条件,则对进行调整。具体依据如下:(1)强分类器的检出率(误判率)随着阈值的减小而增大,随着阈值的增加而减小。极端的情况,如果将阈值设置为0,那么强分类器会将所有的样本分类为人脸,这时检出率和误判率最大,为100%。(2)增加弱分类器的数目可以减小误判率。根据以上两条,得如下强分类器训练程序流程图:*T*Tdfminddfmaxf*T*T强分类器训练程序流程图Adaboost算法的具体描述如下:输入:一组训练集:,其中为样本描述,为样本标识,;其中0,1分别表示正例子和反例。在人脸检测中,可以定义0为非人脸,1为人脸。初始化:初始化训练样本的权重,D(i),其中或者(人脸样本和非人脸样本初始化为不同的值,m为非人脸样本总数,l为人脸样本总数)。对,循环执行下面的步骤:11(,),...,(,)nnxyxyixiy(0,1)iy1,2,...,tT1()2Dim1()2Dil1.归一化权重:2.对每个特征f,训练一个弱分器;计算所有特征的弱分类器的加权错误率3.选取最佳弱分类器,按最小错误率。()thx,,,1titintjjwqw),,,(pfxhyxqiiiifpfh),,,(ypfxqyxqitttiiiiiiipfthpfh),,,(),,,(min,,),,,()(ttttpfhxhx1111()()20TTttttthxCx其他1logtt11,,ietititww1ttt0ie1ieixix4.按照这个最佳弱分类器,调整权重:其中表示被正确分类,表示被错误分类。5.最后的强分类器为:其中:算法流程图关于AdaBoost算法形象理解Adaboost算法是一种用来分类的方法,它的基本原理是把一些比较弱的分类方法合在一起,组合出新的很强的分类方法。例如在图中需要用一些线段把红色的球和深蓝色的球分开,然而如仅果仅用一条线的话,是分不开的。使用AdaBoost算法来进行划分的话,先画出一条错误率最小的线段如图a,但左下角的深蓝色的球被错划分到红色区域,因此加重被错误划分的球的权重,再下一次划分的时候,将更加考虑那些权重大的球,如图c,最终得到一个准确的划分,如下图所示。级联分类器单独一个AdaBoost分类器即使很强,在误检率和检测时间上根本满足不了真正的实时人脸检测系统的需要。采用级联检测策略能很好地解决这个问题。Adaboost算法引入了一种瀑布型的分类器---级联分类器。在级联分类器中,每一个待检测窗口只有通过了当前层的强分类器(AdaBoost分类器)才能进入下一层。这样大量的待检测窗口只需要最初几层简单的判断就可以被迅速淘汰,使得平均检测成本大大降低。多层级联结构中,每一层的强分类器都是由AdaBoost算法训练来的。级联分类器的检测示意图如下图:训练L层级联分类器的步骤如下:(1)训练第i层强分类器;(2)保存强分类器的参数,即各弱分类器的参数、强分类器的阈值以及被误判为人脸的非人脸样本;(3)补充非人脸样本集,组合前i层强分类器对候选非人脸样本进行检测,将被误判为人脸的非人脸样本加入到样本集中(人脸样本不更新);(4)训练第i+1层强分类器。()ixH()ixH()ixH多层级联结构的检测率和误检率分析系统检测率和系统误检率的计算:D为级联分类器的检测率,为强分类器的检测率。F为级联分类器的误检率,为强分类器的误检率。n为级联数目。n由系统所要到达的检测率和误检率决定。1niiDdid1niiFfif级联分类器优势:(1)降低训练难度对于一个强分类器与一个L层的级联分类器,假设它们误判率相同为F,可知级联分类器的各层强分类器的误判率要大于F,训练一个误判率较高的强分类器难度相对较小。(2)降低非人脸样本选取难度训练级联结构的分类器,通过程序“自举”非人脸样本,逐层增加训练难度,可以很好的解决非人脸样本选取的难题。AdaBoost算法检测部分Adaboost算法的检测机制人脸检测过程需要对图像进行有效的扫描,有效地扫描方式有如下两种:(1)图像放缩法检测人脸(2)检测窗口放大法检测人脸。图像放缩法检测人脸:将检测图像按比例缩放成一系列图像,称为“图像金字塔”。对图像金字塔中的每一个图像进行与训练样本窗口大小一样的扫描。放缩检测窗口时要考虑到两个方面的因素:既不能使相邻大小的窗口放大的倍数过大,因为这样会漏检过小的人脸;同时又要考虑到,如果相邻窗口的大小相隔太小,检测过程会有很多多余的计算,检测速度会变慢。检测窗口放大法检测人脸:放大检测窗口法将图像保持不变,按比例不断放大检测窗口,直到检测窗口达到图像