opencv+adaboost的使用

一、样本的准备,需要创建这几个文件夹,其中neg是负样本,pos是正样本,src是源图像(可没有),xml用来存储模型

      以行人训练为例,首先正样本是各种各样的行人的照片,负样本就是非人照片。样本个数最好在上千个,个数太少训练出来的分类器不能准确的检测行人,网上对正负样本的个数比例不尽相同,有的说3:1有的说7:3,具体的还是要自己去实验,我用的正样本有2000个负样本1200个。把正负样本分别放在不同的文件夹下,可以命名为pos、neg。同时也要把opencv自带的训练函数和正负样本一起放到一个文件夹下,例如放盘的boost文件夹下。如图这样就准备好了正负样本了。

ps:对正负样本的几点说明:

      正负样本都要转化成灰度图(两类样本都要是灰度图!!!!),而且对于正样本用haar特征训练是规格化成20*20或其他大小,最好不要太大,过多的haar特征会影响分类器的训练时间;对于LBP特征正样本要规格化为24*24大小,而对于HOG要规格化成64*64. 负样本对尺寸没有统一要求,在训练对应的分类器时,选择的负样本尺寸一定要大于等于正样本规定的尺寸。

 

a,正样本就是人的图片就行了,尽量包含少的背景。

b,负样本有两点要求:1)不能包含正样本且尽可能多的提供场景的背景图;2)负样本尽可能的多,而且要多样化,和正样本有一定的差距但是差别也不要太大,否则容易在第一级就全部被分类器reject,训练时不能显示负样本的个数,从而导致卡死。

 二。对样本的处理

进入识别所在的目录

利用目录下的bat文件生成num.txt

输入dir /b >pos.txt 可以在pos文件夹下生成正样本描述文件,文件是txt文件,包含的内容是正样本中图片的对应序号和格式。把其中的格式jpg改成jpg 1 0 0 20 20。如下所示:

 

 把最后一行的pos.txt删除就可以了。对于负样本,以上生成方式一样,不需要对txt文件的图片格式进行修改,只需要删除最后一行的neg.txt即可。这样正负样本就处理好了。。
 

三、生成样本描述文件

    对正负样本进行以上预处理之后,就可以创建正样本vec文件了。

   命令行进入opencv_createsamples.exe文件夹下,依次输入:opencv_createsamples.exe -info pos\pos.txt -vec pos.vec -bg neg\neg.txt -num 2000 -w 20 -h 20 回车之后文件夹下就会出现pos.vec文件。如下:

下面是错误的!错误的!错误的,

这是因为使用bat文件生成目录后,没有对txt文件格式化:jpg -> jpg 1 0 0 20 20

增加以下

 

出现以下错误

需要将生成的描述文件都放在可执行程序目录下

以下这种情况也是不正常的!!执行很长时间也没有结果!!!主要原因就是没有修改jpg->jpg 1 0 0 20 20将目标与背景的路径文件都放在exe目录下后,再使用createsamples可执行程序再次执行如下:opencv_createsamples.exe -info num_pos.txt -vec pos.vec -bg num_neg.txt -num 1459 -w 20 -h 20

正确的如下:

以上参数的含义如下:
-vec <vec_file_name>:训练好的正样本的输出文件名。
-img<image_file_name>:源目标图片(例如:一个公司图标)
-bg<background_file_name>:背景描述文件。
-num<number_of_samples>:要产生的正样本的数量,和正样本图片数目相同。
-bgcolor<background_color>:背景色(假定当前图片为灰度图)。背景色制定了透明色。对于压缩图片,颜色方差量由bgthresh参数来指定。则在bgcolor-bgthresh 和bgcolor+bgthresh 中间的像素被认为是透明的。
-bgthresh<background_color_threshold>

-inv:如果指定,颜色会反色
-randinv:如果指定,颜色会任意反色
-maxidev<max_intensity_deviation>:背景色最大的偏离度。
-maxangel<max_x_rotation_angle>,
-maxangle<max_y_rotation_angle>,
-maxzangle<max_x_rotation_angle>:最大旋转角度,以弧度为单位。
-show:如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程
继续。这是个有用的debug 选项。
-w<sample_width>:输出样本的宽度(以像素为单位)
-h<sample_height>:输出样本的高度(以像素为单位)

只需要对正样本进行以上操作,负样本不需要生成vec文件。。。

 

四、训练分类器

    在以上准备工作都做好的情况下,就可以进行训练分类器了。

    在cmd命令行下输入:opencv_traincascade.exe -data xml -vec pos.vec -bg neg\neg.txt -numPos 1800 -numNeg 1200 -numStages 20 -featureType LBP -w 24 -h 24。按enter就可以进入训练阶段了。如下:

(注意:-numPos -numNeg -numStages,这几个大写字母,如果不大写,则程序读取不到参数,仍按照默认执行,则会提示错误)

(gh)

我这里的传入的参数没有写成大写,所以仍然按照默认的参数,而实际情况下是我没有那么多的样本,所以出错。而满足这个样本条件的公式如下:

很多人会卡在这里,我也被卡了一个下午,很多人以为这里的-numPos 就是你所谓的正样本的总数,那你就大错特错了。这里有个公式,我们需要通过这个来求解这个-numPos,过程如下:

  1. vec-file number >= (numPos + (numStages-1) * (1 – minHitRate) * numPos) + S

vec-file number  就是我们的正样本总数5085,numstages=20,minHitRate=0.98,S 表示负样本总数也就是等于2177,这样我们可以就差numPos<=2628.9,所以我们这里的numPos应该去2628,这样正确地输入格式应该是这样的:

 

下面这张图是错误的,错误的,错误的!!!!!!

pencv_traincascade.exe的命令行参数解释如下:

通用参数:

-data <cascade_dir_name>:目录用于保存训练产生的分类器xml文件和中间文件(对于上面的LBP_classifier),如不存在训练程序会创建它;

-vec <vec_file_name>:由 opencv_createsamples 程序生成的包含正样本的vec文件名(对应上面的pos_24_24.vec);

-bg <background_file_name>:背景描述文件,也就是包含负样本文件名的那个描述文件(对应上面的neg\neg.txt);

-numPos <number_of_positive_samples>:每级分类器训练时所用的正样本数目(默认值为2000);
-numNeg <number_of_negative_samples>:每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目(默认值为1000);

-numStages <number_of_stages>:训练的分类器的级数(默认值为20级);

-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征值(feature values),单位为MB(默认值为256);
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB(默认值为256);

内存越大,训练时间越短。
-baseFormatSave:这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储(默认不指定该参数项,此时其值为false;一旦指定则其值默认为true);

级联参数:CvCascadeParams类,定义于cascadeclassifier.h
-stageType <BOOST(default)>:级别(stage)参数。目前只支持将BOOST分类器作为级联的类型;
-featureType<{HAAR(default), LBP}>:特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征(默认Harr);
-w <sampleWidth>:训练样本的宽(单位为像素,默认24);
-h <sampleHeight>:训练样本的高(单位为像素,默认24);
训练样本的尺寸必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。

Boosted分类器参数:CvCascadeBoostParams类,定义于boost.h
-bt <{DAB, RAB, LB, GAB(default)}>:Boosted分类器的类型(DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost为默认);
-minHitRate <min_hit_rate>:分类器的每一级希望得到的最小检测率(默认值为0.995),总的检测率大约为 min_hit_rate^number_of_stages;
-maxFalseAlarmRate <max_false_alarm_rate>:分类器的每一级希望得到的最大误检率(默认值为0.5),总的误检率大约为 max_false_alarm_rate^number_of_stages;
-weightTrimRate <weight_trim_rate>:Specifies whether trimming should be used and its weight,一个还不错的数值是0.95;
-maxDepth <max_depth_of_weak_tree>:弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps);

-maxWeakCount <max_weak_tree_count>:每一级中的弱分类器的最大数目(默认值为100)。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate;

 

按照上面的语句进行执行时,再次提示错误,需要将neg.txt放到exe的目录下,同时将neg.txt的文件目录更改一下

将neg文件移至boost目录下,并将路径更改一下:,否则在后面进行训练的时候,不能够执行

 

下面这个错误就是在目录下没有xml文件夹,因此创建xml文件夹就可以了

错误的!!!!!!!!!提示out of memory,我这里使用的是32位程序,将程序及opencv_world都换成64位即可

 

以下,则可以执行

 

关于输入参数的选择

负样本

负样本只需要生成路径文件,不需要生成vec文件,具体步骤跟上面类似,要注意的是负样本要尽可能比正样本多,大概十倍的样子吧。

一些参数解释

  • data 训练的分类器的存储目录
  • vec 正样本文件,由open_createsamples.exe生成,正样本文件后缀名为.vec
  • bg 负样本说明文件,主要包含负样本文件所在的目录及负样本文件名
  • numPos 每级分类器训练时所用到的正样本数目,应小于vec文件中正样本的数目,具体数目限制条件为:numPos+(numStages- 1)numPos(1- minHitRate)<=vec文件中正样本的数目。根据我的经验,一般为正样本文件的80%
  • numNeg 每级分类器训练时所用到的负样本数目,可以大于- bg指定的图片数目。根据我的经验,一般为numPos的2-3倍
  • numStages 训练分类器的级数,强分类器的个数。根据我的经验,一般为12-20
  • precalcValBufSize 缓存大小,用于存储预先计算的特征值,单位MB,根据自己内存大小分配
  • precalcIdxBufSize 缓存大小,用于存储预先计算的特征索引,单位MB,根据自己内存大小分配
  • featureType 训练使用的特征类型,目前支持的特征有Haar,LBP和HOG
  • w 训练的正样本的宽度
  • h 训练的正样本的高

进阶参数

  • minHitRate 影响每个强分类器阈值,每一级分类器最小命中率,表示每一级强分类器对正样本的的分类准确率
  • maxFalseAlarm 最大虚警率,影响弱分类器的阈值,表示每个弱分类器将负样本误分为正样本的比例,一般默认值为0.5
  • weightTrimRate 0- 1之间的阈值,影响参与训练的样本,样本权重更新排序后(从小到大),从前面累计权重小于(1- weightTrimRate)的样本将不参与下一次训练,一般默认值为0.95
  • maxDepth 每一个弱分类器决策树的深度,默认是1,是二叉树(stumps),只使用一个特征。
  • maxWeakCount 每级强分类器中弱分类器的最大个数,当FA降不到指定的maxFalseAlarm时可以通过指定最大弱分类器个数停止单个强分类器

命令总结:

opencv_createsamples.exe -info num_pos.txt -vec pos.vec -bg num_neg.txt -num 1457 -w 20 -h 20
opencv_traincascade.exe -data model_xml -vec pos.vec -bg num_neg.txt -numPos 800 -numNeg 1600 -numStages 20 -featureType haar -mode ALL -w 20 -h 20 -maxFalseAlarmRate 0.3
 

参考文献:

1.https://blog.csdn.net/u010402786/article/details/52298833

2.https://blog.csdn.net/jacke121/article/details/76557518?locationNum=6&fps=1

3.https://blog.csdn.net/martinkeith/article/details/104206348

4.https://www.jianshu.com/p/8a87d0c66d9f

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值