目标检测分为三个步骤:
1、 样本的创建
2、 训练分类器
3、 利用训练好的分类器进行目标检测。
有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad()这个函数加载他们,让他们对我们的人脸进行检测,但是,现在生活中还有很多物品需要识别,所以,我们需要自己做个xml的检测文档。
一、正负样本的创建
1、首先就是图片库了,下载 face 和 nonface 库作为正负样本,分别放入pos_image和neg_image文件夹下,两个文件夹都在工程文件夹中,我这里分别取了100个20*20的样本。负样本图像的大小只要不小于正样本就可以,在使用负样本时,OpenCV 自动从负样本
图像中抠出一块和正样本同样大小的区域作为负样本。
2、将opencv_haartraining.exe ,opencv_createsamples.exe两个可执行文件拷贝到工程文件夹下。
(这里说一下:opencv2.4.4里面没有 opencv_haartraining.exe ,opencv_createsamples.exe这两个可执行文件。解决办法,下载了个opencv2.3.1,在安装目录C:\Program Files\opencv2.3.1\build\common\x86下找到并复制到工程文件夹中。这个时候点击会发现无法运行,因为缺少tbb.dll文件,这时候下一个这个动态链接库,然后拷贝到c:\Windows\SysWOW64下,32位系统的话拷贝到C:\Windows\SYSTEM32下)
windows+R,输入cmd,打开dos命令窗口,分别进入正负样本所在文件夹,我这里输入E:\OpenCV\xiaqunfeng\pos_image回车就可以了。但是我这台电脑不知道怎么回事,老是要出错。解决办法,一步一步进入文件夹,每一步都要在前面加cd,然后就可以了。
再输入:dir /b >pos_image.txt,就在目标文件夹下生成了该文件,打开它,删掉最后一行。然后给文本文件里面的内容加上前缀和后缀,如下图所示:
加前缀方法:1、使用 EditPlus,先选中所有行,然后按 Tab键为每行增加一个制表位,将制表位全部替换为“pos_image/”即可。
2、新建个文本文档,在里面输入 如下代码:
@echo off (for /f "delims=" %%a in (2.txt) do echo 前缀%%a)>b.txt //将 前缀 两字改为你要加的前缀 del /s/q 2.txt ren b.txt 2.txt存为a.bat 会变成可执行文件,若没变,修改工具文件夹—》隐藏已知文件扩展名,不选它
要加前缀的文本文档改为2.txt(或者你一开始就在代码里把 2.txt 改为你想要加前缀的文档名)
将a.bat和2.txt都放到桌面上
双击a.bat即可
二、创建vec文件
将pos_image.txt和neg_image.txt两个样本描述文件分别剪切到上一目录,也就是工程目录下。如果不剪切过来的话也可以,就是在使用opencv_haartraining.exe ,opencv_createsamples.exe这两个的cmd命令时要加上描述文件的绝对地址。
正样本由程序createsample 程序来创建。该程序的源代码由OpenCV 给出,并且在bin 目录下包含了这个可执行的程序。
Createsamples 程序的命令行参数:
参数来指定。则在bgcolor-bgthresh 和bgcolor+bgthresh 中间的像素被认为是透明的。
-inv 如果指定,颜色会反色
-maxangel<max_x_rotation_angle>
-maxangle<max_y_rotation_angle>,
-maxzangle<max_x_rotation_angle> 最大旋转角度,以弧度为单位。
-show 如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程继续。这是 个有用的debug 选项。
输入如下命令,执行完该命令后就会在当前目录下生产一个pos.vec文件了。
其中的-vec是指定后面输出vec文件的文件名,-info指定正样本描述文件,-bg指定负样本描述文件,-w和-h分别指正样本的宽和高,-num表示正样本的个数。
三、使用opencv_haartraining.exe文件训练分类器
Haartraining 的命令行参数如下:
-nneg<number_of_negative_samples> 用来训练每一个分类器阶段的正/负样本。合理的值是:nPos = 7000;nNeg = 3000
-nonsym 指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。如,正面部是垂直对称的。
-minhitrate《min_hit_rate》 每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate的number_of_stages次方。
-maxfalsealarm<max_false_alarm_rate> 没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate 的
number_of_stages 次方。
-weighttrimming<weight_trimming> 指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9
-eqw
-mode<basic(default)|core|all> 选择用来训练的haar特征集的种类。basic仅仅使用垂直特征。all使用垂直和45度角旋转特征。
-h《sample_height》
输入如下cmd命令,在当前目录下生产了一个xml.xml文件。
其中-data为输出xml中间文件的位置,-sym表示训练的目标为垂直对称,-nsplits 1表示使用简单的stump classfier分类。-mem 1280 表示允许使用计算机的1280M内存,-mode all 表示使用haar特征集的种类既有垂直的,又有45度角旋转的。
参考资料:这篇博文里面的过程比较清晰,但是有几个地方的过度没有说清楚,我这里做了补充
新浪的一篇博客,里面还讲了关于正负样本大小不一样的问题,我没仔细研究
原文链接:https://www.f2er.com/xml/298458.html