您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > HaarTraining算法剖析-Opencv
OpenCV之HaarTraining算法剖析作者:周明才Email:mingcai.zhou@ia.ac.cn版权所有,未经作者授权,不得用于商业目的。由于作者水平有限,文中还会有不妥甚至错误之处,欢迎大家批评指正,同时希望能与一起交流探讨!QQ:43561762008.10.08第二版1.引言通过前段时间阅读OpenCV的HaarTraining代码,基本掌握了HaarTraining算法。现将其中的算法作一梳理,同时对HaarTraining的使用方法做一简要说明。HaarTraining算法总体上以Friedman,J.H等人的“AdditiveLogisticRegression:aStatisticalViewofBoosting”为出发点,实现了其中2类分类问题的4种Boost算法:DiscreteAdaBoost,RealAdaBoost,LogitBoost和GentleAdaBoost。同时实现了文中第8节AdditiveLogisticTrees和第9节WeightTrimming.Friedman,J.H等人只描述了如何训练一个强分类器,对于训练级联的强分类器(CascadeofClassifiers),OpenCV采用的是PaulViola等人的“RobustReal-TimeFaceDetection”中所述方法。HaarTraining采用的是OpenCV扩展的Haar特征,具体描述可参考RainerLienhart等人的“AnExtendedSetofHaar-likeFeaturesforRapidObjectDetection”。2.总体框架要训练一个Haar分类器,总体上包括3步:1)准备正负样本;2)用CreateSamples程序建正样本集;3)用HaarTraining程序训练,得到昀终的分类器模型(xml文件)。如图2.1所示。图2.1训练Haar分类器总器框架13.样本准备HaarTraining需要使用正样本和负样本进行训练。下面分别进行描述。3.1正样本对于正样本,通常的做法是先把所有正样本裁切好,并对尺寸做规整(即缩放至指定大小),如图3.1所示。图3.1正样本集示意图由于HaarTraining训练时输入的正样本是vec文件,所以需要使用OpenCV自带的CreateSamples程序将准备好的正样本转换为vec文件。转换的步骤如下:1)制作一个正样本描述文件,用于描述正样本文件名(包括绝对路径或相对路径),正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:face_100/face00001.bmp1002020face_100/face00002.bmp1002020face_100/face00003.bmp1002020…可采用Dos命令结合EditPlus软件生成样本描述文件。具体方法是在Dos下的恰当目录敲入dirface_100/bsamples.dat,则会生成一个samples.dat,里面包含所有正样本文件名列表,但没有相对路径名和正样本位置信息。在samples.dat文件各行行首增加“face_100/”的方法是使用EditPlus,先选中所有行,然后按Tab键为每行增加一个制表位,然后将制表位全部替换为“face_100/”即可。通过将“bmp”替换为“bmp1002020”即可在每行添加“1002020”。2)运行CreateSamples程序。如果直接在VC环境下运行,可以在Project\Settings\Debug属性页的Programarguments栏设置运行参数。下面是一个运行参数示例:-infoF:\FaceDetect\samples.dat-vecF:\FaceDetect\samples.vec-num200-w20-h20表示有200个样本,样本宽20,高20,正样本描述文件为samples.dat,结果输出到samples.vec。3)运行完了会生成一个*.vec的文件。该文件包含正样本数目,宽高以及所有样本图2像数据。3.2负样本负样本图像可以是不含有正样本模式的任何图像,比如一些风景照等。训练时,OpenCV需要一个负样本描述文件,该文件只需包含所有负样本的文件名及绝对(或相对)路径名。以下是一个负样本描述文件内容示例:nonface_200/00001.bmpnonface_200/00002.bmpnonface_200/00003.bmp…负样本描述文件的生成方法可参照正样本描述文件生成方法。负样本图像的大小只要不小于正样本就可以,在使用负样本时,OpenCV自动从负样本图像中抠出一块和正样本同样大小的区域作为负样本,具体可查看函数icvGetNextFromBackgroundData()。具体抠图过程为:1)确定抠图区域的左上角坐标(Point.x,Point.y)2)确定一个昀小缩放比例,使得原负样本图像缩放后恰好包含选中负样本区域3)对原负样本图象按计算好的缩放比例进行缩放4)在缩放后的图像上抠出负样本,如图3.2左半部分的虚线框所示。Reader-imgReader-src(Point.x,Point.y)图3.2抠图示意图34.训练准备好正样本集(即samples.vec文件),负样本集及其描述文件后,就可以看是训练了。从下面的代码中可以看出训练时命令行参数列表。printf(Usage:%s\n-datadir_name\n-vecvec_file_name\n-bgbackground_file_name\n[-nposnumber_of_positive_samples=%d]\n[-nnegnumber_of_negative_samples=%d]\n[-nstagesnumber_of_stages=%d]\n[-nsplitsnumber_of_splits=%d]\n[-memmemory_in_MB=%d]\n[-sym(default)][-nonsym]\n[-minhitratemin_hit_rate=%f]\n[-maxfalsealarmmax_false_alarm_rate=%f]\n[-weighttrimmingweight_trimming=%f]\n[-eqw]\n[-modeBASIC(default)|CORE|ALL]\n[-wsample_width=%d]\n[-hsample_height=%d]\n[-btDAB|RAB|LB|GAB(default)]\n[-errmisclass(default)|gini|entropy]\n[-maxtreesplitsmax_number_of_splits_in_tree_cascade=%d]\n[-minposmin_number_of_positive_samples_per_cluster=%d]\n,argv[0],npos,nneg,nstages,nsplits,mem,minhitrate,maxfalsealarm,weightfraction,width,height,maxtreesplits,minpos);如果在VC中进行调试,可采用第3章介绍的方法设置命令行参数,我在调试时设置的参数如下:-dataF:\FaceDetect\trainout-vecF:\FaceDetect\samples.vec-bgF:\FaceDetect\negatives.dat-nstages3-nsplits2-minhitrate0.999-maxfalsealarm0.5-npos100-nneg200-w20-h20-mem512-eqw1-modeALL-btGAB-minpos50为调试方便,正负样本数目用的非常少,正样本100个,负样本200个。通过查看cvhaartraining.h文件的cvCreateCascadeClassifier函数参数说明可进一步了解上述参数的含义:/**cvCreateCascadeClassifier**Createcascadeclassifier*dirname-directorynameinwhichcascadeclassifierwillbecreated.*Itmustexistandcontainsubdirectories0,1,2,...(nstages-1).*vecfilename-nameof.vecfilewithobject'simages4*bgfilename-nameofbackgrounddescriptionfile*npos-numberofpositivesamplesusedintrainingofeachstage*nneg-numberofnegativesamplesusedintrainingofeachstage*nstages-numberofstages*numprecalculated-numberoffeaturesbeingprecalculated.Eachprecalculatedfeature*requires(number_of_samples*(sizeof(float)+sizeof(short)))bytesofmemory*numsplits-numberofbinarysplitsineachweakclassifier*1-stumps,2andmore-trees.*minhitrate-desiredminhitrateofeachstage*maxfalsealarm-desiredmaxfalsealarmofeachstage*weightfraction-weighttrimmingparameter*mode-0-BASIC=Viola*1-CORE=Allupright*2-ALL=Allfeatures*symmetric-ifnot0verticalsymmetryisassumed*equalweights-ifnot0initialweightsofallsampleswillbeequal*winwidth-samplewidth*winheight-sampleheight*boosttype-typeofappliedboostingalgorithm*0-DiscreteAdaBoost*1-RealAdaBoost*2-LogitBoost*3-GentleAdaBoost*stumperror-typeofusederrorifDiscreteAdaBoostalgorithmisapplied*0-misclassificationerror*1-ginierror*2-entropyerror*/4.1训练的总体流程图4.1是HaarTraining训练的一个简单流程。这个流程之所以是简单流程,因为只有当用户是要建一个简单的级联分类器时才是这么一个流程。对于建树形强分类器,其流程比这个要复杂,暂时没有去梳理它的流程。5图4.1HaarTraining训练流程4.2创建Haar特征函数icvCreateIntHaarFeatures(winsize,mode,symmetric)负责创建所有可能的Haar特征。Mode决定使用基本的5种特征还是所有upright特征抑或所有特征。Symmetric为1时表示只创建Haar特征的中心在左半部分的所有特征,为0时创建所有特征。当训练人脸图像时,由于人脸的左右对称性可以设置Symmetric为1,以加速训练。在创建特征时,OpenCV对每种特征进行了文字描述,具体如图4.2所示。6在该函数中,有一段代码感觉有点问题:if((x+dx*2=winsize.height)&&(y+dy=winsize.width)){if(dx*2*dys0)continue;if
本文标题:HaarTraining算法剖析-Opencv
链接地址:https://www.777doc.com/doc-4343560 .html