Py学习  »  机器学习算法

使用深度学习实现目标检测——车辆检测

CVer • 4 年前 • 303 次点击  

目标检测是指在图像和视频中对目标进行定位和分类。在本文中,我们将通过一个车辆检测示例,介绍如何使用 MATLAB 深度学习创建目标检测器。相同步骤可用于创建任何目标检测器。

 

直播预告

MATLAB带你设计深度学习目标检测系统

——让机器“看见”

2019 年 7 月 25 日 20:00


想用深度学习做目标检测?可是浩如烟海的算法原理和公式推导,令人眼花缭乱、云山雾罩?


本讲中 MATLAB 用经典算法的生动实例,带你搞清目标检测原理,并快速建立对算法的直观理解。掌握使用 MATLAB 分别完成两段式目标检测算法的设计(R-CNN 系列),以及一段式目标检测算法的设计和嵌入式硬件实现(YOLO 系列)。


亮点包括:


  • 目标检测

  • 深度学习

  • 机器视觉

  • 嵌入式实现


扫描二维码,即刻预约本次直播>>


下图显示了一个三类车辆检测器的输出结果,检测器对每一种类型的车辆进行了定位和分类。


对不同类型车辆进行定位和分类的车辆检测器显示的输出结果

 

在创建车辆检测器之前,我需要一组标注的训练数据,这是一组用感兴趣目标的位置和标签标注的图像。更具体地说,是需要有人对每幅图像或视频帧进行筛选,并对所有感兴趣目标的位置进行标注。这个过程称为“真值标注”。真值标注通常是创建目标检测器过程中最耗时的部分。下图左侧显示的是原始训练图像,右侧显示的是经过真值标注的相同图像。


原始输入图象(左)和经过地面实况标注的输入图象(右)

 

可以想见,标注一组数量足够大的训练图像数据集是一项极费人力的处理过程。为了减少数据标注时间,我使用了“Ground Truth Labeler”自动驾驶系统工具箱,这款app 可使地面实况标注过程实现部分自动化。


用于标注视频和图像数据的“Ground Truth Labeler ”app屏幕截图


实现标注过程部分自动化的一种方法是使用跟踪算法。我使用的 Kanade Lucas Tomasi算法(KLT)是在实际应用中使用的第一种计算机视觉算法。KLT 算法将目标表示为一组特征点,然后逐帧跟踪它们的移动位置。我们可以在第一帧中手动标注一个或多个目标,然后使用跟踪算法标注视频的其余部分。“Ground Truth Labeler ”app 还允许用户导入自己的算法进行自动化标注。我见过的最常用的方法是,用户导入自己现有的检测器,再进行新数据标注,这可以帮助他们创建出更精确的检测器。下图演示了使用“Ground Truth Labeler ”app 标注一系列图像或视频的工作流程。


使用MATLAB进行自动真值标注的流程

 

标注数据最终以 table 格式存储,table 中列出了训练集视频中车辆在每个时间点的位置。真值标注完成后,我可以开始训练车辆检测器。本例中,我估计真值标注过程最高可加速 119 倍。我们以每秒 30 帧的速度捕捉训练视频数据,每 4 秒对目标进行一次标注。这意味着我们将节省中间 119 帧的标注时间。当然这是最好的情况,因为我们有时还得花时间更正自动标注的输出结果。我们的车辆检测器使用的是  Faster R-CNN 网络。首先,定义一个网络架构,如下面的 MATLAB 代码片段所示。Faster R-CNN 算法主要分析图像的区域,因此输入层比输入图像的预期尺寸要小。本例中,我选择了一个 32x32 像素的窗口。输入尺寸需要根据执行时间和希望检测器解析的空间细节进行衡量。


% Create image inputlayer.inputLayer =imageInputLayer([32 32 3]);

横向滑动查看完整代码 >>


中间层是网络的核心构造块,具有重复的卷积层、ReLU 层和池化层。本例中,我只会使用几个层。若要提高准确性,或者如果想要将更多的类并入检测器中,可以重复这些使用层,创建一个更深的网络,您可以在神经网络工具箱文档中了解到不同类型的层的详细信息。  

% Define theconvolutional layer parameters.filterSize = [33];numFilters =32;
% Create themiddle layers.middleLayers =[convolution2dLayer(filterSize,numFilters, 'Padding', 1)reluLayer()convolution2dLayer(filterSize,numFilters, 'Padding', 1)reluLayer()maxPooling2dLayer(3,'Stride',2)];

横向滑动查看完整代码 >>


CNN的最后一层通常是一组全连接层和一个 softmax loss 层。在本例中,我在全连接层之间添加了一个 ReLU 非线性层,用以提高检测器的性能,因为我们这个检测器的训练集并没有我想要的那么大。


finalLayers = [% Add a fullyconnected layer with 64 output neurons. The output sizeof this layerwill be an array with a length of 64.fullyConnectedLayer(64)Add a ReLUnon-linearity.reluLayer()Add the lastfully connected layer. At this point, the network must% produceoutputs that can be used to measure whether the input image% belongs toone of the object classes or background. This measurementis made usingthe subsequent loss layers.fullyConnectedLayer(width(vehicleDataset))Add thesoftmax loss layer and classification layer.softmaxLayer()classificationLayer()];
layers = [inputLayermiddleLayersfinalLayers]

横向滑动查看完整代码 >>


为训练目标检测器,我将“layers”网络结构输入“trainFasterRCNNObjectDetector”函数。如果您安装了GPU,算法会默认使用GPU。如果您不想使用GPU或者想使用多个GPU,您可以在“trainingOptions(训练选项)”中调整“ExecutionEnvironment”参数。

detector = trainFasterRCNNObjectDetector(trainingData, layers,options, ...
'NegativeOverlapRange', [0 0.3], ...
'PositiveOverlapRange', [0.61], ...
'BoxPyramidScale', 1.2);

横向滑动查看完整代码 >>


完成训练之后,可以在测试图像上试一试,看看检测器是否正常工作。我使用下面的代码在单一图像上测试检测器。 

% Read atest image. I = imread('highway.png');
 % Run the detector. [bboxes, scores] = detect(detector, I);  % Annotate detections in the image. I = insertObjectAnnotation(I, 'rectangle',bboxes, scores); figure imshow(I)

横向滑动查看完整代码 >>


Faster R-CNN车辆检测器检测到的边界框和得分


若您确信自己的检测器正常工作,我强烈建议您使用统计指标(例如,平均精度)在更大的一组验证图像集上进行测试。平均精度提供的单一分数可衡量检测器进行正确分类的能力(准确率)以及检测到所有相关对象的能力(召回率)。

 

直播预告

MATLAB带你设计深度学习目标检测系统

——让机器“看见”

2019 年 7 月 25 日 20:00


想用深度学习做目标检测?可是浩如烟海的算法原理和公式推导,令人眼花缭乱、云山雾罩?


本讲中 MATLAB 用经典算法的生动实例,带你搞清目标检测原理,并快速建立对算法的直观理解。掌握使用 MATLAB 分别完成两段式目标检测算法的设计(R-CNN 系列),以及一段式目标检测算法的设计和嵌入式硬件实现(YOLO 系列)。


亮点包括:


  • 目标检测

  • 深度学习

  • 机器视觉

  • 嵌入式实现


扫描二维码,即刻预约本次直播>>

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/36000
 
303 次点击