Opencv 级联分类器


介绍

  • OpenCV提供了两个程序可以训练自己的级联分类器:

  • opencv_haartraining。

  • opencv_traincascade。(新版本的opencv中只存在该分类器)

  • opencv_traincascade是一个新程序,使用OpenCV 2.x API 以C++编写。

  • 这二者主要的区别是opencv_traincascade支持 Haar和 LBP (Local Binary Patterns)两种特征,并易于增加其他的特征。与Haar特征相比,LBP特征是整数特征,因此训练和检测过程都会比Haar特征快几倍。

注:Haar: Haar特征分类器就是一个XML文件,存放在OpenCV安装目录中的\data\ haarcascades目录下;LBP是本地二进制模型

  • LBP和Haar特征用于检测的准确率,是依赖训练过程中的训练数据的质量训练参数

  • 训练一个与基于Haar特征同样准确度的LBP的分类器是可能的。

  • 与其他分类器模型的训练方法类似,同样需要训练数据与测试数据;其中训练数据包含正样本pos与负样本neg。

  • 训练程序opencv_haartraining.exe与opencv_traincascade.exe对输入的数据格式是有要求的,所以需要相关的辅助程序:

    • opencv_createsamples 用来准备训练用的正样本数据和测试数据。其能够生成能被opencv_haartraining 和 opencv_traincascade 程序支持的正样本数据。它的输出为以 *.vec 为扩展名的文件,该文件以二进制方式存储图像。

实战演练

opencv级联分类器训练与测试可分为以下四个步骤:

  • 1、准备训练数据
  • 2、训练级联分类器
  • 3、测试分类器性能
  • 4、使用训练好的分类器进行目标检测

操作步骤

1、准备正样本

  • 正样本由opencv_createsamples生成。正样本可以由包含待检测物体的一张图片生成,也可由一系列标记好的图像生成。
  • 1、首先提前准备好已经处理过得正样本图片(可根据实际情况进行图片去噪声等处理,提高精度)
  • 2、生成pos.dat文件,文件格式如下
第一列 第二列 第三列 第四列 第五列 第六列
图片名 图片中包含的
物体实例数
目标区域x值 目标区域y值 图片宽 图片高
xxx.png 1 0 0 16 16

注:图片名为相对路径,后面五列根据实际情况填写。可通过脚本代码读取文件生成该文件,(我已写好一份,需要可给我留言)

pos.dat文件的生成方式: 在dos窗口进入pos文件夹,输入dir /b > pos.dat ; 这样只能生成文件名列表,后面的正样本个数与位置尺寸还需手动添加

  • 3、调用opencv_createsamples.exe程序根据pos.dat创建pos.vec文件.

      opencv_createsamples.exe -info pos.dat -vec pos.vec -num 2327 -w 19 -h 23
    

opencv_createsamples.exe程序的命令行参数解析:

参数名 描述
-info < collection_file_name > 描述物体所在图像以及大小位置的描述文件。
-vec < vec_file_name> 输出文件,内含用于训练的正样本。
-img < image_file_name> 输入图像文件名(例如一个公司的标志)。
-bg< background_file_name> 背景图像的描述文件,文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景。
-num< number_of_samples> 生成的正样本的数目。
-bgcolor < background_color> 背景颜色(目前为灰度图);背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差可以由-bgthresh指定。所有处于bgcolor-bgthresh和bgcolor+bgthresh之间的像素都被设置为透明像素。
-bgthresh < background_color_threshold> 配合bgcolor使用
-inv 如果指定该标志,前景图像的颜色将翻转。
-randinv 如果指定该标志,颜色将随机地翻转。
-maxidev < max_intensity_deviation> 前景样本里像素的亮度梯度的最大值。
-maxxangle < max_x_rotation_angle> X轴最大旋转角度,必须以弧度为单位。
-maxyangle < max_y_rotation_angle> Y轴最大旋转角度,必须以弧度为单位。
-maxzangle< max_z_rotation_angle> Z轴最大旋转角度,必须以弧度为单位。
-show 很有用的调试选项。如果指定该选项,每个样本都将被显示。如果按下Esc键,程序将继续创建样本但不再显示。
-w < sample_width> 输出样本的宽度(以像素为单位)。
-h< sample_height> 输出样本的高度(以像素为单位)。

2、准备负样本

  • 负样本可以是任意图像,但是这些图像中不能包含待检测的物体
  • 用于抠取负样本的图像文件名被列在一个neg.dat文件中。
  • 生成方式与正样本相同,但仅仅包含文件名列表就可以了。
  • 每行是一个文件名(包括相对目录和文件名)这些图像可以是不同的尺寸,但是图像尺寸应该比训练窗口的尺寸大,因为这些图像将被用于抠取负样本,并将负样本缩小到训练窗口大小。

文件格式

第一列
图片名
xxx.png
  • 同样,通过脚本生成neg.dat文件

3、训练级联分类器

  • OpenCV提供了两个可以训练的级联分类器的程序:
    • opencv_haartraining
    • opencv_traincascade
  • opencv_haartraining是一个将被弃用的程序;opencv_traincascade是一个新程序。

调用opencv_traincascade.exe执行训练

opencv_traincascade.exe -data "E:\learning\imagedata\pukepai\data" -vec "E:\learning\imagedata\pukepai\pos\pos.vec" -bg "E:\learning\imagedata\pukepai\neg\neg.dat" -numPos 1500 -numNeg 1500 -numStages 20 -mem 2048 -featureType LBP -w 19 -h 23

opencv_createsamples.exe程序的命令行参数解析:

参数名 描述
通用参数
-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特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储。
级联参数
-stageType < BOOST(default)> 级别(stage)参数。目前只支持将BOOST分类器作为级别的类型。
-featureType<{HAAR(default), LBP}> 特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征。
-w < sampleWidth> 训练样本的宽度(单位为像素)。必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。
-h < sampleHeight> 训练样本的高度(单位为像素)。必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。
Boosted分类器参数:
-bt < {DAB, RAB, LB,GAB(default)}>
DAB - DiscreteAdaBoost,
RAB - Real AdaBoost,
LB - LogitBoost,
GAB -Gentle AdaBoost
Boosted分类器的类型:
-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 trimmingshould be used and its weight.一个还不错的数值是0.95。
-maxDepth < max_depth_of_weak_tree> 弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps)。
-maxWeakCount< max_weak_tree_count> 每一级中的弱分类器的最大数目。The boostedclassifier (stage) will have so many weak trees (<=maxWeakCount), as neededto achieve the given -maxFalseAlarmRate
类Haar特征参数:
-mode < BASIC (default) CORE ALL> 选择训练过程中使用的Haar特征的类型。 BASIC 只使用右上特征, ALL使用所有右上特征和45度旋转特征。
LBP特征参数:
LBP特征无参数。

4、测试分类器性能

  • opencv_performance 可以用来评估分类器的质量,但只能评估 opencv_haartraining 输出的分类器。它读入一组标注好的图像,运行分类器并报告性能,如检测到物体的数目,漏检的数目,误检的数目,以及其他信息。同样准备测试数据集test,生成图像列表文件,格式与训练者正样本图像列表相同,需要标注目标文件的个数与位置。

opencv_performance 的命令行参数解析:

参数名 描述
-data < classifier_directory_name> 训练好的分类器
-info < collection_file_name> 描述物体所在图像以及大小位置的描述文件
-maxSizeDiff < max_size_difference =1.500000>
-maxPosDiff < max_position_difference =0.300000>
-sf < scale_factor = 1.200000>
-ni 选项抑制创建的图像文件的检测
-nos < number_of_stages = -1>
-rs < roc_size = 40>]
-w < sample_width = 24>
-h < sample_height = 24>

附opencv_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> 训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 81,546评论 1 179
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 28,523评论 1 144
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 33,320评论 0 105
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 18,135评论 0 90
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 23,447评论 0 148
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 19,314评论 1 88
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 12,030评论 2 165
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 11,423评论 0 80
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 9,945评论 5 114
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 13,194评论 0 130
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 11,926评论 1 128
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 12,785评论 0 133
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 7,561评论 0 18
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 10,371评论 2 119
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 13,558评论 3 129
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 9,146评论 0 3
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 9,441评论 0 80
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 14,111评论 2 137
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 14,602评论 2 134

推荐阅读更多精彩内容