一种改进的SSD算法及其在车辆目标检测中的应用
2021-11-15韩雁鹏谭光鸿
韩雁鹏 侯 进 谭光鸿 罗 朔
(西南交通大学信息科学与技术学院 四川 成都 611756)
0 引 言
近年来,随着深度学习技术的出现与不断发展,目标检测模式也由传统的手工提取特征的方式转变为神经网络自主学习以提取目标图像特征。与传统的目标检测算法相比,神经网络提取的特征更加抽象与复杂,特征有更好的表达能力,这也是深度学习与目标检测结合的主要原因之一。而对于无人驾驶来说,目标检测技术的发展也进一步提高了无人驾驶环境感知能力,使得无人驾驶车辆可以更加快速安全地对道路环境做出实时反应。
Girshick等[1]提出了基于卷积神经网络的目标检测模型R-CNN,使用CNN(Convolutional Neural Network)对候选区域进行分类,这也是深度学习方法在目标检测领域中的首次系统应用。目前,基于深度学习的目标检测方法主要分为两类:双步(two-stage)目标检测算法,这些算法将目标检测分为两个阶段,首先使用RPN(Region Proposal Network)来生成待检测目标信息,然后再使用一个神经网络检测模型对待检测目标的位置信息和类别信息进行检测,典型代表为: Faster R-CNN[2]、FPN[3]、Mask R-CNN[4]等;单步(one-stage)目标检测算法,与双步模型相比,单步算法不使用 RPN网络,只使用单个目标检测网络模型来直接预测目标的位置和类别信息,因此,单步目标检测算法通常具有更高的检测速度,并且可以实现端到端的目标检测。典型代表算法为:SSD[5-6]、YOLO系列[7-9]等。SSD算法运行在单块Nvidia GTX 1080Ti显卡上检测速度可达到53帧每秒(输入图像尺寸为300×300像素)。但是对于无人驾驶汽车来说,由于功耗、空间以及成本等原因,目标检测等环境感知算法需要搭载在一些内存受限的嵌入式设备上,并在检测结果可接受的情况下达到实时检测的效果,所以本文进一步优化算法以提高目标检测算法的检测效率。
本文提出了一种改进的SSD目标检测算法,以实现更高效率的车辆目标检测,方便以后搭载至无人驾驶车辆设备。本文使用Udacity道路环境数据集中的车辆信息作为训练和检测的目标,并且对SSD的模型结构进行改进。SSD算法使用VGG[10]网络结构进行特征提取,该模型结构虽然有较好的表现,但是结构臃肿、参数量较大,导致模型检测速度不高。本文算法设计了一个目标检测网络结构,对高层特征图不进行降采样,以保留待检测物体的位置信息,同时加入空洞卷积提高模型高层卷积层的感受野,提高对于小目标的检测能力,并且使用深度可分离卷积层来替换原始标准卷积层降低参数量并提高检测速率。利用K-means[11]聚类算法对目标候选框的宽高比维度进行聚类分析。实验结果表明,本文算法对车辆目标检测的平均精准度达到了58.01%,检测速度达到了86.26帧每秒,相比原始SSD算法均有较大提升。
1 SSD算法介绍
SSD算法同时结合了单步检测算法和双步检测算法一些机制。首先采用了YOLO回归的思想,简化神经网络模型的设计,减少模型计算复杂度,来提高算法的实时性; 然后采用了Faster R-CNN中锚点(anchors)机制,通过设计不同纵横比预选框,对不同尺寸的目标进行回归预测。与其他单步目标检测算法相比,SSD这种局部特征提取的方法在目标检测方面有更好的表现。除此之外,SSD算法针对不同尺度的目标检测问题,采取了多尺度目标特征提取的方法,即对低层和高层的多尺度特征信息均进行检测,该设计提高了SSD算法对小目标的检测效果。
SSD的模型结构如图1所示,主要分为两部分。第一部分是位于前端的深度学习网络模型,主要作用是提取目标的初始特征,同时提高网络对目标的感知能力。这部分网络结构使用一些去除了分类层的分类网络模型,分类模型一方面可以有效进行特征提取,有利于后续模型的检测任务,另一方面可以利用迁移学习减少模型训练时间[12]。第二部分是位于后端的多尺度特征检测网络,通过级联的神经网络将不同尺度的特征进行分类得到了初步检测结果(类别与位置信息),并且加入低层卷积层(Conv4_3)的特征来提高SSD算法对小目标的检测效果,最后使用非极大抑制NMS(Non-Maximum Suppression)得到最终检测结果。
图1 SSD网络结构示意图
2 改进的SSD模型
2.1 数据集目标框的聚类分析
SSD算法引入了Faster R-CNN中所使用的锚点框思想,通过对初始锚点框的设置,可以提高网络对目标的检测精度和速度。而本文主要检测类别为车辆,其预测框的长宽比与通用的目标检测数据集有较大区别,所以本文使用K-means聚类算法对Udacity无人驾驶数据集中的目标框的宽高比进行聚类,并以此来进行模型参数设置。根据模型结构,选取k=3,即选取三个聚类中心,对数据集标签数据的宽高比聚类结果如表1所示。
表1 标签数据宽高比K-means聚类结果
根据此聚类结果可将SSD算法中的长宽比参数(aspect_ratios)对应设置为[1.03,1.58,2.67]。
2.2 深度可分离卷积
原始SSD算法使用VGG网络模型结构来提取图像特征,通过多层特征来进行分类和位置检测。但是VGG模型卷积层过深,参数量巨大,虽然在大型GPU上有较高的检测速度,但是对于无人驾驶汽车来说显然计算代价过大。因此本文改进了特征提取部分,使用了MobileNet[13]的深度可分离卷积结构,降低参数量,并减少了卷积层数,大大减少了计算量。深度可分离卷积结构的思想就是将一个标准卷积层分解为深度可分离卷积(depthwise conv)和1×1的卷积,这样可以有效减少卷积运算时的参数量。深度可分离卷积的结构如图2所示。
图2 标准卷积与深度可分离卷积结构
可以看到,卷积核大小为D,卷积核数量为M,输出特征图数量为N,则使用标准卷积的计算开销为:
D×D×M×N
(1)
而使用深度可分离卷积的计算开销为:
D×D×M×1+1×1×M×N
(2)
两者比值为:
(3)
本文使用的卷积核边长为3,而一般模型特征图数量N较大(本文为32、64、128等),相比可以省略。所以与标准卷积相比,深度可分离卷积可以将计算开销减少至1/9左右,较大程度提升模型检测效率。
2.3 高层卷积不降维
目前主流的单步目标检测算法都直接使用一些常见分类算法的网络模型,如VGG[10]、ResNet[14]、DenseNet[15]等,这些分类算法模型为了获得更多的类别信息,往往使用深层的神经网络,这也会导致模型需要不断地进行降采样。但是目标检测任务与分类任务不同,目标检测还需要提供待检测物体的位置信息,而随着不断的降采样,网络模型的感受野不断扩大,高层特征图会缺失目标的部分位置信息。虽然原始SSD算法提取低层的特征信息,但是依旧无法彻底解决小目标检测难问题。
本文算法设计了一种目标检测的网络模型,对高层特征图不进行降采样,增加网络高层输出特征的分辨率,保留低层特征图的位置信息,来提高对小目标的检测效果,如图3所示。
图3 模型结构对比图
由图3(b)可知,本文算法在高层不进行降采样,由此高层特征图保留了大量的目标位置信息,提高了检测精度。但这同时也会导致两个问题:1) 由于减少降采样,导致高层特征图分辨率过高,模型参数量大量增加,模型检测速度降低;2) 高层感受野下降,导致模型对一些大型目标物体检测精度下降。所以本文算法减小网络高层的宽度,减少因增大分辨率带来的额外计算量。并且引入空洞(dilated)卷积[14]增加网络高层的感受野,空洞卷积示意图如图4所示。
图4 空洞卷积结构示意图
空洞卷积可以在不增加计算量的同时扩大模型感受野,同样采用3×3的卷积核,图4(b)空洞卷积的感受野扩大到了5×5,而选取更大的rate,可以获得更大的感受野,如图4(c)所示,感受野达到了7×7。空洞卷积可以有效地提高高层卷积层的感受野大小,但由于其在检测中会省略掉一些图像连续信息,对一些小目标的检测产生影响,所以本文算法模型仅在高层加入了部分空洞卷积层。
2.4 本文算法结构
本文算法卷积网络模型采用类似MobileNet的网络结构,模型第一层为步长为2的常规卷积层,对输入图像进行降采样处理,并且增加初始特征图通道;然后使用6层深度可分离卷积,提取初始图像特征,其中将第六层的特征图作为低层信息输入至模型预测部分,以此增加模型对小目标的检测效果,并使用两层池化层进行降采样;最后使用6层深度可分离卷积,进一步提取图像信息,其中最后四层不进行降采样,以保留物体位置信息,并且加入两层空洞卷积来提高高层卷积层的感受野。模型结构如图5所示,图中未注明的模块均为深度可分离卷积模块。
图5 本文算法模型结构图
本文模型在所有卷积层后均使用批量归一化(Batch Normalization)和ELU激活函数,并且加入了L2正则化。本文网络模型具体参数如表2所示,其中Size指卷积核尺寸×输出通道数,Stride指步长,本文模型使用了步长为2的卷积层来代替池化层。
表2 网络模型结构参数表
3 数据集与评价指标
3.1 数据集处理
本文主要研究目标是道路车辆,所以常规的多类别目标检测数据集无法达到使用要求。因此本文搜集了Udacity无人驾驶道路环境数据集,并对数据进行了相关处理,使其更好地应用于无人驾驶算法训练及验证。Udacity无人驾驶数据集对连续视频图片进行了仔细的标注,主要有汽车、行人、信号灯等类别。整个数据集分为两个子数据集,分别有9 423和15 000幅图片,分辨率都是1 920×1 200像素,两个子数据集的标注文件稍有不同。由于本文训练需求,将图像调整为480×300像素大小,并将数据集中的不同类别的车辆标签如car(汽车)、track(卡车)等类别归类为同一车辆类别,最终数据标签只保留车辆类别。因为Udacity数据集标注不够严谨,出现大量的重复标签,所以对标签信息进行处理,抑制掉重复标签,最终删除了约15%的标签且只保留车辆类别。抑制条件为检测所有的数据标签,根据各个标签框与其他标签框的IoU值来进行筛选。IoU定义如下:
IoU=(a∪b)÷(a∩b)
(4)
式中:a、b为同一图片的不同标签框,IoU即为两标签框的交并集比值,当其大于某一阈值则认为两个框是同一个物体的标签(本文阈值设置为0.9)。处理前与处理后对比如图6所示,最终数据集标签保留了车辆类别标签,并且去除了大量重复标签,平均每幅图片有6.6个车辆目标。
(a) 处理前
(b) 处理后图6 数据集图片处理结果图
3.2 评价指标
目标检测常用评价指标准确率(P)和召回率(R)来衡量模型检测能力,其计算公式为:
(5)
(6)
式中:TP(True Positive)表示正确检测的目标个数;FP(False Positive)表示错误检测的目标个数;FN(False Negative)表示未检测的目标个数。
准确率即查准率,衡量目标检测模型对待检测物体的分类能力,准确率越高,表示模型对于目标的分类能力越强。召回率即查全率,衡量模型对目标的检测能力,召回率越高,表示模型对目标的分辨能力越强。
同时目标检测还使用平均准确度AP值(Average precision)反映模型对某一类别的识别能力。平均准确率从准确率和召回率两个方向同时衡量算法性能,是目标检测模型的主要评价指标。
4 实验与结果分析
4.1 模型训练
对改进后的SSD算法进行训练,初始学习率设置为0.001,衰减系数为0.000 5,同时Keras框架可以根据训练情况来动态减小学习率,本文在训练模型中监控val_loss(验证损失)参数,当其经历10个epoch(训练轮次)不下降后学习速率减半。同时利用数据增强,如随机对图像进行旋转、翻转、亮度等操作对数据集中的图像进行增强。
本文实验硬件环境:CPU为Intel I7- 6800K,内存32 GB,显卡为NVIDIA GeForce GTX1080Ti。软件环境:操作系统ubuntu16.04,python 3.5,Keras框架。
最终算法训练过程中损失值的收敛曲线如图7所示,大约经过230个epoch后,损失值基本稳定。从此参数的收敛情况分析可知,改进的模型训练结果比较理想。
图7 训练结果图
4.2 改进部分验证实验
为了更好地体现改进部分的效果,本文通过控制变量的方法,对于初始模型不改变模型结构,逐步加入改进内容,并计算模型AP值。其中,IoU阈值设置为0.5,即只有置信度大于0.5检测结果被认为是正确的。
实验结果可知,使用基础模型结构的算法AP值仅为26.07%,而使用K-means算法对模型预设参数进行优化可以有效提升模型对车辆目标的检测效果,AP值提升至36.27%。继续加入空洞卷积以及高层不降维结构均可以有效提高模型检测效果,最终模型的AP值达到58.01%。由此实验可以有效证明本文的改进部分可以有效提高模型检测效果。
4.3 对比实验与结果分析
首先分别使用原始SSD算法与改进算法对Udacity数据集进行训练与验证,计算其对目标的准确率和召回率。
实验测试集一共有4 750幅道路环境图片,共有30 992个待检测目标,使用两种目标检测算法在该测试集进行测试,实验结果如表3所示。
表3 不同算法目标检测结果的对比
与原始SSD算法相比,本文改进算法对于车辆目标的检测准确率由76.86%提高到81.19%,召回率由50.28%提高到61.56%。从这两项指标来看,本文算法的检测结果均优于原始SSD算法。
在Udacity数据测试集上分别使用原始SSD算法与本文改进算法比较车辆目标的平均准确度。计算结果如图8所示。
(a) SSD算法[5]
(b) 本文算法图8 不同算法AP曲线对比图
由图8的AP曲线可以看出,本文算法在召回率达到0.6之后准确率才有明显下降,而原始SSD算法在召回率达到0.5之后就开始有明显下降趋势,这说明本文算法相比于原始SSD算法在达到相同准确率条件下召回率更高,也就意味具有更强的检测能力。最终本文算法对车辆目标检测的平均准确度为58.01%,原始SSD算法仅为46.65%。
选取Udacity数据测试集中的部分场景图片,分别使用本文算法与SSD算法进行对比实验,对比检测结果如图9所示。
(a) 真实标签 (b) 本文结果 (c) SSD结果图9 Udacity数据集测试实验结果对比图
可以看到,本文算法在强光条件以及阴影条件下都可以有效地完成车辆检测。第三列中的虚线框表示SSD算法漏检的目标,由此可以看出本文算法对于一些特殊横纵比的车辆目标的检测结果明显优于原始SSD算法。
最后本文对比了两种算法的实时性,实验条件为GPU:GTX1080ti,通过Python脚本来对整个测试集的图片进行检测,最终求出单幅图片平均耗时和每秒传输帧数。实验结果如表4所示,本文算法在检测速度上要优于SSD算法。
表4 不同算法目标检测性能的对比
5 结 语
目前主流的目标检测算法大都需要高性能显卡来辅助计算,难以部署至无人驾驶车辆。本文提出的改进算法使用高层特征图不进行降采样的模型结构,保留待检测物体的位置信息,加入空洞卷积提高模型感受野,提高了本文算法对于小目标的检测和定位能力。同时使用轻量化模型结构,削减了模型卷积层数,并使用深度可分离卷积层来替换原始标准卷积层降低参数量,使得检测速率大大提高。最终实验结果表明,本文算法对车辆目标检测的平均精准度达到了58.01%,检测速度达到了86.26帧每秒,相比原SSD算法有较大提升。本文算法也可以方便部署在无人驾驶车辆的低功耗设备上。但是本文仅实现了道路车辆的实时目标检测,下一步工作将实现多类别的道路环境目标检测,进一步提高模型的检测能力。