haar训练

来源:互联网 发布:mac 文件夹改名 编辑:程序博客网 时间:2024/04/27 23:09

一、采集样本

1、 将正负样本分别放在两个不同的文件夹下面
       分别取名pos和neg,其中pos用来存放正样本图像,neg用来存放负样本

正样本统一成40*40像素(最好是正方形),像素数量越多训练越慢。负样本规格不作统一要求。

2、建立正负样本相关说明文件

在pos文件夹下运行:dir /b > pos.txt,这个时候会在pos文件加下面生成一个pos.txt文件,内容是pos文件夹内容名字列表,,打开pos.txt









我们对它进行如下编辑:
(1)、将BMP 替换成为 BMP 1 0 0 40 40(快捷键trl+h)
注意:1代表此图片出现的目标个数 后面的 0 0 40 40代表目标矩形框(0,0)到(40,40),用户可以根据自身需要调整数值。

(2)、删除txt文件最后一行pos.txt。


(1)、在neg文件夹下运行:dir /b > neg.txt,打开生成的txt,删除txt文件最后一行neg.txt。

二、创建模板

再根目录下运行:>opencv_createsamples -info pos\pos.txt -vec pos.vec -w 40 -h 40 -num 400

成功后会在根目录下生成pos.vec文件。

简单说明:

-w -h 证模板的宽高像素数目     -num 正模板数量

三、训练模板 生成xml文件

根目录下opencv_haartraining.exe -data xml -vec pos.vec -bg neg\neg.txt  -mem 512 -mode ALL -w 40 -h 40

  说明: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为单位的可用内存。内存越大则训练的速度越快。
symdefault
nonsym
    指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对称的。
minhitrate<min_hit_rate>
    每个阶段分类器需要的最小的命中率。总的命中率为min_hit_ratenumber_of_stages次方。
maxfalsealarm<max_false_alarm_rate>
    没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_ratenumber_of_stages次方。
weighttrimming<weight_trimming>
    指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9
eqw
mode<basic(default)|core|all>
    选择用来训练的haar特征集的种类。basic仅仅使用垂直特征。all使用垂直和45度角旋转特征。
w<sample_width>
h<sample_height>
    训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。
一个训练分类器的例子:

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

这一步时间较长 正模板400个 负模板300个在我的用时大概6个小时。