1.正样本文件采集:html
须要使用到的工具:objectmarker编辑器
用于待识别对象的标注,并生成标注文件。须要注意的是,生成完标注文件以后(一般是info.txt文件),用编辑器打开文件,将全部路径信息删除,只保留文件名和其对应的标注信息,修改完成以后,将文件保存为sample_pos.dat(注意,文件名字不要改变,不然之后会很坑,这个具体还没去研究源码,应该是程序的问题);工具
ps:若是已经有了图像的标注信息,那就能够跳过这一步了。ui
2.正样本vec文件生成(sample文件)spa
工具:opencv_createsamples.exe.net
在工具所在目录建立文件夹:pos,将采集到的正样本,以及标注文件放入pos文件夹;命令行
使用cmd进入工具所在目录,执行命令:xml
opencv_createsamples.exe -info ./pos/sample_pos.dat -vec ./pos/sample_pos.vec -num 17 -w 20 -h 20 -show YEShtm
ps:-num:正样本个数对象
3.负样本采集
建议正负样本比例在1:3(具体还不知道,参考网上提供的数据)。负样本在采集的时候尤为须要注意,尽可能保持和正样本环境类似,好比,正样本图像中包含要检测的对象,负样本图像中最好剔除要检测的对象,只保留背景。有条件的同窗能够直接写程序,对负样本图片进行切割,标准是40*40(由于咱们的正样本采用的是20*20)。
负样本采集完成以后,在pos目录的统计目录建立文件夹:neg,将负样本拷贝至neg目录,而后使用命令行进入neg目录,执行命令:
dir /b > sample_neg.dat
用文本编辑器打开dat文件,删除最后一行:sample_neg.dat,保存文件;
ps:文件名字不要改变,不然会出错
4.训练样本
到此为止,咱们要准备的文件都已经准备好,能够进行训练了。
使用的工具:opencv_haartraining.exe
进入工具所在目录,先建立目录:cascade,而后执行命令:
opencv_haartraining.exe -data ./cascade -vec ./pos/sample_pos.vec -bg ./neg/sample_neg.dat -nstage 20 -npos 100 -nneg 300 -mem 256 -mode ALL -w 20 -h 20
-nstage:要训练多少层
-npos:每层的正样本个数
-nneg:每层的负样本个数
ps:在这一步常常会抛异常,一般都是负样本文件不对,同时dat文件的名字必定要按照上面说的命名,不然会出错;
5.合并xml文件
样本训练完成以后,cascade目录下会生成多个子目录,须要将这些目录合并生成xml文件才能使用:
工具:c-example-convert_cascade.exe(ps:根据opencv的版本不一样,这个工具的名字也可能不一样)
执行命令:
c-example-convert_cascade.exe --size=20x20 ./cascade haar_adaboost.xml
到此,会在目录中生成haar_adaboost.xml文件!
done!
说明:
1.全部的工具及其依赖文件建议统一放置在一个目录中(好比:build);
2.除了负样本描述文件的生成命令须要在neg目录中执行,其余命令所有在build(假设你也有这个目录,以各自的实际目录为准)目录中执行;
3.good luck!
参考:
1.http://www.cnblogs.com/wengzilin/p/3845271.html
2.http://blog.csdn.net/xuejiren/article/details/39493537
(Opencv Error: Assertion failed (elements_read==1))