opencv_haar分类器的训练
本文为作者原创,未经允许不得转载;原文由作者发表在博客园: http://www.cnblogs.com/panxiaochun/p/5345412.html
HaarTraining步骤
1.正负样本处理
正样本处理需要对正样本进行归一化处理,一般情况下可以用Photoshop对图像进行尺寸统一处理,比如都是20*20或者24*24,其中其它尺寸比如240*15也可以做成样本的,不要求是正方形,或者20*20,24*24,。这是取决于你的目标的形状,不过正样本的分辨率不要太高,太高的话在训练时会内存分配不足引起crash
错误如下: OpenCV Error :insufficient memory <failed to allocate 250343435bytes> in cv::\OutOfMemoryError


图1.1 正样本分辨率太大时引起的内存分配不足的crash
不预先用Photoshop对正样本进行处理时,还可以使用opencv_createSamples工具进行处理,其实就算用Photoshop对样本进行过处理,在这里还是会对样本进行一次处理,Photoshop预先处理的好处就是样本的位置都为0,0。那么对正样本描述文件处理时就比较简单,特别是正样本数量足够大时,可以减少正样本描述文件的出错率,提高分类器的检测率。
1.1正样本描述文件
正样本描述文件的创建如下:
一个.txt文件或者.dat文件里面包含正样本的信息,
结构:
包含正样本图片的相对路径或者全路径 正样本中包含的正样本数量 第一个正样本的位置x y 第一个正样本的宽和高w h 第二个正样本的位置x y 第二个正样本的宽和高w h …… 第n个正样本的位置x y 第n个正样本的宽和高w h
img01.jpg 0 0 20 20
img\\img02.jpg 0 0 24 24
e://img/img03.jpg 3 4 240 15 248 29 160 20
….
在这里你就会明白为什么要在之前用Photoshop对图片进行处理,这样的话,所有图片都是只包含一个正样本的统一尺寸的图片,那么正样本描述文件就像下面那样:
img01.jpg 1 0 0 20 20
img02.jpg 1 0 0 20 20
img03.jpg 1 0 0 20 20
……
既然是是统一的话,就可以用批处理来完成:
在Windows下用命令: dir imgDir /b > imgDiscr.txt
(在linux下用: ls imgDir >imgDiscr.txt ,也可以保存为.sh文件,这样不用每次输入命令)
我是直接保存为.bat文件,这样每次不用打命令,而是点击就生成包含所有正样本图片名的文件imgDiscr.txt :
img01.jpg
img02.jpg
img03.jpg
….
然后用编辑器打开,把jpg替换成jpg 1 0 0 20 20
就可以快速生成正样本描述文件。
1.2负样本描述文件的生成
和正样本一样,不过不需要对负样本图片进行处理,只要负样本图片不比正样本图片的分辨率小就行,负样本描述文件只需要包含图片路径名:
non-img01.jpg
non-img02.jpg
non-img03.jpg
….
2.opencv_createsamples生成正样本.vec文件
分类器在训练时并不会直接处理正样本描述文件,而是包含正样本的.vec文件,这是一个用matlab函数生成的向量文件。
参数的设定如下:
opencv_createsamples.exe -info imgDiscr.txt -vec samples.vec -num -w -h 20
命令行参数:
- [-vec <vec_file_name>] 输出文件,内含用于训练的正样本
- [-img <image_file_name>] 输入图像文件名(例如一个公司的标志
- [-bg <background_file_name>] 背景图像的描述文件,文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景。
- [-mun <number_of_samples>]生成的正样本的数目。
- [-maxxangle <max_x_rotation_angle>]X轴最大旋转角度,必须以弧度为单位。
- [-maxyangle <max_y_rotation_angle>]Y轴最大旋转角度,必须以弧度为单位。
- [-maxzangle <max_z_rotation_angle>]Z轴最大旋转角度,必须以弧度为单位。
- [-w <sample_width >] 输出样本的宽度(以像素为单位)
- [-h <sample_height >]输出样本的高度(以像素为单位)。
其中-num的数值应该为总的正样本数,也就是正样本描述文件中第二列数字总和
-w -h是输出图像的宽和高,这里也会对正样本进行归一化处理,其中我们之前用Photoshop对图像进行过归一化处理,如果没有,那么在这里createsample工具也会对正样本进行归一化处理,所有的正样本大小都是一样的。而且,之前Photoshop归一化为20个像素后,在这里设置为24个像素,那么生成的.vec向量文件里面的图像是24个像素的。
3.haarTraining训练分类器
opencv_haarTraining训练器是一个被淘汰的训练器,在2.4.9里面还有,2.4.10后就没有了,不过用opencv_traincascade训练出来的分类器在示例程序中无法使用,而且3.10的opencv_traincascade在使用时出现问题,所以迫不得已找回了以前的haarTraining来使用。其中opencv_traincascade出现的错误如下:
Train dataset for temp stage can not be filled. Branch training terminated
stackoverflow上的说是描述文件是在Windows下生成的,结尾是/r/n,而linux下的描述文件后面是/r没有/n,所有导致读取不到图像文件,但是在linux下训练时还是会出现问题,所以,我觉得问题不在描述文件上。训练分类器用以下命令:
opencv_haartraining.exe -data block_xml/ -vec samples.vec -bg non-imgDiscr.txt -nstages -nsplits -minhitrate 0.999 -maxfalsealarm 0.5 -npos -nneg -w -h -mem -eqw -mode ALL -bt GAB -minpos
这里的正样本数量为200,负样本数量为20,样本的宽为240,高为15
正样本最小命中率为0.999,因为级联-nstages为20,所以0.999^20 = 0.98 负样本的最大错误率为0.5 经过20个级联后错误率为0.5^20 = 0.0000009536
基本参数:
" -data <dir_name>\n"
" -vec <vec_file_name>\n"
" -bg <background_file_name>\n"
" [-npos <number_of_positive_samples = %d>]\n"
" [-nneg <number_of_negative_samples = %d>]\n"
" [-nstages <number_of_stages = %d>]\n"
" [-nsplits <number_of_splits = %d>]\n"
" [-mem <memory_in_MB = %d>]\n"
" [-sym (default)] [-nonsym]\n"
" [-minhitrate <min_hit_rate = %f>]\n"
" [-maxfalsealarm <max_false_alarm_rate = %f>]\n"
" [-weighttrimming <weight_trimming = %f>]\n"
" [-eqw]\n"
" [-mode <BASIC (default) | CORE | ALL>]\n"
" [-w <sample_width = %d>]\n"
" [-h <sample_height = %d>]\n"
" [-bt <DAB | RAB | LB | GAB (default)>]\n"
" [-err <misclass (default) | gini | entropy>]\n"
" [-maxtreesplits <max_number_of_splits_in_tree_cascade = %d>]\n"
" [-minpos <min_number_of_positive_samples_per_cluster = %d>]\n",
要注意的是 –nneg 的参数 = 实际的负样本数 * maxfalsealarm
因为第一次训练完成后,第二个级联的负样本数其实并没有百分百留下,其中有误判的负样本没有加载,所以-nneg如果为实际的负样本数,那么程序很有可能进入死循环,如果样本数不大,但是几个小时后还没有动静,那么就是进入死循环了,像上面的200个正样本,20个负样本基本上前10个级联是一分钟内完成,后面的级联几分钟一个,如果超过十分钟没有动静,那么就是进入死循环了。在这里,参数设置不正确,那么就会训练不成功,还有一个进入死循环的可能就是虚警率一直不能下来,就是maxfalsealarm的值一直居高不下,所以训练器一直在跑,导致结果一直不能停,如果训练一段时间,还在训练,参数没有问题的话,那么就应该适当的设置级联的数量,来停止训练,得到分类器。
用opencv_traincascade来训练的话可以结合TBB来多核处理,在
编译opencv时加入TBB。
用opencv_haarTraining训练出来的分类器会保存在当前目录下用-data的参数命名的xml文件里。
训练的过程可以随时停止,重新训练时,训练器会读取之前的参数,从停止的地方开始。
训练结束:

opencv_haar分类器的训练的更多相关文章
- 【原】训练自己haar-like特征分类器并识别物体(2)
在上一篇文章中,我介绍了<训练自己的haar-like特征分类器并识别物体>的前两个步骤: 1.准备训练样本图片,包括正例及反例样本 2.生成样本描述文件 3.训练样本 4.目标识别 == ...
- 【原/转】opencv的级联分类器训练与分类全程记录
众所周知,opencv下有自带的供人脸识别以及行人检测的分类器,也就是说已经有现成的xml文件供你用.如果我们不做人脸识别或者行人检测,而是想做点其他的目标检测该怎么做呢?答案自然是自己训练一个特定的 ...
- 如何利用OpenCV自带的级联分类器训练程序训练分类器
介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...
- opencv人脸检测分类器训练小结
这两天在初学目标检测的算法及步骤,其中人脸检测作为最经典的算法,于是进行了重点研究.该算法最重要的是建立人脸检测分类器,因此我用了一天的时间来学习分类器的训练.这方面的资料很多,但是能按照一个资料运行 ...
- opencv 训练自己的分类器汇总
原地址:http://www.cnblogs.com/zengqs/archive/2009/02/12/1389208.html OpenCV训练分类器 OpenCV训练分类器 一.简介 目标检测方 ...
- 自己训练SVM分类器进行HOG行人检测
正样本来源是INRIA数据集中的96*160大小的人体图片,使用时上下左右都去掉16个像素,截取中间的64*128大小的人体. 负样本是从不包含人体的图片中随机裁取的,大小同样是64*128(从完全不 ...
- [PyTorch入门之60分钟入门闪击战]之训练分类器
训练分类器 目前为止,你已经知道如何定义神经网络.计算损失和更新网络的权重.现在你可能在想,那数据呢? What about data? 通常,当你需要处理图像.文本.音频或者视频数据时,你可以使用标 ...
- OpenCV开发笔记(七十一):红胖子8分钟带你深入级联分类器训练
前言 红胖子,来也! 做图像处理,经常头痛的是明明分离出来了(非颜色的),分为几块区域,那怎么知道这几块区域到底哪一块是我们需要的,那么这部分就涉及到需要识别了. 识别可以自己写模板匹配.特征 ...
- 【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件文章目录:http:/ ...
随机推荐
- 用c#开发微信(5)自定义菜单设置工具 (在线创建)
读目录 1 使用 2 原理 3. 错误 上次写了<用c#开发微信 (4) 基于Senparc.Weixin框架的接收事件推送处理 (源码下载)>,有园友问到如何创建菜单的问题,今天就介绍下 ...
- TableLayoutPanel导致的闪屏问题
界面Load的时候添加对tableLayoutPanel的处理即可,还可设置窗体的DoubleBuffered属性为True tableLayoutPanel1.GetType().GetProper ...
- 个人项目框架搭建 -- Autofac简单使用记录
1.添加autofac相关程序集/使用Nuget 2.引入命名空间 using Autofac; using Autofac.Configuration; 3.使用 3.1:直接使用 var buil ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-4.设备驱动管理器的设计
目 录 第四章 设备驱动管理器的设计... 2 4.1 接口定义... 2 4.2 设备容器... 7 4.3 ...
- java多线程-线程池
线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等. 我们可以把并发执行的任务传递给一个线程池, ...
- float包裹性与破坏性及清除浮动几种方法
1. “清除浮动” ??准确的描述应该是“清除浮动造成的影响” 学习视频录制推荐的教程<CSS深入理解之float浮动> 2.如何清除浮动造成的影响??? 栗子 块级div元素包含一个内 ...
- CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案
一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...
- text-align=center 失效原因
text-align属性是针对 内联元素居中得属性设置,对于块状元素使用margin:0 auto;来控制居中: 笔者在设置一个h2标签时设置了text-align:center;但是却始终出现在中间 ...
- iOS笔记之NSSet
一.简介 NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合: NSSet , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的, ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q135-Q137)
Question 135 You work for a software company that sells Web Parts to customers. You designed the fi ...