岳晓新,贾君霞,陈喜东,李广安
1.兰州交通大学 电子与信息工程学院,兰州 730070
2.兰州文理学院 旅游学院,兰州 730030
目标检测是计算机视觉领域研究的重要基础,不论是实现图像与文字的交互还是特定目标的跟踪,目标检测都能够提供可靠有效的信息,因而目标检测在人工智能和信息技术等众多领域都有广泛的应用,如机器视觉、智慧安保、医学影像中的病灶检测、自动驾驶、行为理解、人机交互、基于内容的图像检索、智能视频监控等[1-6]。但常用的目标检测算法在检测小目标时因目标分辨率低、特征不明,存在效果不佳及漏检率较高的问题[7-8]。
近年来,随着计算机技术的快速发展,基于深度学习的多种目标检测算法相继提出[1]。此类算法具有自动学习、特征表达能力良好且检测精度优良等特点,已成为当前目标检测算法的主流[1,9-10]。目前主流的基于深度学习的目标检测算法依据其设计原理,主要分为两类。第一类为两阶段目标检测算法,此类算法是将目标检测分为两个阶段,第一阶段使用候选区域生成网络(Region Proposal Network,RPN)生成一个有可能包含待检物体的候选框,第二阶段利用卷积神经网络完成对候选框中候选目标位置与类别的预测及识别[10]。常见的两阶段目标检测算法有R-CNN(Region-Conventional Neural Network)[11]、Fast R-CNN[12]、Faster R-CNN[13]等。第二类为单阶段目标检测算法,此类算法不使用RPN,直接在卷积神经网络中提取特征来预测物体分类和位置信息,是一种端到端的目标检测算法[6-7],因此单阶段目标检测算法具有更快的检测速度。常见的单阶段目标检测算法有SSD(Single Shot multibox Detector)[14]、YOLO(You Only Look Once)[15]、YOLO V2[16]、YOLO V3[17]等。
为了提高目标检测算法对小目标检测的平均精度和检测速度,本文以单阶段目标检测算法YOLO V3为基础,提出了一种改进YOLO V3的道路小目标检测算法。首先对YOLO V3算法网络模型中的K-Means聚类算法[18]进行优化,使用DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类算法[19]消除噪音点对聚类结果的影响,并确定K-Means聚类算法的K值;再通过K-Means 聚类算法对DBSCAN 聚类结果分析确定聚类中心,进而根据重叠度IOU(Intersection Over Union)选取更合适的Anchor Box,以提高检测的平均精度(Average Precision,AP)和检测速度。同时引入Focal Loss损失函数[20]代替原YOLO V3算法中预测框定位平方和损失函数、置信度交叉熵损失函数及类别概率交叉熵损失函数。最后将KITTI 数据集[21]中的行人作为训练和测试对象,并与其他目标检测算法进行对比实验,结果表明改进后的YOLO V3算法对小目标的检测在平均精度和速度上都有了明显的提升。
YOLO V3 是 Redmon 等[17]在 YOLO V2 算法的基础上,融合ResNET、FPN、二元交叉熵损失等方法提出的单阶段目标检测算法[22]。YOLO V3采用新的特征提取网络Darknet-53,Darknet-53 主要由5 个残差块构成,借鉴了残差神经网络的思想[17]。YOLO V3在所属类别结果的预测方面,采用了上采样和融合做法,通过13×13、26×26 和52×52 三个不同尺度的融合特征图对目标进行独立检测,有效地增强了对大小不同物体和被遮挡物体的检测效果,并引入跃层连接以强化收敛效果。其网络结构如图1所示。
借鉴 Faster R-CNN 算法,YOLO V2 算法引入了Anchor Box并设定为5个[16]。YOLO V3算法中Anchor Box 由 5 个变为 9 个,Anchor Box 的大小由K-Means 聚类算法对所有真实目标框的长宽聚类得到[17]。预测过程中,网络输出相对于Anchor Box 的偏移量分别为tx,ty,tw,th,Bounding Box与Anchor Box的对应关系如图2所示,则Bounding Box的坐标计算公式为:
式中,bx,by,bw,bh为Bounding Box的中心坐标和宽高;cx,cy为当前单元网格相对于图像左上角的偏移量;pw,ph为对应Anchor Box的宽和高;σ为激活函数Sigmoid,将网络预测值tx,ty映射到0~1。
图1 YOLO V3网络结构
图2 Anchor Box和Bounding Box对应关系
本文主要研究小目标检测问题,通过聚类算法找到更合适的Anchor Box,有助于提高小目标检测的平均精度和速度。原YOLO V3算法中采用K-Means聚类算法获得Anchor Box。K-Means 聚类算法在聚类迭代过程中采用距离作为相似性指标找到给定数据集中的K个类,每个类的中心根据类中所有数据点的均值得到。该方法将距离公式中的不同特征属性视为等权重,未考虑不同属性对聚类效果的影响;如果类中存在噪音点或者孤立点,它们远离数据样本空间,则在计算类中心时产生较大波动,必定对均值计算产生极大影响,甚至使聚类中心严重偏离类样本的密集区域,导致聚类结果出现严重偏差[23]。而且K-Means 聚类算法在处理数据时需要预先指定聚类数目即K值,K值的指定具有较大的主观性[18]。
针对K-Means聚类算法存在的问题,本文对聚类算法优化,采用DBSCAN+K-Means 聚类算法对训练数据集目标框进行聚类分析,以期选取更适合小目标检测的Anchor Box。首先使用DBSCAN聚类算法分析聚类个数和聚类包含的点,解决聚类时噪音点或者孤立点对聚类结果的影响,并为K-Means 聚类算法提供准确的K值,即得到Anchor Box的个数;再通过K-Means聚类算法对DBSCAN 聚类结果分析确定聚类中心,进而根据重叠度IOU 选取更合适的Anchor Box。聚类过程中K-Means聚类算法距离公式定义为:
式中,B表示样本框大小,A表示聚类框大小,C表示K-Means聚类算法产生的聚类中心,IOU表示样本框大小和聚类框大小的交互比,作为两个框大小相似的度量。
本文使用优化后的聚类方法,对KITTI 数据集person 类别的样本框进行聚类分析。经DBSCAN 聚类算法分析后确定K值为9,K-Means聚类算法迭代后选取的对应Anchor Box 的宽高分别为(4,10)、(9,24)、(9,44)、(17,30)、(29,58)、(55,130)、(76,167)、(132、243)、(192,326)。表1 展示了聚类方法优化前后,在KITTI 数据集上Anchor Box 的差异和检测结果对比。从表1 中可以看出,使用优化后的聚类算法得到的Anchor Box 对目标检测效果有明显的提升,检测速度比原YOLO V3 提高了2.14 帧/s,检测平均精度提高了1.16个百分点,达到91.23%。
表1 不同Anchor Box检测结果对比
损失函数作为深度神经网络对误检样本评判的依据,在很大程度上影响神经网络模型收敛的效果[24]。在目标检测领域,很多研究者[25]致力于研究设计更合适的损失函数,以获得更好的预测效果。YOLO 算法将目标检测问题转化为回归问题,YOLO V3 算法在预测框定位回归过程中采用误差平方和(SSE)的形式,在置信度和类别方面采用交叉熵损失函数[25-26],最终损失采用和的形式,其表达式如公式(3)所示:
式中,λcoord、λnoobj分别表示坐标损失权重和不包含目标的置信度损失权重,S为网格划分的横或纵向个数,B为该网格具有的Bounding Box个数,表示第i个网格第j个Bounding Box 是否负责某个对象的检测,表示网络输出相对于Anchor Box的坐标、宽高偏移量及预测框置信度和类别概率预测,表示真实目标框坐标、宽高、置信度和类别概率预测。
YOLO V3 算法中的预测框定位损失、置信度损失以及类别概率损失均需经过Sigmoid 函数激活[17],然后采用公式(3)计算最终损失。Sigmoid 函数在逻辑回归中经常用到,也称Logistic函数且表达式为:
其函数图像及导数图像如图3所示。
图3 Sigmoid函数及其导函数图像
从图3中可以看出,Sigmoid函数单调连续,输出范围有限,因此数据在传递的过程中不容易发散;导数的值始终小于1,输入变量较大或者较小时其值接近于0,在深层的神经网络中极易造成梯度消失的问题,即当神经网络的输出较大时,导数会变得非常小。再将Sigmoid函数的输出值输入到损失函数中,得到的误差值会很大,而且误差越大收敛越慢,出现梯度消失的情况。为解决此问题,本文以Focal Loss损失函数代替了原YOLO V3算法中的预测框定位平方和损失函数、置信度交叉熵损失函数及类别概率交叉熵损失函数。
Focal Loss 损失函数是在交叉熵损失函数的基础上修改而来,其表达式如式(5)所示:
式中,p为激活函数Sigmoid 的输出值;γ≥0 ,为聚焦参数;(1-p)γ为调节因子;0 ≤α≤1 ,为类别权重因子;γ和α为固定值,不参与训练;y为标签值。无论是前景类还是背景类,p越大,权重 (1-p)γ就越小,lgp就越大,即调节因子减少了大概率目标的损失贡献,并扩展了样本接收小目标的范围,增加了小目标检测的准确率。改进后的YOLO V3算法损失函数如下:
为了验证改进后损失函数的有效性,使用改进后的损失函数代替原YOLO V3中的损失函数,Anchor Box大小选用表1中原YOLO V3方法得到的数值。表2展示了使用不同的损失函数,在KITTI数据集上目标检测结果对比。从表2 中可以看出,使用改进损失函数的YOLO V3算法在KITTI数据集上目标检测的平均精度有明显的提高,检测平均精度达到91.29%,较原YOLO V3提高了1.22个百分点,且检测速度达到43.08 帧/s。
表2 不同损失函数检测结果对比
本次实验的数据集选用KITTI 数据集,KITTI 数据集包含市区、乡村和高速公路等场景采集的真实图像数据,每张图像中最多达15辆车和30个行人,还有不同程度的遮挡与截断。本文对KITTI数据集原有的8类标签信息进行了处理,保留实验需要的person 类别标签,同时选取该数据集中9 476 张图像作为实验数据,并分成了两部分。其中7 107 张图像用于训练数据集,其余2 369张图像用于测试数据集。实验基于Windows平台通过Python 语言编程实现,应用深度学习框架Tensorflow 1.4作为后端的Keras 2.1.3搭建网络模型,硬件环境为Intel®Core™i7-8750H CPU@3.60 GHz、8 GB RAM、NVIDIA GeForce GTX 1050 Ti。对比实验硬件配置环境相同。
对YOLO V3算法和改进的YOLO V3算法分别采用批梯度下降的方式进行训练,参数设置以YOLO V3论文(文献[17])样本训练时参数设置为基础,并对部分参数调整,经过反复试验选取效果最佳的参数。样本训练总共进行50 000 次迭代计算,其中批量大小设置为64,初始学习率设定为0.001,动量为0.94,权重衰减系数为0.000 2。当训练迭代次数为25 000 次和40 000 次时,分别将学习率降低为0.000 1 和0.000 01,使损失函数进一步收敛。同时将训练的图像进行饱和度和曝光度调整、图像翻转、增加对比度等方法处理,使训练数据集中的图像进行增强和扩充。
4.2.1 对小目标检测的结果
选取三组国内城市道路图片,分别使用原始YOLOV3算法和改进后的YOLO V3算法进行道路行人检测,并加入小目标检测算法Perceptual GAN[27]对同一场景小目标进行检测。图4展示了检测结果,其中图4(a)中改进的YOLO V3 算法有效地检测出了遮挡的环卫工人,而小目标检测算法Perceptual GAN 和原始YOLO V3 算法漏检了此小目标,图4(b)中原始YOLO V3 算法漏检了2 个行人小目标,小目标检测算法Perceptual GAN只检测出了其中一个行人小目标,而改进的YOLO V3算法准确地检测出了漏检的2个行人小目标的位置,图4(c)中改进的YOLO V3 算法准确地检测出了原始YOLO V3漏检的被遮挡的外卖骑手和远处的2个行人小目标,而小目标检测算法Perceptual GAN相比改进的YOLO V3算法未检测出被遮挡的外卖骑手且漏检了一个行人小目标。可见,原始YOLO V3算法对道路中的行人小目标存在漏检的情况,而改进的YOLO V3算法可以有效地检测出道路中的行人小目标,且相比小目标检测算法Perceptual GAN 对小目标的检测效果有进一步提升。
图4 小目标检测的结果对比
为了进一步验证本文提出方法能够有效降低小目标漏检率,选取目标检测算法评价指标精度、召回率和F1 指标对改进的YOLO V3 算法进行评价。表3 展示了YOLO V3算法改进前后在KITTI数据集上目标检测结果评价指标的对比结果。从表3中可以看出,相较原YOLO V3 算法,改进后的 YOLO V3 算法在 KITTI 数据集上目标检测的精度、召回率和F1指标均有所提升,其中对小目标检测的召回率提高了1.65 个百分点,达到90.18%。
表3 YOLO V3算法改进前后评价指标对比%
4.2.2 与其他目标检测算法的结果对比
将本文改进的YOLO V3算法与Fast R-CNN、Faster R-CNN、SSD、YOLO、YOLO V2、YOLO V3等目标检测算法均使用本文选取的KITTI数据集进行行人目标检测任务的训练与测试,并选取平均精度与检测速度两项指标对各算法进行评价。表4 展示了Fast R-CNN、Faster R-CNN、SSD、YOLO、YOLO V2、YOLO V3 与改进的YOLO V3算法的对比实验结果。
表4 不同目标检测算法结果对比
从表4中可以看出两阶段目标检测算法Fast R-CNN和Faster R-CNN 的平均精度分别为63.52%与74.69%,但检测速度较低,这主要是由于两阶段目标检测算法在检测过程中候选区域生成网络(RPN)生成包含待检物体的候选框会增加网络模型的计算时间。使用单阶段目标检测算法YOLO和YOLO V2检测目标,虽然检测速度得到了很大提升,但平均精度却有所下降。单阶段目标检测算法SSD较两阶段目标检测算法Fast R-CNN和Faster R-CNN在平均精度和检测速度方面都有较大的提升,但与原始YOLO V3算法在检测的平均精度和检测速度方面具有一定的差距。表中未改进的目标检测算法中性能最好的是YOLO V3 算法,其获得了90.07%的平均精度和42.17 帧/s 的检测速度,而本文改进的YOLO V3算法较原始YOLO V3算法对行人目标检测在平均精度上又进一步提升,达到了92.43%,同时检测速度超过原始YOLO V3 算法,达到44.52 帧/s,实现了实时检测。
针对通用目标检测算法在检测小目标时效果不佳、漏检率较高的问题,本文对YOLO V3深度神经网络模型算法进行了改进。首先优化了聚类算法,并选取了更合适的Anchor Box,提高了检测的平均精度和速度;然后引入Focal Loss损失函数代替原YOLO V3算法中预测框定位平方和损失函数、置信度交叉熵损失函数及类别概率交叉熵损失函数,加快了初始收敛速度,减小了梯度消失的影响,提高了小目标检测的平均精度;最后将改进的YOLO V3 算法应用于道路行人目标检测并与原始YOLO V3算法进行定性对比实验,同时运用改进的YOLO V3算法与Fast R-CNN、Faster R-CNN、SSD、YOLO、YOLO V2、YOLO V3等目标检测算法在行人目标检测方面进行了定量对比实验。实验结果表明,本文改进的YOLO V3 算法能够有效降低小目标检测的漏检率,大大提高检测的平均精度和检测速度,本实验检测的平均精度达92.43%,检测速率达44.52 帧/s。
本文虽然将YOLO V3 算法改进并应用于小目标检测,同时取得了较好的实验结果。但目前改进的YOLO V3 算法仅应用于行人小目标检测方面,而实际应用中往往是多类目标同时检测,因此,今后将加入更多不同类别的小目标同时检测,以进一步提升算法的识别率和实用性。