当前位置: 代码迷 >> 综合 >> opencv haar+adaboost使用心得
  详细解决方案

opencv haar+adaboost使用心得

热度:64   发布时间:2024-01-11 16:34:37.0

最近在使用opencv里的haar+adaboost做检测,其实早在一年前的无锡已经看过用它做车徽检测,然后再做识别(大众,奔驰...)。这次终于要自己动手做了,网上有很多这方面的资料,感谢大家分享他们的经验。重复的东西这里就不再赘述了,只简单的补充几个大家容易疏忽的东西。

step1.首先是准备正负样本,正样本好说,打了标签,解析xml文件,然后做点小旋转就可以用了

       负样本就复杂了,第一点要求是不能包含正样本,在我的应用场景中还需要尽可能多的提供场景的背景图,而不是网上所说的从网络上找一些不相干的图像,这些图像加进来促进作用也不大,因为我的场景中根本不会出现它们,但也不会出现负作用。第二是负样本数目尽可能的多,但这个还是量力而行吧,毕竟纯体力活,没多大的乐趣在里面。补充一句,样本的目录结构很简单,只要包含pos和neg两个子文件夹和opencv_haartraining.exe,

opencv_createsamples.exe,convert_cascade.exe等几个可执行程序,比如face-->face\train  face\test

step2.生成正负样本描述文件,描述文件保存在face目录下与train test平级,命令如下:

打开cmd  分别cd 到正负样本目录

                        cd negdir  
                         dir /b > negative.data
                         cd posdir
                         dir /b > positive.data

生成的描述文件当然还要替换才能够最终使用 对于positive.data只要在最后把jpg ->jpg 1 0 0 20 20,这里注意最好是在word下面替换好,再拷到txt下,速度快些,1 0 0 20 20的意思是这幅图片包含一个正样本目标,矩形区域为 0 0 20 20这里由于我们的正样本只有一个目标,而且已经大小归一化为20x20的图像,所以这里参数这么定义,而且opencv的坐标是从0开始的,我开始想过是不是要写成 0 0 19 19,本来看过网上一篇文章错写成1 1 20 20也没出错。正负样本的.data文件都要做的一件事是:打开.data文件,替换掉不是图片的行,比如positive.data negative.data.对于正样本,由于大小一致,为了避免过多的IO操作,可以生成vec文件,cd 到face目录 直接cd ..即可 然后输入命令:

opencv_createsamples.exe -info "pos/positive.data" -vec pos.vec -num 7097 -w 20 -h 20

其中-num指定你的正样本数目 -w 图像宽度,-h图像高度    生成描述文件

step3:经过上一步,准备工作已经做好,可以开始运行训练了,输入命令:

opencv_haartraining.exe -data haarcascade7097 -vec pos7097.vec -bg neg/negative.data -nstages 20 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 7097 -nneg 7097 -w 20 -h 20  -mem 1024 -mode ALL

解释下各个参数的含义  -data 指定生成的文件目录, -vec vec文件名, -bg 负样本描述文件路径, -nstage 20 指定训练层数,推荐15~20,层数越高,耗时越长。-nsplits 分裂子节点数目,选取默认值 2 -minhitrate 最小命中率,即训练目标准确度。-maxfalsealarm最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练,-npos 正样本数目,-nneg  负样本数目 这个值可以设置大于真正的负样本图像数目,程序可以自动从负样本图像中切割出和正样本大小一致的 -nneg张图 这个参数一半设置为正样本数目的1~3倍, -w -h意思很明确, -mem 程序可使用的内存,这个设置为256即可,实际运行时根本就不怎么耗内存。 -mode ALL指定haar特征的类型数目

step3:然后就是等待了 ,我用上面的代码,负样本数目为2830,训练了一周,当然如果实在等不住了,中间结果也可以生成xml文件,命令如下:

/*转换为xml*/
convert_cascade.exe --size="20x20" ..\cascade ..\cascade.xml

ps:还有一个小建议:大家最好自己编译opencv,这样就可以vs--->project-->properties-->c++-->language-->OpenMp support 开启openmp选项,编译出来的exe就是多核并行的,提升速度很重要,我上面说的一周就是openmp加速在8核,3.2Ghz的服务器上跑的。

用别人的总有一天要还,想要最快,不会出错,最好自己写 haar+ adaboost ,这样选取负样本(最耗时的部分)的程序也可以并行加速了。waiting for me

最后添加几幅运行时图片:

这个是我跑到19层的结果,其中BACKGROUNG PROCESSING TIME 是负样本切割时间 很长很长

N 为训练层数 %SMP 样本占总样本个数 ST.THR 阈值,HR 击中率, FA  虚警 EXP.ERR 经验错误率

这个是指定的haarcasade7079 文件中生成的每一层文件的文件夹

文件和文件中的内容,然后使用

convert_cascade.exe --size="20x20" ..\cascade ..\cascade.xml就可以生成xml文件

祝大家玩的开心 有问题可以发信到gjtjx@163.com,只回复本文所包含的问题,

其他问题可以参看Opencv自带的doc 中haar训练的问题FAQ,还是参看英文原版的东西

节约时间.