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

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

经常有朋友和同事问我,自动驾驶系统怎么感知周围环境并做出“人类”的决定?如何在系统中使用 MATLAB?在接下来的文章中,我将解释如何使用深度学习和 MATLAB 完成两种常见的自动驾驶感知任务。

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

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

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

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

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

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

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

实现标注过程部分自动化的一种方法是使用跟踪算法

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

Ground Truth Labeler 还允许用户导入自己的算法进行自动化标注。

我见过的最常用的方法是,用户导入自己现有的检测器,再进行新数据标注,这可以帮助他们创建出更精确的检测器。下图演示了使用 Ground Truth Labeler 标注一系列图像或视频的工作流程。

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

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

本例中,我估计真值标注过程最高可加速 119 倍。我们以每秒 30 帧的速度捕捉训练视频数据,每 4 秒对目标进行一次标注。这意味着我们将节省中间 119 帧的标注时间。当然这是最好的情况,因为我们有时还得花时间更正自动标注的输出结果。

我们的车辆检测器使用的是 FasterR-CNN 网络。首先,定义一个网络架构,如下面的 MATLAB 代码片段所示。Faster R-CNN 算法主要分析图像的区域,因此输入层比输入图像的预期尺寸要小。本例中,我选择了一个 32x32 像素的窗口。输入尺寸需要根据执行时间和希望检测器解析的空间细节进行衡量。

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

本例中,我只会使用几个层。若要提高准确性,或者如果想要将更多的类并入检测器中,可以重复这些使用层,创建一个更深的网络。

CNN 的最后一层通常是一组全连接层和一个 softmax loss 层。

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

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

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

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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180906B1ZJDA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券