【原】训练自己haar-like特征分类器并识别物体(1)

本系列文章旨在学习如何在opencv中基于haar-like特征训练自己的分类器,并且用该分类器用于模式识别。该过程大致可以分为一下几个大步骤:

1.准备训练样本图片,包括正例及反例样本

2.生成样本描述文件

3.训练样本

4.目标识别

=================

本文主要对步骤1、步骤2进行说明。

1.准备训练样本图片,包括正例及反例样本

1)正样本的采集:

  所谓正样本,是指只包含待识别的物体的图片,一般是一些局部的图片,且最好能转化为灰度图。比如,若你想识别人脸,则正样本应尽可能只包含人脸,可以留一点周边的背景但不要过多。在正样本的采集上,我们有两种图形标定工具可以使用:(1)opencv的imageClipper (2)objectMarker。这两个工具都支持傻瓜式地对图片中的物体进行矩形标定,可以自动生成样本说明文件,自动逐帧读取文件夹内的下一帧。我用的是objectMarker。如果你找不到这个软件,可以留下邮箱,我发给你。
  在标定的时候尽量保持长宽比例一致,也就是尽量用接近正方形的矩形去标定待识别的物体,至于正方形的大小影响并不大。尽管OpenCV推荐训练样本的最佳尺寸是20x20,但是在下一步生成样本描述文件时可以轻松地将其它尺寸缩放到20x20。标定完成后生成的样本说明文件info.txt内容举例如下:

 


1

2

3

4

5

rawdata/  
(1).bmp 1 118 26 81 72

rawdata/  
(10).bmp 2 125 72 48 46 0 70 35 43

rawdata/  
(11).bmp 1 105 87 43 42

rawdata/  
(12).bmp 2 1 70 34 38 105 87 41 44

...

 

其中rawdata文件夹存放了所有待标定的大图,objectMarker.exe与rawdata文件夹同级。这个描述文件的格式已经很接近opencv所要求的了。

2)负样本的采集:

  所谓负样本,是指不包含待识别物体的任何图片,因此你可以将天空、海滩、大山等所有东西都拿来当负样本。但是,很多时候你这样做是事倍功半的。大多数模式识别问题都是用在视频监控领域,摄像机的角度跟高度都相对固定。如果你知道你的项目中摄像机一般都在拍什么,那负样本可以非常有针对性地选取,而且可以事半功倍。举个例子,你现在想做火车站广场的异常行为检测,在这个课题中行人检测是必须要做的。而视频帧的背景基本都是广场的地板、建筑物等。那你可以在人空旷的时候选择取一张图,不同光照不同时段下各取一张图,然后在这些图上随机取图像块,每个块20x20,每个块就是一个负样本。这几张图就能缠上数以千计数以万计的负样本!而且针对性强。因为海洋、大山等东西对你的识别一点帮助也没有,还会增加训练的时间,吃力不讨好的事还是少做为好。我写了一段小程序,功能是根据背景图片自动随机生成指定数量指定尺寸的负样本:

 1 #include "stdafx.h"
 2 #include "cv.h"
 3 #include "highgui.h"
 4 #include <iostream>
 5 #include <string>
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 //从背景图片中随机抽取图像块,多用于生成负样本
11 #define kImageBlockWidth                40        //图像块大小
12 #define kImageBlockHeight                40
13 #define kLoopTimes                        1000    //期望样本数
14
15 int _tmain(int argc, _TCHAR* argv[])
16 {
17     int originX = 0, originY = 0;
18     int width_limited = 0, height_limited = 0;
19     int width = 0, height = 0;
20     IplImage *bgImage = cvLoadImage("neg\\bg1.bmp");
21     IplImage *blockImage = cvCreateImage(cvSize(kImageBlockWidth, kImageBlockHeight), bgImage->depth, bgImage->nChannels);
22     width = bgImage->width;
23     height = bgImage->height;
24     width_limited = width - kImageBlockWidth;
25     height_limited = height - kImageBlockHeight;
26     cout<<width_limited<<"   "<<height_limited;
27     for (int i = 0; i < kLoopTimes; i++)
28     {
29         originX = rand() % width_limited;
30         originY = rand() % height_limited;
31         cvZero(blockImage);
32         CvPoint2D32f center_block = cvPoint2D32f(originX + kImageBlockWidth / 2, originY + kImageBlockHeight / 2);
33         cvGetRectSubPix(bgImage, blockImage, center_block);
34         char saveFileName[100] = {'\0'};
35         sprintf(saveFileName, "neg\\(%d).bmp", i + 1);
36         cvSaveImage(saveFileName, blockImage);
37     }
38
39     cvReleaseImage(&bgImage);
40     cvReleaseImage(&blockImage);
41     system("pause");
42     return 0;
43 }

这里的负样本尺寸我设定为40x40,是因为在我的应用环境下待识别的物体差不多是这个尺寸的。具体可以分析一下你的info.txt文件。生成文件后,开cmd.exe cd到该目录,然后运行“dir /b > neg_sample.dat”,打开.dat,用editplus替换bmp为bmp 1 0 0 40 40。这样负样本说明文件就产生了。

  对于负样本,我还有一点要说明:负样本图像的大小只要不小于正样本就可以。opencv在使用你提供的一张负样本图片时会自动从其中抠出一块与正样本同样大小的图像作为负样本,具体的函数可见opencv系统函数cvGetNextFromBackgroundData()。

 

2.生成样本描述文件

  样本描述文件也即.vec文件,里面存放二进制数据,是为opencv训练做准备的。只有正样本需要生成.vec文件,负样本不用,负样本用.dat文件就够。在生成描述文件过程中,我们需要用到opencv自带的opencv_createsamples.exe可执行文件。这个文件一般存放在opencv安装目录的/bin文件夹下(请善用ctrl+F搜索)。如果没有,可以自己编译一遍也很快。这里提供懒人版:http://en.pudn.com/downloads204/sourcecode/graph/texture_mapping/detail958471_en.html 这是别人编译出来的opencv工程,在bin底下可以找到该exe文件。要注意,该exe依赖于cv200.dll、cxcore200.dll、highgui200.dll这三个动态库,要保持这四个文件在同个目录下。

 

现在我们开始生成描述文件。新建文件夹pos、neg分别存放正样本及负样本图片,此处是指没标定的大图。

1)修改样本说明文件的格式:

在第1步中我们用objectMarker完成标定后会自动生成info.txt,现在我们需要对其格式做一定的微调,通过editplus或者ultraedit将路径信息rawdata都替换掉,并命名为sample_pos.dat,也可自定义名字。


1

2

3

4

5

6

(1).bmp
1 118 26 81 72

(10).bmp
2 125 72 48 46 0 70 35 43

(11).bmp
1 105 87 43 42

(12).bmp
2 1 70 34 38 105 87 41 44

(13).bmp
1 102 93 43 41

(14).bmp
1 104 86 45 47

2)使用opencv_createsamples.exe创建样本描述文件:

  打开cmd.exe,cd到opencv_createsamples.exe所在的目录,执行命令:


1

opencv_createsamples.exe
-info
./pos/sample_pos.dat -vec ./pos/sample_pos.vec -num 17 -w 20 -h 20 -show YES

 参数说明:-info,指样本说明文件

      -vec,样本描述文件的名字及路径

      -num,总共几个样本,要注意,这里的样本数是指标定后的20x20的样本数,而不是大图的数目,其实就是样本说明文件第2列的所有数字累加         和。

      -w -h 指明想让样本缩放到什么尺寸。这里的奥妙在于你不必另外去处理第1步中被矩形框出的图片的尺寸,因为这个参数帮你统一缩放!

      -show 是否显示每个样本。样本少可以设为YES,要是样本多的话最好设为NO,或者不要显式地设置,因为关窗口会关到你哭

 

done表示创建成功,若创建不成功会报错,大部分会提示你sample.dat pars error,一般是说明文件格式有错,或者num设置过大


1

2

Create
training samples
from images
collection...

Done.
Created 17 samples

 

总结

总结并延伸以上内容:

1.样本图片最好使用灰度图,且最好能根据实际情况做一定的预处理

2.样本选择的原则是:数量越多越好,尽量高于1000;样本间差异性越大越好

3.正负样本比例为1:3最佳,尺寸为20x20最佳

 

That`s all。

==================

附上参考资料,看这些就够,网上资料太多容易让人看花眼!

http://blog.csdn.net/think_embed/article/details/9959569

http://www.docin.com/p-80649093.html

http://jingyan.baidu.com/article/4dc40848f50689c8d946f197.html

http://blog.csdn.net/carson2005/article/details/8171571

【原】训练自己haar-like特征分类器并识别物体(1)

时间: 2024-10-26 05:46:43

【原】训练自己haar-like特征分类器并识别物体(1)的相关文章

【原】训练自己的haar-like特征分类器并识别物体(3)

在前两篇文章中,我介绍了<训练自己的haar-like特征分类器并识别物体>的前三个步骤: 1.准备训练样本图片,包括正例及反例样本 2.生成样本描述文件 3.训练样本 4.目标识别 ============== 本文将着重说明最后一个阶段--目标识别,也即利用前面训练出来的分类器文件(.xml文件)对图片中的物体进行识别,并在图中框出在该物体.由于逻辑比较简单,这里直接上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

【原】训练自己haar-like特征分类器并识别物体(2)

在上一篇文章中,我介绍了<训练自己的haar-like特征分类器并识别物体>的前两个步骤: 1.准备训练样本图片,包括正例及反例样本 2.生成样本描述文件 3.训练样本 4.目标识别 ================= 今天我们将着重学习第3步:基于haar特征的adaboost级联分类器的训练.若将本步骤看做一个系统,则输入为正样本的描述文件(.vec)以及负样本的说明文件(.dat):输出为分类器配置参数文件(.xml). 老规矩,先介绍一下这篇文章需要的工具,分别是(1)训练用的open

机器学习_基于adaboost和haar like特征的人脸识别

基于adaboost做人脸识别的一篇论文         PAUL VIOLA  的 Robust Real-Time Face Detection      Rapid object detection using a boosted cascade of simple features 其中谈到使用haar like特征,参考这篇论文        Rainer Lienhart and Jochen Maydt 的 An Extended Set of Haar-like Features

脸部识别-急求!在线等!问一个关于特征脸人脸识别的问题!

问题描述 急求!在线等!问一个关于特征脸人脸识别的问题! 我想问一个问题,比如说,A 和B长的很像,有罪犯的照片C,如何确定A B那个是罪犯?这个问题是关于特征维度的取法提高信息数量还是改进特征提取方法选取A B的最大差异部分匹配 或者是 关于不同距离分类器的识别效果呢? 解决方案 可以两个都做,然后打分,取加权分.哪个分高哪个就是 解决方案二: 这个题目的要求就是提高准确度吗?

阿里AAAI2018论文解读:轻量网络训练框架、GAN中文命名实体识别、英俄翻译等

1. 火箭发射:一种有效的轻量网络训练框架<Rocket Launching: A Universal and Efficient Framework for Training Well-performing Light Net> [团队名称]阿里妈妈事业部 [作者]周国睿.范颖.崔润鹏.卞维杰.朱小强.盖坤 [论文简介]像点击率预估这样的在线实时响应系统对响应时间要求非常严格,结构复杂,层数很深的深度模型不能很好的满足严苛的响应时间的限制.为了获得满足响应时间限制的具有优良表现的模型,我们提

北大团队研发“车脸”识别系统,不看车牌看外观特征实现精确识别

北京大学信息科学技术学院田永鸿等三名研究人员研发了根据汽车外观特征,而非扫描车牌号来精确识别摄像头拍摄的车辆的新技术.研究人员称该项技术也能用于人脸识别和行人检测,能为侦破盗窃车辆等案件提供帮助. 论文:https://arxiv.org/pdf/1708.02386.pdf 据<参考消息>8月30日引西媒报道,北京大学信息科学技术学院田永鸿等三名研究人员研发了根据汽车外观特征精确识别摄像头拍摄的车辆的新技术.该系统不再依靠扫描车牌号,而是基于对车辆外观特征的记录和分析,如轮廓线条.碰撞损伤或

浅析人脸检测之Haar分类器方法

很久没有看到这么精彩的博客了,必须转  [补充] 这是我时隔差不多两年后, 回来编辑这篇文章加的这段补充, 说实话看到这么多评论很是惊讶, 有很多评论不是我不想回复, 真的是时间久了, 很多细节我都忘记了, 无力回复, 非常抱歉.  我本人并非做CV的, 这两年也都没有再接触CV, 作为一个本科毕业的苦逼码工, 很多理论基础都不扎实, 回顾这篇文章的时候, 我知道其实有很多地方都是写的模棱两可, 加这个补充, 也是希望看这篇文章同学要带着批判的眼光来看, 要想透彻的理解算法, 一是要看透算法原作

OpenCV训练分类器制作xml文档

opencv 2.1网上查的另一种资料 训练分类器成功,在此与大家分享.  参考英文资料网址: http://note.sonots.com/SciSoftware/haartraining.html#e134e74e  样本训练要求 1.杯子的背景要统一吗,因为有些背景是白色,有些是淡淡的背景色,还有些深色的背景色 答:背景色要统一 2.整个图的大小就是最外面一个框框起来那么大,    问题是:我需要在原图基础上截图吗,如:只把红框框起来的那部分截出来???  答:不用的 3.那图片是256色

如何用OpenCV训练自己的分类器

最近要做一个性别识别的项目,在人脸检测与五官定位上我采用OPENCV的haartraining进行定位,这里介绍下这两天我学习的如何用opencv训练自己的分类器.在这两天的学习里,我遇到了不少问题,不过我遇到了几个好心的大侠帮我解决了不少问题,特别是无忌,在这里我再次感谢他的帮助. 一.简介 目标检测方法最初由Paul Viola [Viola01]提出,并由Rainer Lienhart [Lienhart02]对这一方法进行了改善.该方法的基本步骤为: 首先,利用样本(大约几百幅样本图片)