标签:
本文主要是介绍自适应提升学习算法(Adaptive Boosting,Adaboost)原理,因为其中涉及到分类器,而分类器往往是基于一些样本特征得到的,所以在此介绍最常用的Adaboost算法结合Haar-like特征。该算法首先在人脸检测中得到广泛运用,而后也被用于其它有关目标检测中。
训练过程中,级联强分类器中的每一级分类器采用AdaBoost算法训练得到,对于第一级强分类器,训练数据为全体训练样本,指定了较高的检测率而对误检率只要求不小于随机结果,所以训练过程中一般只需用到少量分类性能较强的特征就可以达到指定要求;而对于第二级强分类器,训练数据的负样本更新为第一级强分类器对原始负样本的误检样本,这样,第下一级强分类器的训练将针对第上一级难以分开的样本进行,一般地,会使用产生稍多的特征及弱分类器,如此继续,便得到最后的由简单到复杂排列的级联强分类器。
在对输入图像进行检测时,一般需要对图像进行多区域、多尺度的检测。所谓多区域,就是要对取样子窗口进行平移操作,以检测到每个区域。由于训练时候所使用的正样本都是归一化到固定尺寸的图像,所以必须使用多尺度检测以解决比训练样本尺寸更大的目标的检测。多尺度检测一般有两种策略,一种是使子窗口的尺寸固定,通过不断缩放图片来实现,显然,这种方法需要完成图像的缩放和特征值的重新计算,效率不高;而另一种方法,通过不断扩大初始化为训练样本尺寸的窗口,达到多尺度取样检测的目的,这样就避免了第一种方法的弱势。但在窗口扩大检测的过程中会出现同一个目标被多次检测的情况,所以需要进行区域的合并处理。
无论哪一种搜索方法,都会从待检测图像取样大量的子窗口图像,这些子窗口图像会被级联分类器一级一级不断地筛选,只有检出为非负区域才能进入下一步检测,否则作为非目标区域丢弃,只有通过所有级联的强分类器并判断为正区域才是最后检测得到的目标区域。级联分类器的检测过程如下图:
Haar-like特征值的计算就是用图中矩形模板中黑色矩形内所有像素值的和减去白色矩形内所有像素值的和。Haar-like特征可以有效的提取图像的纹理特征,各模板通过平移、缩放提取不同位置和尺度的特征值。所以Haar-like特征的数量是巨大的,对于给定的W×H的图片,其一个矩形特征的数量为:
其中,wxh为特征模板尺寸
表示特征模板在水平和垂直方向放大的最大比例。而对于45度的特征数量为:
关于这个公式,其推导过程比较难懂。在此说说我的理解:
首先得清楚两点:
1、对于图2中的某一特征,特征本身可以沿水平、竖直方向缩放;水平方向需以w为单位缩放,竖直方向需以h为单位进行缩放;即缩放后宽高比可能与原特征宽高比不同,但缩放后,宽和高与原特征的宽和高是成比例的。所以对于图2中某一w*h的矩形,其有X*Y种放大方式。
2、对图2中的某一特征矩形及其缩放后的特征矩形,其处于图像的位置不同,Haar特征不同,所以需在窗口中滑动计算。例如图2中的1(a)特征大小为2*1,对于24*24的图像,水平可滑动23步,垂直可滑动24步,所以共有23*24个特征。
理解了这两点后如何绕开原著一大堆推导过程得到上述公式呢?
在此引用一个网友的相比之下简洁明了的推导过程:
这个公式是从概率方面得到的,因为haar特征框没有对宽和高做比例的限制,因此其两边个数的选择为独立同分布事件(此块不知如何用语言描述,如不能理解请直接看计算步骤)。因此以高度边为例,haar特征框为h,训练图像为H,则:
1)特征框放大1倍(无放大):有(H-h+1)个特征
2)特征框放大2倍(只放大h一边,下同):有(H-2h+1)个特征
3)特征框放大3倍:有(H-3h+1)个特征
如此直到放大H/h倍
4)特征框放大H/h倍:有1个特征,即有(H-H/h*h+1)个特征
以上全部相加有:
H-h+1+H-2h+1+H-3h+1+......+H-H/h*h+1=H*H/h+H/h-h*H/h*(1+H/h)/2
设H/h=Y,则上式可变为Y(H+1-h(1+Y)/2),同理,对宽度边做同样处理可得到X(W+1-w(1+X)/2),因为这种选取符合独立同分布事件,因此总个数可以直接相乘得到,至此得到文章中的公式。
看完他的表达有一种豁然开朗的感觉!很显然,在确定了特征的形式之后,矩形特征的数量只与子窗口的大小有关。在24×24的检测窗口中,可以产生数以10万计的特征,对这些特征求值的计算量是非常大的。
由于数量的巨大,所以解决特征的快速计算将显得尤为重要。Paul Viola和Michal Jones提出使用积分图来实现特征的快速运算。构造的积分图中的像素点存储其左上方所有像素值之和,即:
特别说明:在前期准备训练样本的时候,需要将样本归一化和灰度化到规定尺寸大小,这样每个样本的都是灰度图像并且样本的大小一致,保证了每一个Haar特征(描述的是特征的位置)都在每一个样本中出现。
对于本算法中的矩形特征来说,弱分类器的特征值f(x)就是矩形特征的特征值。由于在训练的时候,选择的训练样本集的尺寸等于检测子窗口的尺寸,检测子窗口的尺寸决定了矩形特征的数量,所以训练样本集中的每个样本的特征相同且数量相同,而且一个特征对一个样本有一个固定的特征值。
这样一来,对于每一个Haar特征,遍历所有的正样本和负样本,计算每张图像对应的特征值,最后将特征值从小到大排序。然后在当前样本权重分布的情况下,确定f的最优阈值,使得这个弱分类器(特征f)对所有训练样本的分类误差最低。
当然,并不是每个Haar特征都能区分正负样本的;且Haar特征作为分类器,它的分类错误率是极高的。但前述有提到:将多个弱分类器组合成一个强分类器,虽然单个弱分类器分类错误率极高,但经过层层筛选,仍然能将错误率降到满足现实要求。一个弱学习器的要求仅仅是:它能够以稍低于50%的错误率来区分正负样本。
按照这个要求,在每轮训练中,可以把所有错误率低于50%的矩形特征(弱分类器)都找到。选取一个最佳弱分类器就是选择那个对所有训练样本的分类误差在所有弱分类器中最低的那个弱分类器。Adaboost算法中,迭代T次即是选择T个最佳弱分类器,最后按照一定方法提升为强分类器。 5.总结
本文首先讲述Adaboost算法的历史和思路原理,由此引出如何训练得到一个强分类器。接着基于实际应用的要求,提出了级联分类器的策略,其中级联分类器中每一级分类器都采用Adaboost算法训练得到。然后讨论Adaboost算法“多个弱分类器组合成一个强分类器“中提到的弱分类器是如何训练得到的,由此引出Haar-like特征。介绍了Haar特征是什么,给定一子窗口大小,如何求其Haar特征;针对Haar特征数量的巨大,引出了快速计算Haar特征的方法——积分图像法。最后阐述如何将Adaboost算法结合Haar-like特征训练得到弱分类器和强分类器的方法和过程。博文难免有引用和借鉴的地方,它们对于我学习这块知识有着莫大的帮助。写该博文不过是为了加深自己的印象和记录一些需要注意的细节点,并不做他用,若能顺便帮助到想要学习这一块知识的朋友,锦上添花,何乐而不为!
标签:
原文地址:http://www.cnblogs.com/codingmengmeng/p/5415093.html