OpenCVTutorials

OpenCV-Python4.1 中文文档

Back

级联分类器

作者 OpenCV-Python Tutorials
编译 Vincent
来源 OpenCV-Python Tutorials

简介

使用弱分类器的增强级联包括两个主要阶段:训练阶段和检测阶段。对象检测教程中介绍了使用基于HAAR或LBP模型的检测阶段。本文档概述了训练自己的弱分类器的级联所需的功能。当前指南将逐步完成所有不同阶段:收集训练数据,准备训练数据并执行实际模型训练。

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

重要的事项

准备训练数据

为了训练弱分类器的增强级联,我们需要一组正样本(包含您要检测的实际对象)和一组负样本(包含您不想检测的所有内容)。负样本集必须手动准备,而阳性样本集是使用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应用程序的命令行参数来控制。

命令行参数:

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

也可以从以前标记的图像的集合中获取正样本,这是构建鲁棒对象模型时的理想方式。该集合由类似于背景描述文件的文本文件描述。该文件的每一行都对应一个图像。该行的第一个元素是文件名,后跟对象注释的数量,后跟描述包围矩形(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

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

也可以使用opencv_annotation工具完成手动创建-info文件的过程。这是一个开放源代码工具,用于在任何给定图像中直观地选择对象实例的关注区域。以下小节将详细讨论如何使用此应用程序。

额外事项

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

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

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

opencv_annotation --annotations=/path/to/annotations/file.txt --images=/path/to/image/folder/ 

此命令将启动一个窗口,其中包含第一张图像和您的鼠标光标,这些窗口将用于注释。有关如何使用注释工具的视频,请参见此处。基本上,有几个按键可以触发一个动作。鼠标左键用于选择对象的第一个角,然后继续绘制直到您满意为止,并在单击鼠标第二次单击时停止。每次选择后,您有以下选择:

最后,您将获得一个可用的注释文件,该文件可以传递给opencv_createsamples的-info参数。

级联训练

下一步是根据预先准备的正负数据集对弱分类器的增强级联进行实际训练。

按用途分组的opencv_traincascade应用程序的命令行参数:

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

训练完成后,您可以测试级联分类器!

可视化级联分类器

有时,可视化经过训练的级联可能很有用,以查看其选择的功能以及其阶段的复杂程度。为此,OpenCV提供了一个opencv_visualisation应用程序。该应用程序具有以下命令:

当前可视化工具的某些限制

HAAR / LBP人脸模型的示例在安吉丽娜·朱莉(Angelina Jolie)的给定窗口上运行,该窗口具有与级联分类器文件相同的预处理–> 24x24像素图像,灰度转换和直方图均衡:每个阶段都会制作一个视频,每个特征都可视化:

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

每个阶段都作为图像存储,以供将来对功能进行验证:

这项工作是由StevenPuttemans为OpenCV 3 Blueprints创建的,但是Packt Publishing同意将其集成到OpenCV中。