OpenCV训练分类器制作xml文档

(2011-08-25 15:50:06)

标签:

杂谈

分类: 学习
我的问题:有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad()这个函数加载他们,让他们对我们的人脸进行检测,但是,现在生活中的计算机视觉并不远远是检测人脸,还有很多物品需要识别,所以,能不能自己做个xml的检测文档,用它来检测自己需要的东西呢?例如,检测一个可乐瓶!
问题解决:

首先了解下,目标检测分为三个步骤:

1、 样本的创建

2、 训练分类器

3、 利用训练好的分类器进行目标检测。

一,样本的创建:

训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本(例如可乐瓶,人脸等),反例样本指其它任意图片。

1.正样本

现在,我们来看正样本的创建步骤:

正样本由程序createsample 程序来创建。该程序的源代码由OpenCV 给出,并且在bin 目录下包含了这个可执行的程序。例如你opencv安装目录为 c:\ 既C:\OpenCV\bin,你找找就有

正样本可以由单个的目标图片或者一系列的事先标记好的图片来创建!

2在用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》

输出样本的高度,以像素为单位。
注:正样本也可以从一个预先标记好的图像集合中获取。这个集合由一个文本文件来描述。每一个文本行对应一个图片。每行的第一个元素是图片文件名,第二个元素是对象实体的个数。后面紧跟着的是与之匹配的矩形框(x, y, 宽度,高度)。

由于 HaarTraining 训练时输入的正样本是 vec 文件,所以需要使用 OpenCV 自带的

CreateSamples程序将准备好的正样本转换为 vec文件。转换的步骤如下:

1) 制作一个正样本描述文件,用于描述正样本文件名(包括绝对路径或相对路径) ,

正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:

face_100/face00001.bmp 1 0 0 20 20

face_100/face00002.bmp 1 0 0 20 20

face_100/face00003.bmp 1 0 0 20 20



可采用 Dos命令结合 EditPlus 软件生成样本描述文件。

具体方法是在 Dos下的恰当目录敲入
dir face_100 /b > samples.dat,
则会生成一个 samples.dat,里面包含所有正样本文件名列表,但没有相对路径名和正样本位置信息。在 samples.dat 文件各行行首增加"face _100/"的方法是
使用 EditPlus,先选中所有行,
然后按 Tab键为每行增加一个制表位,
然后将制表位全部替换为"face _100/"即可。
通过将"bmp"替换为"bmp 1 0 0 20 20"即可在每行添加"1 0 0 20 20"。
 
运行CreateSamples程序。下面是一个运行参数示例:

opencv_createsamples.exe -vec pos.vec -info pos.dat -num 200 -w 32 -h 32
表示有 200 个样本,样本宽 32,高 32,正样本描述文件为 pos.dat,结果输出

到 pos.vec。

运行完了会生成一个pos.vec 的文件。该文件包含正样本数目,宽高以及所有样本图.

 
2 负样本图像可以是不含有正样本模式的任何图像,比如一些风景照等。训练时, OpenCV

需要一个负样本描述文件,该文件只需包含所有负样本的文件名及绝对(或相对)路径名。

以下是一个负样本描述文件内容示例:

nonface_200/00001.bmp

nonface_200/00002.bmp

nonface_200/00003.bmp



负样本描述文件的生成方法可参照正样本描述文件生成方法。

负样本图像的大小只要不小于正样本就可以,在使用负样本时,OpenCV 自动从负样本

图像中抠出一块和正样本同样大小的区域作为负样本,具体可查看函数

icvGetNextFromBackgroundData() 。具体抠图过程为:

1) 确定抠图区域的左上角坐标(Point.x, Point.y)

2) 确定一个最小缩放比例,使得原负样本图像缩放后恰好包含选中负样本区域

3) 对原负样本图象按计算好的缩放比例进行缩放

4) 在缩放后的图像上抠出负样本,如图 3.2 左半部分的虚线框所示。

三、训练分类器

样本创建之后,接下来要训练分类器,这个过程是由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》

训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同

然后,同样在dos命令行输入harr这个函数的命令

具体如图:

然后,按回车,会出现"成果"界面

如果出现:训练停留在一个分类器长达几小时没有相应,问题出现在取负样本的那个函数 icvGetHaarTrainingDataFromBG中(另见我的博客http://blog.sina.com.cn/s/blog_75e063c10100za53.html中对于icvGetHaarTrainingDataFromBG的分析);只有当之前的强分类器对负样本集内的样本全部分类正确时才会出现死循环,因为只要有一个样本会被错分为正样本,那么通过count次扫描整个负样本集就能得到count个负样本,当然这count个负样本实际上就是一个负样本的count个拷贝。为避免这种情况,负样本集中的样本数需要足够多 。
不过此时的分类器已经完全额、可以使用,因为它的误检率已经很低,从实用性上时没有任何问题的。所以我们可以通过设置-nstages 这个参数来限制分类器级数,适当时候停止并生成xml文件。

 
附:需要样例人脸和非人脸的,可以上csdn上下载。地址:http://download.csdn.net/detail/rxm24217/4221235
 
到目前为止,你自己需要的分类器的xml文档就生成了,你自个找下当前那个目录,会发现,多了几个文件夹,请看图:

到目前为止,就告一段落了!

(这里就只有几个图片,所以,很快训练完,不过,要想训练出检测率高的xml,图片的张数的很多,那时候,会训练几个小时到1天,时间几天的时间,那时候,你只求你的电脑不要断电!)

那么我该用什么办法检验我训练出的分类器的各项性能呢?

回答:要用opencv_performance.exe

先得到test sample:

用命令: opencv_createsamples.exe -info test1.dat -img face7.jpg -bg C:/TDDOWNLOAD/car_pic/bg.txt -num 35

-info 后面是生成的dat 文件,

-img 是人脸图片

-bg 背景图片

-num 生成的sample数量

测试命令:

opencv_performance.exe -data haarcascade_frontalface_alt2.xml -info test1.dat -ni

-data 参数接要测试的xml文档

-info 是生成的sample

OpenCV训练分类器制作xml文档的更多相关文章

  1. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  2. 【HTML/XML 10】XML文档中的Schema文件

    导读:DTD是对XML文档进行有效性验证的方法之一,事实上,继DTD之后,出现了用来规范和描述XML文档的第二代标准:Schema.Schema是DTD的继承,但是也有其不同的地方,它是真正的以独立的 ...

  3. 用python批量生成简单的xml文档

    最近生成训练数据时,给一批无效的背景图片生成对应的xml文档,我用python写了一个简单的批量生成xml文档的demo,遇见了意外的小问题,记录一下. 报错问题为:ImportError: No m ...

  4. C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”

    Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...

  5. 【.net 深呼吸】使用二进制格式来压缩XML文档

    在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小. XmlDicti ...

  6. 【Win 10应用开发】把文件嵌入到XML文档

    把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点.不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML ...

  7. 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……

    大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...

  8. 【Win10 应用开发】自适应Toast通知的XML文档结构

    老规矩,在开始之前老周先讲个故事. 话说公元2015年7月20日,VS 2015发布.于是,肯定有人会问老周了,C#6有啥新特性,我学不来啊.学不来的话你应该检讨.老周比较保守地计算一下,学会C# 6 ...

  9. XML文档操作集锦(C#篇)

    在JSON没流行起来的时候xml一直作为程序存储配置信息的主流介质:特别是小型数据表方面还是不错的选择,所以经常涉及到的操作无非也就是增删改查,这篇博客主要是对这些对比较常用的操作做了个简单的总结 文 ...

随机推荐

  1. 187. Repeated DNA Sequences

    题目: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: " ...

  2. easyui返回数据类型

    /** * 我申请的事项List * * @param personalParamVo * @param pagePara * @return */ @ResourceMapping("my ...

  3. WinCE启动失败的原因与解决办法分析

    本文通过一个真实的嵌入式项目进行说明.文中的嵌入式系统用的是ARM处理器+WinCE平台,项目的目的是要把WinCE平台从旧版本移植到WinCE6.0平台上.但结果是这个WinCE系统在启动的时候经常 ...

  4. [转]Linux下Nagios的安装与配置

    转自:http://blog.chinaunix.net/uid-29539073-id-4149856.html 月色书香 一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有 ...

  5. hdu4177:Super Mario

    主席树+离散化.给一段区间.多次询问[l,r]中有多少个数小于k.啊主席树用指针版写出来优美多了QAQ... #include<cstdio> #include<cstring> ...

  6. (十三)学习CSS之两个class连一起隔空格和逗号

    1.时常见到css的这两种种写法: a.两个class隔空格连一起: .class1 .class2{......} b.两个class隔逗号连一起: .class1,.class2{......} ...

  7. C# Multilanguage messagebox z

    Either way, can't you just call MessageBox.Show(rm.GetString("messageboxData", ci)) class ...

  8. docker专题(2):docker常用管理命令(上)

    http://segmentfault.com/a/1190000000751601 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备 ...

  9. opencv linux

    This link which you also mentioned describes the necessary steps to compile OpenCV on your machine. ...

  10. python错误收集

    Installing 'flask'You are using pip version 6.1.1, however version 7.1.2 is available.You should con ...