本博客涉及到的资源:git
正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197算法
负样本:http://download.csdn.net/detail/zhuangxiaobin/7326205app
训练和检测工具:http://download.csdn.net/detail/zhuangxiaobin/7414793工具
分类器xml文件:http://download.csdn.net/detail/zhuangxiaobin/7553415oop
adaboost训练和测试源代码:http://download.csdn.net/detail/zhuangxiaobin/7590517测试
更新总结:http://blog.csdn.net/zhuangxiaobin/article/details/40432705ui
在开始阅读以前,建议先把这几个用到的资料先下载了,有很多网友想要训练的代码,我没有直接提供,因此也没必要私信我提供代码了。若是非要弄懂整个过程的话,有两种途径。一种是经过cmake opencv查看源代码(事实上本工具也是经过这种途径获得的),另外一种就是下载adaboost训练和测试的源代码而后本身能够选择本身想要的特征,这对于想作特征融合的网友是比较有帮助的,算法的介绍能够经过点击AdaBoost算法详解查看。spa
本文章的目的是让全部在数字图像处理零经验的同窗能够快速实现运动目标跟踪。.net
opencv自带了一我的脸识别用到的分类器,咱们直接使用就好了。可是不少人想到要跟踪其余东西,例如说,手,杯子,篮球,汽车,那怎么办?其实很简单,只要按照一下步骤一步一步作,很容易就能够作到了。运动目标识别,用上这个工具,貌似都不是什么难事。(好像在卖广告了。。)回到正题,本文用的是haar+adaboost的方法。code
目标检测分为三个步骤:
一、 样本的建立
二、 训练分类器
三、 利用训练好的分类器进行目标检测。
一.样本的建立:
训练样本分为正例样本和反例样本。正例样本是指待检目标样本(例如可乐瓶,汽车,人脸等),反例样本指其它任意图片,全部的样本图片都被归一化为一样的尺寸大小(例如,20x20)。反例样本能够来自于任意的图片,但这些图片不能包含目标特征。
正样本:
1.先准备正样本图片。
进入路径tools\temp\positive\rawdata(个人路径是F:\tools\temp\positive\rawdata,你按照你本身的路径对应的改过来就好了),而后在里面放入含有正样本的图片。固然了,正样本数目要要足够大,通常要是1000以上吧。注意,图片要用BMP格式,若是你手头上的图片不是BMP格式的话,只须要用图片处理软件转一下就好了。以下图所示:
2.截图目标区域。
正样本图片有了,而后双击F:\tools\temp\positive下的objectmarker.exe,开始截图目标区域,有readme文件已经说明了,也就是说,每次截图完要按一次空格键保存区域,多目标的图片能够接着继续截图,按下回车键能够跳到写一张图片:
The following keys are used:
<Enter> save added rectangles and show next image
<ESC> exit program
<Space> add rectangle to current imageany other key clears rectangle drawing only
这个过程要持续下去不能中断,否则的话就没法产生相应的文件了,因此在样本太多的状况下,能够先分组,大约100张图片放进去rawdata中去,这样子若是有什么意外的话,损失也就100张图的时间而已。只须要最后把几个文件合成一个大文件,效果就同样了。最后能够在F:\tools\temp\positive下生成info.txt文件。
例子:
rawdata/11022923.BMP 1 11 5 100 78
这里,rawdata/11022923.BMP表示文件的相对路径;
1 表示有一个目标(若是图片中有两个目标的话,截两次图,这里就是2了,以此类推;
11 5 表示目标矩形框起点坐标;
100 78 表示目标矩形框的宽和高。
3.正样本描述文件vec文件的建立。
已经把目标的状况记录了放在txt文件里,接下来就编辑F:\tools下的samples_creation.bat文件,由于正样本数是8个(我这里是8个),因此改为createsamples.exe -info positive/info.txt -vec data/vector.vec -num 8 -w 24 -h 24这句话的-num 后面写个8就好了,后面的-w 和 -h 说的是图片resize成的大小,根据你的须要本身改。以后会在F:\tools\temp\data下面生成vector.vec文件,这个就是向量描述文件了。
到此,正样本的操做已经完成了,不用打开vec文件,由于这个要专门的软件才能够打开的。
负样本:
1.准备负样本图片。
到F:\tools\temp\negative下,把负样本图片放进去。通常来讲,负样本要比正样本数目多不少。为何呢?由于负样本表示的是随机状况,只要有大量随机样本的状况下,才能够充分表示与正样本相反的状况,大约2-5倍吧,也不能太多,否则的话花费的时间太长,分类效果可能反而很差,由于比例偏移太严重了
2.负样本描述文件的生成。
打开F:\tools\temp\negative下的create_list.bat文件,能够自动生成描述文件。若是没有找到这个create_list.bat批出处理文件,就本身在这个目录下新建一个,内容就一句话:dir /b *.BMP >infofile.txt,而后保存。
infofile.txt文件内容以下为例(注意负样本也是bmp文件):
172328267.BMP
172328277.BMP
172328457.BMP
172328467.BMP
172328747.BMP
172328957.BMP
172328967.BMP
172329137.BMP
172329147.BMP
172329347.BMP
172329517.BMP
.............
到此,负样本的操做结束。
二.进入训练阶段:
打开F:\tools下的haarTraining.bat,开始训练了(注意:下载到的训练和测试工具里haarTraining.bat文件内容不必定适合你的实际状况,注意按照下面的参数说明修改参数,特别是 -npos 20 -nneg 40 -nstages 5!!)。该文件参数说明以下:
-data data/cascade -vec data/vector.vec -bg negative/infofile.txt -npos 20 -nneg 40 -nstages 5 -mem 1000 -mode ALL -w 24 -h 24 -nonsym
-data<dir_name>
存放训练好的分类器的路径名。
-vec<vec_file_name>
正样本文件名(由trainingssamples 程序或者由其余的方法建立的)
-bg<background_file_name>
背景描述文件。
-npos<number_of_positive_samples>,
-nneg<number_of_negative_samples>
用来训练每个分类器阶段的正/负样本。合理的值是:nPos = 7000;nNeg = 3000
-nstages<number_of_stages>
训练的阶段数。
-nsplits<number_of_splits>
决定用于阶段分类器的弱分类器。若是1,则一个简单的stump classifier 被使用。若是是2 或者更多,则带有number_of_splits 个内部节点的CART 分类器被使用。
-mem<memory_in_MB>
预先计算的以MB 为单位的可用内存。内存越大则训练的速度越快。
-sym(default)
-nonsym
指定训练的目标对象是否垂直对称。垂直对称提升目标的训练速度。例如,正面部是垂直对称的。
-minhitrate《min_hit_rate》
每一个阶段分类器须要的最小的命中率。总的命中率为min_hit_rate 的number_of_stages 次方。
-maxfalsealarm<max_false_alarm_rate>
没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate 的number_of_stages 次方。
训练过程会在F:\tools\temp\data\cascade中产生相应阶段的文件。训练时间和电脑配置和训练数据的多少有关。若是在这个过程当中中断了也不要紧,再次启动训练能够接着训练下去的。(ctrl+c能够退出)。个人配置是CPU:i5-480M,内存2G,正样本2500,负样本4500,大概从下午4点到次日早上7点吧,生成18级。速度比其余博客上写的要快不少,有的网友居然有用了6天的,我就搞不懂了。。。可能数据是在太大了吧。若是发现训练着程序再也不动了,那么不到18级也能够中止了。生成18级的阶段性分类器文件以后,把\temp\data\cascade下的n(这里n=18)个弱分类器文件夹拷贝到cascade2xml\data下,用F:\tools\cascade2xml下的convert.bat就能够生成xml分类器文件了。默认在同级目录下生成output.xml,固然了,你也能够改~~
3、检测
生成分类器以后,就能够启用F:\tools\test_recognition下的facedetect.exe文件了,至于文件路径什么的,本身结合实际修改一下,就是要把这个output.xml做为分类器文件输入就是了。
例如:start.bat中
facedetect.exe --cascade="dane.xml" 0
就是使用F:\tools\test_recognition下的dane.xml文件,媒体文件来源是摄像头,你要用视频,就改成相似于xxx.avi或者其余路径就好了。
其实这个facedetect.exe 是有源代码的,你能够本身去opencv 自带的代码里面找,我这里也贴出来了。
本博客涉及到的资源:
正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197
负样本:http://download.csdn.net/detail/zhuangxiaobin/7326205
训练和检测工具:http://download.csdn.net/detail/zhuangxiaobin/7414793
分类器xml文件:http://download.csdn.net/detail/zhuangxiaobin/7553415
我在正样本和训练工具设置了下载积分是1,一方面是正样本的制做是在太耗我时间了,另外一方面实在是由于我穷苦过久,对积分十分渴望。ps:请原谅个人庸俗,呵呵~
我把检测视频也共享出来了,http://pan.baidu.com/s/1i3ADest
若是以为能够的话,请在下面顶一下吧~~
除了本文提供的资源以外,再也不提供任何其余相关资源,本身去找,没必要私信我索要。