admin管理员组

文章数量:821254

深度学习车辆检测实现自动驾驶

在本文中,我将通过一个车辆检测示例演示如何使用深度学习创建目标检测器。相同的步骤可用于创建任何目标探测器。

我经常有朋友和同事问我自动驾驶系统如何感知周围的环境并做出“人类”的决定。

目标检测是指对图像和视频中的目标进行定位和分类。

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

由车辆检测器显示的输出,用于定位和分类不同类型的车辆

在创建车辆检测仪之前,我需要一组带标签的训练数据,这是一组带有目标位置和标签的图像。更具体地说,需要有人对每个图像或视频帧进行筛选,并标记所有感兴趣对象的位置。这个过程称为“真值注释”。

真值注释通常是创建目标检测器最耗时的部分。下图左侧显示原始训练图像,右侧显示标有真值的同一图像。

原始输入图像(左)和地面真值(右)上的输入图像

用于标记视频和图像数据的地面真值贴标器屏幕截图

自动化注释过程的一个方法是使用跟踪算法。

我使用的Kanadelucas-Tomasi算法(KLT)是第一个在实际应用中使用的计算机视觉算法。KLT算法将目标表示为一组特征点,然后逐帧跟踪其运动位置。我们可以在第一帧中手动标记一个或多个目标,然后使用跟踪算法标记其余视频。

地面真值贴标机还允许用户导入自己的自动贴标算法。

我看到的最常见的方法是,用户导入自己的现有检测器,然后标记新数据,这有助于他们创建更精确的检测器。下图说明了使用地面真值贴标机标记一系列图像或视频的工作流程。

利用matlab实现真值自动标注的过程。

注释数据最终以表格格式存储,其中列出了训练集视频中每个点的车辆位置。在标记了真值之后,我可以开始训练车辆检测器。

在这种情况下,我估计真值标记过程可以加速多达119倍。我们以每秒30帧的速度捕获训练视频数据,并每隔4秒标记一次目标。这意味着我们将节省中间119帧的标记时间。当然,这是最好的情况,因为有时我们必须花时间纠正自动标签的输出。

我们的车辆检测器使用Fasterr CNN网络。首先,定义一个网络体系结构,如下面的matlab代码片段所示。更快的R-CNN算法主要分析图像的面积,因此输入层小于输入图像的预期大小。在这个例子中,我选择了一个32x32像素的窗口。输入大小需要根据执行时间和探测器需要解决的空间细节进行测量。

%Createimageinputlayer.inputLayer = imageInputLayer([32323]);

中间层是网络的核心构建块,具有重复的卷积层、relu层和池层。

在这种情况下,我只使用一些图层。为了提高准确性,或者如果您想在检测器中加入更多的类,您可以重复这些使用层来创建一个更深的网络。

% Define the convolutional layer parameters.​filterSize = [3 3];​numFilters = 32;​% Create the middle layers.​middleLayers = [​convolution2dLayer(filterSize, numFilters, 'Padding', 1)​reluLayer()​convolution2dLayer(filterSize, numFilters, 'Padding', 1)​reluLayer()​maxPooling2dLayer(3, 'Stride',2)​];

CNN的最后一层通常是一组完全连接的层和一个软最大损耗层。

在本例中,我在完全连接的层之间添加了一个relu非线性层,以提高检测器的性能,因为我们的检测器的训练集没有我想要的那么大。

finalLayers = [​% Add a fully connected layerwith64outputneurons. Theoutputsize​%ofthis layer will be anarraywithalengthof64.​fullyConnectedLayer(64)​%Adda ReLU non-linearity.​reluLayer()​%Addthelastfully connected layer.Atthis point, the network must​% produce outputs that can be usedtomeasure whether theinputimage​% belongstooneoftheobjectclassesorbackground. This measurement​%ismadeusingthe subsequent loss layers.​fullyConnectedLayer(width(vehicleDataset))​%Addthe softmax loss layerandclassification layer.​softmaxLayer()​classificationLayer()​];​​​layers = [​inputLayer​middleLayers​finalLayers​]

为了训练目标探测器,我将层网络结构输入trainfasterrcnObjectDetector函数。如果安装了GPU,默认情况下算法将使用GPU。如果不想使用GPU或想使用多个GPU,可以在培训选项中调整ExecutionEnvironment参数。

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

完成训练后,您可以在测试图像上进行测试,看看探测器是否正常工作。使用下面的代码在单个图像上测试探测器。

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

快速R-CNN车辆检测器检测到的边界框和分数

如果您确定您的检测器工作正常,我强烈建议您使用统计指标(例如,平均准确度)对更大的一组验证图像集进行测试。平均准确度提供的单一准确度测量了探测器正确分类(准确度)的能力和探测所有相关物体的能力。

关注微信公众号:“图像算法”或者微信搜索imalg_cn 可获取更多资源

本文标签: 深度学习车辆检测实现自动驾驶