OpenCV学习笔记(2)——opencv方法训练.xml文件过程

前端之家收集整理的这篇文章主要介绍了OpenCV学习笔记(2)——opencv方法训练.xml文件过程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

目标检测分为三个步骤:@H_404_4@
1、 样本的创建@H_404_4@
2、 训练分类器@H_404_4@
3、 利用训练好的分类器进行目标检测。@H_404_4@@H_404_4@@H_404_4@

有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad()这个函数加载他们,让他们对我们的人脸进行检测@H_404_4@,但是,现在生活中还有很多物品需要识别,所以,我们需要自己做个xml的检测文档。@H_404_4@
@H_404_4@@H_404_4@@H_404_4@

一、正负样本的创建@H_404_4@@H_404_4@

1、首先就是图片库了,下载 face 和 nonface 库作为正负样本,分别放入pos_image和neg_image文件夹下,两个文件夹都在工程文件夹中,我这里分别取了100个20*20的样本。负样本图像的大小只要不小于正样本就可以,在使用负样本时,OpenCV 自动从负样本@H_404_4@
图像中抠出一块和正样本同样大小的区域作为负样本。@H_404_4@@H_404_4@@H_404_4@@H_404_4@

2、将opencv_haartraining.exe ,opencv_createsamples.exe两个可执行文件拷贝到@H_404_4@工程文件夹下。@H_404_4@@H_404_4@

(这里说一下:opencv2.4.4里面没有 opencv_haartraining.exe ,opencv_createsamples.exe这两个可执行文件解决办法,下载了个opencv2.3.1,在安装目录@H_404_4@C:\Program Files\opencv2.3.1\build\common\x86下找到并复制到工程文件夹中。这个时候点击会发现无法运行,因为缺少tbb.dll文件,这时候下一个这个动态链接库,然后拷贝到c:\Windows\SysWOW64下,32位系统的话拷贝到C:\Windows\SYSTEM32下)@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@

3、生成正负样本描述文件@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@

windows+R,输入cmd,打开dos命令窗口,分别进入正负样本所在文件夹,我这里输入E:\OpenCV\xiaqunfeng\pos_image回车就可以了。但是我这台电脑不知道怎么回事,老是要出错。解决办法,一步一步进入文件夹,每一步都要在前面加cd,然后就可以了。@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@

再输入:dir /b >pos_image.txt,就在目标文件夹下生成了该文件,打开它,删掉最后一行。然后给文本文件里面的内容加上前缀和后缀,如下图所示:@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@


@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@

加前缀方法:1、@H_404_4@使用 EditPlus,先选中所有行,@H_404_4@然后按 Tab键为每行@H_404_4@增加一个制表位,@H_404_4@将制表位全部替换为“pos_image/”即可。@H_404_4@@H_404_4@

2、@H_404_4@新建个文本文档,在里面输入 如下代码:@H_404_4@
@H_404_4@@H_404_4@

@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 会变成可执行文件,若没变,修改工具文件夹—》隐藏已知文件扩展名,不选它@H_404_4@
要加前缀的文本文档改为2.txt(或者你一开始就在代码里把 2.txt 改为你想要加前缀的文档名)@H_404_4@
将a.bat和2.txt都放到桌面上@H_404_4@
双击a.bat即可@H_404_4@

@H_404_4@@H_404_4@@H_404_4@

加后缀方法:通过将“bmp”替@H_404_4@ 换为“bmp 1 0 0 20 20”即可在每行末尾添加“1 0 0 20 20”。@H_404_4@

二、@H_404_4@@H_404_4@@H_404_4@@H_404_4@创建vec文件@H_404_4@@H_404_4@@H_404_4@

将pos_image.txt和neg_image.txt两个样本描述文件分别剪切到上一目录,也就是工程目录下。如果不剪切过来的话也可以,就是在使用opencv_haartraining.exe ,opencv_createsamples.exe这两个的cmd命令时要加上描述文件的绝对地址。@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@

正样本由程序createsample 程序来创建。该@H_404_4@程序的源代码由OpenCV 给出,并且在bin 目录下包含了这个可执行的程序。@H_404_4@
@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@

@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@

在用createsamples.exe 这个程序前,先来了解下这个程序的一些命令组合模式
Createsamples 程序的命令行参数:@H_404_4@
-vec <vec_file_name> 训练好的正样本的输出文件名。@H_404_4@
-img<image_file_name> 源目标图片(例如:一个公司图标)@H_404_4@
-bg<background_file_name> 背景描述文件。@H_404_4@
-num<number_of_samples> 要产生的正样本的数量,和正样本图片数目相同。@H_404_4@
-bgcolor<background_color> 背景色(假定当前图片为灰度图)。背景色制定了透明色。对于压缩图片,颜色方差量由bgthresh
参数来指定。则在bgcolor-bgthresh 和bgcolor+bgthresh 中间的像素被认为是透明的。@H_404_4@
-bgthresh<background_color_threshold>
-inv 如果指定,颜色会反色@H_404_4@
-randinv 如果指定,颜色会任意反色@H_404_4@
-maxidev<max_intensity_deviation> 背景色最大的偏离度。
-maxangel<max_x_rotation_angle>
-maxangle<max_y_rotation_angle>,
-maxzangle<max_x_rotation_angle> 最大旋转角度,以弧度为单位。
-show 如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程继续。这是 个有用的debug 选项。@H_404_4@
-w<sample_width> 输出样本的宽度(以像素为单位)@H_404_4@
-h《sample_height》 输出样本的高度,以像素为单位。@H_404_4@

输入如下命令,执行完该命令后就会在当前目录下生产一个pos.vec文件了。@H_404_4@@H_404_4@@H_404_4@


@H_404_4@@H_404_4@

其中的-vec是指定后面输出vec文件文件名,-info指定正样本描述文件,-bg指定负样本描述文件,-w和-h分别指正样本的宽和高,-num表示正样本的个数。@H_404_4@@H_404_4@


@H_404_4@@H_404_4@

三、使用opencv_haartraining.exe文件训练分类器@H_404_4@@H_404_4@@H_404_4@@H_404_4@

@H_404_4@@H_404_4@@H_404_4@

样本创建之后,接下来要训练分类器,这个过程是由haartraining 程序来实现的。
Haartraining 的命令行参数如下:@H_404_4@@H_404_4@@H_404_4@
-data<dir_name>@H_404_4@存放训练好的分类器的路径名。@H_404_4@@H_404_4@@H_404_4@
-vec<vec_file_name>@H_404_4@正样本文件名(由trainingssamples 程序或者由其他的方法创建的)@H_404_4@@H_404_4@@H_404_4@
-bg<background_file_name>@H_404_4@背景描述文件。@H_404_4@@H_404_4@@H_404_4@
-npos<number_of_positive_samples>,
-nneg<number_of_negative_samples> @H_404_4@用来训练每一个分类器阶段的正/负样本。合理的值是:nPos = 7000;nNeg = 3000@H_404_4@@H_404_4@@H_404_4@
-nstages<number_of_stages>@H_404_4@训练的阶段数。@H_404_4@@H_404_4@@H_404_4@
-nsplits<number_of_splits>@H_404_4@决定用于阶段分类器的弱分类器。如果1,则一个简单的stump classifier 被使用。如果是2 @H_404_4@或者更多,则带有number_of_splits 个内部节点的CART 分类器被使用。@H_404_4@@H_404_4@@H_404_4@
-mem<memory_in_MB>@H_404_4@预先计算的以MB 为单位的可用内存。内存越大则训练的速度越快。@H_404_4@@H_404_4@@H_404_4@
-sym(default)
-nonsym @H_404_4@指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。如,正面部是垂直对称的。
-minhitrate《min_hit_rate》 @H_404_4@每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate的number_of_stages次方。
-maxfalsealarm<max_false_alarm_rate> @H_404_4@没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate 的
@H_404_4@number_of_stages 次方。
-weighttrimming<weight_trimming> @H_404_4@指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9
-eqw
-mode<basic(default)|core|all> @H_404_4@选择用来训练的haar特征集的种类。basic仅仅使用垂直特征。all使用垂直和45度角旋转特征。@H_404_4@@H_404_4@@H_404_4@
-w《sample_width》
-h《sample_height》

@H_404_4@@H_404_4@@H_404_4@
首先在当前目录下新建一个xml文件夹用于存放生成的.xml文件。@H_404_4@

输入如下cmd命令,在当前目录下生产了一个xml.xml文件。@H_404_4@@H_404_4@@H_404_4@@H_404_4@@H_404_4@

@H_404_4@

其中-data为输出xml中间文件的位置,-sym表示训练的目标为垂直对称,-nsplits 1表示使用简单的stump classfier分类。-mem 1280 表示允许使用计算机的1280M内存,-mode all 表示使用haar特征集的种类既有垂直的,又有45度角旋转的。@H_404_4@
@H_404_4@

参考资料:这篇博文里面的过程比较清晰,但是有几个地方的过度没有说清楚,我这里做了补充@H_404_4@@H_404_4@

新浪的一篇博客,里面还讲了关于正负样本大小不一样的问题,我没仔细研究@H_404_4@

百度文库的一个例子@H_404_4@

猜你在找的XML相关文章