1. opencv_createsamples
用来生成正样本vec的,用来准备训练用的正样本数据和测试数据。他的输出为以 *.vec 为扩展名的文件,该文件以二进制方式存储图像。
Usage: opencv_createsamples.exe
[-info <collection_file_name>] //就是跟存放正样本图片目录位置相同的描述文件的路径,可用txt,dat等格式保存,每一行的内容为:xxx.jpg nums left_x left_y width heght。
[-img <image_file_name>] //如果你要通过一张图片的扭曲形变成多张图片作为样本,就填写这个参数,参数的内容为要扭曲的图片的路径。填入后,-info参数不再有效。
[-vec <vec_file_name>] //要生成用于训练的vec文件的路径,内容为:xxx/xxx/xxx/xxx.vec。
[-bg <background_file_name>] //如果省略,则使用bgcolor的值填充作为背景。就是跟存放负样本图片(背景图片)目录位置相同的描述文件的路径,可用txt,dat等格式保存,每一行的内容为:xxx.jpg。
[-num <number_of_samples = 1000>] //要创建的样本的数量,使用-info生成时,不要比你准备的正样本图片数量大就行了。
[-bgcolor <background_color = 0>] //这是创建样本是样本扭曲函数中用来决定像素是有效还是作为背景过滤的基本值,因为操作的是灰度图,所以这个值0范围是~255。
[-inv] [-randinv] [-bgthresh <background_color_threshold = 80>]
//这是样本生成时,是否需要反相或随机反相,这个在车牌这样的数字中就需要,比如说白底黑字的车牌和蓝底白字的车牌,两者生成的样本是相反的,前者数字是黑色,后者数字是白色。所以这个参数按你实际需要使用吧。
[-maxidev <max_intensity_deviation = 40>] //一个用于生成前景(有效像素区域)灰度值的常数值,实际样本的前景灰度值会根据这个参数结合随机数产生多种不同的灰度值。
[-maxxangle <max_x_rotation_angle = 1.100000>] //对样本图片的x轴方向的扭曲的最大弧度,X轴即是图片水平方向的旋转。
[-maxyangle <max_y_rotation_angle = 1.100000>] //对样本图片的y轴方向的扭曲的最大弧度,Y轴即是图片竖直方向的旋转。
[-maxzangle <max_z_rotation_angle = 0.500000>] //对样本图片的z轴方向的扭曲的最大弧度,Z轴即是垂直于图像平面的方向的旋转(可理解为旋转轴是一条穿过显示器的垂线)。
[-show [<scale = 4.000000>]] //样本创建期间,是否通过imshow显示出每一个生成的样本图片出来。
[-w <sample_width = 24>] //要创建的样本图片的宽度,后面的训练样本步骤要使用和这时一样的值,不然会报错
[-h <sample_height = 24>] //要创建的样本图片的高度,后面的训练样本步骤要使用和这时一样的值,不然会报错
[-maxscale <max sample scale = -1.000000>] [-rngseed <rng seed = 12345>]
创建
opencv_createsamples.exe -info D:\test\code\cascadetrain\positive\info.dat -vec D:\test\code\cascadetrain\pos.vec -num 150 -w 24 -h 24
1. opencv_traincascade
用来训练数据
常见参数:
-data <cascade_dir_name> : 训练过的分类器应该存储在哪里。这个文件夹应该手动创建。
-vec <vec_file_name> : 具有正样本的vec-文件(由opencv_createsamples utility创建)。
-bg <background_file_name> : 背景描述文件。包含负样品图像的文件。
-numPos <number_of_positive_samples> : 每个分类器阶段训练中使用的正样本数。
-numNeg <number_of_negative_samples> : 每个分类器阶段训练中使用的负样本数。
-numStages <number_of_stages> : 要训练的梯度(cascsde stages)的数目。
-precalcValBufSize <precalculated_vals_buffer_size_in_Mb> : 预先计算的特征值的缓冲区大小(单位为MB)。您分配的内存越多,培训过程越快,但是请记住,-precalcValBufSize和 -precalcIdxBufSize组合不应超过可用的系统内存。
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb> : 预先计算的特征索引的缓冲区大小(在MB中)。您分配的内存越多,培训过程越快,但是请记住,-precalcValBufSize和 -precalcIdxBufSize组合不应超过可用的系统内存。
-baseFormatSave : 这个参数在Haar-like特征的情况下通用。如果它被指定,梯度将以旧格式保存。这仅适用于向后兼容性的原因,并且允许用户坚持旧的已弃用的接口,至少使用新的接口来训练模型。
-numThreads <max_number_of_threads> : 训练期间要使用的最大线程数。请注意,实际使用的线程数可能较低,这取决于您的计算机和编译选项。默认情况下,如果使用TBB支持构建OpenCV,则可以选择最大可用线程,这是优化的必要条件。
-acceptanceRatioBreakValue <break_value> : 这个参数被用来确定你的模型应该保持精确的学习和何时停止。一个好的准则是训练不要超过10e^-5,以确保模型不会对你的训练数据造成过度训练。默认情况下,此值设置为-1,以禁用此功能。
级联参数:
-stageType <BOOST(default)> : 阶段的类型。目前仅支持增强型分类器作为阶段类型。
-featureType<{HAAR(default), LBP}> : 特征类型:HAAR - Haar-like features, LBP - local binary patterns。
-w <sampleWidth> : 训练样本的宽度(以像素为单位)。必须与训练样本创建时使用的值完全相同(opencv_createsamples utility)
-h <sampleHeight> : 训练样本的高度(以像素为单位)。必须与训练样本创建时使用的值完全相同(opencv_createsamples utility)
增强分类器参数:
-bt <{DAB, RAB, LB, GAB(default)}> : 增强分类器类型:DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost。
-minHitRate <min_hit_rate> : 分类器的每个阶段的最小期望命中率。总体命中率可估计为 (min_hit_rate ^ number_of_stages), [192]
-maxFalseAlarmRate <max_false_alarm_rate> : 分类器的每个阶段的最大期望虚警率(false alarm rate)。整体虚警率可估计为(max_false_alarm_rate ^ number_of_stages), [192]
-weightTrimRate <weight_trim_rate> : 指定是否应该使用修整和它的重量。一个不错的选择是0.95。
-maxDepth <max_depth_of_weak_tree> : 弱树(weak tree)的最大深度。一个不错的选择是1,就是树桩(stumps)的例子。
-maxWeakCount <max_weak_tree_count> : 每个梯度的弱树的最大计数。增强分类器(阶段)将有许多弱树(<=maxWeakCount),根据需要实现给定的 -maxFalseAlarmRate。
haarFeature参数:
-mode <BASIC (default) | CORE | ALL> : 选择在训练中使用的Haar特征集的类型。基本使用只有直立功能,而全部使用全套直立和45度旋转特征集。
训练
opencv_traincascade.exe -data D:\test\code\cascadetrain\xml -vec D:\test\code\cascadetrain\pos.vec -bg bg.txt -numPos 100 -numNeg 300 -numStages 12 -w 24 -h 24 -minHitRate 0.996 -maxFalseAlarmRate 0.5 -mode ALL