学生休息室

分享学生如何在日常项目中使用MATLAB和Simulink的技术和现实例子#学生成功#

在MATLAB中设计目标检测器

Connell D’souza回来做客座博客,告诉我们MATLAB中的物体检测。

- - - - - -

几周前,我参观了佛罗里达大西洋大学团队Owltonomous他们参加了诸如“机器人”之类的学生竞赛RoboBoatRobotX从2019年开始RoboSub!我们的讨论涵盖了一系列主题,包括在MATLAB中设计目标检测算法。物体探测器是允许自主系统识别周围环境的关键。该团队认为该工作流将有助于减少开发对象检测器所需的时间,因为它们的开发周期为1年。所以,我想在这篇文章中分享一些我们的讨论!本例中讨论的代码可以在这个文件交换条目

什么是对象检测器?

目标检测器是一种计算机程序,它采用计算机视觉、图像处理和/或人工智能算法来检测图像或视频流中感兴趣的特征。正如塞巴斯蒂安在这篇文章是关于自动系统的传感器在美国,相机是一种廉价而重要的自动系统感知传感器。你可以使用物体检测算法来理解你的相机“看到”什么。我喜欢根据所使用的技术将物体检测器分为3大类:

  1. 经典计算机视觉:采用经典的计算机视觉技术,如图像分割和特征检测与匹配,以识别感兴趣的对象。特征可以包括颜色、形状、边缘等。查看我们的在线教程系列MATLAB计算机视觉了解更多。
    如。颜色阈值Blob分析梯度直方图加速的健壮特性
  2. 机器学习:机器学习是一种有效的数据分类方法。这些检测器使用经典的计算机视觉算法从图像中提取特征或数据点,然后使用支持向量机等机器学习技术对特征进行分类。
    如。级联对象检测器(Viola-Jones算法)聚合信道特征(ACF)
  3. 深度学习:深度学习检测器使用标记图像形式的数据来教授感兴趣的卷积神经网络(CNN)特征。您可以从头开始训练网络,也可以在预先训练好的网络上执行迁移学习。请查看深度学习入口学习如何开始!
    如。YOLO v2意思R-CNN,快R-CNN和快R-CNN

我们将讨论设计一个ACF对象检测器,这是一个机器学习检测器。然而,正如你将看到的,通过替换一些函数和正确的计算能力,你也可以对基于深度学习的检测器遵循相同的过程。

设计探测器

使用地面真相进行目标检测的工作流程如下图所示。我将用接下来的几个部分简要地解释它们。

产生基本真相

基本事实是指由经验证据或观察提供的信息。在我们的例子中,这是一组有标签的图像。如上所示,标记图像包含,图像,对象类描述符(如bigRedBuoy, smallGreenBuoy)以及这些图像中感兴趣的区域(roi)的位置。设计者需要提供这个数据集来训练检测器。有许多公开可用的、开源的标记数据集,但可能没有数据集可用于您的特定应用程序。这将保证你创造你自己的基本真相。

MATLAB为您提供了一个工具-地面真相标签使这个过程自动化。这个应用程序为您提供了一个简单的方法来标记矩形ROI,折线ROI,像素和场景。您还可以使用内置的自动化算法或自动执行此过程提供自己的算法.一旦完成了图像或视频的标记,就可以将地面真相作为地面真相数据对象导出。观看下面的视频,学习如何自动为基本事实标记!

(视频)MATLAB和Simulink机器人竞技场:使用地面真理进行物体检测,第1部分

训练对象检测器

现在您已经有了标记的数据集或基本事实,计算机视觉工具箱提供了内置的训练函数,可用于训练机器学习或深度学习检测器。下图显示了可以帮助您训练这些检测器的功能和工作流。

trainACFObjectDetector函数用于训练一个ACF对象检测器,正如我们前面讨论的是一个机器学习检测器。这个函数调用可以被其他类似的函数代替,比如

需要注意的是,您需要提供一些针对这些深度学习检测器的训练选项,您可以在上面的文档链接中阅读相关内容。

现在您已经有了一个训练有素的检测器,您可以使用对象检测器对象的检测方法来识别感兴趣的图像对象!

评估对象检测器

一旦您有了一个训练有素的检测器,并且从视觉上确认它正在检测它想要检测的东西,您可能想要用一些数值指标来评估这些检测器。它可以是a的形式混淆矩阵或者其他常见的指标错过率而且精度.MATLAB提供了内置函数来执行这些评估。

当涉及到缺失率和精度时,使用的一个重要参数是阈值。阈值参数决定了探测器给出的感兴趣对象周围的包围框与ground truth中相同对象的包围框的重叠程度。计算方法为交叉联合(IoU)或Jaccard指数.如下图所示,对于相同的检测和地面真相数据,改变阈值参数的值会极大地改变评估指标的值。选择一个最适合您的应用程序的重叠阈值,并记住较高的阈值意味着您期望检测结果与实际情况的更大区域重叠。

当选择一个数据集来测试您的检测器时,请确保您使用的数据集是独立的用来训练探测器的那个。这将有助于确保您不会将检测器过度拟合到特定的数据集。观看下面的视频,看看这个代码是如何工作的!

(视频)MATLAB和Simulink机器人竞技场:使用地面真理进行物体检测,第2部分

生成C/ c++代码

要在机器人/车辆的计算机上使用这个检测器,您需要将MATLAB代码转换为可以在嵌入式系统上执行的低级语言,如C/ c++。在R2019a,我们添加了对上面讨论的一些对象检测器的代码生成支持,包括本例中使用的ACF对象检测器.为了生成C/ c++代码,MATLAB代码必须打包在一个函数中。的ACFObjectDetector对象,不能在生成的代码中作为参数通过函数接口传递,因为它是一个MATLAB对象,您必须通过调用的构造函数方法在函数内部构造对象acfObjectDetector类的分类器而且TrainingOptions属性作为参数。这可以通过将对象转换为具有属性字段的结构并将其保存为mat文件来实现,如下所示。

s = toStruct(检测器);保存(“detectorCodegen.mat”、“结构”,“年代”,“分类”,“ModelName”,…“NumWeakLearners”、“ObjectTrainingSize ', ' TrainingOptions ')

方法在函数中加载mat文件coder.load函数如下所示,并调用构造函数。您将希望将它声明为持久的,因此它存储在内存中,不需要在每次调用函数时构造它。一旦你修改了你的代码,你可以按照MATLAB Coder应用程序的工作流程来获得C/ c++代码。不熟悉MATLAB编码器应用程序?查看这个关于代码生成的系列教程。

function [boxes,scores] = ACFDetector(img)% # codegenif isempty(检测器)s = code .load('detectorCodegen.mat');检测器= acfObjectDetector(s.Classifier,s.TrainingOptions);End [boxes, scores] = detect(检测器,img);)

最后,我鼓励你们下载代码试一下。看看几行MATLAB代码如何帮助您开发健壮的对象检测器,并将其转换为C/ c++。

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。

Baidu
map