主要内容

开始使用级联对象检测器

为什么要训练一个探测器?

愿景。CascadeObjectDetector系统对象带有几个预先训练的分类器,用于检测正面面孔,侧面面孔,鼻子,眼睛和上半身。然而,对于特定的应用程序,这些分类器并不总是足够的。计算机视觉工具箱™提供trainCascadeObjectDetector函数来训练自定义分类器。

你能探测到什么类型的物体?

计算机视觉工具箱级联对象检测器可以检测出宽高比变化不大的对象类别。长宽比固定的物体包括人脸、停车标志和从一边看的汽车。

愿景。CascadeObjectDetector系统对象通过在图像上滑动窗口来检测图像中的对象。然后检测器使用级联分类器来决定窗口是否包含感兴趣的对象。窗口的大小不同,以检测不同规模的物体,但其宽高比保持不变。探测器对面外旋转非常敏感,因为大多数三维物体的纵横比会发生变化。因此,您需要为对象的每个方向训练检测器。训练一个检测器来处理所有方向是行不通的。

级联分类器是如何工作的?

级联分类器由多个阶段组成,每个阶段都是弱学习者的集合。弱学习者被称为简单的分类器决定树桩.每个阶段都使用一种叫做助推的技术进行训练。提高通过对弱学习者的决策进行加权平均,提供训练高度精确分类器的能力。

分类器的每个阶段都将滑动窗口当前位置定义的区域标记为正或负。积极的表示找到了一个对象表示没有找到对象。如果该标签为负值,则表示该区域的分类已完成,检测器将窗口滑动到下一个位置。如果标签是正的,分类器将区域传递到下一阶段。当最后阶段将区域分类为阳性时,检测器报告在当前窗口位置发现的对象。

该阶段的设计是为了尽可能快地拒绝阴性样本。假设绝大多数窗口不包含感兴趣的对象。相反,真正的正面信息很少,值得花时间去核实。

  • 一个真阳性当阳性样本被正确分类时发生。

  • 一个假阳性当阴性样本被错误地归类为阳性样本时发生。

  • 一个假阴性当阳性样本被错误地归类为阴性样本时发生。

为了更好地工作,级联中的每个阶段都必须有低的假阴性率。如果舞台错误地将一个对象标记为否定的,分类将停止,并且您无法纠正这个错误。然而,每个阶段都可能有很高的假阳性率。即使检测器错误地将一个非对象标记为正,您也可以在后续阶段纠正这个错误。

级联分类器的总体假阳性率为 f 年代 ,在那里 f 每个阶段的假阳性率是否在(0 1)范围内,和 年代 是阶段数。同样,总体真实阳性率为 t 年代 ,在那里 t 为范围(0 1)内每个阶段的真实阳性率。因此,增加更多的阶段降低了整体的假阳性率,但也降低了整体的真阳性率。

创建级联分类器trainCascadeObjectDetector

级联分类器训练需要一组正样本和一组负图像。您必须提供一组带有指定作为正样本的感兴趣区域的正图像。你可以使用图片标志用边框标记感兴趣的对象。Image Labeler输出一个用于正样本的表。您还必须提供一组负片图像,函数从中自动生成负片样本。为了达到可接受的探测器精度,可以设置台阶的数量、特征类型和其他功能参数。

设置参数时的注意事项

选择函数参数以优化阶段数、假阳性率、真阳性率和特征类型用于训练。当您设置参数时,请考虑这些权衡。

条件 考虑
大量的训练集(数以千计)。 增加阶段的数量,并为每个阶段设置较高的假阳性率。
一个小的训练集。 减少阶段数量,降低每个阶段的假阳性率。
以减少丢失物体的概率。 增加真实阳性率。然而,较高的真阳性率会阻止您实现每个阶段所需的假阳性率,使检测器更有可能产生假检测。
以减少误检的次数。 增加级数或降低每个级的误报率。

可用于培训的特征类型

选择适合您需要的对象检测类型的功能。的trainCascadeObjectDetector金宝app支持三种类型的特征:Haar,局部二值模式(LBP)和定向梯度直方图(HOG)。Haar和LBP特征常被用于人脸检测,因为它们能很好地表示细尺度纹理。HOG特征通常用于检测人和汽车等物体。它们对于捕捉物体的整体形状很有用。例如,在下面的HOG特征可视化中,你可以看到自行车的轮廓。

你可能需要运行trainCascadeObjectDetector函数多次来调优参数。为了节省时间,您可以在一小部分数据上使用LBP或HOG特性。使用哈尔特征训练检测器需要更长的时间。在此之后,您可以运行哈尔特征,看看准确性是否提高。

供应正样本

要轻松创建阳性样本,您可以使用图片标志通过交互式指定感兴趣的矩形区域(roi), Image Labeler提供了一种简单的方法来标记积极的样本。

您还可以通过以下两种方法之一手动指定阳性样本。一种方法是在较大的图像中指定矩形区域。区域包含感兴趣的对象。另一种方法是从图像中裁剪出感兴趣的对象,并将其保存为单独的图像。然后,您可以指定该区域为整个图像。您还可以通过添加旋转或噪声,或通过改变亮度或对比度,从现有的样本中生成更多积极的样本。

供应负面形象

未明确指定负样本。相反,trainCascadeObjectDetector函数从用户提供的不包含感兴趣对象的负图像中自动生成负样本。在训练每个新阶段之前,该函数运行检测器,该检测器由已经训练的阶段组成。从这些图像中检测到的任何物体都是假阳性,用作阴性样本。这样,级联的每一个新阶段都被训练来纠正前一阶段所犯的错误。

随着阶段的增加,探测器的整体误报率降低,导致阴性样本的生成更加困难。因此,提供尽可能多的负面形象是有帮助的。为了提高训练的准确性,提供包含通常与感兴趣的物体相关的背景的负面图像。另外,还应包含与感兴趣的物体在外观上相似的非物体的负面图像。例如,如果您正在训练一个停车标志检测器,请使用包含道路标志和类似于停车标志形状的负面图像。

选择阶段的数量

在每个阶段较低的假阳性率和多个阶段较高的假阳性率之间存在一种权衡。假阳性率较低的阶段更为复杂,因为它们包含更多的弱学习者。假阳性率较高的阶段,弱学习者较少。一般来说,最好有更多的简单阶段,因为在每个阶段,总体假阳性率呈指数级下降。例如,如果每个阶段的假阳性率为50%,那么具有两个阶段的级联分类器的总体假阳性率为25%。经过三个阶段,它变成了12.5%,以此类推。然而,阶段越多,分类器需要的训练数据量就越大。此外,增加阶段的数量也会增加假阴性率。这种增加会导致更大的错误拒绝阳性样本的机会。设置假阳性率(FalseAlarmRate)和阶段数,(NumCascadeStages)以产生可接受的整体假阳性率。然后您可以通过实验来调整这两个参数。

培训有时会提前终止。例如,假设训练在七个阶段后停止,即使您将阶段数参数设置为20。有可能函数不能产生足够的负样本。如果再次运行该函数并将阶段数设置为7,则不会得到相同的结果。阶段之间的结果不同,因为每个阶段使用的阳性和阴性样本的数量是根据新的阶段数量重新计算的。

探测器训练时间

训练一个好的检测器需要数千个训练样本。大量的训练数据可能需要数小时甚至数天的时间来处理。在训练过程中,该函数在MATLAB中显示训练每个阶段所花费的时间®命令窗口。训练时间取决于指定的特征类型。使用Haar特征比使用LBP或HOG特征花费更长的时间。

故障排除

如果阳性样本用完了怎么办?

trainCascadeObjectDetector函数自动确定用于训练每个阶段的正样本的数量。该数字是基于用户提供的正样本总数和值TruePositiveRateNumCascadeStages参数。

用于训练每个阶段的可用正样本的数量取决于真阳性率。速率指定函数可以将阳性样本划分为阴性的百分比。如果一个样本在任何阶段被归类为阴性,它就永远不会进入后续阶段。例如,假设你设置TruePositiveRate0.9,所有可用的样本都用于训练第一阶段。在这种情况下,10%的正样本被拒绝为阴性,只有90%的正样本可以用于第二阶段的训练。如果继续训练,则每个阶段的训练样本越来越少。每一个后续阶段都必须解决一个越来越困难的分类问题,并且要使用更少的正样本。由于每个阶段得到的样本更少,后期阶段可能会过度拟合数据。

理想情况下,使用相同数量的样本来训练每个阶段。为此,用于训练每个阶段的正样本的数量必须小于可用的正样本的总数。唯一的例外是,当值TruePositiveRate乘以总阳性样本数小于1,没有阳性样本被拒绝为阴性。

该函数使用以下公式计算每个阶段使用的正样本数量:

阳性样本数=地板上totalPositiveSamples/ (1 + (NumCascadeStages- 1 * (1 -TruePositiveRate)))

这种计算并不能保证每个阶段都有相同数量的阳性样本可用。原因是不可能确切地预测有多少阳性样本会被拒绝为阴性样本。只要可用于训练一个阶段的正样本数大于使用前一个公式自动确定的函数样本数的10%,训练就继续进行。如果没有足够的正样本,则训练停止,函数发出警告。该函数还输出一个分类器,该分类器包含到该点为止所训练的阶段。如果训练停止,您可以添加更多的正样本。或者,你可以增加TruePositiveRate.减少阶段的数量也可以起到作用,但这种减少也会导致更高的整体误报率。

如果阴性样本用完了怎么办?

该函数计算在每个阶段使用的负样本的数量。这个计算是通过在每个阶段使用的正样本数乘以的值来完成的NegativeSamplesFactor

与正样本一样,也不能保证在特定阶段总能得到计算出的负样本数量。的trainCascadeObjectDetector函数从负图像生成负样本。但是,随着每一个新阶段的出现,级联分类器的整体误报率降低,使其发现负样本的可能性降低。

只要可以训练一个阶段的负样本数大于计算出的负样本数的10%,训练就继续进行。如果没有足够的负样本,则训练停止,函数发出警告。它输出一个分类器,该分类器由它到该点为止所训练的阶段组成。当训练停止时,最好的方法是添加更多的负面图像。或者,您可以减少阶段的数量或增加假阳性率。

例子

训练一个五级停车标志探测器

训练一个真实阳性率降低的五阶段停车标志检测器

训练一个十级停车标志检测器

列车停车标志探测器

从MAT文件加载正样本数据。该文件包含一个表,指定了几个对象类别的边界框。表从图片标志应用程序。

负载阳性样本。

负载(“stopSignsAndCars.mat”);

从表格中选择停止符号的边界框。

positiveInstances = stopSignsAndCars (:, 1:2);

将图像文件夹添加到MATLAB路径中。

imDir = fullfile (matlabroot,“工具箱”“愿景”“visiondata”...“stopSignImages”);目录(imDir);

指定底片的文件夹。

negativeFolder = fullfile (matlabroot,“工具箱”“愿景”“visiondata”...“nonStopSigns”);

创建一个imageDatastore包含负映像的对象。

negativeImages = imageDatastore (negativeFolder);

使用HOG特性训练一个名为“stopSignDetector.xml”的级联对象检测器。注意:该命令可能需要几分钟的时间来运行。

trainCascadeObjectDetector (“stopSignDetector.xml”positiveInstances,...negativeFolder,“FalseAlarmRate”, 0.1,“NumCascadeStages”5);
自动设置ObjectTrainingSize(35岁,32)使用最多42 42正样本每阶段使用最多84负样本每阶段——cascadeParams训练阶段1的5  [........................................................................)使用42积极和84 -样品时间训练阶段1:训练阶段2 5 0秒  [........................................................................)使用42积极和84 -样品时间训练阶段2:训练阶段3的5 0秒  [........................................................................)使用42积极和84 -样品时间训练阶段3:2秒训练阶段4的5  [........................................................................)使用42积极和84 -样品时间训练阶段4:5的5 6秒的训练阶段  [........................................................................训练第5阶段:9秒训练完成

使用新训练的分类器检测图像中的停止标志。

探测器=愿景。CascadeObjectDetector (“stopSignDetector.xml”);

阅读测试图像。

img = imread (“stopSignTest.jpg”);

发现停车标志。

bbox =步骤(检测器,img);

插入边框矩形并返回标记的图像。

detectedImg = insertObjectAnnotation (img,“矩形”bbox,“停车标志”);

显示检测到的停止标志。

图;imshow (detectedImg);

从路径中删除映像目录。

rmpath (imDir);

相关的话题

外部网站