machine learning(2) OpenCV训练分类器制作xml文档

前端之家收集整理的这篇文章主要介绍了machine learning(2) OpenCV训练分类器制作xml文档前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在网上找了中文资料,发现大多都是转载那两篇文章,而且那两篇文章讲的都有误差,经过两天的摸索,我终于训练分类器成功了,在此与大家分享

参考英文资料网址: http://note.sonots.com/SciSoftware/haartraining.html#e134e74e

整个过程分为两步:

1. 创建样本

2. 训练分类

现在让我一一讲述。

1. 创建样本

◆ 样本分两种: 正样本与负样本(也有人翻译成:正例样本和反例样本),其中正样本是指待检目标样本(例如人脸,汽车,鼻子等),负样本指其它任意图片

◆ 所有样本图片都应该有同一尺寸,如20 * 20,并放在相应文件目录下,

◆ 集合文件格式(collection file format)和描述文件格式(description file format)

集合文件格式(collection file format)就是如下形的描述文件

[filename]

[filename]

[filename]

描述文件格式(description file format)就是如下形的描述文件

[filename] [# of objects] [[x y width height] [... 2nd object] ...]

[filename] [# of objects] [[x y width height] [... 2nd object] ...]

[filename] [# of objects] [[x y width height] [... 2nd object] ...]

….

(x,y) 指左上角的坐标,width和 height 分别是样本的宽和高,这里我的图片是20*20的,所以两个值都是20

◆ 负样本用集合文件格式描述,正样本用描述文件格式描述!(这点网上很多文章都搞错了!)

▼创建样本步骤:

一. 把所有正样本图片放在posdata的文件夹下,把所有负样本图片放在negdata文件夹下

(这里我以人脸图片样本为例)

(注:以上这些 20*20 的图片均来自MIT人脸库,可以在csdn下载)

二. 分别为正样本和负样本创建描述文件

A. 为正样本创建描述文件格式文件info.txt,并且把这个文件放在与样本图片同一目录下,例如我的目录为C:/OpenCV2.1/bin/posdata

a) 在命令行下 输入以下命令: dir /b > info.txt

b) 打开info.txt,按ctrl+h,把所有的bmp 换成 bmp 1 0 0 20 20

c) 删除info.txt最后一行的 “info.txt”

d) 结果如下:

B. 为负样本创建集合文件格式文件bg.txt,并且把这个文件放在与样本图片同一目录下,例如我的目录为I:/negdata

a) 在命令行下 输入以下命令: dir /b > bg.txt

b) 删除bg.txt最后一行的 “bg.txt”

c) 结果如下:

三. 创建样本。

Opencv 自带有创建样本的exe 文件,在 …/OpenCV2.1/bin 目录下, 这里我创建10个sample:

命令是: opencv_createsamples.exe -info C:/OpenCV2.1/bin/posdata/info.txt -vec a.vec -num 10 -w 20 -h 20

如图:


结果如图:

(关于 opencv_createsamples.exe 的参数用法,在参考英文资料网址http://note.sonots.com/SciSoftware/haartraining.html#e134e74e,里有详细介绍;

需要说明的是,我这里用的参数并没有 –bg, 因为根据那份文档,有了 –vec 和 –info 之后,就表示:Create training samples from some (从很多正样本中创建sample,没有distortions)

经历千辛万苦,我们终于看到sample被创建成功了,接下来的工作就简单多了

▼训练分类

还是在…/OpenCV2.1/bin目录下,输入命令:

opencv_haartraining.exe -data data -vec C:/OpenCV2.1/bin/a.vec -bg I:/negdata/bg.txt -npos 250 -nneg 800 -nstages 4 -nsplits 2 -mem 512 -nonsym -w 20 -h 20 -minpos 100

回车

(注意:

1. 参数-vec 一定要是刚刚创建样本产生的a.vec,且把完整路径也写上去,我试过用相对路径,但总会训练失败; bg.txt 也要用绝对路径

2. –w 和 –h 都要写上与样本大小的一致的尺寸

3. 若遇到“内存什么不能read”的问题,很有可能是bg.txt的格式有误,回去

4. 关于 opencv_haartraining.exe 的参数用法,在参考英文资料网址http://note.sonots.com/SciSoftware/haartraining.html#e134e74e,里有详细介绍

结果如下:

(可能实际结果与上图有出入, 但看到最后的,就说明训练成功了。

在bin目录会生成一份可爱的data.xml文档,这个就是我们想要的结果了!

Whew….done! Give me a five! ^_^

出处:http://blog.csdn.net/tyt2222008/archive/2010/08/25/5838389.aspx

在整个学习的过程中发现几个问题如下:

直接在DOS下调用批处理时出现一些问题,说什么不是内部外部命令,也不是可运行的程序或批处理文件

法一:咯,没办法了,只能自己弄一个批处理的EXE,在VS2010下其实也是一句话而已,在main函数调用system("dir E:\\nonfaces /B > info.txt") 其中E:\\nonfaces是要处理图片的路径,可以自己改,编译成功后可直接在当前目录下取得info.txt文件,这个路径也可以自己设定。

法二:搞定后,后来再仔细想想为什么自己在DOS下运行不了那个批处理命令,没有道理的啊,为什么人家可以,我不可以。后来尝试后发现,在我的电脑里那个批处理的命令要分两步来,首先要CD要当前目录下,再使用dir /b > info.txt。真的见鬼了,为会么直接就是用不了。

后来问题又来了,我的opencv是2.4.6,没有他们所说的那个opencv_createsamples.exe自带文件,不过还好,它们的cpp和h文件都在,自己就用VS建个工程生成一个exe文件,结果也还好,也完成创建样本那一步,我用的exe名是train...

到训练分类器也同理,用了cvhaartraining.cpp文件作为main函数

编译的时候又出现了老问题

1>D:\Opencv\opencv\build\include\opencv2/flann/flann.hpp(233): warning C4996: 'cv::flann::Index_<T>': 被声明为已否决
1> D:\Opencv\opencv\build\include\opencv2/flann/flann.hpp(279): 参见对正在编译的类 模板 实例化“cv::flann::Index_<T>”的引用
1>LINK : fatal error LNK1561: 必须定义入口点

考虑可能是VS本身的问题,就不想理了。

其中里面也还个haartraining.cpp文件,考虑会不会opencv_haartraining.exe由这个cpp生成,编译通过,但是最后DOS下也没有生成最后结果,,,求高手解答,先吃饭去了。

猜你在找的XML相关文章