0.预先准备
我们需要用到的是opencv自带的级联分类器:
主要是opencv_traincascade.exe和opencv_createsamples.exe;
位置类似:opencv/build/x64/vc15/bin;
只需要设置好opencv的环境变量即可;
在控制台直接输出函数:
1.准备样本:
准备的格式为存放正负样本的两个文件夹,以及2个txt文本描述:
这里负样本放在bg文件夹,文本描述在bg.txt;
这里正样本放在new_samples文件夹,文本描述在info.txt;
正样本图像大小已统一;
文本格式类似(记录图片的地址):
正样本的格式为:
例如1: 数字1表示图中一个目标,标示其在图像中的位置和大小的矩形为(140, 100, 45, 45)
在准备样本的过程中可能需要把大量文件夹的图片整合到一个文件夹并同意命名:
可参考:https://blog.csdn.net/sazass/article/details/92832942
代码输出指定内容txt描述文件,
可参考:https://blog.csdn.net/sazass/article/details/92833146
2.使用opencv_createsamples创建正样本vec格式
打开控制台,输出opencv_createsamples:
下面是各个参数的详解。
一般主要用到:
-info 正样本描述文件的地址
-vec 输出的vec文件地址
-w 正样本的宽
-h 正样本的高
-num 正样本数量(越少越快,一般不超过正样本库的数目)
其他参数可查看
https://blog.csdn.net/sean_xyz/article/details/80002266
开始创建(时间大约几分钟):
第二阶段结束。
注意:最开始opencv_createsamples创建的时候陷入到了无穷等待中:后来发现正样本的尺寸很乱,后来是直接统一了所有正样本的尺寸大小,规范了一下正样本描述文件的地址(格式可参考上步);然后再次创建就很快的成功了!
3.使用opencv_traincascade训练模型
打开控制台:
这里主要需要用到的参数详细说明:
https://blog.csdn.net/sazass/article/details/89196350
遇到问题:
这个问题应该是描述文件的地址问题,控制台若是在当前文件夹内则可用相对地址,否则需要用绝对地址。
正样本若整个图片都是一个目标,最好中描述文件中加入参数(坐标尺寸):1 0 0 24 36
还有一些是x64与x86的问题,灵活处理。
关于opencv_traincascade具体参数:
1.通用参数:
-stageType <BOOST(default)>
-data <cascade_dir_name> 目录名,如不存在训练程序会创建它,用于存放训练好的分类器。
vec <vec_file_name> 包含正样本的vec文件名(由 opencv_createsamples 程序生成)。
-bg <background_file_name> 背景描述文件,也就是包含负样本文件名的那个描述文件。
-numPos <number_of_positive_samples> 每级分类器训练时所用的正样本数目。
-numNeg <number_of_negative_samples> 每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目。
-numStages <number_of_stages> 训练的分类器的级数。
-precalcValBufSize <precalculated_vals_buffer_size_in_Mb> 缓存大小,用于存储预先计算的特征值(feature values),单位为MB。
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb> 缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB。内存越大,训练时间越短。
-baseFormatSave 这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储。
2.级联参数:
-stageType <BOOST(default)> 级别(stage)参数。目前只支持将BOOST分类器作为级别的类型。
-featureType<{HAAR(default), LBP}> 特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征。
-w <sampleWidth>
-h <sampleHeight> 训练样本的尺寸(单位为像素)。必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。
3.Boosted分类器参数:
-bt <{DAB, RAB, LB, GAB(default)}> Boosted分类器的类型: DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost。
-minHitRate <min_hit_rate> 分类器的每一级希望得到的最小检测率。总的检测率大约为 min_hit_rate^number_of_stages。
-maxFalseAlarmRate <max_false_alarm_rate> 分类器的每一级希望得到的最大误检率。总的误检率大约为 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> 每一级中的弱分类器的最大数目。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate.
4.类Haar特征参数:
-mode <BASIC (default) | CORE | ALL> 择训练过程中使用的Haar特征的类型。 BASIC 只使用右上特征, ALL 使用所有右上特征和45度旋转特征
5.LBP特征参数:
LBP特征无参数。
开始训练: