OpenCV训练分类器制作xml文档

时间:2023-02-16 17:42:14

OpenCV训练分类器制作xml文档

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。
OpenCV训练分类器制作xml文档

运行完了会生成一个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 左半部分的虚线框所示。

OpenCV训练分类器制作xml文档
三、训练分类器

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

具体如图:
OpenCV训练分类器制作xml文档

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

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

OpenCV训练分类器制作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&sol;XML 10】XML文档中的Schema文件

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

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

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

  4. C&num;反序列化XML异常:在 XML文档&lpar;0&comma; 0&rpar;中有一个错误&OpenCurlyDoubleQuote;缺少根元素”

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

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

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

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

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

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

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

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

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

  9. XML文档操作集锦&lpar;C&num;篇&rpar;

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

随机推荐

  1. linux命令后面常见的&gt&semi;&sol;dev&sol;null 和 2&gt&semi;&amp&semi;1 的含义

    >/dev/null 输出到空设备,表示丢掉输出信息. 2 > &1 将输出到标准错误的信息输出到标准输出设备(通常是屏幕) 有3个默认的i/o, 0 是标准输入,一般是键盘 1 ...

  2. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;二&rpar;&colon;素材选择的取舍

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前面一篇里我们基本明确了游戏的大致玩法和特点.下面就游戏中会用到 ...

  3. 不同应用共享redis应用,但分数据库存储数据

    日常开发工作中,常常遇到这种情况 项目A ,需要使用redis 项目B ,也需使用redis …… 原来傻乎乎的在服务器上装几个redis,通过不同的端口号来进行使用 其实redis可用有16个数据库 ...

  4. react购物车

    import React, { Component } from 'react';   import {Tabs} from './Tabs'   import 'whatwg-fetch'   im ...

  5. LeetCode--No&period;013 Roman to Integer

    13. Roman to Integer Total Accepted: 95998 Total Submissions: 234087 Difficulty: Easy Given a roman ...

  6. The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp

    文件链接 Karp在1977年的论文,讲述了一种\(O(nm)\)的算法,用来求有向强连通图中最小平均权值回路(具体问题请参照这里) 本人翻译(有删改): 首先任取一个节点 \(s\) ,定义 \(F ...

  7. Quartz带参数任务的创建与修改

    需求背景:创建的quartz任务需要用到三个参数,根据参数去执行并将结果入库,并且参数可修改更新. 这里,有三个参数需要传入,分别是planId.target.officeId 定义Job类: pub ...

  8. maven 无法下载私服jar包,如刚上传的第三方jar包无法下载。。

    原因可能是: 在你下载该文件时 ,的确 私服上没有该文件. 但是maven会在本地仓库建立文件夹路径,并且今天不会再去私服下载. 即使你现在上传3rd jar ,也不会去下载,导致一直找不到jar.. ...

  9. SQL语句添加删除修改字段&lbrack;sql server 2000&sol;2005&rsqb;

    用SQL语句添加删除修改字段1.增加字段     alter table docdsp    add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME ...

  10. redis节点管理-节点的移除

    原文:http://blog.sina.com.cn/s/blog_53b45c4d0102wg13.html 节点的移除 和节点添加一样,移除节点也有移除主节点,从节点. 1.移除主节点 移除节点使 ...