在这里,我们学习如何使用objdetect来寻找我们的图像或视频中的对象
在本教程中,
我们将学习Haar级联目标检测的工作原理。
我们将看到使用基于Haar特征的级联分类器进行人脸检测和眼睛检测的基础知识
我们将使用cv::CascadeClassifier类来检测视频流中的对象。特别地,我们将使用以下功能:
cv::CascadeClassifier::load加载一个.xml分类器文件。它可以是Haar,也可以是LBP分类器
cv::CascadeClassifier::detectMultiScale执行检测
基于Haar特征的级联分类器的目标检测是Paul Viola和Michael Jones在2001年的论文《简单特征增强级联快速目标检测》中提出的一种有效的目标检测方法。这是一种基于机器学习的方法,从大量的正面和负面图像中训练一个级联函数,
然后用它来检测其他图像中的目标。
如人脸检测:首先,该算法需要大量的正图像(人脸图像)和负图像(无人脸图像)来训练分类器。然后我们需要从中提取特征。
使用增强级联的弱分类器包括两个主要阶段:训练阶段和检测阶段。
使用HAAR或LBP模型的检测阶段在目标检测教程中进行了描述。
本文档概述了训练您自己的增强弱分类器级联所需的功能。
目前的指南将贯穿所有不同的阶段:收集培训数据,准备培训数据和执行实际的模型培训。
为了支持本教程,我们将使用几个官方的OpenCV应用程序:
opencv_createsamples
opencv_annotation
opencv_traincascade
opencv_visualisation
如果您看到任何教程提到旧的opencv_haartraining工具(它已被弃用),请忽略教程,使用opencv_traincascade工具。opencv_traincascade同时支持HAAR和LBP特征。与HAAR特征相比,LBP特征具有整数精度,产生浮点精度,因此LBP的训练和检测速度都比HAAR特征快好几倍。对于LBP和HAAR的检测质量,主要取决于所使用的训练数据和所选择的训练参数。在训练时间的百分比内,训练一个基于lbp的分类器可以提供与基于haar的分类器几乎相同的质量。
新的级联分类器检测接口支持使用新旧模型格式。opencv_traincascade甚至可以以旧格式保存(导出)一个经过训练的级联,如果由于某种原因您无法使用旧的接口。至少可以在最稳定的界面上对模型进行训练。
opencv_traincascade应用程序可以使用TBB进行多线程处理。要在多核模式下使用它,必须在构建OpenCV时启用TBB支持。
为了训练增强的弱分类器级联,我们需要一组正样本(包含您想要检测的实际对象)和一组负图像(包含您不想检测的所有内容)。负样本集必须手工准备,而阳性样本集是使用opencv_createsamples应用程序创建的。
负样本取自任意图像,不包含您想要检测的对象。生成示例的这些负片图像应该列在一个特殊的负片图像文件中,每行包含一个图像路径(可以是绝对路径,也可以是相对路径)。请注意,负样本和样本图像也称为背景样本或背景图像,在本文档中可互换使用。
所描述的图像可能有不同的大小。然而,每个图像应该等于或大于所需的培训窗口大小(对应于模型的维度,大多数时候的平均大小你的对象),因为这些图片用于给定的负面形象成几个子图像样本有这个培训窗口大小。
负样本描述文件的一个例子:
目录结构:
/img
img1.jpg
img2.jpg
bg.txt
文本bg.txt: img/img1.jpgimg/img2.jpg
负样本将被用来告诉机器学习,当你试图寻找你感兴趣的对象时,不要寻找什么;
正样本由opencv_createsamples应用程序创建,应用程序支持两种生成正样例数据集的方法:
1.从一个图像中生成正样本
2.自己提供所有的正样本,只使用这个工具来裁剪它们,调整它们的大小,并将它们放入opencv所需的二进制格式中
第一个方法是固定对象,只适用于不是要求很严格的情况。要求很严格的情况,建议采用第二种方法。
web上的许多教程甚至说,通过使用opencv_createsamples应用程序,100个真实的对象图像可以产生比1000个人工生成的阳性结果更好的模型。
如果你决定采用第一种方法,请记住以下几点:
1.请注意,在将其提供给上述应用程序之前,您需要的不仅仅是一个正的示例,因为它只应用透视图转换。
2.如果您想要一个健壮的模型,请选取涵盖您的对象类中可能出现的各种类型的示例。例如,在脸的情况下,你应该考虑不同的种族和年龄群体,情绪,可能还有胡子风格。这也适用于使用第二种方法时。
第一种方法是使用一个单一的物体图像,例如一个公司的标志,通过随机旋转物体,改变图像的强度以及将图像放置在任意的背景中,从给定的物体图像中创建一个大集合的正样本。随机性的数量和范围可以由opencv_createsamples应用程序的命令行参数控制。
命令行参数:
-vec :
包含训练正样本的输出文件的名称
-img :
源对象图像(如公司标识)
-bg :
背景描述文件;包含一个用于对象随机变形版本背景的图像列表
-num :
生成的正样本数
-bgcolor :
背景色(目前假设为灰度图像);背景色表示透明色。由于可能存在压缩伪影,可以通过-bgthresh指定颜色容忍量。在bgcolor-bgthresh和bgcolor+bgthresh范围内的所有像素被解释为透明。
-bgthresh
-inv:如果指定,颜色将被颠倒。
-randinv:如果指定,颜色会随机颠倒。
-maxidev :前景样本中像素的最大强度偏差。
-maxxangle : x轴的最大旋转角度,必须用弧度表示。
-maxyangle : y轴的最大旋转角度,必须用弧度表示。
-maxzangle : z轴的最大旋转角度,必须以弧度表示。
-show : 有用的调试选项。如果指定,将显示每个样本。按Esc将继续示例创建过程,而不显示每个示例。
-w :输出样本的宽度(像素)。
-h :输出样本的高度(单位为像素)。
在以这种方式运行opencv_createsamples时,将使用以下过程创建示例对象实例:在所有三个轴上随机旋转给定的源图像。所选的角度受-maxxangle, -maxyangle和-maxzangle的限制。然后像素的强度来自[bg_color-bg_color_threshold;
范围被解释为透明的。白噪声被添加到前景的强度中。如果指定了-inv键,则前景像素强度倒置。如果指定-randinv密钥,则算法随机选择是否对该样本进行反演。最后,将获得的图像放在背景描述文件中的任意背景上,将其大小调整为-w和-h指定的所需大小,并存储到由-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
从这些收集中创建阳性样本,应该指定-info参数而不是-img:
-info :标记正向图像集合的描述文件
注意,第二种方法中,参数如-bg, -bgcolor, -bgthreshold, -inv, -randinv, -maxxangle, -maxyangle, -maxzangle都被忽略了。对象实例是从给定的图像中获取的,方法是从原始图像中剪切提供的边框。然后将它们调整为目标样本大小(由-w和-h定义),并存储在由-vec参数定义的输出矢量文件中。没有失真应用,所以唯一影响的参数是-w, -h, -show和-num。
手动创建-info文件的过程也可以使用opencv_annotation工具完成。这是一个开源工具,用于在任何给定图像中可视化地选择对象实例感兴趣的区域。
下面的小节将更详细地讨论如何使用这个应用程序。
额外注意点
1.opencv_createsamples程序可用于检查存储在任何给定的阳性样本文件中的样本为了只执行-vec,应指定-w和-h参数
2.矢量文件的例子在opencv/data/vec_files/trainingfaces_24-24 - vec。它可以用来训练窗口为-w 24 -h 24的人脸检测器
自从OpenCV 3.x,社区一直提供并维护opencv_annotation,用于生成-info文件。使用该工具非常简单,该工具接受几个必需的和一些可选参数:
--annotations(必需的):注释txt文件的路径,您想要存储注释的地方,然后传递给-info参数[如:/data/annotations.txt]
-images(必选):包含图像和对象的文件夹路径[如:/data/testimages/]
--maxwindowh8(可选):如果输入图像的高度比这里给出的更大,请使用--resizeFactor调整图像的大小,以便更容易注释。
--resizeFactor(可选):在使用--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应用程序完成它的工作后,训练好的cascade将保存在-data文件夹中的cascade.xml文件中。此文件夹中的其他文件是为中断培训而创建的,可以在培训结束后删除。训练结束,您可以测试您的级联分类器了!
有时将训练过的级联可视化是有用的,可以看到它选择了哪些特征以及它的阶段有多复杂。
为此OpenCV提供了一个opencv_visualisation应用程序。
这个应用程序有以下命令:
--image(必需的):对象模型参考图像的路径。这应该是一个维度[-w,-h]的注释,同时传递给opencv_createsamples和opencv_traincascade
--model (必需的):训练模型的路径,它在opencv_traincascade的-data参数提供的文件夹中
--data(可选):如果提供了一个数据文件夹,它必须事先手动创建,将存储输出和视频的特征
下面是一个示例命令
opencv_visualisation --image=/data/object.png --model=/data/model.xml --data=/data/result/
当前可视化工具的一些限制
1.只处理用opencv_traincascade工具训练的级联分类器模型,包含树冠作为决策树[默认设置]。
2.提供的图像需要是带有原始模型尺寸的示例窗口,传递给–image参数。