目标检测的模型haartraining培训

目标检测的程序如人脸检测,但其中需要一个培训文件 haarcascade_frontalface_default.xml。对于不同的检测目标,这个文件不同,怎么得到这个文件呢?这就是本文要介绍的。

最开始在网上查找,有很多介绍,其中需要几个培训用的执行文件。在我的新版本4.x opencv 里找不到,后来听说只有3.x 的版本里有。我下载了一个opencv 3.4.7,找到了介绍中的执行文件。我想opencv 里应该也有介绍,opencv 3.4.7 版本里只有markdown 类文件,可以用Typora 阅读。后来在我的opencv 3.0beta版本里找到了html,其目录路径是:

file:///E:/opencv/sources/doc/haartraining.htm

本文就以他们的内容为蓝本吧。

两个阶段:训练阶段和检测阶段。 对象检测中介绍了使用基于HAAR或LBP模型的检测阶段。 本文概述了训练自己的分类级联所需的功能。 其包括不同阶段:收集训练数据,准备训练数据并执行实际模型训练。

为了支持本教程,将使用几个官方的OpenCV应用程序:opencv_createsamples ,opencv_annotation,opencv_traincascade和 opencv_visualisation。

这些文件可以在我的网站下载:www.liwensoft.com/downloads/train.zip  我测试了一下下载,因为有好些都是执行文件,容易提示危险。

比较安全的方法是下载opencv3.x 的版本,我的这些文件在这个目录下:C:\opencv347\opencv\build\x64\vc15\bin 。据说4以后的版本就不会有这些文件了。

 

提示:

opencv_traincascade支持HAAR 和LBP(局部二进制模式)。与HAAR产生浮点精度特征相比,LBP特征产生整数精度,因此LBP的训练和检测速度都比HAAR特征快几倍。关于LBP和HAAR的检测质量,主要取决于所使用的训练数据和选择的训练参数。可以训练基于LBP的分类器,该分类器将在训练时间的一定百分比内提供与基于HAAR的分类器几乎相同的质量。

 opencv_traincascade应用程序可以使用TBB进行多线程处理。要在多核模式下使用它,必须在启用TBB支持的情况下构建OpenCV。

准备训练数据

为了训练分类增强级联,我们需要一组正样本(包含要检测的实际对象)和一组负图像(包含不想检测的所有内容)。 负样本集必须手动准备,而正性样本集是使用opencv_createsamples应用程序创建的。

负样本

从任意图像中获取负样本。 这些图像不得包含检测对象。 负样品通过背景描述文件传递, 它是一个文本文件,其中每个文本行都包含负样本图像的文件名(相对于描述文件的目录)。 该文件必须手动创建。 注意,负样本和样本图像也称为背景样本或背景样本图像,在本文档中可互换使用

负样本描述文件示例:

假如文件目录如下:

/img

  img1.jpg

  img2.jpg

bg.txt

那么文件 bg.txt 内容:

img/img1.jpg

img/img2.jpg

正样本

正样本由opencv_createsamples应用程序创建。增强过程使用它们来定义在尝试找到感兴趣的对象时模型应实际寻找的内容。该应用程序支持两种生成正样本数据集的方式。

  1.可以从单个正对象图像生成一堆正值。
  2.可以自己提供所有正样本的内容,仅使用该工具将其切出,调整大小并以opencv所需的二进制格式放置。

虽然第一种方法对固定对象(例如非常刚性的徽标)效果不错,但对于刚性较差的对象,它往往很快就会失效。在这种情况下,我们建议使用第二种方法。网络上的许多教程甚至都指出,通过使用opencv_createsamples应用程序,可以生成100个真实对象图像,而不是1000个人工生成的正值。但是,如果您决定采用第一种方法,请记住以下几点:

在将其提供给上述应用程序之前,您需要多个正样本,因为它仅应用透视变换。
如果您想要一个健壮的模型,请获取涵盖对象类中可能出现的各种变化的样本。例如,对于面孔,您应该考虑不同的种族和年龄段,情绪以及胡须风格。当使用第二种方法时,这也适用。

第一种方法采用带有公司徽标的单个对象图像,并通过随机旋转对象,更改图像强度以及将图像放置在任意背景上,从给定的对象图像中创建大量正样本。随机性的数量和范围可以由opencv_createsamples应用程序的命令行参数控制。

命令行参数:

-vec <vec文件名>  包含用于训练的阳性样本的输出文件的名称

-img <图像文件名>  源对象图像(例如公司徽标)

-bg <background_file_name>  背景描述文件;包含一张图像列表,其中粘贴了对象的随机变形版本以生成正样本

-num <样本数>  产生的正样本数

-bgcolor <background_color>      背景颜色,和下面组合

-bgthresh <background_color_threshold> 背景颜色容忍度,和上面组合

     假设当前为灰度图像, bgcolor-bgthresh和bgcolor + bgthresh之间的所有像素均视为透明。

-inv      如果指定,颜色将被反转

-randinv       如果指定,颜色将随机反转

-maxidev <最大强度偏差>   前景样本像素的最大强度偏差

-maxxangle <max_x_rotation_angle>,

-maxyangle <max_y_rotation_angle>,

-maxzangle <max_z_rotation_angle>      最大旋转弧度角

-show      如果指定,将显示每个样本。按“ Esc”将继续创建过程,而不会显示示例。有用的调试选项。

-w <sample_width>   输出样本的宽度(以像素为单位)

-h <sample_height>  输出样本的高度(以像素为单位)

当运行opencv_createsamples时,将使用以下过程创建示例对象实例:给定的源图像围绕所有三个轴随机旋转。所选角度受“ -maxxangle”,“-maxyangle”和“ -maxzangle”限制。然后,像素具有[bg_color-bg_color_threshold; bg_color + bg_c​​olor_threshold]范围被解释为透明。白噪声被添加到前景的强度。如果指定了“ -inv”键,则前景像素强度将反转。如果指定了-randinv键,则算法会随机选择是否应对该样本应用反演。最后,将获得的图像从背景描述文件放置到任意背景上,将其调整为由-w和-h指定的所需大小,并存储到由-vec命令行指定的vec文件中选项。

也可以从以前标记的图像的集合中获取正样本,这是构建鲁棒对象模型时的理想方式。该集合由类似于背景描述文件的文本文件描述。该文件的每一行都对应一个图像。该行的第一个元素是文件名,第2是对象数量,后跟描述包围矩形(x,y,宽度,高度)的对象坐标的数字。

正样本目录结构如下:

/img

  img1.jpg

  img2.jpg

info.dat

 则文件 info.dat 内容如下:

img/img1.jpg  1  140 100 45 45

img/img2.jpg  2  100 200 50 50   50 30 25 25

图像img1.jpg包含具有边界矩形(140、100、45、45)的单个对象实例。

图像img2.jpg包含两个对象实例。

为了从此类集合创建正样本,应指定–info参数而不是–img:

 

使用OpenCV的集成注释工具

从OpenCV 3.x开始,社区一直在提供和维护开源注释工具,该工具用于生成`-info`文件。如果构建了OpenCV应用程序,则可以通过命令opencv_annotation访问该工具。

使用该工具非常简单。该工具接受几个必需参数和一些可选参数:

 `--annotations` <b>(必需)</ b>:注释txt文件的路径,您要在其中存储注释,然后将其传递给`-info`参数[示例-/ data / annotations。文本]
 `--images` <b>(必填)</ b>:包含带有对象图像的文件夹的路径[示例-/ data / testimages /]
 `--maxWindowHeight` <i>(可选)</ i>:如果输入图像的高度大于此处的给定分辨率,请使用--resizeFactor调整图像的大小以便于注释。
 -`--resizeFactor` <i>(可选)</ i>:使用`--maxWindowHeight`参数时用于调整输入图像大小的因素。

请注意,可选参数只能一起使用。可以使用的命令示例如下所示

训练

样本创建后的下一步是训练分类器。 它由haartraining实用程序执行。

命令行参数:

-data <dir_name>      存储受过训练的分类器的目录名称

-vec <vec文件名>      正样本文件的文件名(通过trainingsamples实用程序或通过任何其他方式创建)

-bg <background_file_name>      背景描述文件

-npos <正样本数>,

-nneg <负样本数>      每个分类器阶段的训练中使用的正/负样本数。合理的值是npos = 7000和nneg = 3000。

-nstages <阶段数>  训练阶段数

-nsplits <拆分数>      确定阶段分类器中使用的弱分类器。如果为1,则使用简单的树桩分类器;如果为2或更多,则使用具有number_of_splits内部(拆分)节点的CART分类器

-mem <memory_in_MB>      可用内存,以MB为单位进行预先计算。您拥有的内存越多,训练过程就越快

-sym(默认),

-nonsym      指定受训练的对象类是否具有垂直对称性。垂直对称加快了训练过程。例如,正面显示出垂直对称

-minhitrate <min_hit_rate>      每个阶段分类器的最小期望命中率。总体命中率可以估计为(min_hit_rate ^ 阶段数)

-maxfalsealarm <max_false_alarm_rate>      每个阶段分类器的最大期望误报率。总体误报率可以估计为(max_false_alarm_rate ^ number_of_stages)

-weighttrimming <weight_trimming>  指定是否以及应该使用多少修剪重量。不错的选择是0.90。

-eqw 

-mode <BASIC (default) | CORE | ALL>      选择训练中使用的haar功能集的类型。 BASIC仅使用直立功能,而ALL使用整套直立和45度旋转功能集。有关更多详细信息,请参见[1]。

-w <sample_width>,样本宽

-h <sample_height>  样本高

提升分类器参数:
  `-bt <{DAB,RAB,LB,GAB(默认)} >>:增强分类器的类型:DAB-离散AdaBoost,RAB-真实AdaBoost,LB-LogitBoost,GAB-温和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>`:指定是否应使用修剪及其权重。不错的选择是0.95。
  `-maxDepth <max_depth_of_weak_tree>`:一棵弱树的最大深度。一个不错的选择是1,这是树桩的情况。
  `-maxWeakCount <max_weak_tree_count>`:每个级联阶段的弱树的最大数量。提升分类器(阶段)将具有如此多的弱树(<= maxWeakCount),以实现给定的“ -maxFalseAlarmRate”。

-Haar的特征参数:
  `-mode <BASIC(默认)|CORE | ALL>`:选择训练中使用的Haar功能集的类型。 BASIC仅使用直立功能,而ALL使用整套直立和45度旋转功能集。

-本地二进制模式参数:本地二进制模式没有参数。

训练样本的大小(以像素为单位)。 必须具有与训练样本创建过程中使用的值(实用训练样本)完全相同的值

opencv_traincascade应用程序完成工作后,经过训练的级联将保存在`-data`文件夹的`cascade.xml`文件中。 此文件夹中的其他文件是为中间培训而创建的,因此可以在培训完成后将其删除。

培训已完成,可以测试级联分类器!

也可参考博客

https://blog.csdn.net/carson2005/article/details/8171571

https://blog.csdn.net/qq_32502511/article/details/79010509

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值