opencv 2.1网上查的另一种资料 训练分类器成功,在此与大家分享。 参考英文资料网址: http://note./SciSoftware/haartraining.html#e134e74e 样本训练要求 1、杯子的背景要统一吗,因为有些背景是白色,有些是淡淡的背景色,还有些深色的背景色 答:背景色要统一 2、整个图的大小就是最外面一个框框起来那么大, 问题是:我需要在原图基础上截图吗,如:只把红框框起来的那部分截出来???
答:不用的 3、那图片是256色的还是彩色的呢? 答:灰度最佳
5、一般来说,训练分类器用的什么 图片 就用什么 图片作测试 6、那正样本选择方面有没有要求,如玻璃杯 8、那关于杯子这个正样本,我要弄大约多少张图片呀? 9、负样本最好含有正样本中的背景部分
训练失败的原因很多: 1、负样本数目太少,导致Adaboost算法汉有跳出死循环, 2、负样本之间重复部分过多,或正样本尺寸过大,导致训练分类器时内在溢出。
.vec文件里的东西是用二进制的形式表示的。 本文现在正在做人头检测。视频中的人头尺寸,光照,角度都很不相同。 整个过程分为两步: 1. 创建样本 2. 训练分类器 3、 利用训练好的分类器进行目标检测。 现在让我一一讲述。 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) 结果如下:(1代表一个文件,0 0 20 20表示这个文件的2个顶点位置坐标) B. 为负样本创建集合文件格式文件bg.txt, 并且把这个文件放在与样本图片同一目录下,例如我的目录为I:/negdata a) 在命令行下 输入以下命令: dir /b > bg.txt b) 删除bg.txt最后一行的 “bg.txt” c) 结果如下:
三. 创建样本。 Opencv 自带有创建样本的exe 文件,在 …/OpenCV2.1/bin 目录下, 这里我创建120个sample: 命令是: opencv_createsamples.exe -info e:\test\posdata0\info.txt -vec e:\test\posdata0\pos.vec -num 120 -w 20 -h 20 如图:
结果如图:
(关于 opencv_createsamples.exe 的参数用法,在参考英文资料网址http://note./SciSoftware/haartraining.html#e134e74e,里有详细介绍; 需要说明的是,我这里用的参数并没有 –bg, 因为根据那份文档,有了 –vec 和 –info 之后,就表示:Create training samples from some (从很多正样本中创建sample, 没有distortions) 经历千辛万苦,我们终于看到sample被创建成功了,接下来的工作就简单多了 ▼训练分类器 还是在…/OpenCV2.1/bin目录下,输入命令: opencv_haartraining.exe -data e:\test\data0\cascade0 -vec e:\test\posdata0\pos.vec -bg e:\test\negdata0\negdata0.txt -npos 120 -nneg 120 -nsplits 2 -mem 512 -nonsym -w 20 -h 20 -minpos 100 -nstages 4
回车 (注意: 1. 参数-vec 一定要是刚刚创建样本产生的a.vec,且把完整路径也写上去,我试过用相对路径,但总会训练失败; bg.txt 也要用绝对路径; .vec文件里的东西是用二进制的形式表示的。 2. –w 和 –h 都要写上与样本大小的一致的尺寸 3. 若遇到“内存什么不能read”的问题,很有可能是bg.txt的格式有误,回去 4. 关于 opencv_haartraining.exe 的参数用法,在参考英文资料网址http://note./SciSoftware/haartraining.html#e134e74e,里有详细介绍 ) 结果如下: (可能实际结果与上图有出入, 但看到最后的 在E:\test\data0目录会生成一份cascade0.xml文档,这个就是我们想要的结果了! ============================================================================ OpenCV训练分类器制作xml文档之一 我的问题:有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad()这个函数加载他们,让他们对我们的人脸进行检测,但是,现在生活中的计算机视觉并不远远是检测人脸,还有很多物品需要识别,所以,能不能自己做个xml的检测文档,用它来检测自己需要的东西呢?例如,检测一个可乐瓶!
问题解决: 首先了解下,目标检测分为三个步骤: 1、 样本的创建 2、 训练分类器 3、 利用训练好的分类器进行目标检测。 一,样本的创建: (1)收集训练样本: 训练样本包括正样本和负样本。正样本,通俗点说,就是图片中只有你需要的目标。而负样本的图片只要其中不含有目标就可以了。但需要说明的是,负样本也并非随便选取的。例如,你需要检测的目标是汽车,那么正样本就应该是仅仅含有汽车的图片,而负样本显然不能是一些包含天空的,海洋的,风景的图片。因为你最终训练分类器的目的是检测汽车,而汽车应该出现在马路上。也就是说,分类器最终检测的图片应该是那些包含马路,交通标志,建筑物,广告牌,汽车,摩托车,三轮车,行人,自行车等在内的图片。很明显,这里的负样本应该是包含摩托车、三轮车、自行车、行人、路面、灌木丛、花草、交通标志、广告牌等。 另外,需要提醒的是,adaboost方法也是机器学习中的一个经典算法,而机器学习算法的前提条件是,测试样本和训练样本独立同分布。所谓的独立同分布,可以简单理解为:训练样本要和最终的应用场合非常接近或者一致。否则,基于机器学习的算法并不能保证算法的有效性。此外,足够的训练样本(至少得几千张正样本、几千张负样本)也是保证训练算法有效性的一个前提条件。 训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本(例如可乐瓶,人脸等),反例样本指其它任意图片,所有的样本图片都被归一化为同样的尺寸大小(例如,20x20)。1 、负样本(反例样本)可以来自于任意的图片,但这些图片不能包含目标特征。 负样本由背景描述文件来描述。背景描述文件是一个文本文件,每一行包含了一个负样本图片的文件名(基于描述文件的相对路径)。该文件必须手工创建。
2,正样本
现在,我们来看正样本的创建步骤: 正样本由程序createsample程序来创建。该程序的源代码由OpenCV给出,并且在bin目录下包含了这个可执行的程序。 …… info.txt e:\test\posdata B1_001.bmp …… 背景(负样本)描述文件negdata.txt的内容如下: 图片imag1.bmp包含了单个目标对象实体,矩形为(0,0,20,20)。 -info <collect_file_name> C:\Program Files\OpenCV\bin>createsamples -info e:\test\posdata\info.txt -vec e:\test\posdata\pos.vec -num 18 -w 20 -h 20【解释下】。。。。
小贴士1: 可以采用Dos命令生成样本描述文件(一般样本图片上万幅),在Dos下进入图片目录,输入dir /b *.bmp > negdata.txt, 则会在此目录中产生一个negdata.txt,文件中包含所有当前目录下的文件名,就可以建成负样本描述文件。对于正样本描述文件,方法同负样本,只要把bmp替换成1 0 0 20 20即可。如果样本图片太多,在txt中替换会导致程序无法响应,可以先把内容拷贝到word中替换后再拷贝回来。 小贴士2: 一些处理后的人脸图片的网址 http://www./challenges/VOC/databases.html#VOC2005_1 三、训练分类器 C:\Program Files\OpenCV\bin>haartraining -data e:\test\data\cascade -vec e:\test\posdata\pos.vec -bg e:\test\negdata\negdata.txt -npos 18 -nneg 45 -nsplits 1 -mem 512 -mode ALL -w 20 -h 20 -minhitrage 0.998 -maxfalsealarm 0.5 -nstages 训练开始,如下图,可能会一小段时间才训练完成。
(可能实际结果与上图有出入, 但看到最后的 在bin目录会生成一份可爱的data.xml文档,这个就是我们想要的结果了! 训练结束后,会在目录data下生成一些子目录,即为训练好的分类器。 训练结束后,还要使用haarconv.exe生成xml文件,可以通过下列网页下载。 http://www./forum/viewtopic.php?t=5181 重要!可能遇到的问题: 1.如果跑到某一个分类器时,几个小时也没有反应,而且显示不出训练百分比,这是因为你的负样本数量太少,或者负样本的尺寸太小,所有的负样本在这个分类器都被reject了,程序进入不了下一个循环,果断放弃吧。解决方法:负样本尽量要大一些,比如我的正样本是40*15,共300个,负样本是640*480,共500个。(我当时的错误就出现在这,把负本改大后,就成功了) 2.读取样本时报错:Negative or too large argument of CvAlloc function,网上说这个错误是因为opencv规定单幅iplimage的内存分配不能超过10000,可是我的每个负样本都不会超过这个大小,具体原因不明。后来我把负样本的数量减少,尺寸加大,这个问题就解决了。 3.训练的过程可能经常出错,耐心下来不要着急,我在训练MRI分类器的时候失败了无数次。失败的时候有两件事可以做,第一,调整正负样本的数量,再试。第二,调整负样本的大小,祝大家好运。 =============================================================================================
1.海尔训练
Usage: ./haartraining -data <dir_name> -vec <vec_file_name> -bg <background_file_name> [-npos <number_of_positive_samples = 2000>] [-nneg <number_of_negative_samples = 2000>] [-nstages <number_of_stages = 14>] [-nsplits <number_of_splits = 1>] [-mem <memory_in_MB = 200>] [-sym (default)] [-nonsym] [-minhitrate <min_hit_rate = 0.995000>] [-maxfalsealarm <max_false_alarm_rate = 0.500000>] [-weighttrimming <weight_trimming = 0.950000>] [-eqw] [-mode <BASIC (default) | CORE | ALL>] [-w <sample_width = 24>] [-h <sample_height = 24>] [-bt <DAB | RAB | LB | GAB (default)>] [-err <misclass (default) | gini | entropy>] [-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>] [-minpos <min_number_of_positive_samples_per_cluster = 500>]
$ haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 7000 -nneg 3019 -w 20 -h 20 -nonsym -mem 512 -mode ALL
[-bt <DAB | RAB | LB | GAB (default)>] [-err <misclass (default) | gini | entropy>] [-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>] [-minpos <min_number_of_positive_samples_per_cluster = 500>]
2.生成XML文件
$ convert_cascade --size="<sample_width>x<sampe_height>" <haartraining_ouput_dir> <ouput_file>
$ convert_cascade --size="20x20" haarcascade haarcascade.xml
|
|