转载自:http://zhan.renren.com/xjtuopencv?gid=3602888498033866847
训练过程就是上面的三步
关于正负样本的一些理解:
正样本即包括目标的图片,一般较小(教程里提到的一般是24*24 20*20 18*18<单位是像素> 但是在实际做的时候总有种太模糊,什么都看不清的感觉,我觉得应该可以适当的加大图像,提供更多细节试试,虽然这必然会导致更多的运算时间,而且在进行处理之前,应将所有正样本进行标准化处理<统一大小,转化为灰度图>)
负样本,与正样本相反很容易理解,即任何不包含检测目标的图像,对负样本的标准化处理并不严格,仅有:灰度图 <可能也能使用彩图,在选项里又看到bgcolor这个选项> ,对图像的大小的限制是大于正样本尺寸(必须满足,是由于训练器的算法决定),同时负样本的数量一般远多于正样本的数量(2-3倍或以上的样子)
关于合适的样本数量,教程还有opencv中推荐的都是正样本1000+,负样本3000+,这意味着训练时间会很长(目测一晚上+),当然如果你只是来试试看训练方法怎么样,那么可是使用少量样本比如100+的正样本。
下面进入正题:
首先我们要获得一个正样本的描述文件
用于描述正样本文件名(包括绝对路径或相对路径),
正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:
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
…
其中face_100/是相对路径,face00001.bmp是图片名称,1 0 0 20 20 分别表示 1张图片,本样本左下角坐标(不一定是左下,但是肯定是距离原点最近的点)是0 0,右上角的坐标(同样的道理不一定是右上角)是20 20
具体方法是在Dos 下的恰当目录敲入dir/b > samples.dat,则会生成一个samples.dat,里面包含所有正样本文件名列表,但没有相对路径名和正样本位置信息。在samples.dat 文件各行行首增加“face _100/”的方法是使用文本编辑器替换功能,先选中所有行,然后按Tab 键为每行增加一个制表位,然后将制表位全部替换为“face _100/”即可。通过将“bmp”替换为“bmp 1 0 0 20 20”即可在每行添加“1 0 0 20 20”。
注释:图片文件的格式不局限与bmp jpg png都行,其他格式的没试过,估计opencv支持的都可以
运行 CreateSamples.exe 程序。下面是一个运行参数示例:
-info F:\FaceDetect\samples.dat -vec F:\FaceDetect\samples.vec -num 200 -w 20 -h 20
表示有200 个样本,样本宽20,高20,正样本描述文件为samples.dat,结果输出到samples.vec。
运行完了会生成一个*.vec 的文件。
对于负样本的描述文件其处理方法与正样本基本相同,但是一个负样本的描述文件应该是做到这样的程度:
face_100/face00001.bmp
face_100/face00002.bmp
face_100/face00003.bmp
即只有图片的路径,名称,而没有图片数量大小的描述,而且其也不是vec文件,而是dir /b>时所指定的文件
非常重要的一点,所有的样本描述的条目中,路径和文件名内部不允许出现空格,原因自己想
样本创建之后,接下来要训练分类器,这个过程是由haartraining 程序来实现的。该程序源
码由OpenCV 自带,且可执行程序在OpenCV 安装目录的bin 目录下。
Haartraining 的命令行参数如下:
-data
存放训练好的分类器的路径名。
-vec
正样本文件名(由trainingssamples 程序或者由其他的方法创建的)
-bg
背景描述文件。
-npos
-nneg
用来训练每一个分类器阶段的正/负样本。合理的值是:nPos = 7000;nNeg = 3000
-nstages
训练的阶段数。
-nsplits
决定用于阶段分类器的弱分类器。如果1,则一个简单的stump classifier 被使用。如果是2
或者更多,则带有number_of_splits 个内部节点的CART 分类器被使用。
-mem
预先计算的以MB 为单位的可用内存。内存越大则训练的速度越快。
-sym(default)
-nonsym
指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对
称的。
-minhitrate《min_hit_rate》
每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate 的number_of_stages 次
方。
-maxfalsealarm
没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate 的
number_of_stages 次方。
-weighttrimming
指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9
-eqw
-mode
选择用来训练的haar 特征集的种类。basic 仅仅使用垂直特征。all 使用垂直和45 度角旋转
特征。
-w《sample_width》
-h《sample_height》
训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。
一个训练分类器的例子:
"D:\Program Files\OpenCV\bin\haartraining.exe" -data data\cascade -vec data\pos.vec
-bg negdata\negdata.dat -npos 49 -nneg 49 -mem 200 -mode ALL -w 20 -h 20
训练结束后,会在目录data 下生成一些子目录,即为训练好的分类器。
值得提醒的是xml文件在于data目录同级的目录下<如果训练成功的话>
我在试着训练时使用的参数
注意 -nsplits 这个选项应该尽量设置成2(到底有没有更高的值,我也不知道,应该有吧),这样会获得起码比较细致的训练过程,如果选1 的话,我不知道你们会怎么样,反正我是只得到了一个6k大小的xml文件,几乎不能用