AdaBoost人脸检测训练算法 (上)

http://blog.csdn.net/hqw7286/article/details/5556767



前在实际中应用人脸检测方法多为基于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等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征。

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

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

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

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

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

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

 

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

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

假设训练或检测窗口大小为W x H个像素,w , h分别为特征原型的长、宽,所示四种特征原型对应的w /h分别为:2/1,1/2,3/1,2/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像素大小的子窗口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Adaboost是一种常用的机器学习算法,可以用于人脸检测。在Matlab中,可以使用Adaboost算法训练分类器,然后使用该分类器来检测人脸。具体步骤包括:收集训练数据集,提取特征,训练分类器,测试分类器,调整参数等。Matlab中有很多现成的工具箱可以用来实现这些步骤,例如Computer Vision Toolbox和Image Processing Toolbox等。 ### 回答2: Adaboost算法是一种分类算法,它可以在大量的数据中识别出特定的模式。最常见的应用就是人脸检测。其中,matlab是一种高效的编程语言和开发工具,可以用来实现adaboost人脸检测adaboost算法是基于弱分类器的集成学习算法。它的思想是将一系列弱分类器组合成一个强分类器。这个弱分类器可以是任何的分类器,比如决策树、SVM等。而弱分类器的训练过程是通过不断地迭代得到的。在adaboost算法中,每一个弱分类器都是在前一个弱分类器的错误基础上进行训练得到的。这,就可以将每一个弱分类器的错误率降到最低。最终得到的强分类器可以在大量的数据中识别出特定的模式。 Adaboost人脸检测的实现流程大致分为以下几步: 1. 数据集准备:获取一批已知的训练样本数据,并将其标记为人脸或非人脸图像。 2. 特征选择:选择一种特征表示方法,例如Haar特征,将每一张图像表示为该特征的向量。 3. 弱分类器训练:使用弱分类器算法,如决策树、SVM等,对特征向量进行分类,并计算每个分类器的错误率。 4. Adaboost训练:通过Adaboost算法,将各个弱分类器集成为一个强分类器,并计算每个弱分类器的权重。 5. 物体检测:在测试图像中滑动窗口,并使用训练好的强分类器进行检测。如果检测到物体,则输出该物体的位置和类别。 Adaboost人脸检测具有以下优点: 1. 高精度和高效率:Adaboost算法可以在大量的数据中识别出特定的模式,并能够对其进行高效的分类。 2. 鲁棒性强:Adaboost算法对于一些小的图像变化和干扰因素具有较好的鲁棒性。 3. 可扩展性:Adaboost算法可以适用于不同的分类问题和不同的特征表示方法。 总体来说,Adaboost算法人脸检测中的应用已经得到了广泛的认可。而基于Matlab的Adaboost人脸检测的实现也非常方便和易于理解。 ### 回答3: Adaboost是一种基于弱分类器的集成学习方法,常用于人脸检测。在Matlab中,Adaboost人脸检测可以通过使用CascadeObjectDetector类实现。 首先,需要准备一个训练集,该训练集包含正本和负本。正本是人脸图片,负本是非人脸图片。这个训练集需要足够大且包含真实生活情境中的数据。 然后,可以使用trainCascadeObjectDetector函数训练一个级联分类器。该函数使用Adaboost算法对分类器进行训练,并且可以控制级联层数和每个级联器中弱分类器的数量。在训练过程中,会自动将弱分类器组合成强分类器,达到更高的准确率。 训练完成后,可以使用detect函数来测试训练后的分类器。该函数可以输入需要检测图像,并输出检测到的人脸对象的位置和大小。对于大型图像,可以使用step函数对其进行逐级检测来提高检测速度。 Adaboost人脸检测算法在Matlab中的应用非常广泛,其准确性和可靠性已经被广泛证明。同时,也有很多优秀的开源库可以使用。不过需要注意的是,该算法训练数据的质量要求非常严格,因此要确保训练集足够大和多化,才能得到较好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值