AdaBoost人脸检测训练算法

摘自:http://blog.csdn.net/alec1987/article/details/7470108  (备注:还没有学习,先只是做收藏)

目前在实际中应用人脸检测方法多为基于Adaboost学习算法的方法,这种检测方法最初由剑桥大学的两位大牛Paul ViolaMichael Jones[ViolaJones01]提出,并由另一位大牛英特尔公司的Rainer Lienhart[Lienhart02]对这一方法进行了改善。

这里,我先介绍ViolaJones的人脸检测方法,然后再介绍Lienhart的人脸检测算法。

我们可以发现,两种检测方法的大体框架是相同的,只是在Harr-like特征的选取、计算以及AdaBoost的训练算法上有区别。

 

ViolaJones人脸检测方法

 

ViolaJones人脸检测方法是一种基于积分图、级联检测器和AdaBoost算法的方法,方法框架可以分为以下三大部分:
    1)使用Harr-like特征表示人脸,使用“积分图”实现特征数值的快速计算;
    2)使用Adaboost算法挑选出一些最能代表人脸的矩形特征(分类),按照加权投票的方式将弱分类器构造为一个强分类器;
    3)将训练得到的若干强分类器串联组成一个级联结构的层叠分类器,级联结构能有效地提高分类器的检测速度。

 

一、Haar-like矩形特征的特征值的快速计算方法

 

影响AdaBoost人脸检测训练算法速度很重要的两方面是特征选取和特征计算。选取的特征为矩特征为Haar特征,计算的方法为积分图。

 

1Haar-like特征

 

Haar-like特征最早是由Papageorgiou等应用于人脸表示,ViolaJones在此基础上,使用3种类型4种形式的特征。

3种类型分别为:2-矩形特征、3-矩形特征、4-矩形特征。

Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。

特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。

 

 对于图中的A,  BD这类特征,特征数值计算公式为:v=Sum-Sum

 而对于C来说,计算公式如下:v=Sum-2*Sum

之所以将黑色区域像素和乘以2,是为了使两种矩形区域中像素数目一致。

 

通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。

上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的称为“特征值”。

假设训练或检测窗口大小为W x H个像素,w , h分别为特征原型的长、宽,所示四种特征原型对应的w /h分别为:2/11/23/12/2

 

一个haar-like特征在24*24像素图的子检测窗口中的矩形特征数量总计为134736个。

 

2、积分图(Integral Image

 

积分图主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和,从而加快了计算。(最近听过屈婉玲老师课的话,应该知道,这有个相应的称呼,叫做动态规划算法)

 

点(x,y)处的积分图,定义为点(x,y)左上角所有像素和。用公式表示为:

 

其中,I(x',y')为图像在点(x',y')处的像素值。

为了节约时间,减少重复计算,则积分图可按如下递推公式计算:

 

其中,ii(x,y)为点(x,y)的积分图,i(x,y)为点(x,y)处的像素值,s(x,y)为点(x,y)的累计行总和。

 

这样就可以进行2种运算:

1)任意矩形区域内像素积分

由图像的积分图可方便快速地计算图像中任意矩形内所有像素灰度积分。

如下图所示,点1的积分图像ii1的值为(其中Sum为求和)

ii1=SumA

 

同理,点2、点3、点4的积分图像分别为:

ii2=Sum(A)+Sum(B)

ii3=Sum(A)+Sum(C)

ii4=Sum(A)+Sum(B)+Sum(C)+Sum(D)

矩形区域D内的所有像素灰度积分可由矩形端点的积分图像值得到:

        Sum(D)=ii1+ii4-(ii2+ii3)            (1)

 

(2)特征值计算

矩形特征的特征值是两个不同的矩形区域像素和之差。

(1)式可以计算任意矩形特征的特征值。

 

上图中,该特征原型的特征值定义为:Sum(A)-Sum(B)

根据(1)式则有:Sum(A)=ii4+ii1-(ii2+ii3)Sum(B)=ii6+ii3-(ii4+ii5)

所以此类特征原型的特征值为:(ii4-ii3)-(ii2-ii1)+(ii4-ii3)-(ii6-ii5)

 

矩形特征的特征值计算,只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。这样只要遍历图像一次,就可以求得所有子窗口的特征值。

 

二、使用Adaboost算法选取优化的弱分类器和级联结构的层叠分类器

 

在确定了特征形式后,Harr- like特征的数量就取决于训练样本图像矩阵的大小,特征模板在子窗口内任意放置,一种形态称为一种特征,找出所有子窗口的特征是进行弱分类训练的基础。

训练过程分为3个步骤:首先需要提取Haar特征;然后将Haar特征转化成对应的弱分类器;最后从大量的弱分类器中迭代选择出最优弱分类器。

 

1)提取Haar特征

 

 

常用的Haar特征有4种。

当然也可以在这4种特征的基础上设计出更多、更复杂的特征。以大小为24x24像素的训练样本为例,上述4种特征的总个数超过了160000个。

这样庞大的数字给后续的迭代训练工作带来了庞大的计算量,直接导致AdaBoost算法训练过程极为费时,这恰恰是算法需要改进的关键问题之一。

 

2)生成弱分类器

 

AdaBoost的学习算法能从一个很大的特征集中选择很小的一部分关键的特征,从而产生一个极其有效的分类器。

最初的AdaBoost学习算法可用于提高一个简单的分类器(有时又称为弱分类器)的性能,它最终形成的强分类器的训练错误率接近于零,而且具有很好的推广性。

每一个Haar特征都对应着一个弱分类器,每一个弱分类器都是根据它所对应的Haar特征的参数来定义的。利用上述Haar特征的位置信息,对训练样本进行统计就可以得到对应的特征参数。

Viola共定义了180,000种矩形特征,这个数远大于图像中像素的数目。每个特征都能很快计算出来,再通过试验选出一小部分作为特征以形成一个有效的分类器。要得到最终的强分类器,最重要的是如何找到这些特征。

为此起见,每个弱分类器的设计都是从能对正例和反例进行正确分类的所有弱分类器的集合中选择错误率最小的一个。对每个特征而言,弱学习器决定弱分类器的最佳的阈值,使其具有最小的误分样本数。

因此一个弱分类器hj(x)是由一个特征(fj)、一个阈值(θj)和一个指示不等式方向的校验器(pj)构成:

 

其中x表示图像中一个24 x24像素大小的子窗口。

 

3)采用AdaBoost算法选取优化的弱分类

 

通过Adaboost算法挑选数千个有效的haar特征来组成人脸检测器,Adaboost算法中不同的训练集是通过调整每个样本对应的权重来实现的。

开始时,每个样本对应的权重是相同的,对于h1分类错误的样本,加大其对应的权重;而对于分类正确的样本,降低其权重,这样分错的样本就被突出出来,从而得到一个新的样本分布U2

在新的样本分布下,再次对弱分类器进行训练,得到弱分类器h2。依次类推,经过T次循环,得到T个弱分类器,把这T个弱分类器按一定的权重叠加(boost)起来,得到最终想要的强分类器。

 

 

 

这里,我给出训练弱分类器和选取优化的弱分类器的算法(算法图若看不清,请点击放大):

 

 

分类器训练完以后,就可以应用于输入图像中的感兴趣区域(与训练样本相同的尺寸)的检测。检测到目标区域(汽车或人脸)分类器输出为1,否则输出为0

为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。

所以,为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。

 

4)构成级联结构的层叠分类器

 

每个特定分类器所使用的特征用形状、感兴趣区域中的位置以及比例系数(这里的比例系数跟检测时候采用的比例系数是不一样的,尽管最后会取两个系数的乘积值)来定义。

分类器中的“级联”是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。

 

 

同样,我们给定训练级联结构的分类器的算法(算法图若看不清,请点击放大):

 

 

补充:训练样本的选择和训练系统总体框架

 

训练样本要求是面部特写图像,下图是一簇训练样本,大小被归一化为24×24像素。

其中,正训练样本要求是面部特写图像,但是人脸形态千差万别,所以训练样本选取过程中要考虑到样本的多样性。

负训练样本,大小被归一化为24×24像素,其中各样本不完全相同,分别具有一定的代表性。

 

训练系统总体框架,由“训练部分”和“补充部分”构成。依据系统框架,本文的训练系统可分为以下几个模块:

(1)以样本集为输入,在给定的矩形特征原型下,计算并获得矩形特征集;

       (2)以特征集为输入,根据给定的弱学习算法,确定闽值,将特征与弱分类器一一对应,获得弱分类器集;

        (3)以弱分类器集为输入,在训练检出率和误判率限制下,使用A d a B o o s t算法

挑选最优的弱分类器构成强分类器;

       (4)以强分类器集为输入,将其组合为级联分类器;

        (5)以非人脸图片集为输入,组合强分类器为临时的级联分类器,筛选并补充非人脸样本。

 

Lienhart人脸检测方法

 

就像我一开始说的,比起ViolaJones人脸检测方法,Lienhart的人脸检测方法只是在Harr-like特征的选取、计算以及AdaBoost的训练算法上有区别。

 

一、Harr-like特征的选取

 

Lienhart提出了一些新的旋转Haar-like特征。

 

包含4个边缘特征、8个线性特征和2个中心特征。

而对角线特征(对应图中的4)没有用到,是因为对角线特征和线性特征里的特征相似。

在特征值的计算过程中,黑色区域的权值为负值,白色区域的权值为正值。

 

二、特征值的计算

 

对于竖直矩阵,我们定义SAT(x,y)为点(x,y)左上角区域的像素和。

用公式可以表示为:

 

为了节约时间,减少重复计算,可按如下递推公式计算:

 

而计算矩阵特征的特征值,是位于对角线矩形SAT(x,y)之差。可参考下图:

 

        

   

    对于45°旋角的矩形,我们定义RSAT(x,y)为点(x,y)左上角45°区域和左下角45°区域的像素和。

       

 

用公式可以表示为:

 

为了节约时间,减少重复计算,可按如下递推公式计算:

 

 

 

而计算矩阵特征的特征值,是位于十字行矩形RSAT(x,y)之差。可参考下图:

 

 

三、AdaBoost的训练算法

 

Lienhart通过学习得到的系统能够用于旋转人脸的快速检测,同时也能使平均的误检率降低10%

此外他还研究了一些其他的Boosting算法,如:离散的Adaboost算法(Discrete Adaboost),实值的Adaboost算法(Real Adaboost)和平缓的Adaboost算法(Gentle Adaboost)

通过比较得出基于平缓的Adaboost算法(Gentle Adaboost)效果较好。

 

离散的Adaboost算法和平缓的Adaboost算法如下(算法图若看不清,请点击放大):

 

 

总的来说,基于Adaboost算法的系统在速度方面具有很大的优越性。它是在提出的一系列Haar-like特征的基础上,通过Adaboost算法学习一些弱分类器,再组合成一个强分器。

但一般一个强分类器还不足以圆满完成任务,还要级联一系列这样的强分类器,但是要进一步提高检测精度,就需要级联更多的强分类器,但是这样又会降低检测速度。

我们认为一方面可以采用更好的、计算却更简单的图像特征表述方法;另一方面就是综合Adaboost和一些强分类器。

Adaboost学习的过程中,可以提高正例学习的阈值,如可以将每级常采用的正检率阈值(一般设为98.5%)适当增加,当然误检的非人脸会相应增加,这样学习得到的一些弱分类器组合后形成的强分类器作为分级分类器的前面几级,最后再用一个强分类器进一步过滤。

由于在前几级消除了大多数的非人脸,因此通过最后一级强分类器的窗口将大大减少。这样可以获得一个既提高检测速度又提高检测精度的系统。

 

你可能感兴趣的:(AdaBoost人脸检测训练算法)