简介
使用弱分类器的增强级联包括两个主要阶段:训练阶段和检测阶段。对象检测教程中介绍了使用基于HAAR或LBP模型的检测阶段。本文档概述了训练自己的弱分类器的级联所需的功能。当前指南将逐步完成所有不同阶段:收集训练数据,准备训练数据并执行实际模型训练。
为了支持本教程,将使用几个官方的OpenCV应用程序:opencv_createsamples,opencv_annotation,opencv_traincascade和opencv_visualisation。
重要的事项
如果您遇到任何提及旧的opencv_haartraining工具(不推荐使用,仍在使用OpenCV1.x界面)的教程,请忽略该教程并坚持使用opencv_traincascade工具。此工具是较新的版本,根据OpenCV 2.x和OpenCV 3.x API用C ++编写。opencv_traincascade支持类似HAAR的小波特征[227]和LBP(局部二进制模式)[127]特征。与HAAR特征相比,LBP特征产生整数精度,产生浮点精度,因此LBP的训练和检测速度都比HAAR特征快几倍。关于LBP和HAAR的检测质量,主要取决于所使用的训练数据和选择的训练参数。可以训练基于LBP的分类器,该分类器将在训练时间的一定百分比内提供与基于HAAR的分类器几乎相同的质量。
来自OpenCV 2.x和OpenCV 3.x(cv::CascadeClassifier)的较新的层叠分类器检测接口支持使用新旧模型格式。如果由于某种原因而使用旧界面,则opencv_traincascade甚至可以旧格式保存(导出)经过训练的级联。然后至少可以在最稳定的界面中训练模型。
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