主要内容

开始使用级联对象检测器

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

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

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

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

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

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

级联分类器由阶段组成,其中每个阶段是弱学习者的集合。弱学习者是简单的分类者决定树桩.每个阶段都使用一种叫做“加速”的技术进行训练。提高提供通过对弱学习者所作决策的加权平均值来训练高度准确的分类器的能力。

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

该阶段的设计是为了尽可能快地排除阴性样品。假设绝大多数窗口不包含感兴趣的对象。相反,真正的阳性结果很少,值得花时间去验证。

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

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

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

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

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

创建级联分类器trainCascadeObjectDetector

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

参数设置注意事项

选择函数参数来优化阶段数、假阳性率、真阳性率以及用于训练的特征类型。在设置参数时,要考虑这些权衡。

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

可用于训练的特性类型

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

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

供应正样本

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

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

供应负面形象

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

随着增加更多的级,检测器的总体假阳性率降低,导致阴性样本的生成更加困难。因此,提供尽可能多的负面形象是有帮助的。为了提高训练的准确性,提供包含通常与感兴趣的对象相关的背景的负面图像。同样,也要包括消极的图像,包含与感兴趣的物体外观相似的非物体。例如,如果你正在训练一个停止标志检测器,包括消极的图像,包含道路标志和形状类似的停止标志。

选择阶段的数量

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

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

检测器培训时间

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

故障排除

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

trainCascadeObjectDetector函数自动确定用于训练每个阶段的阳性样本的数量。数量是基于用户提供的阳性样本总数和的值TruePositiveRate而且NumCascadeStages参数。

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

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

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

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

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

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

该函数计算每个阶段使用的负样本数。的值乘以每个阶段使用的正样本的数量,就可以进行计算NegativeSamplesFactor

就像正样本一样,不能保证负样本的计算数量对于特定阶段总是可用的。的trainCascadeObjectDetector函数从负图像中生成负样本。但是,每增加一个阶段,级联分类器的整体虚警率就会降低,从而使其更不容易找到负样本。

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

例子

训练一个五阶段停止标志检测器

训练一个降低真阳性率的五级停止标志检测器

训练一个十级停止标志探测器

列车停止标志检测器

从MAT文件加载阳性样本数据。该文件包含ground truth,指定为几个对象类别的边界框表。地面真相被标记和输出从图片标志应用程序。

负载(“stopSignsAndCars.mat”);

在停止标志图像前加上fullpath前缀。

stopSigns = fullfile (toolboxdir (“愿景”),“visiondata”stopSignsAndCars {: 1});

创建数据存储以加载停止标志的地面真实数据。

imd = imageDatastore (stopSigns);建筑物= boxLabelDatastore (stopSignsAndCars (:, 2));

组合图像和框标签数据存储。

positiveInstances =结合(imd,建筑物);

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

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

为负图像指定一个文件夹。

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

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

negativeImages = imageDatastore (negativeFolder);

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

trainCascadeObjectDetector (“stopSignDetector.xml”, negativeFolder positiveInstances 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秒的训练阶段  [........................................................................使用42个阳性样本和17个阴性样本训练时间:第5阶段:9秒训练完成

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

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

阅读测试图像。

img = imread (“stopSignTest.jpg”);

在测试图像中检测停止标志。

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

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

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

显示检测到的停止标志。

图;

imshow (detectedImg);

从路径中删除图像文件夹。

rmpath (imDir);

相关的话题

外部网站

Baidu
map