OpenCV57:级联分类器的训练

目的

在本章中,将学习:

  • 级联分类器的训练过程
  • 学习函数:
    • opencv_createsamples
    • opencv_annotation
    • opencv_traincascade
    • opencv_visualisation

原理

使用弱分类器的增强级联包括两个主要阶段:训练阶段和检测阶段。对象检测教程中介绍了使用基于HAAR或LBP(中心点为阈值,大于它的设为1,小于它的设为0)模型的检测阶段。本文档概述了训练弱分类器的级联所需的函数。当前指南将逐步完成所有不同阶段:

  • 收集训练数据
  • 准备训练数据
  • 训练实际模型

为了支持本教程,将使用几个官方的OpenCV应用程序:

注意

自opencv 4.0版本以来, 和被禁用。考虑使用这些应用程序为级联分类器的3.4分支训练,因此模型格式在3.4和4.x之间相同。

重要提示

  • 如果遇到任何提及旧的工具的教程,请忽略该教程并坚持使用工具。该工具是较新的版本,根据OpenCV 2.x和OpenCV 3.x API用C ++编写。支持类似**的小波特征和(局部二进制模式)特征**。与HAAR特征相比,LBP特征产生整数精度,HAAR产生浮点精度,因此LBP的训练和检测速度都比HAAR特征快几倍。关于LBP和HAAR的检测质量,主要取决于所使用的训练数据和选择的训练参数。可以训练基于LBP的分类器,该分类器将在训练时间的一定百分比内提供与基于HAAR的分类器几乎相同的质量。
  • 来自OpenCV 2.x和OpenCV 3.x()的较新的级联分类器检测接口支持使用新旧模型格式。如果由于某种原因而使用旧界面,则可以旧格式保存(导出)经过训练的级联,然后可以在最稳定的界面中训练模型。
  • opencv_traincascade应用程序可以使用TBB进行多线程处理。 要在多核模式下使用它,必须在启用TBB支持的情况下构建OpenCV。

准备训练数据

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

负样本|Negative Samples

负样本来自任意图像,不包含要检测的对象。这些生成样本的负片图像应列在一个特殊的负片图像文件中,该文件每行包含一个图像路径(可以是绝对路径,也可以是相对路径)。注意,负样本和样本图像也称为背景样本或背景图像,在本文档中可以互换使用。

所描述的图像可能具有不同的尺寸。但是,每个图像都应等于或大于所需的训练窗口大小(与模型尺寸相对应,多数情况下是对象的平均大小),因为这些图像用于将给定的负像子采样为几个图像,具有此训练窗口大小的样本。

负样本描述文件的示例:

目录结构:

样式:

这样的一组负窗口样本将用于机器学习步骤中,试图找到的感兴趣对象时不寻找什么。

正样本|Positive Samples

正样本由应用程序创建。正样本告诉机器学习算法来定义在尝试找到感兴趣的对象时模型应实际寻找的内容。该应用程序支持两种生成正样本数据集的方式。

  • 可以从单个正对象图像生成一堆正值
  • 可以自己提供所有肯定的内容,仅使用该工具将其裁剪调整大小并以opencv所需的二进制格式放置

尽管第一种方法对固定对象(例如非常刚性的Logo)效果不错,但对于刚性较差的对象,它往往就会失效。在这种情况下,建议使用第二种方法。

网络上的许多教程甚至都指出,通过使用应用程序可以生成100个真实对象图像,而不是1000个人工生成的正值。但是**,如果采用第一种方法,请记住以下几点**:

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

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

命令行参数:

  • :包含用于训练的正样本的输出文件的名称

  • :源对象图像(例如,公司徽标)

  • :背景描述文件; 包含图像列表,这些图像用作对象的随机变形版本的背景

  • :要生成的正样本数

  • :背景色(当前假定为灰度图像); 背景色表示透明色。由于可能存在压缩伪影,因此可以通过指定颜色容忍度和bgcolor + bgthresh范围内的所有像素均被解释为透明的

  • :如果指定,颜色将被反转

  • :如果指定,颜色将随机反转

  • :前景样本中像素的最大强度偏差

  • :朝向x轴的最大旋转角度,必须以弧度为单位

  • :朝向y轴的最大旋转角度,必须以弧度为单位

  • :朝向z轴的最大旋转角度,必须以弧度为单位

  • :如果指定,将显示每个样本。 按Esc将继续示例创建过程,而不会显示每个示例

  • :输出样本的宽度(以像素为单位)

  • :输出样本的高度(以像素为单位)

当以此方式运行时,将使用以下过程创建示例对象实例:给定的源图像围绕所有三个轴随机旋转。 所选角度受,和 限制。 然后,像素在范围内被设置为透明。白噪声被添加到前景的强度。如果指定键,则前景像素强度将反转。如果指定 键,则算法将随机选择是否应对该样本应用反演。最后,将获得的图像从背景描述文件放置到任意背景上,将其大小调整为由 和 指定的所需大小,并存储到由 命令行选项指定的vec文件中。

正样本也可以从先前标记的图像的集合获得,这是在构建鲁棒目标模型时是所需的方式,该集合由类似于背景描述文件的文本文件描述。此文件的每一行对应于图像。该行的第一个元素是文件名,后跟对象注释的数量,后跟描述对象边界矩形的坐标(x,y,宽度,高度)的数字。

正样本描述文件的示例:

目录结构:

文件内容:

图像包含具有以下边界矩形坐标的单个对象实例:。图像img2.jpg包含了两个对象实例,分别为以及

要从此系列中创建正示例,应指定参数而不是:

  • :标记图像集合的描述文件

请注意,在这种情况下, ,,,,,,和等参数将被简单地忽略并且不再使用。在这种情况下,样本创建的方案如下。通过从原始图像中切出提供的边界框,从给定图像中获取对象实例,然后将它们调整为目标样本大小(由和定义),并存储在由 参数定义的输出vec文件中。没有应用任何失真,因此仅有的影响参数是 , , 和 。

也可以使用工具完成手动创建 文件的过程。这是一个开放源代码工具,用于在任何给定图像中直观地选择对象实例的关注区域。

额外事项

  • 实用程序可用于检查存储在任何给定正样本文件中的样本。为此,仅应指定 , 和 参数
  • 此处提供了vec文件的示例 。它可以用于训练具有以下窗口大小的面部检测器:

使用OpenCV集成的标注工具

由于OpenCV 3.x社区一直在提供和维护一个用于生成文件的开源注释工具。如果,则可以访问该工具,如果opencv应用程序在其中构建。

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

  • (必需):txt标注文件的路径,要在其中存储标注,然后将其传递给 参数
  • (必需):包含带有对象的图像的文件夹的路径
  • (可选):如果输入图像的高度大于此处的给定分辨率,则调整图像的大小以用于 使用
  • –maxWindowHeight` 参数时用于调整输入图像大小的因子

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

visualisation_video.png

每个阶段都会制作一个视频,以显示每个特征:

OpenCV57:级联分类器的训练 AI科技时讯 OpenCV57:级联分类器的训练 微信公众号 OpenCV57:级联分类器的训练 技术分享

来源:uncle_ll

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年1月21日
下一篇 2022年1月21日

相关推荐