叶召元,郑建立
东华大学 信息科学与技术学院,上海 201620
众所周知,自动驾驶已经成为目前最受关注的人工智能研究方向之一。无论从何种角度分析,自动驾驶技术都是一项充满挑战性的研究工作。因此,针对自动驾驶场景,研究更加精准高效的目标检测算法具有重要的战略意义。
传统目标检测算法大致可以分为两类,基于背景建模方法和基于前景建模方法[1]。基于背景建模方法[2]主要用于动态目标检测,首先建立背景与时间的关系模型,然后利用当前帧信息与背景模型进行对比,从而获取目标的位置[3]。基于前景建模方法,可以针对静态图像进行目标检测,传统的做法就是利用滑窗,提取不同尺寸不同区域的特征,接着针对具体目标训练相应的分类器,利用训练好的分类器对提取的特征进行分类,比如利用HOG[4(]Histogram of Oriented Gradient)+SVM[5](Support Vector Machine)进行行人检测,利用Haar[6]+AdaBoost[7]进行人脸检测。由于传统的特征都是人类手工设计的特征[8],许多都是针对特定目标检测而设计的,使用具有局限性。人工设计特征在许多时候并不能刻画出图像的本质,因此在检测时易受各种干扰因素的影响,模型鲁棒性不高,无法在自动驾驶场景中应用。
自动驾驶面临的环境是开放的、复杂的,为了保证驾驶安全,对检测算法的性能要求极高。因此,目前大多数自动驾驶方案采用的都是基于深度学习的目标检测算法。自2012 年AlexNet[9]使用卷积神经网络获得ImageNet竞赛的冠军之后,图像领域便掀起了深度学习的研究热潮。卷积神经网络具有较强的特征提取能力,能够提取图像的高层次特征,这对于图像分类和目标检测任务来说十分重要。在当前的研究成果中,基于深度学习的目标检测算法可以分为两类:一类是基于候选区域的两阶段(two-stage)算法,将目标检测问题转化为分类问题。基于候选区域分类的目标检测流程一般可以分为两步,首先提取候选区域(Region Proposal)[10],再对候选区域进行分类并且对位置坐标进行修正。这类算法检测精度高,但模型复杂度也高,运行效率低,很难达到实时检测的目的。此类算法的代表有R-CNN[11](Region-based Convolutional Neural Network)、SPP-NET[12](Spatial Pyramid Pooling Network)、Fast-RCNN[13(]Fast Region-based Convolutional Neural Network)、Faster-RCNN[14(]Faster Region-based Convolutional Neural Network)以及各种改进版本。另一类是基于回归的单阶段(one-stage)算法,将目标检测问题转化为回归问题,检测算法将整张图片作为网络的输入,直接在输出层回归边界框(bounding box)的位置及其所属的类别。one-stage 检测算法数据管道简单,运行效率高,可以达到实时检测的目的,但算法精度一般略低于two-stage检测算法。此类算法的代表有SSD[15]、YOLO[16(]You Only Look Once)、YOLOV3[17]以及各种改进版本。
自动驾驶所面临的交通场景十分复杂,人们所要检测的关键目标行人和车辆经常会重叠在一起,或者被遮挡,这会给检测算法带来极大的挑战。此外,在高速行驶的过程中,需要检测很远处的目标,以便及早为驾驶决策做出规划。然而,远处的目标在图像中只占据很少的像素点,这同样为目标的检测带来了很大的困难。基于这些问题,同时考虑到自动驾驶对算法性能和效率的要求,本文针对one-stage目标检测算法SSD 进行改进,提升其对于重叠、遮挡以及远景小目标的检测能力,使其能应用于自动驾驶场景之中。本文所做工作有:(1)基于SSD提出一种新的模型结构,以提高对小目标的检测能力。(2)提升小目标检测性能的同时,保证算法的实时检测性能。(3)引入一种新的训练方式,提升模型对复杂背景的抗干扰能力。为了比较算法性能的提升,本文所做实验都是基于公开数据集PASCAL VOC 2007 和KITTI交通数据集。
图1 是SSD300(模型输入图像分辨率为300×300)模型结构。SSD 以VGG16[18(]Visual Geometry Group)作为特征提取网络,替换VGG16的两个全连接层FC6、FC7为卷积层,同时在后面添加了四个卷积层。为了提高检测精度,SSD 在不同尺度的特征图上进行检测,输出固定数量的边界框,然后通过置信度过滤和非极大抑制(Non-Maximum Suppression,NMS)等方法输出最终检测的目标框和类别。具体的做法是,在特征图Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2 上设置不同尺度和不同宽高比的默认框(default box),然后在特征图上每一个位置使用3×3的小卷积核进行卷积,输出真值框(ground truth)相对于默认框的偏移量和目标种类。SSD算法中的default box相当于Faster-RCNN算法中的anchor,采取anchor的目的是为了使模型能够更容易收敛。这对于SSD 和YOLO 这样的单阶段目标检测算法来说更为重要。如果没有anchor,SSD需要直接回归出目标的位置坐标和宽高,数据集中各类目标的宽高差距较大,如果直接回归,会导致模型很难收敛,甚至陷入一个较差的局部最优状态。因此目前大多数单阶段目标检测算法都会采取设置anchor的策略。
图1 SSD300模型结构图
假如使用m个特征图进行预测,则第k个特征图上的default box的尺寸计算公式为:
其中,Smin=0.2,为最底层的尺寸,Smax=0.9,为最高层的尺寸。default box 的宽高比标记为ar∈{1,2,3,1/2,1/3},则第k层每一个default box 的宽高,对于宽高比ar=1,额外添加一个尺寸为的default box。这样特征图每一个位置就有6 个default box,并且设置每个default box 的中心为为第k个特征图的尺寸。在实际实现时,SSD对Conv4_3、Conv10_2和Conv11_2只设置了4个default box。因此,如图1 所示,SSD 总共可以预测 38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8 732 个bounding box。
SSD 模型并不是直接输出边界框的位置坐标和宽高,而是输出bounding box 相对于default box 的偏移量。假设default box的位置表示为d=(dcx,dcy,dw,dh),对应的bounding box 表示为b=(bcx,bcy,bw,bh) ,其中cx、cy为中心位置坐标,w、h为框的宽和高,则模型预测bounding box的输出可以表示为t:
假设预测类别数为c,特征图的尺寸为m×n,则特图每个像素单元的default box数量为k,即每个单元需要预测k×(c+4) 个值,整个特征图需要预测m×n×k×(c+4)个值。
SSD损失函数由两部分组成,一部分是目标框的位置损失,即目标框的中心坐标损失和目标框的宽高损失,另一部分是类别置信度损失,计算公式如下:
={0,1}作为一个标识,代表第i个默认框与k类的第j个默认框匹配。Lconf为置信度损失,Lloc为位置损失。N为所有匹配的默认框的个数。p、g分别为预测框和真值框的位置参数。λcoord是一个加权系数,用来衡量位置损失在总损失中占的比例。位置损失使用平滑L1损失[11],网络回归相对于默认框中心(cx,cy)和默认框宽高(w,h)的偏移量为:
置信度损失采用多类别的softmax交叉熵损失:
SSD 算法无论是在mAP 指标还是FPS 指标上,都取得了不错的效果。同时,SSD采用多尺度特征图进行预测,这在一定程度上有利于提升对小目标的检测性能,但是从实验结果来看,SSD 对于小目标的召回率(Recall)依然较低,与two-stage 检测算法相比,仍有差距。此外,对于检测出来的特别小的目标,容易出现错检的现象。
SSD采用VGG16作为特征提取网络,因此Conv4_3层的特征图分辨率就已经下降为输入的1/8,如果原图中有一个16×16 的目标,则此目标在Conv4_3层特征图上只占据了几个像素,这几个像素所保留的信息自然不足以准确地定位目标的位置,甚至无法确定这是正样本还是背景。其实,SSD用距离顶层较远的Conv4_3层特征图来预测,目的就是想用大尺度的特征图来预测小目标,只不过这个尺寸还是相对较小。另一方面,SSD 采用6个尺寸的特征图独立的预测目标,并没有融合不同特征图所蕴含的信息。目前,许多研究表明,底层高分辨率的特征图蕴含着目标的一些细节信息,这些信息有利于准确地定位目标。但是,由于底层的特征图经历的卷积运算较少,未能提取足够多的高级特征,语义信息不足,这不利于区分目标和背景。高层低分辨率的特征图经历了大量的卷积运算,能够提取丰富的语义信息,但是由于下采样过多,导致丢失大量的细节信息。此外,SSD在训练时是通过两个框重叠部分的面积与两个框总面积的比值IoU(Intersection over Union)来确定正负样本的,小目标所占据的像素点太少,与default box 的 IoU 小于阈值 0.5,很难与 default box 进行匹配,因而被判定为负样本,不能得到充分的训练。
针对SSD算法所存在的问题,目前已经有许多优秀的改进工作。这些改进工作大部分是围绕特征融合展开的,而本文也是遵循特征融合这一角度展开分析。
DSOD[19(]Deeply Supervised Object Detector)采取down to top的融合方式,在SSD结构基础上,对于相邻的两个特征图,将前面的特征图进行池化(pooling)降采样,使之与后面的特征图具有相同的尺寸,然后将池化获得的特征图与后面的特征图级联在一起,二者各占据一半通道,共同作为目标检测器的输入特征。DSOD采取的密集连接的方式,确实可以将大尺寸特征图所具有的细节信息引入到后面小尺寸的特征图,但是每一层都采取相同的操作,连接过于密集,并且会向后面的特征图引入过多的冗余信息,同时增加模型的复杂度。FPN[20(]Feature Pyramid Networks)和FSSD[21(]Feature Fusion Single Shot Multibox Detector)都是采用top to down的融合方式,对于相邻的两个特征图,将高层低分辨率的特征图进行上采样,上采样获得的特征图尺寸与底层高分辨的特征图尺寸一致,然后进行特征融合。二者之间不同的是,FPN 上采样使用的是插值算法,不会增加模型的参数量,而FSSD 的上采样使用的是反卷积(deconvolution),deconvolution会额外增加参数量,增加模型的尺寸和复杂度。RSSD[22(]Rainbow-SSD)既采用了down to top 的pooling 融合,又采用了top to down的deconvolution融合,这样的深度融合方式确实带来了mAP的提升,提高了小目标的召回率,但付出的代价是增加了模型的体积和复杂度,引入了许多重复的特征信息。
为了便于比较DFSSD 模型结构的有效性,本文没有替换SSD的基础网络VGG16。许多改进工作为了提升模型的特征提取能力,将基础网络替换为特征提取能力更强的深度残差网络,DF-YOLOV3[23]便是将YOLOV3的特征提取网络替换为深度残差网络以提升精度。DFSSD 模型结构如图2 所示,使用尺寸为38×38、19×19、10×10的特征图来预测小目标,使用尺寸为5×5、3×3、1×1 的特征图来预测尺寸较大的目标。当模型的输入尺寸为300×300 时,38×38 分辨率的特征图已经丢失了许多底层的细节信息,考虑到模型的效率,这里不增加额外的高分辨率的特征图预测层。但是为了获取更多细节信息,将分辨率为75×75 的特征图通过池化下采样,分别与 Conv4_3、Conv7、Conv8_2 层特征图进行融合,同时将Conv8_2、Conv9_2、Conv10_2 通过插值上采样分别与 Conv4_3、Conv7、Conv8_2 融合。实验中发现,将75×75 这样的高分辨率特征图引入到后面的Conv4_3、Conv7、Conv8_2 层,不仅能够提升小目标的recall,同时还能够加速模型的收敛,说明高分辨率特征图所蕴含的细粒度信息有利于bounding box 的坐标回归。考虑到Conv9_2、Conv10_2、Conv11_2 层特征图已经具备较为丰富的语义信息,因此不对它们进行后向融合,只进行前向融合引入细节信息,将Conv7、Conv8_2、Conv9_2 分别与 Conv9_2、Conv10_2、Conv11_2 层特征图进行融合。所有的融合都采用的是Concatenate的连接方式。与DSOD、FPN、FSSD、RSSD 相比,这样跨越式的连接,既能实现特征的双向融合,还不会引入冗余信息。实验表明,DFSSD 提升了SSD 算法的mAP 以及对小目标的检测能力,在不增加过多复杂度的情况下,与SSD 其他的改进算法具有相当的性能。具体数据会在实验部分展示。
图2 DFSSD300模型结构图
DFSSD 充分利用前向卷积过程计算得到的特征图,没有在SSD 基础之上另外增加卷积通道,这有效限制了计算量的增加。值得注意的是,在不同层次的特征图进行级联以后,使用1×1的卷积核进行卷积可以使不同层次的特征进行融合,同时降低通道数。在1×1卷积之后使用3×3的小卷积核进行卷积,使得不同特征在整个特征空间中得到充分的融合。
在训练深度神经网络时,如果模型过于复杂,或者是数据量太少,都会引起模型的过拟合。过拟合表现为模型在训练集上的损失低,检测精度高,但是在测试集上的检测精度却远远低于训练集上的精度。如果数据集中小目标较多,或者背景比较复杂,这种现象更为明显。由于小目标占据的像素点十分少,模型不能提取足够多的特征来准确检测小目标,很容易将其判别为背景,或者将某一类目标误判为另一类。为了提高模型的抗干扰能力和泛化能力,本文提出一种加入噪声的训练方式。SSD在训练阶段把与真值框IoU大于0.5的默认框作为正样本训练,将置信度损失进行排序,筛选出一部分具有高置信度损失的默认框作为负样本参与训练,置信度损失的计算见式(8),保证正负样本的比例为1∶3。在此基础上,本算法随机地加入一些未标记的区域作为负样本参与训练(注意这里的未标记区域并非没有目标,只是目标距离较远,尺寸很小)。一般情况下,未标记的区域是不参与训练的。这部分实验是基于KITTI数据集的,因为KITTI 数据集记录了许多未标注区域。通过实验发现,这样的训练有利于提升模型的泛化能力,降低误检率。
为了验证本文提出的DFSSD 模型结构的有效性,在PASCAL VOC2007 和KITTI 数据集上分别进行实验,在同一个数据集上DFSSD 和SSD 采取相同的数据增强策略,不对DFSSD 算法做额外的数据预处理。本文采取的数据增强措施有随机颜色抖动、随机裁剪与缩放等。
实验所采取的评价指标为目标检测领域标准的评价指标平均精度(Average Precision,AP)和平均精度的均值(mean Average Precision,mAP)。AP 是针对某一种类别而言的,是一种综合的评价指标,AP值越高表明算法检测目标的精度和召回率越高,可以根据PR 曲线与坐标轴所包围的面积近似地计算出来。某一类别的PR 曲线与坐标轴所包围的面积越大,代表这一类别的AP 值越高。PR 曲线是精度(Prescision)关于召回率(Recall)的曲线。mAP 是所有类别AP 的均值,可以评价一个模型检测不同类别的整体性能。
其中,tp(true positives)为正样本被正确地识别为正样本个数;fp(false positives)为负样本被错误地识别为正样本个数;fn(false negatives)为正样本被错误地识别为负样本个数。
本文在计算tp和fp时采用的IoU阈值为0.5,当预测框与真值框的IoU 大于0.5 时即判定为tp,否则判定为fp,Precision和Recall反映的是模型单方面的性能,由Precision和Recall可以画出图3所示的PR曲线。
为了验证DFSSD 算法的有效性,首先在通用目标检测数据集PASCAL VOC 上进行实验,并与其他算法进行比较。遵循大部分研究人员的做法,本部分实验使用PASCAL VOC2007 trainval+PASCAL VOC2012 trainval 作为训练集,PASCAL VOC2007 test 作为测试集。PASCAL VOC 数据集中共有20 类目标,其中有些目标样本数量较少,并且尺寸很小,比如Boat、Bottle、PottedPlant、Chair、TvMonitor。许多算法在这些类别上的平均精度比较低,从而导致算法整体的性能指标mAP也降低。因此,可以通过计算这些类别的AP值来比较DFSSD 算法对小目标的检测能力,通过mAP 还可以评价算法检测各类目标的整体性能。
表1 列出了一些比较流行的目标检测算法和DFSSD算法在VOC2007测试集上的检测结果。图3(a)、(b)分别展示的是SSD300 和 DFSSD300 对VOC2007 数据集中五类小目标检测结果的PR曲线,由PR曲线可以直观地比较算法的检测性能。
由表1 中的数据可以看出,DFSSD 在VOC2007 测试集上的mAP 为78.0%,原SSD300 的mAP 为74.3%,DFSSD 在mAP 指标上提升了3.7 个百分点。由表1 中加粗的数据以及图3(a)、(b)中的PR 曲线对比可知,DFSSD对远景小目标有较好的检测能力。
图3 SSD300与DFSSD300小目标检测PR曲线图
表1 PASCAL VOC 2007测试结果 %
图4(a)和图4(c)为SSD300的检测效果,可以看出SSD300对于遮挡或者重叠的小目标漏检严重。图4(b)和图4(d)为DFSSD 的检测效果,对比可以看出DFSSD对小目标的召回率和定位精度更高,且不易出现漏检和定位不准的问题。
为了证明DFSSD 能够适应更复杂的自动驾驶场景,本部分实验在KITTI交通数据集上进行测试。KITTI数据集是在真实的交通场景采集的,数据集覆盖各种场景和天气状况,并且数据集中存在大量重叠遮挡的小目标,这便于验证DFSSD的有效性。KITTI数据集中共有 8 类目标,分别为 Car、Van、Truck、Pedestrian、Person(sitting)、Cyclist、Tram 和Misc。有些类别在数据集中出现的次数非常少,官方提供的评测脚本也只对其中的3类进行评测。因此,为了方便实验,并排除样本类别不均衡的影响,本实验将数据集中所有车辆合并为1 类,标记为Car,只针对车辆目标进行评估。图5 为Car 的PR曲线。图5(a)为SSD300的评测结果,图5(b)、(c)为DFSSD 算法的评测结果,图5(b)在训练时未标记区域不参与训练,图5(c)在训练时随机加入未标记区域。KITTI 数据集将目标分为简单、中等、困难3 个级别,困难目标就是严重遮挡,在视野中尺寸特别小的目标。由图5(a)、(b)和(c)的PR曲线可以看出,图5(b)、(c)中困难目标的PR曲线与坐标轴所围的面积比图5(a)中困难目标的PR曲线与坐标轴所围的面积更大,说明DFSSD算法对困难目标的检测性能提升更大,也就是对重叠或者小目标检测能力更强。图5(c)中困难目标的PR曲线比图5(b)中困难目标的PR曲线与坐标轴所包围的面积更大,表明提出的训练方式能够提升对困难小目标的检测能力。
表2 是 Car 类目标的 AP 值,是通过 PR 曲线计算出来的,由AP 值可以对模型性能进行定量分析。由表2可以看出,与SSD相比,DFSSD对简单目标的检测性能未有明显变化,但在困难目标检测中,DFSSD比SSD的AP 增加了5 个百分点,中等困难目标的AP 也增加了2个百分点。
图4 困难样例检测结果对比图
图5 Car类PR曲线对比图
表2 Car类目标AP %
图6是从KITTI数据集中挑选出来的具有代表性的困难样本,图片中的车辆或者是大量重叠在一起,或者是呈现在视野远处,尺寸较小。图6左侧一列为SSD300检测结果,右侧一列为DFSSD 算法检测结果。通过两列检测结果可以直观地看出DFSSD对困难目标的检测性能较好,很少有漏检的现象。主要是因为DFSSD 算法能够在下采样的过程中较为完整地保留目标的细节信息,能够充分合理地利用卷积过程所提取出来的各种尺寸的特征图,使得卷积神经网络不同层次所蕴含的信息能够得到充分地融合,从而抽象出较为鲁棒的特征作为目标检测器的输入。
本文实验平台为Ubuntu16.04,GPU 1080,深度学习框架KERAS。实验测试帧频FPS 时,batch size 统一设为 1。由表3 可知,DFSSD 算法比经典 SSD300 的mAP提高了约4个百分点,尤其是对小目标的检测能力提升明显。这得益于选取合理的特征图作为检测器的输入,同时对这些特征进行高效的融合,最大程度地保留目标的细节和语义信息。本文实验SSD300的FPS为25,DFSSD 算法的 FPS 为 24,在提高精度的同时,DFSSD 还能保证运行效率不被降低,仍然可以达到实时检测的要求。这主要是因为DFSSD在进行上采样时直接采用插值算法,没有使用FSSD、RSSD和DSSD[25]算法中deconvolution上采样方式,所以没有引入额外的参数和一些重复的计算。
表3 VOC2007 test上模型精度与效率对比
本文DFSSD算法特征提取网络部分的参数是利用预训练模型进行初始化的,其他层的权重则是采用随机初始化。算法采用的是Adam优化器,batch size设置为24,如果显存足够大,还可以适当增大batch size来稳定梯度。为了不使模型发散,开始的两轮设置一个较小的学习率0.000 01,第三轮开始调整学习率为0.001,加快模型收敛。分别在第30轮和第80轮将学习率缩小为前一轮的1/10,由图7(a)可以看出,在第80轮降低学习率时,模型进一步收敛。因为KITTI 数据样本较少,所以在第20轮和第40轮时降低学习率,由图7(b)可以看出,模型在第50轮时基本上已经收敛。由图7(a)和图7(b)中的训练损失曲线和验证损失曲线持续下降的趋势可以看出,模型在整个训练过程中未发散,也未出现过拟合现象,从而说明了DFSSD模型结构的有效性。
图6 Car类困难样例检测结果对比图
图7 损失曲线图
针对原SSD 算法对困难小目标检测能力不足的问题,本文分析其原因,并提出了一种新的特征融合方式,以提高对困难目标的检测能力,同时还能保证模型的检测效率。为了提高模型对困难目标的泛化能力,本文还引入一种新的训练方式,让未标记的但含有目标的区域随机地参与训练。通过实验证明,本文提出的方法能够有效提升SSD 算法对困难目标的检测能力。未来进一步的研究重点是改进特征提取网络,提升特征表达能力,降低参数和计算量,以保证模型有更高的精度和实时性,在应用到自动驾驶系统时,能够为其他系统模块节约算力。