adaboost + haar 特征实

1 介绍

         adaboost 是一套机器学习的框架,根据给出的正样本和副样本训练一个用于识别正样本一类物体的模型。这个模型的本质就是分类器,又叫做级联(cascade)分类器。本文主要是介绍我实现的adaboost+haar特征程序,并展示其用于商标检测的效果。


2 预备知识

2.1 弱分类器

         分类的目的是将正样本和负样本用一种统一的标准进行区别,分类的方式是对输入样本进行特征提取,特征需要具备好的表示能力,能够在一定程度上反映同类的相似性,不同类的区别性。在adaboost框架中,输入样本提取的是1维特征,即一个样本对应一个标量,这样就可以找到一个阈值最好的区分正负样本,当然会分错,所以称之为弱分类器。vj算法采用的是adaboost+haar特征,还有人使用lbp特征,hog特征, opencv中集成了这3种。


2.2 强分类器

       强分类器是由许多弱分类器组成,弱分类器返回值为(0,1)或者(-1, 1),强分类器中对每一个弱分类器有一个权值(w=log(e/(1-e) ), e为弱分类器在样本集上分错样本比例),一个样本在强分类器的作用下,产生一个置信度,即弱分类器返回值乘上其对应的权值,然后求和,训练的过程中通过召回率来确定这个置信度。
      一个强分类器可以确定输入样本是否具备成为正样本的可能,是则通过判定为正样本,不是则判定为负样本。


2.3 级联分类器

        级联分类器是由指定数量的强分类器组成。如上面所说一个强分类器通过多个弱分类器级联完成对一个样本分类,但是要使这个强分类器具有较高的召回率和精度,就必须有非常大量的弱分类器,判断样本的时间随弱分类器的数量成线性增长。如果换一种思路,一个强分类器不是具备很高的精度,但是召回率很高,对应的效果就是组成强分类器的弱分类器数量少,但是具备过滤掉大量负样本的能力,然后再用一个精度很高,召回率也很高的强分类器进行二次分类。虽然后一种方式对于一个样本来说花费的时间要长,但是对于大量样本分类时间的总和却是少了许多。

       于是级联分类器包含多个强分类器,强分类器的召回率很高,精度不一样,呈阶梯变化,级联分类器先用精度较低的强分类器对样本分类,如果是正样本,再用精度较高的正样本分类,如果是负样本,被某个强分类器判定是负样本则不再用精度更高的强分类器分类。


3 实现

         整套框架的代码比较多,主要分为两个部分:训练部分和检测部分。算法的实现基本上是按照论文[1]中记叙的过程,其中的主要改进方法有3个地方:

         1)弱分类器筛选,弱分类器特征模板是根据一定规律生成的,量很大,我认为对于特定的物体只有一部分是可用的,这部分是分类比较靠前的,我以错误率小于0.3作为模板筛选标准筛选了弱分类器;另外还有一种方法,就是随机选取n个弱分类器,从中选择一个最有的分类器级联到强分类器中,在新版本的实现中用了这个方法;

         2)验证集,强分类器在每一次迭代添加新的弱分类器时会重新训练,训练之后要计算fp的比率,我所使用了验证集,这个集子的数量是固定数量1000张;

         3)样本集更新,负样本在每一次强分类器训练得到后都会用级联分类器更新,之前我犯了一个错误,把分类正确的负样本留下,删去分类错误的负样本,实际上应该删除分类正确的负样本,然后从图片库中去找在当前级联分类器下,分类错误的负样本作为补充。随着级联分类器的精度提高,寻找分类错误的负样本变得很困难,训练的大部分时间都花在这里。

         弱分类器筛选可以大大降低训练时间,效果上也不会降低太多,加入验证集可以提高检测效果,防止过拟合现象的发生。另外,检测方法用的是普通的笨办法:滑动窗口。就是用一个窗口从图像上扣一块,这个窗口在图像上按从左到右,从上到下一次滑动。


4 总结

          实现代码见我的github上https://github.com/huneng/my_adaboost。下图是对车标的检测结果,训练样本1000张左右。接下来我会使用一些新的特征来训练弱分类器,也想过将两种特征结合起来训练弱分类器。

图1

adaboost + haar 特征实_第1张图片

图2

         我的github代码中给出了一个训练模型,可以作为测试用。


[1] Robust Real-Time Face Detection, PAUL VIOLA, MICHAEL J. JONES, International Journal of Computer Vision 57(2), 137–154, 2004


你可能感兴趣的:(机器学习)