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

来源:互联网 发布:pbft算法 编辑:程序博客网 时间:2024/06/09 23:48

目标检测分为三个步骤:
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下)

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

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即可

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

二、创建vec文件

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

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

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

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


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


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

    样本创建之后,接下来要训练分类器,这个过程是由haartraining 程序来实现的。
Haartraining 的命令行参数如下:
-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 次方。
-weighttrimming<weight_trimming> 指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9
-eqw
-mode<basic(default)|core|all> 选择用来训练的haar特征集的种类。basic仅仅使用垂直特征。all使用垂直和45度角旋转特征。
-w《sample_width》
-h《sample_height》

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

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

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




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

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

          百度文库的一个例子









0 0