您的位置:首页 > 大数据 > 人工智能

利用OpenCV自带的traincascade程序训练分类器

2017-07-10 17:32 405 查看
级联分类器简介

OpenCV中的Adaboost级联分类是树状结构,如下图,其中每一个stage都代表一级强分类器。当检测窗口通过所有的强分类器时才被认为是目标,否则就认为当前窗口不是我们要找的目标。实际上,不仅强分类器是树状结构,强分类器中的每一个弱分类器也是树状结构。



一个完整的弱分类器包含包含:Haar特征+leftValue+rughtValue+弱分类器阈值(threshold)

这些元素共同构成了弱分类器,缺一不可。

下图为深度为2的两种形式的弱分类器。左边形式包含2个Haar特征、1个leftValue、2个rightValue和2个弱分类器阈(t1和t2);右边形式包括2个Haar特征、2个leftValue、1个rightValue和2个弱分类器阈。



左边形式的计算流程:

1.计算第一个Haar特征的特征值haar1,与第一个弱分类器阈值t1对比,当haar1< t1时,进入步骤2;当haar1>t1时,该弱分类器输出rightValue2并结束。

2.计算第二个Haar特征值haar2,与第二个弱分类器阈值t2对比,当 haar2 < t2时输出leftValue;当haar2>t2时输出rightValue1。

分类器训练

利用opencv自带的opencv_traincascade程序训练一个分类器,需要经过以下几个步骤:

(1)收集训练样本

训练样本包括正样本和负样本。正样本,通俗点说,就是图片中只有你需要的目标。而负样本的图片只要其中不含有目标就可以了。但需要说明的是,负样本也并非随便选取的,最好是与检测目标相关的图片。例如,你需要检测的目标是汽车,那么正样本就应该是仅仅含有汽车的图片,而负样本显然不能是一些包含天空、海洋等风景的图片,因为最终训练分类器的目的是检测汽车,而汽车应该出现在马路上。也就是说,分类器最终检测的图片应该是那些包含马路,交通标志,建筑物,广告牌,汽车,摩托车,三轮车,行人,自行车等在内的图片。很明显,这里的负样本应该是包含摩托车、三轮车、自行车、行人、路面、灌木丛、花草、交通标志、广告牌等的图片。

需要注意的是,adaboost方法是机器学习中的一个经典算法,而机器学习算法的前提条件是,测试样本和训练样本独立同分布。所谓的独立同分布,可以简单理解为:训练样本要和最终的应用场合非常接近或者一致。否则,基于机器学习的算法并不能保证算法的有效性。此外,足够的训练样本(至少得几千张正样本、几千张负样本)也是保证训练算法有效性的一个前提条件。

(2)正样本尺寸归一化

将上一步收集到的正样本进行尺寸归一化,尺寸归一化的目的是将所有的图片都缩放到同一大小,比如,缩放到28*28的大小,可以用批量编辑工具,批量将图片改成同一尺寸。

(3)建立正负样本说明文件

利用脚本文件 dir.bat(文件内容:dir /b > possamples.txt)置于正样本图片同一目录下,运行生成正样本图片名描述文件,打开possamples.txt删除非图片名的行;同样的方法建立负样本名描述文件negsamples.txt,注意删除非图片名的行,每一行为一个文件名,负样本图像可以是不同的尺寸,但是图像尺寸应该比训练窗口的尺寸大,因为这些图像将被用于抠取负样本。



(4)生成正样本描述文件

正样本描述文件,其实就是一个文本文件。正样本描述文件中的内容包括:文件名 目标个数 目标在图片中的位置(x,y,width,height),可直接将上一步生成的正样本图片名描述文件中的bmp替换成bmp 1 0 0 28 28即可,如下图所示:



正样本描述文件如下图所示:



……

正样本描述文件中,每一个正样本占一行,每一行以正样本图片开头,后面紧跟着该图片中正样本的数量(通常为1),以及正样本在图片中的位置。

(5)创建正样本.vec文件

由于opencv_raincascade训练的时候需要输入的正样本是vec文件,所以需要使用createsamples程序来将正样本转换为vec文件。

利用OpenCV安装目录下bin文件夹里面的名为opencv_createSamples的可执行程序,该程序可通过命令行启动,这里利用bat脚本文件createsamples.bat,文件内容为:

@echo
opencv_createsamples.exe -info positivesamples/possamples.txt -vec positivesamples/possamples.vec -num 5 -w 28 -h 28
pause


需设置正样本描述文件所在的路径(positivesamples/possamples.txt)以及生成的正样本文件保存路径(positivesamples/possamples.vec)。

其中命令行参数含义为:

-info

描述物体所在图像以及大小位置的描述文件

-vec

训练好的正样本的输出文件名。

-num

要产生的正样本的数量,和正样本图片数目相同。

-w

输出样本的宽度(以像素为单位)

-h《sample_height》

输出样本的高度,以像素为单位。



关于opencv_createsamples.exe程序的详细的命令行参数可以参考:http://blog.csdn.net/u012507022/article/details/53981399

(6)训练级联分类器

下面是 opencv_traincascade 的命令行参数,以用途分组介绍:

1.通用参数:

-data

目录名,如不存在训练程序会创建它,用于存放训练好的分类器。

-vec

包含正样本的vec文件名(由 opencv_createsamples 程序生成)。

-bg

背景描述文件,也就是包含负样本文件名的那个描述文件。

-numPos

每级分类器训练时所用的正样本数目。

-numNeg

每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目。

-numStages

训练的分类器的级数。

-precalcValBufSize

缓存大小,用于存储预先计算的特征值(feature values),单位为MB。

-precalcIdxBufSize

缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB。内存越大,训练时间越短。

-baseFormatSave

这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储。

2.级联参数:

-stageType< BOOST(default) >

级别(stage)参数。目前只支持将BOOST分类器作为级别的类型。

-featureType<{HAAR(default), LBP}>

特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征。

-w

-h

训练样本的尺寸(单位为像素)。必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。

3.Boosted分类器参数:

-bt <{DAB, RAB, LB, GAB(default)}>

Boosted分类器的类型: DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost。

-minHitRate

分类器的每一级希望得到的最小检测率。总的检测率大约为 min_hit_rate^number_of_stages。

-maxFalseAlarmRate

分类器的每一级希望得到的最大误检率。总的误检率大约为 max_false_alarm_rate^number_of_stages.

-weightTrimRate

Specifies whether trimming should be used and its weight. 一个还不错的数值是0.95。

-maxDepth

弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps)。

-maxWeakCount

每一级中的弱分类器的最大数目。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate.

4.类Haar特征参数:

-mode< BASIC (default) | CORE | ALL >

选择训练过程中使用的Haar特征的类型。 BASIC 只使用右上特征, ALL 使用所有右上特征和45度旋转特征。

5.LBP特征参数:

LBP特征无参数。

使用opencv_traincascade.exe文件进行训练,首先在当前目录下新建一个cascades文件夹用于存放生成的.xml文件。

opencv_traincascade程序的.bat批处理文件的格式如下:

@echo
opencv_traincascade.exe  -data classifiers -vec positivesamples/possamples.vec -bg negativesamples/negsamples.txt -numPos 2000 -numNeg 10000 -numStages 20 -precalcValbufSize 200 -precalcdxBufSize 1000 -featureType LBP  -w 28 -h 28 -minHitRate 0.995 -maxFalseAlarmRate 0.5 -weightTrimRate 0.95 -maxDepth 1 -maxWeakCount 100 -mode ALL
Pause


当opencv_traincascade程序训练结束以后,训练好的级联分类器将存储于文件cascade.xml中,这个文件位于 -data 指定的目录(这里为cascades文件夹)中。这个目录中的其他文件是训练的中间结果,当训练程序被中断后,再重新运行训练程序将读入之前的训练结果,而不需从头重新训练。训练结束后,可以删除这些中间文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: