深度学习车辆检测实现自动驾驶
在本文中,我将通过一个车辆检测示例演示如何使用深度学习创建目标检测器。相同的步骤可用于创建任何目标探测器。
我经常有朋友和同事问我自动驾驶系统如何感知周围的环境并做出“人类”的决定。
目标检测是指对图像和视频中的目标进行定位和分类。
下图显示了一个三类车辆检测器的输出,该检测器对每种类型的车辆进行定位和分类。
由车辆检测器显示的输出,用于定位和分类不同类型的车辆
在创建车辆检测仪之前,我需要一组带标签的训练数据,这是一组带有目标位置和标签的图像。更具体地说,需要有人对每个图像或视频帧进行筛选,并标记所有感兴趣对象的位置。这个过程称为“真值注释”。
真值注释通常是创建目标检测器最耗时的部分。下图左侧显示原始训练图像,右侧显示标有真值的同一图像。
原始输入图像(左)和地面真值(右)上的输入图像
用于标记视频和图像数据的地面真值贴标器屏幕截图
自动化注释过程的一个方法是使用跟踪算法。
我使用的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 = [inputLayermiddleLayersfinalLayers]
为了训练目标探测器,我将层网络结构输入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 可获取更多资源