学生休息室

分享技术和现实生活的例子,学生可以如何使用MATLAB和Simulink在他们的日常项目#学生成功金宝app

YOLOv2目标检测:MATLAB中的神经网络数据标记

在今天的博客中,我们将讨论使用深度学习进行目标检测的完整工作流。您将学习一步一步的数据标记方法,训练YOLOv2神经网络,并在MATLAB中评估网络。的本示例中使用的数据来自RoboNation竞赛团队。

我。数据预处理

迈向数据科学问题的第一步是准备好你的数据。下面是处理数据集时应该执行的几个步骤。

  1. 下载数据集及其子文件夹,并将它们添加到MATLAB路径中。
  2. 调整图像的大小为416年x416x3来说明YOLOv2架构,使用该函数imresize
  3. 将完整数据集分解为训练数据、验证数据和测试数据,避免过拟合,优化训练数据集的准确性。

注意:提供的数据集已被调整大小并划分到文件夹中,以便于共享;只有在使用自己的数据时才需要执行这些步骤。请参阅下面的“代码文件”文件夹这GitHub回购来检查代码。

2数据标签

您需要标记图像来执行监督学习方法。因此,下一步将是标记数据集中感兴趣的对象。

截图

A.创造基本真理

Ground Truth Labeler应用或者是视频贴标签机应用,你可以给对象贴上标签,通过应用程序的内置算法或通过在应用程序中集成您自己的自定义算法.在这个例子中,我们使用ground truth Labeler应用程序来创建ground truth,但是你也可以使用Video Labeler应用程序来实现相同的结果和工作流程。

一旦您标记了图像,您就可以为每个列车、测试和验证数据集导出地面真值作为地面真值数据对象。接下来,使用该函数从ground truth对象创建训练数据objectDetectorTrainingData.你把这些训练数据输入你的网络。

trainingData = objectDetectorTrainingData (gTruthResizedTrain SamplingFactor, 1…“WriteLocation”、“TrainingData”);

要了解如何实现上述步骤,请查看下面链接的视频。

3设计和培训YOLOv2网络

现在您的数据已经准备好了。我们来谈谈神经网络。

那么,什么是YOLOv2网络?- - - - - -你只看一次(YOLO)是一种针对实时处理的目标检测系统。该算法采用单级目标检测网络,比卷积神经网络区域(faster R-CNNs)等两级深度学习目标检测网络更快。

YOLOv2模型对输入图像运行深度学习CNN,以产生网络预测。目标检测器解码预测并生成边界框。

A. YOLOv2网络层设计

您可以从头开始逐层设计一个定制的YOLOv2模型。模型应该总是从一个输入层开始,然后是包含一系列卷积层、批处理归一化层和ReLu(整流线性单元)层的检测子网络。这些层然后连接MATLAB的内置yolov2TransformLayer和yolov2OutputLayer。

yolov2TransformLayer将原始CNN输出转换为产生对象检测所需的形式。yolov2OutputLayer定义锚盒参数,实现用于训练检测器的损耗函数。

按照上述方法,您可以使用imageInputLayer函数定义图像输入层的最小图像大小(这里使用的是128x128x3)。根据需要检测的数据集和对象进行最佳判断。

inputLayer = imageInputLayer([128 128 3],'Name','input','Normalization','none');filterSize = [3 3];

接下来是中间层。遵循的基本方法YOLO9000纸,用一批重复Convolution2dLayer批归一化层RelU层,马克斯池层

midlelers =[卷积2dlayer (filterSize, 16, 'Padding', 1,'Name','conv_1',…'WeightsInitializer','窄-normal') batchNormalizationLayer('Name','BN1') reluLayer('Name','relu_1') maxPooling2dLayer(2, 'Stride',2,'Name','maxpool1')卷积2dlayer (filterSize, 32, 'Padding', 1,'Name', 'conv_2',…'WeightsInitializer',' narrowality -normal') batchNormalizationLayer('Name','BN2') reluLayer('Name','relu_2') maxPooling2dLayer(2, 'Stride',2,'Name','maxpool2')卷积2dlayer (filterSize, 64, 'Padding', 1,'Name','conv_3',…'WeightsInitializer',' narrowality -normal') batchNormalizationLayer('Name','BN3') reluLayer('Name','relu_3') maxPooling2dLayer(2, 'Stride',2,'Name','maxpool3')卷积2dlayer (filterSize, 128, 'Padding', 1,'Name','conv_4',…'WeightsInitializer','窄-normal') batchNormalizationLayer('Name','BN4') reluLayer('Name','relu_4')];

最后将初始层和中间层结合起来,转换成一个层图形对象,以便对层进行操作。在下面的步骤c中,您将使用这一层图来组装最终的网络。

lgraph = layerGraph ([inputLayer;middleLayers]);

您需要的另一个参数是类的数量。您应该根据输入数据计算它。

numClasses =大小(trainingData, 2) 1;

B.定义锚盒

在组装最终网络之前,您已经了解了YOLO体系结构中的锚盒概念。锚框是一组具有一定高度和宽度的预定义边界框。定义它们是为了捕获您想要检测的特定对象类的规模和宽高比,通常是根据训练数据集中的对象大小选择的。您可以定义多个锚框,每个锚框对应不同的对象大小。锚盒的使用使网络能够检测多个对象、不同规模的对象和重叠的对象。你可以研究细节锚箱基础在这里。

锚盒是根据训练数据中对象的比例和大小来选择的。你可以使用集群估计锚盒根据训练数据确定一组好的锚盒。使用此过程,本例中使用的数据集的锚框是:

锚= [43 59 18 22 23 29 84 109];

C.组装YOLOv2网络

最后一步是使用该函数将上述所有网络部件组装到YOLOv2架构中yolov2Layers.这个函数在yolov2Transform和yolov2OutputLayer中添加了一个YOLO层的内置子网。

lgraph = yolov2Layers ([128 128 3],numClasses,Anchors,lgraph,'relu_4');

‘relu_4’是特征提取层。从这一层提取的特征作为输入给YOLO v2对象检测子网络。可以指定除完全连接层外的任何网络层为特征层。

你可以想象lgraph使用网络分析仪的应用。

analyzeNetwork (lgraph);

D.培训网络

一旦你准备好了图层,你就可以训练网络了。现在,您需要处理模型的培训选项。

为了训练一个网络,你总是提供一些算法培训方案.这些选项指导网络如何学习。使用这些选项进行更改可以帮助您修改网络的性能。

学习率,最小批量大小,无纪元是一些需要考虑的重要培训方案。这些可以帮助您决定在每一轮训练中,您的网络的学习速度应该是多少,以及您的网络应该使用多少数据样本进行训练。

对于这个例子,基于数据集的大小,我使用求解器-随机梯度下降对网络进行了80个epoch的训练,初始学习率为0.001,小批量大小为16。这里我考虑到数据的大小,调整epoch和mini-batch的大小,降低了学习率,给训练更多的时间。您应该根据您的数据集修改选项。

options = trainingOptions('sgdm',…“InitialLearnRate”,0.001,…“详细”,的确,MiniBatchSize, 16日“MaxEpochs”,80年,…“洗牌”、“every-epoch’,‘VerboseFrequency’,50岁,…“DispatchInBackground”,真的,…“ExecutionEnvironment”、“汽车”);

一旦您有了培训数据、网络和培训选项,使用YOLOv2培训功能培训检测器-trainYOLOv2ObjectDetector

[detectorYolo2, info] = trainYOLOv2ObjectDetector(trainingData,lgraph,options);

E.检测器检测输出

一旦有了检测器,就可以通过在验证数据集中运行检测器来检查结果。

您可以先创建一个表来保存结果。

result = table('Size',[height(TestData) 3],…VariableTypes,{‘细胞’,‘细胞’,‘细胞’},…VariableNames,{“盒”,“分数”,“标签”});

然后初始化可部署的视频播放器以查看图像流。

depVideoPlayer = vision.DeployableVideoPlayer;

然后循环遍历验证集中的所有图像。

for i = 1:height(ValidationData) %读取图像i = imread(ValidationData. imagefilename {i});%运行检测器。[bboxes、分数、标签]=检测(detectorYolo2,我);% if ~isempty(bboxes) I = insertObjectAnnotation(I,'Rectangle',bboxes,cellstr(labels));depVideoPlayer(我);暂停(0.1);end %在结果表results中收集结果。盒子我{}=地板(bboxes);结果。分数{我}=分数;结果。Labels{i} = labels; end

f .评估

一旦您有了训练有素的检测器,并在视觉上确认了验证数据上的检测,您就可以计算数值评估指标并在测试数据上绘制结果。

MATLAB提供内置函数evaluateDetectionPrecisionevaluateDetectionMissRate分别评估精度指标和失效率指标。

[ap, recall, precision] = evaluateDetectionPrecision(results, TestData(:,2:end),threshold);[am,fppi,missRate] = evaluateDetectionMissRate(results, TestData(:,2:end),threshold);

当涉及到缺失率和精度时,阈值是一个重要的参数。阈值参数决定了探测器给出的感兴趣对象周围的边界框与地面真实中同一对象的边界框的重叠程度。它被计算为交叉在联合(IoU)或雅卡德索引.如下图所示,对于相同的检测数据和地面真实数据,改变阈值参数的值会极大地改变评价指标的值。选择一个最适合您的应用程序的重叠阈值,并记住,较高的阈值意味着您希望您的检测结果重叠更大范围的地面真相。

0.7阈值

0.3阈值

查看下面的视频,了解如何完成上述设计和培训YOLOv2网络的步骤。

4导入基于Python的模型

另一种培训网络的方法是导入Python或其他3理查德·道金斯在MATLAB中开发了模型。一种方法是遵循以下工作流:

转换你的Python到ONNX模型- >导入ONNX模型到MATLAB

要了解更多如何导入预先训练的YOLOv2 ONNX模型到MATLAB中,并在自定义数据集上训练它,请查看下面的博客和视频。

博客:MATLAB中基于ONNX模型的YOLOv2目标检测

视频:将预训练的深度学习网络导入MATLAB

总结

一些关键的外卖:

因此,我们在这里了解到,通过在MATLAB的单一环境中开发一个完整的目标检测模型,可以简化使用不同平台的工作难度。查看下一篇文章,了解如何在NVIDIA Jetson上部署这个模型。

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。