一、参考资料

感谢以下两位博主的资料(侵删):

http://blog.csdn.net/qq_26625581/article/details/78201833

http://blog.csdn.net/yeyang911/article/details/17753033

http://blog.csdn.net/u013355191/article/details/40381107


二、准备正负样本

这里我为大家提供了一个小程序以供大家方便的采集样本(2个资源币是已经是最低,醉了)

        http://download.csdn.net/download/qq_26625581/10023356


三、创建一个新的文件夹,

并把当时opencv编译的build目录下的opencv_createsample.exe和opencv_traincascade.exe,并创建pos文件夹(放正样本)和neg文件夹(放负样本)

用cmd分别进入pos和neg目录下,使用dir /b > pos.txt(dir /b > neg.txt)命令,把文件路径拷贝到描述文件中。

Opencv Qt 学习笔记(三) 级联器的训练

使用notepad++之类的程序,打开描述文件,把原有的路径描述修改成这样,最后两个参数是图片大小。

Opencv Qt 学习笔记(三) 级联器的训练

neg文件夹里面的负样本不用后面的描述参数。

Opencv Qt 学习笔记(三) 级联器的训练



、生成.vec文件

使用cmd进入到两个.exe文件所在的文件夹,使用opencv_createsample.exe生成.vec。

-vec(生成的.vec文件名) -info(正样本描述文件) -bg(负样本的描述文件) -w-h(正样本大小) -num(正样本数量)

Opencv Qt 学习笔记(三) 级联器的训练

成功输出:

Opencv Qt 学习笔记(三) 级联器的训练



五、训练级联器

创建一个data文件夹。

使用opencv_traincascade.exe训练。-data(cascade.xml生成目录)

(重点!-numPos和-numNeg正负样本数要比实际的少一点,不然会不通过)

(重点!如果出现OutOfMemoryError的错误是x86平台限制适当调小正负样本数,或者移动到x64平台)

(重点!-featureType对正样本有大小限制(HAAR是20*20)(HOG好像没有?)(LBP好像是26*26?))

Tips:美图秀秀可以批量更改图片大小

我是用Haar的因为OpenCV默认的人脸识别例程是使用Haar识别的,方便测试。

Opencv Qt 学习笔记(三) 级联器的训练

通用参数:

-data <cascade_dir_name>:目录用于保存训练产生的分类器xml文件和中间文件(对于上面的LBP_classifier),如不存在训练程序会创建它;

-vec <vec_file_name>:由 opencv_createsamples 程序生成的包含正样本的vec文件名(对应上面的pos_24_24.vec);

-bg <background_file_name>:背景描述文件,也就是包含负样本文件名的那个描述文件(对应上面的neg\neg.txt);

-numPos <number_of_positive_samples>:每级分类器训练时所用的正样本数目(默认值为2000);
-numNeg <number_of_negative_samples>:每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目(默认值为1000);

-numStages <number_of_stages>:训练的分类器的级数(默认值为20级);

-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征值(feature values),单位为MB(默认值为256);
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB(默认值为256);

内存越大,训练时间越短。
-baseFormatSave:这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储(默认不指定该参数项,此时其值为false;一旦指定则其值默认为true);

级联参数:CvCascadeParams类,定义于cascadeclassifier.h
-stageType <BOOST(default)>:级别(stage)参数。目前只支持将BOOST分类器作为级联的类型;
-featureType<{HAAR(default), LBP}>:特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征(默认Harr);
-w <sampleWidth>:训练样本的宽(单位为像素,默认24);
-h <sampleHeight>:训练样本的高(单位为像素,默认24);
训练样本的尺寸必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。

Boosted分类器参数:CvCascadeBoostParams类,定义于boost.h
-bt <{DAB, RAB, LB, GAB(default)}>:Boosted分类器的类型(DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost为默认);
-minHitRate <min_hit_rate>:分类器的每一级希望得到的最小检测率(默认值为0.995),总的检测率大约为 min_hit_rate^number_of_stages;
-maxFalseAlarmRate <max_false_alarm_rate>:分类器的每一级希望得到的最大误检率(默认值为0.5),总的误检率大约为 max_false_alarm_rate^number_of_stages;
-weightTrimRate <weight_trim_rate>:Specifies whether trimming should be used and its weight,一个还不错的数值是0.95;
-maxDepth <max_depth_of_weak_tree>:弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps);
-maxWeakCount <max_weak_tree_count>:每一级中的弱分类器的最大数目(默认值为100)。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate;



六、完成

Opencv Qt 学习笔记(三) 级联器的训练

相关文章:

  • 2021-08-06
  • 2021-08-16
  • 2018-06-24
  • 2021-12-29
  • 2018-10-15
  • 2021-08-15
  • 2021-11-15
  • 2017-11-26
猜你喜欢
  • 2021-12-03
  • 2021-12-03
  • 2021-12-03
  • 2018-06-21
  • 2021-10-03
  • 2021-10-06
  • 2021-10-03
  • 2021-08-15
相关资源
相似解决方案