现在的位置: 首页 > 综合 > 正文

Haar like特征+Adaboost学习方法 +Cascade classifier

2019年01月06日 ⁄ 综合 ⁄ 共 4236字 ⁄ 字号 评论关闭


1.haar-like特征

一看到Haar-like特征这玩意儿就头大的人举手。好,很多人。那么我先说下什么是特征,我把它放在下面的情景中来描述,假设在人脸检测时我们需要有这么一个子窗口在待检测的图片窗口中不断的移位滑动,子窗口每到一个位置,就会计算出该区域的特征,然后用我们训练好的级联分类器对该特征进行筛选,一旦该特征通过了所有强分类器的筛选,则判定该区域为人脸。

那么这个特征如何表示呢?好了,这就是大牛们干的好事了。后人称这他们搞出来的这些东西叫Haar-Like特征。

下面是Viola牛们提出的Haar-like特征。

 

下面是Lienhart等牛们提出的Haar-like特征。

 

 

 


这些所谓的特征不就是一堆堆带条纹的矩形么,到底是干什么用的?我这样给出解释,将上面的任意一个矩形放到人脸区域上,然后,将白色区域的像素和减去黑色区域的像素和,得到的值我们暂且称之为人脸特征值,如果你把这个矩形放到一个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,而且越不一样越好,所以这些方块的目的就是把人脸特征量化,以区分人脸和非人脸。

为了增加区分度,可以对多个矩形特征计算得到一个区分度更大的特征值,那么什么样的矩形特征怎么样的组合到一块可以更好的区分出人脸和非人脸呢,这就是AdaBoost算法要做的事了。这里我们先放下积分图这个概念不管,为了让我们的思路连贯,我直接开始介绍AdaBoost算法。

2.Adaboost 算法,弱分类器叠加之后变成强分类器

Adaboost 的物理意义可以表述为:当已经提取的分类器对于某些样本分类正确,那么减小这些样本的权重。当分类错误,增加这些样本的权重。这样,后面训练提取的简单分类器就会更加强化对这些分类错误样本的训练。

一个典型的 Adaboost 训练算法可以被简单的看成是对特征进行贪心选择的过程。一个简单的 boosting 问题包含了非常多的弱分类器,这些弱分类器通过加权投票被组合在一起,对于这个 boosting 问题来讲,最大的挑战就是怎么样来保证对于分类效果好的分类器赋予一个较高的权值,而对于分类效果不好的分类器赋予一个较低的权值。Adaboost 提供了一个很强有力的机制,把弱分类器和特征挂起勾来,把性能很好的分类器选择出来,并赋予相应的权值。将弱分类器和特征挂钩起来的一个很直接的方法是,将弱分类器和特征做一一对应的关系,也就是说,一个弱分类器仅仅依赖一个特征。为了实现这个机制,每一轮分类器的训练的过程就是选择一个矩形特征,使得这个特征能最好的将正训练样本和反训练样本分离开。弱学习过程在每一轮训练过程中,对于每一个特征来说,都要确定一个最优阈值,使得该阈值对样本的分类效果最好。这样,每一轮训练过程都可以得到一个分类效果最好的特征,而该特征所对应的弱分类器就是该轮所选出的弱分类器。

可以参考百度关于原始Adaboost介绍的文章:http://stblog.baidu-tech.com/?p=19


结合haar 特征介绍Adaboost算法

2.1弱分类器的设计

最初的弱分类器可能只是一个最基本的Haar-like特征,计算输入图像的Haar-like特征值,和最初的弱分类器的特征值比较,以此来判断输入图像是不是人脸,然而这个弱分类器太简陋了,可能并不比随机判断的效果好,对弱分类器的孵化就是训练弱分类器成为最优弱分类器,注意这里的最优不是指强分类器,只是一个误差相对稍低的弱分类器,训练弱分类器实际上是为分类器进行设置的过程。至于如何设置分类器,设置什么,我们首先分别看下弱分类器的数学结构。

数学结构

 

一个弱分类器由子窗口图像x,一个特征f,指示不等号方向的p和阈值组成。P的作用是控制不等式的方向,使得不等式都是<号,形式方便。

机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树。”(来自《维基百科》)

决策树包含:分类树,回归树,分类和回归树(CART),CHAID 

分类和回归的区别是,分类是当预计结果可能为两种类型(例如男女,输赢等)使用的概念。 回归当局域结果可能为实数(例如房价,患者住院时间等)使用的概念。 

决策树用途很广可以分析因素对事件结果的影响(详见维基百科),同时也是很常用的分类方法,我举个最简单的决策树例子,假设我们使用三个Haar-like特征f1,f2,f3来判断输入数据是否为人脸,可以建立如下决策树:

 

可以看出,在分类的应用中,每个非叶子节点都表示一种判断,每个路径代表一种判断的输出,每个叶子节点代表一种类别,并作为最终判断的结果。

一个弱分类器就是一个基本和上图类似的决策树,最基本的弱分类器只包含一个Haar-like特征,也就是它的决策树只有一层,被称为树桩(stump)。

最重要的就是如何决定每个结点判断的输出,要比较输入图片的特征值和弱分类器中特征,一定需要一个阈值,当输入图片的特征值大于该阈值时才判定其为人脸。训练最优弱分类器的过程实际上就是在寻找合适的分类器阈值,使该分类器对所有样本的判读误差最低。

具体操作过程如下:

1)对于每个特征 f,计算所有训练样本的特征值,并将其排序。

扫描一遍排好序的特征值,对排好序的表中的每个元素,计算下面四个值:

全部人脸样本的权重的和t1;

全部非人脸样本的权重的和t0;

在此元素之前的人脸样本的权重的和s1;

在此元素之前的非人脸样本的权重的和s0;

2)最终求得每个元素的分类误差

在表中寻找r值最小的元素,则该元素作为最优阈值。有了该阈值,我们的第一个最优弱分类器就诞生了。


强分类器的诞生需要T轮的迭代,具体操作如下:

1. 给定训练样本集S,共N个样本,其中X和Y分别对应于正样本和负样本; T为训练的最大循环次数;  

2. 初始化样本权重为1/N ,即为训练样本的初始概率分布;  

3. 第一次迭代训练N个样本,得到第一个最优弱分类器,步骤见2.2.2节

4. 提高上一轮中被误判的样本的权重;

5. 将新的样本和上次本分错的样本放在一起进行新一轮的训练。

6. 循环执行4-5步骤,T轮后得到T个最优弱分类器。

7.组合T个最优弱分类器得到强分类器,组合方式如下:

 

 

相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果。

2.2弱分类器的强强联手

至今为止我们好像一直在讲分类器的训练,实际上Haar分类器是有两个体系的,训练的体系,和检测的体系。训练的部分大致都提到了,还剩下最后一部分就是对筛选式级联分类器的训练。我们看到了通过AdaBoost算法辛苦的训练出了强分类器,然而在现实的人脸检测中,只靠一个强分类器还是难以保证检测的正确率,这个时候,需要一个豪华的阵容,训练出多个强分类器将它们强强联手,最终形成正确率很高的级联分类器这就是我们最终的目标Haar分类器。

那么训练级联分类器的目的就是为了检测的时候,更加准确,这涉及到Haar分类器的另一个体系,检测体系,检测体系是以现实中的一幅大图片作为输入,然后对图片中进行多区域,多尺度的检测,所谓多区域,是要对图片划分多块,对每个块进行检测,由于训练的时候用的照片一般都是20*20左右的小图片,所以对于大的人脸,还需要进行多尺度的检测,多尺度检测机制一般有两种策略,一种是不改变搜索窗口的大小,而不断缩放图片,这种方法显然需要对每个缩放后的图片进行区域特征值的运算,效率不高,而另一种方法,是不断初始化搜索窗口size为训练时的图片大小,不断扩大搜索窗口,进行搜索,解决了第一种方法的弱势。在区域放大的过程中会出现同一个人脸被多次检测,这需要进行区域的合并,这里不作探讨。

无论哪一种搜索方法,都会为输入图片输出大量的子窗口图像,这些子窗口图像经过筛选式级联分类器会不断地被每一个节点筛选,抛弃或通过。

它的结构如图所示。

3.Cascade classifier 级联分类器


设K是一个级联检测器的层数,D是该级联分类器的检测率,F是该级联分类器的误识率,di是第i层强分类器的检测率,fi是第i层强分类器的误识率。如果要训练一个级联分类器达到给定的F值和D值,只需要训练出每层的d值和f值,这样:

d^K = D,f^K = F

级联分类器的要点就是如何训练每层强分类器的d值和f值达到指定要求。

AdaBoost训练出来的强分类器一般具有较小的误识率,但检测率并不很高,一般情况下,高检测率会导致高误识率,这是强分类阈值的划分导致的,要提高强分类器的检测率既要降低阈值,要降低强分类器的误识率就要提高阈值,这是个矛盾的事情。据参考论文的实验结果,增加分类器个数可以在提高强分类器检测率的同时降低误识率,所以级联分类器在训练时要考虑如下平衡,一是弱分类器的个数和计算时间的平衡,二是强分类器检测率和误识率之间的平衡。具体训练方法如下,我用伪码的形式给出:

1)设定每层最小要达到的检测率d,最大误识率f,最终级联分类器的误识率Ft;

2)P=人脸训练样本,N=非人脸训练样本,D0=1.0,F0=1.0;

3)i=0;

4)for : Fi>Ft

++i;

ni=0;Fi=Fi-1;

for : Fi>f*Fi-1

++ni;

利用AdaBoost算法在P和N上训练具有ni个弱分类器的强分类器;

衡量当前级联分类器的检测率Di和误识率Fi;

for : di<d*Di-1;

Ø 降低第i层的强分类器阈值;

Ø 衡量当前级联分类器的检测率Di和误识率Fi;

N = Φ;

利用当前的级联分类器检测非人脸图像,将误识的图像放入N;

 

参考文献

Robust Real-Time Face Detection

基于Adaboost的人脸检测方法及眼睛定位算法研究(可以作为中文翻译看看)

转载地址:

http://wenku.baidu.com/view/e7bd88b665ce0508763213c0.html

http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html

抱歉!评论已关闭.