天天看点

opencv级联增强分类器训练流程--python实现

文章目录

  • ​​介绍​​
  • ​​重要提示​​
  • ​​训练数据准备​​
  • ​​负样本​​
  • ​​正样本​​
  • ​​**额外说明**​​
  • ​​使用OpenCV的集成标注工具​​
  • ​​级联增强分类器训练​​
  • ​​可视化级联分类器​​

介绍

级联增强分类器包含两个主要阶段:训练阶段和检测阶段。检测阶段使用HAAR或在LBP基础模型,在物体检测引导中有说明。本文展示训练自己的级联增强分类器所需的功能概述。本篇文章通过以下几个部分进行讲解,分别是:收集训练数据、训练数据预处理和进行实际的模型训练

以下教程将会使用到以下OpenCV程序,分别是:opencv_createsamples、opencv_annotation、opencv_traincascade和opencv_visualisation

重要提示

  1. 如果你看到任何关于老版本opencv_haartraining工具的使用说明,请将其忽略并坚持使用opencv_traincascade工具,因为它是不被推荐使用的但依然存在opencv1.x版本里面。opencv_traincascade工具是更新的版本,存在与opencv2.x和opencv3.x版本里面。它支持HAAR的小波特征和LBP特征(本地二进制模式)。与HAAR特征相比,LBP特征产生整数精度,从而产生浮点精度,因此LBP的训练和检测速度都比HAAR特征快几倍。关于LBP和HAAR的检测质量,它主要取决于使用的训练数据和选择的训练参数。相比于训练一个HAAR模型的级联增强分类器,达到相同的效果训练一个LBP模型的级联增强分类器所使用的时间更少。
  2. 来自opencv2.x和opencv3.x的较新的级联分类器检测接口可以用于旧的或者新的模型格式。如果因为某种原因你只能使用旧的接口, opencv_traincascade甚至可以保存和支持一个已经训练好的分类器以一种旧的格式。至少可以在最稳定的接口上面完成模型的训练。
  3. 为了多线程opencv_traincascade应用程序可以使用TBB。为了在多核模式下使用它,opencv必须在TBB支持情况下进行安装。

训练数据准备

为了训练级联增强分类器,我们需要一组正样本(包含你想要检测的实际物体)和一组负样本(包含你不想要检测的一切物体)。负样本需要手动提前准备,正样本可以通过opencv_createsamples应用程序生成。

负样本

负样本从不包含检测物体的任意图片中产生。负样本的所有图片路径应该包含在一个txt文件里面,每一行表示一个路径(可以是绝对路径和相对路径)。注意,产生负样本的任意图片和负样本都可以称之为背景样本。

你找到的背景样本可能尺寸大小不一,但是要求大于检测物体图片的平均尺寸,因为这些图片会以这个平均尺寸进行二次采样得到一些图片样本。

下面展示一个负样本描述文件的例子

文件夹结构

/img
  img1.jpg
  img2.jpg
bg.txt      

文件bg.txt内容为

img/img1.jpg
img/img2.jpg      

这组负样本数据在机器学习寻找感兴趣物体的过程中指出哪些是不需要去寻找的。

正样本

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

​第一种是​

​​,你可以使用一个检测物体图像来生成一组正样本数据;​

​第二种是​

​,你可以提供所有的正样本数据而只是使用工具将其进行裁剪、调整大小。

然而第一种方式适合固定的检测物体,例如非常死板的logo,对于比较灵活的检测物体,效果较差。这种情况下,我们建议使用第二种方式。很多教程甚至指出100个真实物体正样本图片比通过opencv_createsamples应用程序生成的1000个人工制作的正样本图片可以带来更好的模型效果。然而,如果你坚持使用第一种方法,请记住以下几点:第一,请注意你不仅仅只是需要一个正样本图片在你提供给opencv_createsamples应用程序之前,因为它仅仅只是适用于透视转型。第二,如果你想要一个强大的模型,请采用你想要检测物体的多种不同种类作为正样本。例如,对于脸型而言,你应该考虑不同脸型和岁数的组合,表情或者胡须的风格。这个方法同样适用于第二种方式。

第一种方式使用一个单独的物体例如公司的logo,并依靠已有的物体图片通过随机旋转、改变图像强度和增加背景图片的方式来随机生成一批正样本图片。随机的数量和种类可以被控制通过opencv_createsamples应用程序的命令行参数。

命令行参数如下:

  • ​-vec<vec_file_name>​

    ​:包含训练正样本图片路径的输出文件的名字
  • ​-img<image_file_name>​

    ​:检测物体图片,例如公司logo
  • ​-bg<backgrounp_file_name>​

    ​:背景描述文件,包含图像列表,这些图像用作检测对象的随机变形之后的背景。
  • ​-num<num_of_samples>​

    ​:生成的正样本的数量
  • ​-bgcolor <background_color>​

    ​​:背景颜色(假设目前的图片的灰度图片);这个背景颜色提供透明颜色。由于可能存在压缩伪影,因此可以通过​

    ​-bgthresh​

    ​​指定颜色容忍度。​

    ​bgcolor​

    ​​-​

    ​bgthresh​

    ​​和​

    ​bgcolor​

    ​​ +​

    ​bgthresh​

    ​范围内的所有像素均被解释为透明的。
  • ​--bgthresh <background_color_threshold>​

    ​:
  • ​-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>​

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

当以这种方式运行opencv_createsamples时,用于创建样本对象实例的过程如下:给定的源图像围绕所有三个轴随机旋转。所选角度受​

​-maxxangle​

​​,​

​-maxyangle​

​​和​

​-maxzangle​

​​限制。然后像素在[​

​bg_color​

​​-​

​bg_color_threshold​

​​; ​

​bg_color​

​​ + ​

​bg_color_threshold​

​​]范围内被解释为透明的。白噪声被添加到前景图片中。如果指定了​

​-inv​

​​键,则前景像素强度将反转。如果指定了​

​-randinv​

​键,则算法会随机选择是否应将反转应用于此样本。最后获取的图片按-w和-h选项调整好大小放到背景描述文件的任意背景图片上,然后存储到有命令行参数指定的vec-file文件里面。

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

  • ​-info <collection_file_name>​

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

请注意,在这种情况下,像​

​-bg,-bgcolor,-bgthreshold,-inv,-randinv,-maxxangle,-maxyangle,-maxzangle​

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

​-w,-h,-show和-num​

​。

额外说明

  • opencv_createsamples实用程序可用于检查存储在任何给定正样本文件中的样本。为此,仅应指定​

    ​-vec,-w和-h​

    ​参数。
  • 此处提供了vec文件的示例​

    ​opencv / data / vec_files / trainingfaces_24-24.vec​

    ​。它可以用于训练具有以下窗口大小的面部检测器:-w 24 -h 24。

使用OpenCV的集成标注工具

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

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

  • ​--annotations(required)​

    ​:注释txt文件的路径,您要在其中存储注释,然后将其传递到-info参数[示例-/data/annotations.txt]
  • ​--images(required)​

    ​:包含带有对象的图像的文件夹的路径[示例-/ data / testimages /]
  • ​--maxWindowHeight (optional)​

    ​​:如果输入图像的高度更大,则此处为给定的分辨率,请使用​

    ​--resizeFactor​

    ​调整图像的大小,以便于注释。
  • ​--resizeFactor (required)​

    ​​:使用​

    ​--maxWindowHeight​

    ​参数时用于调整输入图像大小的系数。

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

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

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

  • 按c:确认注释,将注释变为绿色并确认已存储
  • 按d:从注释列表中删除最后一个注释(易于删除错误的注释)
  • 按n:继续下一张图像
  • 按ESC键:这将退出注释软件

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

级联增强分类器训练

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

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

  • 常用参数:
  • 级联参数:
  • 提升分类器参数:
  • Haar-like特征参数

opencv_traincascade应用程序完成其工作之后,经过训练的模型将保存在​

​-data​

​​文件夹中的​

​cascade.xml​

​文件中。此文件夹中的其他文件是为中断培训而创建的,因此您可以在培训完成后将其删除。

训练已完成,你可以测试以下自己的分类器效果!

可视化级联分类器

有时为了查看哪些特征被选择和该阶段有多复杂,可视化已训练好的分类器是有用的。为此,OpenCV提供了一个opencv_visualisation应用程序。该应用程序具有以下命令:

  • ​--image(required)​

    ​:输入模型的示例图片路径。这应该是标注,标注[-w,-h]传递给opencv_createsamples和opencv_traincascade应用程序。
  • ​--model(required)​

    ​:训练模型的路径,该路径应该位于opencv_traincascade应用程序的-data参数提供的文件夹中。
  • ​--data(optional)​

    ​:如果提供了必须事先手动创建的数据文件夹,阶段输出和特征视频将被储存。

下面是一个示例命令

opencv_visualisation --image=/data/object.png --model=/data/model.xml --data=/data/result/      

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

  • 仅处理由opencv_traincascade工具训练的级联分类器模型,其中包含树桩作为决策树[默认设置]。
  • 提供的图像必须是带有原始模型尺寸的样本窗口,并传递给–image参数。

在给定的Angelina Jolie窗口上运行了HAAR / LBP人脸模型的示例,与级联分类器文件具有相同的预处理-> 24x24像素图像,灰度转换和直方图均衡化:

继续阅读