AdaBoost算法在人脸的应用例子Word文档格式.docx
《AdaBoost算法在人脸的应用例子Word文档格式.docx》由会员分享,可在线阅读,更多相关《AdaBoost算法在人脸的应用例子Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。
Adaboost算法是Freund和Schapire根据在线分配算法提出的,他们详细分析了Adaboost算法错误率的上界,以及为了使强分类器达到错误率,算法所需要的最多迭代次数等相关问题。
与Boosting算法不同的是,adaboost算法不需要预先知道弱学习算法学习正确率的下限即弱分类器的误差,并且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,这样可以深入挖掘弱分类器算法的能力。
Adaboost算法中不同的训练集是通过调整每个样本对应的权重来实现的。
开始时,每个样本对应的权重是相同的,即其中n为样本个数,在此样本分布下训练出一弱分类器。
对于分类错误的样本,加大其对应的权重;
而对于分类正确的样本,降低其权重,这样分错的样本就被突出出来,从而得到一个新的样本分布。
在新的样本分布下,再次对弱分类器进行训练,得到弱分类器。
依次类推,经过T次循环,得到T个弱分类器,把这T个弱分类器按一定的权重叠加(boost)起来,得到最终想要的强分类器。
Adaboost算法的具体步骤如下:
1.给定训练样本集,其中分别对应于正例样本和负例样本;
为训练的最大循环次数;
2.初始化样本权重,即为训练样本的初始概率分布;
3.第一次迭代:
(1)训练样本的概率分布下,训练弱分类器:
(2)计算弱分类器的错误率:
(3)选取,使得最小
(4)更新样本权重:
(5)最终得到的强分类器:
Adaboost算法是经过调整的Boosting算法,其能够对弱学习得到的弱分类器的错误进行适应性调整。
上述算法中迭代了次的主循环,每一次循环根据当前的权重分布对样本x定一个分布P,然后对这个分布下的样本使用若学习算法得到一个错误率为的弱分类器,对于这个算法定义的弱学习算法,对所有的,都有,而这个错误率的上限并不需要事先知道,实际上。
每一次迭代,都要对权重进行更新。
更新的规则是:
减小弱分类器分类效果较好的数据的概率,增大弱分类器分类效果较差的数据的概率。
最终的分类器是个弱分类器的加权平均。
最开始的时候,每个样本对应的权重是相同的,在此样本分布下训练出一个基本分类器h1(x)。
对于h1(x)错分的样本,则增加其对应样本的权重;
而对于正确分类的样本,则降低其权重。
这样可以使得错分的样本突出出来,并得到一个新的样本分布。
同时,根据错分的情况赋予h1(x)一个权重,表示该基本分类器的重要程度,错分得越少权重越大。
在新的样本分布下,再次对基本分类器进行训练,得到基本分类器h2(x)及其权重。
依次类推,经过T次这样的循环,就得到了T个基本分类器,以及T个对应的权重。
最后把这T个基本分类器按一定权重累加起来,就得到了最终所期望的强分类器。
AdaBoost算法的具体描述如下:
假定X表示样本空间,Y表示样本类别标识集合,假设是二值分类问题,这里限定Y={-1,+1}。
令S={(Xi,yi)|i=1,2,…,m}为样本训练集,其中Xi∈X,yi∈Y。
①
始化m个样本的权值,假设样本分布Dt为均匀分布:
Dt(i)=1/m,Dt(i)表示在第t轮迭代中赋给样本(xi,yi)的权值。
②
令T表示迭代的次数。
③
Fort=1toTdo
根据样本分布Dt,通过对训练集S进行抽样(有回放)产生训练集St。
在训练集St上训练分类器ht。
用分类器ht对原训练集S中的所有样本分类。
得到本轮的分类器ht:
X→Y,并且有误差εt=Pri-Di[ht(xi)≠yi]。
令αt=(1/2)ln[(1-εt)/εt]。
更新每个样本的权值
,其中,Zt是一个正规因子,用来确保ΣiDt+1(i)=1。
endfor
④
最终的预测输出为:
AdaBoost人脸检测原理
对人脸检测的研究最初可以追溯到20世纪70年代,早期的研究主要致力于模板匹配、子空间方法,变形模板匹配等。
近期人脸检测的研究主要集中在基于数据驱动的学习方法,如统计模型方法,神经网络学习方法,统计知识理论和支持向量机方法,基于马尔可夫随机域的方法,以及基于肤色的人脸检测。
目前在实际中应用的人脸检测方法多为基于Adaboost学习算法的方法。
Viola人脸检测方法是一种基于积分图、级联检测器和AdaBoost算法的方法,方法框架可以分为以下三大部分:
第一部分,使用Harr-like特征表示人脸,使用“积分图”实现特征数值的快速计算;
第二部分,使用Adaboost算法挑选出一些最能代表人脸的矩形特征(弱分类器),按照加权投票的方式将弱分类器构造为一个强分类器;
第三部分,将训练得到的若干强分类器串联组成一个级联结构的层叠分类器,级联结构能有效地提高分类器的检测速度。
Adaboost算法是一种用来分类的方法,它的基本原理就是“三个臭皮匠,顶个诸葛亮”。
它把一些比较弱的分类方法合在一起,组合出新的很强的分类方法。
例如下图中
需要用一些线段把红色的球与深蓝色的球分开,然而如果仅仅画一条线的话,是分不开的。
a
b
c
d
使用Adaboost算法来进行划分的话,先画出一条错误率最小的线段如图1,但是左下脚的深蓝色球被错误划分到红色区域,因此加重被错误球的权重,再下一次划分时,将更加考虑那些权重大的球,如c所示,最终得到了一个准确的划分,如下图所示。
人脸检测的目的就是从图片中找出所有包含人脸的子窗口,将人脸的子窗口与非人脸的子窗口分开。
大致步骤如下:
(1)在一个20*20的图片提取一些简单的特征(称为Harr特征),如下图所示。
它的计算方法就是将白色区域内的像素和减去黑色区域,因此在人脸与非人脸图片的相同位置上,值的大小是不一样的,这些特征可以用来区分人脸和分人脸。
(2)目前的方法是使用数千张切割好的人脸图片,和上万张背景图片作为训练样本。
训练图片一般归一化到20*20的大小。
在这样大小的图片中,可供使用的haar特征数在1万个左右,然后通过机器学习算法—adaboost算法挑选数千个有效的haar特征来组成人脸检测器。
(3)学习算法训练出一个人脸检测器后,便可以在各个场合使用了。
使用时,将图像按比例依次缩放,然后在缩放后的图片的20*20的子窗口依次判别是人脸还是非人脸。
人脸检测的流程
人脸检测在实际中主要用于人脸识别的预处理,即在图像中准确标定出人脸的位置和大小。
目前人脸检测技术在门禁系统、智能监控系统中已得到了很好的应用。
另外,目前的笔记本电脑中也陆续开始使用人脸识别技术作为计算机登录的凭证。
近年来,在数码相机和手机中也集成了人脸检测算法,作为一个新的功能提供用户使用。
在这些应用中,人脸检测都是发挥着至关重要的作用
关于人脸检测中的Haar特征提取
在人脸识别中的应用
基于Haar特征的分类器,每个Haar特征对应看一个弱分类器,如何从大量Haar特征中挑选最优的Haar特征并制作成分类器,是AdaBoost算法训练过程要解决的问题。
PaulViola和MichaelJones于2001年将Adaboost算法应用于人脸检测中,其基本思想是针对不同的训练集训练同一个分类器(弱分类器),然后把这些不同训练集上的得到的分类器联合起来,构成一个最终的强分类器。
Adaboost算法中不同的训练集是通过调整每个样本对应的权重来实现的。
开始时,每个样本对应的权重是相同的,对于h1分类错误的样本,加大其对应的权重;
而对于分类正确的样本,降低其权重,这样分错的样本就被突出出来,从而得到一个新的样本分布U2。
在新的样本分布下,再次对弱分类器进行训练,得到弱分类器h2。
训练系统总体框架,由“训练部分”和“补充部分”构成,根据系统框架,训练系统可以分为以下几个模块:
(1)以样本集为输入,在给定的矩形特征原型下,计算并获得矩形特征集;
(2)以特征集为输入,根据给定的弱学习算法,确定闽值,将特征与弱分类器一一对应,获得弱分类器集;
(3)以弱分类器集为输入,在训练检出率和误判率限制下,使用AdaBoost算法
挑选最优的弱分类器构成强分类器;
(4)以强分类器集为输入,将其组合为级联分类器;
(5)以非人脸图片集为输入,组合强分类器为临时的级联分类器,筛选并补充
非人脸样本。
训练样本的选择:
训练样本要求是面部特写图像,图1是一簇训练样本,大小被归一化为24×
24像素,其中正训练样本要求是面部特写图像,但是人脸形态千差万别,所以训练样本选取过程中要考虑到样本的多样性。
负训练样本,大小被归一化为24×
24像素,其中各样本不完全相同,分别具有一定的代表性。
训练过程分为3个步骤:
首先需要提取Haar特征;
然后将Haar特征转化成对应的弱分类器;
最后从大量的弱分类器中迭代选择出最优弱分类器。
(1)提取Haar特征
常用的几个Haar特征:
常用的Haar特征有4种,如图2所示。
当然也可以在这4种特征的基础上设计出更多、更复杂的特征。
以大小为24X24像素的训练样本为例,上述4种特征的总个数超过了160000个。
这样庞大的数字给后续的迭代训练工作带来了庞大的计算量,直接导致AdaBoost算法训练过程极为费时,这恰恰是算法需要改进的关键问题之一o
(2)生成弱分类器
每一个Haar特征都对应着一个弱分类器,每一个弱分类器都是根据它所对应的Haar特征的参数来定义的。
利用上述Haar特征的位置信息,对训练样本进行统计就可以得到对应的特征参数。
AdaBoost算法中所训练的弱分类器是任何分类器,包括决策树,神经网络,隐马尔科夫模型,如果弱分类器是线性神经网络,那么AdaBoost算法每次将构造多层感知器的一个节点。
(3)采用AdaBoost算法选取优化的弱分类器
AdaBoost算法训练过程就是挑选最优弱分类器,并赋予权重过程,图3是AdaBoost算法训练示意图。
Haar特征提取的相关在haar文档中
关于AdaBoostopencv的一些说明在网址:
DiscreteAdaBoost是指,弱分类器的输出值限定在{-1,+1},和与之相应的权值调整,强分类器生成的AdaBoost算法;
RealAdaBoost是指,弱分类器输出一个可能度,该值的范围是整个R,和与之相应的权值调整,强分类器生成的AdaBoost算法。
事实上,Discrete到Real的转变体现了古典集合到模糊集合转变的思想
adaboost在opencv下的分类器对应结构
CvHaarFeature,对应的是Haar特征
CvHaarClassifier,是基于前面特征组成的弱分类器
CvHaarStageClassifier,对应由弱分类器组成的强分类器
CvHaarClassifierCascade,最终的层叠分类器,
BoostedHaar分类器结构
#defineCV_HAAR_FEATURE_MAX3
/*一个harr特征由2-3个具有相应权重的矩形组成*/
/*ahaarfeatureconsistsof2-3rectangleswithappropriateweights*/
typedefstructCvHaarFeature
{
inttilted;
/*0meansup-rightfeature,1means45--rotatedfeature*/
/*2-3rectangleswithweightsofoppositesignsand
withabsolutevaluesinverselyproportionaltotheareasoftherectangles.ifrect[2].weight!
=0,thenthefeatureconsistsof3rectangles,otherwiseitconsistsof2*/
struct
{
CvRectr;
floatweight;
}rect[CV_HAAR_FEATURE_MAX];
}CvHaarFeature;
/*asingletreeclassifier(stumpinthesimplestcase)thatreturnstheresponseforthefeatureattheparticularimagelocation(i.e.pixelsumoversubrectanglesofthewindow)andgivesoutavaluedependingontheresponce*/
typedefstructCvHaarClassifier
intcount;
/*numberofnodesinthedecisiontree*/
/*theseare"
parallel"
arrays.Everyindexicorrespondstoanodeofthedecisiontree(roothas0-thindex).
left[i]-indexoftheleftchild(ornegatedindexiftheleftchildisaleaf)
right[i]-indexoftherightchild(ornegatedindexiftherightchildisaleaf)
threshold[i]-branchthreshold.iffeatureresponceis<
=threshold,leftbranchischosen,otherwiserightbranchischosed.
alpha[i]-outputvaluecorrepondingtotheleaf.
*/
CvHaarFeature*haar_feature;
float*threshold;
int*left;
int*right;
float*alpha;
}CvHaarClassifier;
/*aboostedbatteryofclassifiers(=stageclassifier):
thestageclassifierreturns1
ifthesumoftheclassifiers'
responces
isgreaterthanthresholdand0otherwise*/
typedefstructCvHaarStageClassifier
/*numberofclassifiersinthebattery*/
floatthreshold;
/*thresholdfortheboostedclassifier*/
CvHaarClassifier*classifier;
/*arrayofclassifiers*/
/*thesefieldsareusedfororganizingtreesofstageclassifiers,
ratherthanjuststrightcascades*/
intnext;
intchild;
intparent;
}CvHaarStageClassifier;
typedefstructCvHidHaarClassifierCascadevHidHaarClassifierCascade;
/*cascadeortreeofstageclassifiers*/
typedefstructCvHaarClassifierCascade
intflags;
/*signature*/
/*numberofstages*/
CvSizeorig_window_size;
/*originalobjectsize(thecascadeistrainedfor)*/
/*thesetwoparametersaresetby
cvSetImagesForHaarClassifierCascade
CvSizereal_window_size;
/*currentobjectsize*/
doublescale;
/*currentscale*/
CvHaarStageClassifier*stage_classifier;
/*arrayofstageclassifiers*/
CvHidHaarClassifierCascade*hid_cascade;
/*hiddenoptimizedrepresentationofthecascade,createdby
cvSetImagesForHaarClassifierCascade*/
}CvHaarClassifierCascade;
其中CvHaarFeature对应的就是haar特征,
CvHaarClassifier是基于前面特征组成的弱分类器,
CvHaarStageClassifier对应由弱分类器组成的强分类器,
CvHaarStageClassifier对应最终的层叠分类器,理解这一点可以深刻的理解opencv下的adaboost人脸识别原理