1.正样本文件采集:
需要使用到的工具:objectmarker
用于待识别对象的标注,并生成标注文件。需要注意的是,生成完标注文件之后(通常是info.txt文件),用编辑器打开文件,将所有路径信息删除,只保留文件名和其对应的标注信息,修改完成之后,将文件保存为sample_pos.dat(注意,文件名字不要改变,否则以后会很坑,这个具体还没去研究源码,应该是程序的问题);
ps:如果已经有了图像的标注信息,那就可以跳过这一步了。
2.正样本vec文件生成(sample文件)
工具:opencv_createsamples.exe
在工具所在目录创建文件夹:pos,将采集到的正样本,以及标注文件放入pos文件夹;
使用cmd进入工具所在目录,执行命令:
opencv_createsamples.exe -info ./pos/sample_pos.dat -vec ./pos/sample_pos.vec -num 17 -w 20 -h 20 -show YES
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))