'Opencv级联分类器'

  发布日期:   2018-11-07
  最新修改:   2020-02-17
  阅读次数:   52 次

介绍

  • 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
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
-w < sample_width>
-h< sample_height> 训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。

更多资源:

  • 自己写了一些处理数据的代码,需要可留言

https://pythonprogramming.net/haar-cascade-object-detection-python-opencv-tutorial/


   转载规则

《'Opencv级联分类器'字》GajAngels 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。