本文采用上下限阈值的方法来选取弱分类器,与以往只选取一个阈值的方法不同,我们尝试用这种方法来提高检测率与降低虚警率。
5.2 AdaBoost算法训练强分类器
AdaBoost算法通过重新赋予样本权重来增强学习过程。样本的权重代表了该样本被误分类的可能性。在重新赋予权重的过程中,被误分类的样本的权重将会变得比原先更大;如果样本被错误分类很多次,它的权重将会变得越来越大;我们就可以认为这一样本属于困难样本集。
5.2.1 算法描述
AdaBoost训练强分类器的算法描述如下[15],(算法流程图见下节):
? 给定一系列训练样本(x1,y1),(x2,y2),?,(xn,yn),其中yi?0表示其为负样本(非人脸),yi?1表示其为正样本(人脸)。n为所有的训练样本数量。
? 初始化权重w1,i?D(i),在这里提供一种初始化权重D(i)的方法:
11(对负样本)或D(i)?(对正样本)。其中m,l分别是负样本和正样2m2l本的数量,m?l?n。 D(i)?? Fort?1,?,T(T为弱分类器的最大编号)
1、归一化权重:
qt,i?wt,i?wj?1n (5.2)
t,j这样可以使得qt,i呈现概率分布。
2、对每个特征fj,训练一个只关联于单个特征的弱分类器hj。计算对应所有特征的弱分类器的加权(qt,i)错误率?f:
?f??qihj(xi)?yi (5.3)
i
3、选取最佳的弱分类器hj(x)(拥有最小错误率?t):
?t?min?qihj(xi)?yi??qiht(xi)?yi (5.4)
ii
由此可得最佳弱分类器为ht(x)。
4、按照这个最佳弱分类器,调整权重:
wt?1,i?wt,i?t1?ei (5.5)
其中ei?0表示xi被正确地分类,ei?1表示xi被错误地分类;?t?? 最后的强分类器为:
?t 1??t1T1??tht(x)???tC(x)?2t?1 (5.6) t?10otherwise
其中?t?log1T?t。
5.2.2 算法流程图
开始给定一系列训练样本(x1,y1),(x2,y2)??(xn,yn)归一化权重初始化权重计算每个特征fj的弱分类器hj的加权错误率FOR t=1,2,?,T选择最小错误率的弱分类器htNEXT t调整权重获得强分类器结束
图5.3 算法流程图
5.3 级联强分类器结构
人脸检测问题是一个非对称的分类问题,背景中非人脸样本占大多数,且大部分可以用很简单的判别规则去掉,为此,可以采用如上图3.3所示的分类器级联结构。该结构将一系列单级强分类器级联起来,任何一个被判断为负面样本的窗口都会被马上舍弃,只有被所有分类器判断为正面样本的窗口,才会被当作目标保留。每个单级分类器在训练时有较高的检测率和中等的虚警率,将这些分类器级联起来后就可以达到极低的虚警率和较高的检测率。假设第k级分类器的检测率为hk,虚警率为fk,级联的级数为K,那么整个级联结构的分类器[16]的检测率和虚警率分别为
KH??hkk?1KF??fkk?1 (5.7)
例如,如果每级的检测率为0.995,虚警率为0.5,级联结构的级数为20,那么整个级联分类器的检测率约为0.99,虚警率约为10?6。
采用级联结构,有两个明显的好处:首先是大大增加了样本分类的平均速度,由于在目标检测时大部分样本是较为简单的背景图片,可以通过十分简单的分类器在级联结构的前几级去掉,所以大大提高了估值的速度;其次是在每次训练新的单级分类器时,需要利用已经训练得到的分类器在背景图片上检测出的虚警图片来作为下一级的负面样本,这样使用的负面样本越来越多,并且它们之间具有相对的独立性,使得使用的负面样本空间也越来越大,从而提高了分类器的精度。级联结构的训练过程包括如下步骤:
? 输入:正面样本,背景样本图片,分类器级数K
? 循环:如果k?1,用所有正面样本作为正面样本,在背景图片上抽取指定数目的负面样本;如果k?1,利用已经得到的k?1级级联分类器通过―自举‖的方法得到训练用的正面样本和负面样本。利用该级的训练样本,训练满足指定检测率hk和虚警率fk的分类器。
? 输出:K级级联分类器。
级联分类器结构对于每级的分类器结构没有限制,可以采用SVM分类器,也可以采用AdaBoost分类器,只要每级分类器训练时满足预先指定的检测率与虚警率即可。在满足一定检测率前提下,AdaBoost算法可以通过增加弱分类器的方式,逐步降低虚警率,所以目前的实际系统一般采用AdaBoost算法来训练单级分类器。AdaBoost算法用来训练具有预定检测率和虚警率的单级分类器的步骤如下:
(1)输入:训练样本,指定检测率h和虚警率f,弱分类器学习算法。