主要内容

在树莓派上使用深度学习检测和跟踪对象

本示例展示了如何使用MATLAB®支持包为树莓派™硬件部署深度学习算法,该算法在Co金宝appnnected IO和PIL模式下检测和跟踪对象。该算法使用基于resnet -18的YOLOv2神经网络来识别安装在伺服电机上并连接到树莓派硬件板的摄像头所捕获的物体。你可以在周围的不同物体上进行实验,看看网络在树莓派硬件上检测图像的准确性如何。

注意:不能使用macOS在树莓派硬件上生成和部署深度学习代码。

先决条件

配置树莓派网络硬件设置窗口。在此过程中,下载用于深度学习的MathWorks®Raspbian映像。如果您选择自定义硬件上的现有映像,而不是使用MathWorks Raspbian映像,请确保选择了安装ARM®计算库的选项。

所需的硬件

硬件设置

  1. 为树莓派目标板上电。

  2. 使用跳线将伺服电机连接到树莓派目标板。连接GND和VCC引脚。此外,在本例中,将伺服电机信号引脚连接到树莓派目标板的GPIO引脚12。

  3. 用胶带或粘合剂将相机安装在伺服电机的顶部。本例使用USB网络摄像头。

创建跟踪对象

创建跟踪器对象并获得地面真相数据。

tracker = raspiObjectTracker
追踪=
带有属性的raspiObjectTracker:
BoardDetails: [1x1 struct]设置:[1x1 struct]检测器:[1x1 struct]测试配置文件:[1x1 struct]

查看树莓派目标板详细信息。

跟踪器。BoardDetails
ans =
带字段的结构:
名称:树莓派DeviceAddress: 192.168.0.100用户名:Pi密码:树莓

该结构显示了树莓派单板的名称、设备地址、用户名和密码。您可以使用点表示法来更改值。例如,将密码修改为MATLAB

tracker.BoardDetails.Password =MATLAB的

通过再次查看属性来检查更改。

跟踪器。BoardDetails
ans =
带字段的结构:
名称:树莓派DeviceAddress: 192.168.0.100用户名:Pi密码:MATLAB

该结构显示了更新后的密码。

查看图像捕获设置属性。

跟踪器。设置
ans =
带字段的结构:
DataCaptureTime: 120 CameraInterface: 'webcam'

这个结构显示了接口的类型和捕获时间。

  • DataCaptureTime—跟踪对象图像采集的时间,单位为秒。默认时间为120秒。您可以使用点表示法来更改值。在检测和跟踪一个物体时,可以增加捕获时间来提高神经网络的训练效率。将捕获时间更改为300秒。

trace . setup . datacapturetime = 300;
  • CameraInterface—用于检测和跟踪目标的摄像头接口类型网络摄像头cameraboard对象。缺省接口为网络摄像头

将要检测和跟踪的对象放置在摄像机前,在MATLAB命令窗口中执行以下命令:

objectTrackingSetup(跟踪)

该命令与树莓派硬件建立IO连接,并从网络摄像头获取ground truth数据。它还会打开贴标签机视频应用程序。

控件中指定的时间,摄像机将捕获图像DataCaptureTime财产。该应用程序将图像保存到当前工作目录中的文件夹数据-_date_ -_timestamp_,日期当前日期和时间戳是当前时间。

对象中复制一个示例图像数据-_date_-_timestamp_文件夹,并粘贴到当前工作目录。的文件名,以便在训练网络时使用它作为参考图像tracker.Detector.SampleImage财产。

运行objectTrackingSetup(跟踪)命令还将打开贴标签机视频这个应用程序允许您标记感兴趣的区域(ROI),使用自动化算法自动跨图像帧标记,并导出标记的地面真相。

在视频标签应用程序中遵循以下步骤:

  1. ROI标签窗格中,单击标签.创建一个矩形标签,命名,然后单击好吧.在本例中,对象具有名称

  2. 使用鼠标在图像中绘制矩形ROI。

  3. 自动贴标部分,使用选择算法按钮,以选择点跟踪器算法然后点击自动化.算法指示显示在右窗格中,所选标签可用于自动化。

  4. 运行部分中,点击运行自动标记图像序列。

  5. 当对算法结果满意时,进入关闭部分中,点击接受

  6. 出口标签中,选择到文件将标记的数据导出到MAT文件objectLabel.mat

有关如何使用视频标签应用程序的详细信息,请参阅贴标签机视频而且开始与视频标签

检测对象

从捕获的地面真相数据训练YOLOv2对象检测器,并在Connected IO和PIL模式下验证被检测到的对象。

使用跟踪器。探测器命令查看LabeledData字段是您使用视频标签应用程序导出的MAT文件的名称。

跟踪器。探测器
ans =
带字段的结构:
LabeledData:“objectLabel。ImageSize: [224 224 3] NumClasses: 1 SampleImage: ' SampleImage .jpg'网络:[1x1 struct]训练选项:[1x1 struct] DetectorMatFile: 'detectorSaved.mat'

训练YOLOv2对象检测器

用从相机捕获的图像训练YOLOv2对象检测器。的objectLabel.mat文件包含导出的地面真相数据。使用这个文件来训练YOLOv2对象检测器。

从当前捕获的目标图像目录中,选择一个有效的样本图像作为训练神经网络的参考。对于本例,将示例图像设置为image_50.png

tracker.Detector.SampleImage =“image_50.png”

训练YOLOv2对象检测器并将其保存为MAT文件detectorSaved.mat

createObjectDetector(跟踪)

一旦YOLOv2神经网络完成对图像的训练,就会打开一个包含所选样本图像的图形窗口。该图像显示了训练网络内的ROI和匹配概率。

请注意:可以通过Connected IO和PIL两种方式验证对象检测。

验证Connected IO模式下的对象检测

使用Connected IO模式验证检测到的对象。图像捕获过程发生在树莓派硬件本身。

在MATLAB命令窗口中执行以下命令:

跟踪器。TestAndProfile
ans =
带字段的结构:
PredictFunction: 'raspi_yolov2_detect' TestMode: 'IO' TestDuration: 60伺服:[1x1 struct]

默认的TestMode值是“输入输出”

验证IO模式下的对象检测:

startTestAndProfile(跟踪)

打开一个摄像头窗口,显示ROI和在训练网络中检测到的对象的匹配概率。

在PIL模式下验证对象检测

使用PIL模式验证被检测对象。图像捕获过程发生在树莓派硬件本身。的raspi_yolov2_detect命令以PIL模式运行在Raspberry Pi单板上。

注意:PIL模式下的对象检测和跟踪需要一些时间来执行。

修改目标检测方式为“公益诉讼”

tracker.TestAndProfile.TestMode =“公益诉讼”

在MATLAB命令提示符下运行此命令以验证PIL模式下的目标检测。

startTestAndProfile(跟踪)

打开一个摄像头窗口,显示ROI和在训练网络中检测到的对象的匹配概率。

浏览代码执行分析报告,按执行概要报告链接。

配置伺服电机参数

当目标被检测成功后,为了跟踪目标,必须配置伺服电机参数。

查看伺服电机参数。

tracker.TestAndProfile.Servo
ans =
带字段的结构:
TestWithServo: 0增量:0.5000 PinNumber: 12 StartPosition: 90 MinPulseDuration: 5.0000e-04 MaxPulseDuration: 0.0025
  • TestWithServo—启用或禁用跟踪对象的伺服电机。该字段的默认值为.使用以下命令启动伺服电机:

trace . teststandprofile . servo . testwithservo = true;

您可以根据伺服电机的数据表修改这些参数:

1.增量-伺服电机旋转步进角大小。默认步进角度值为0.5度。

2.PinNumber—伺服电机所连接的树莓派目标板GPIO引脚号。

3.起动位置-伺服电机启动角度位置。伺服电机从0到180度旋转。默认的起始角度是90度。

4.MinPulseDuration-最小脉冲持续时间移动到0度。

5.MaxPulseDuration-最大脉冲持续时间移动到180度。

连接IO模式下的跟踪对象

使用这些命令来确保伺服电机上的对象跟踪被启用,并且测试模式被设置为IO:

trace . teststandprofile . servo . testwithservo = true;
tracker.TestAndProfile.TestMode =“输入输出”

以连接IO模式跟踪被检测对象:

startTestAndProfile(跟踪)

将物体放在摄像机前并移动物体。观察伺服电机跟随运动物体转动。

一个带有ROI和与训练网络匹配概率的摄像头窗口打开。打开一个单独的窗口来显示伺服电机的角度。

PIL模式跟踪对象

使用这些命令确保伺服电机上的对象跟踪是开启的,并且测试模式设置为PIL:

trace . teststandprofile . servo . testwithservo = true
tracker.TestAndProfile.TestMode =“公益诉讼”

在已连接的PIL模式下跟踪被检测对象:

startTestAndProfile(跟踪)

将物体放在摄像机前并移动物体。观察伺服电机跟随运动物体转动。

一个带有ROI和与训练网络匹配概率的摄像头窗口打开。打开一个单独的窗口来显示伺服电机的角度。

部署在树莓派目标板上

raspi_object_tracking函数在树莓派硬件板上执行目标跟踪算法。方法中指定的跟踪算法raspi_yolov2_detect函数。

在将代码部署到树莓派目标板之前,请打开raspi_object_tracking.m函数文件,并通过修改其中一个或多个来配置参数:

  • 输入ResNet-18神经网络的图像大小

  • 观察伺服电机的增量角度、启动位置等

  • 用于捕获对象图像的相机接口类型

raspi_yolov2_detect函数使用基于yolov2的反卷积神经网络(DNN)保存为MAT文件。通过inputImg作为被检测网络的输入。如果探测到该物体,outImg包含被检测对象的包围框信息。posIncFactor指示将对象维持在此包围框的框架中心所需的旋转因子。

打开raspi_yolov2_detect.m文件,并输入保存的训练过的神经网络MAT文件的名称detectorSaved.matyolov2obj参数。

在MATLAB命令提示符下运行这些命令。

t = targetHardware(“树莓π”
t.CoderConfig.TargetLang =“c++”
DLCFG =编码器。DeepLearningConfig (“arm-compute”);
dlcfg。ArmArchitecture =v7的
t.CoderConfig.DeepLearningConfig = dlcfg;
部署(t)“raspi_object_tracking”

观察安装在伺服电机上的摄像机检测物体并跟踪其运动。在树莓派桌面,打开摄像头显示屏,观察实时跟踪结果。

对象的代码生成raspi_object_tracking函数。代码生成完成后,MATLAB生成代码生成报告。使用此报告调试raspi_object_tracking函数用于生成代码中的任何构建错误或警告。

在成功生成代码之后,支持包将加载对象分类算法并在硬件上作为独立的可执行文件运行。金宝app可执行文件开始检测所获取视频中的对象,并显示预测的标签及其相关概率。要查看树莓派屏幕,请使用VNC查看器并在硬件上打开远程会话以获得显示。您也可以将HDMI线从显示器连接到硬件。

其他可以尝试的事情

  • 训练YOLOv2对象检测器检测和跟踪多个对象。

  • 使用ResNet-18以外的神经网络对目标进行训练,观察得到结果的差异。

  • 中使用不同的算法贴标签机视频应用程序,并将结果与点跟踪器算法。

  • 方法中提供的输入图像大小raspi_yolov2_detect功能和观察目标检测图像。

另请参阅