opencv haar+adaboost使用心得

简介:

最近在使用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,还是参看英文原版的东西

节约时间.





相关文章
|
10月前
|
算法 数据可视化 数据处理
Opencv与python实现多目标跟踪 (一) - PaddleDetection目标检测
Opencv与python实现多目标跟踪 (一) - PaddleDetection目标检测
297 0
|
算法 数据挖掘 Android开发
|
计算机视觉
小白评测opencv-ORB
牙叔教程 简单易学
179 0
|
XML 编译器 C语言
OpenCV编程:OpenCV3.X训练自己的分类器
OpenCV编程:OpenCV3.X训练自己的分类器
153 0
OpenCV编程:OpenCV3.X训练自己的分类器
|
计算机视觉
OpenCV | OpenCV哈里斯 (Harris)角点检测
OpenCV | OpenCV哈里斯 (Harris)角点检测
128 0
OpenCV | OpenCV哈里斯 (Harris)角点检测
|
计算机视觉
OpenCV 实现特征检测
OpenCV 实现特征检测 目标 在这篇文章中你将学习到: 使用 FeatureDetector 接口来查找兴趣点,具体包括: 使用 SurfFeatureDetector 及其函数 detect 来执行检测过程 使用函数 drawKeypoints 来绘制检测到的关键点 代码 完整代码可从这里 下载 #inc
2236 0
|
算法 计算机视觉
OpenCV教程(47) sift特征和surf特征
在前面三篇教程中的几种角检测方法,比如harris角检测,都是旋转无关的,即使我们转动图像,依然能检测出角的位置,但是图像缩放后,harris角检测可能会失效,比如下面的图像,图像放大之前可以检测出为harris角,但是图像放大后,则变成了边,不能检测出角了。
1299 0
|
计算机视觉
OpenCV教程(46) 快速特征检测
在计算harris特征角时候,我们要在两个方向计算梯度,计算代价有点大。在paper The article by E. Rosten and T. Drummond, Machine learning for high-speed corner detection, in In European Conference on Computer Vision, pp. 430-443, 2006. 中,作者提出了一种快速的特征检测方法。
831 0