手把手教你训练分类器

转载自: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<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》

训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。

一个训练分类器的例子:

"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(到底有没有更高的值,我也不知道,应该有吧),这样会获得起码比较细致的训练过程,如果选的话,我不知道你们会怎么样,反正我是只得到了一个6k大小的xml文件,几乎不能用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章