APP下载

融合跨阶段局部网络和空间金字塔池化的Yolov3目标检测算法

2021-11-06梁礼明钱艳群吴媛媛

重庆理工大学学报(自然科学) 2021年10期
关键词:池化金字塔损失

梁礼明,钱艳群,吴媛媛

(江西理工大学 电气工程与自动化学院,江西 赣州 341000)

目标检测任务是实例分割、姿态估计、自动驾驶、视频分析等任务的基础,更是计算机视觉领域中非常热门的研究方向。传统的检测算法利用滑动窗口的技术从输入图像上提取大量候选框,人工设计特征提取器提取候选区域的特征,选取合适的分类器进行分类。大数据时代下,传统的手工提取的方法已经不能满足人们对目标检测的高要求,随着深度学习技术的发展和计算机硬件设备的提高,在检测任务上达到了快速且精确的程度。基于深度学习的目标检测方法分为2种:基于候选区域的两阶段检测和基于回归的一阶段检测。Ren等[1]提出的Faster RCNN利用候选区域提取模块RPN替换SS算法,通过anchor机制生成候选区域,达到了更为准确的定位和较高的识别精度。Lin等[2]提出的FPN网络,设计了具有横向连接的自顶向下的体系结构,使检测器不再只在网络的顶层进行检测。Dai等[3]提出的R-FCN使用全卷积网络实现计算共享,提高检测的速度。He等[4]提出的Mask RCNN用ROI Align取代Faster RCNN中的感兴趣池化层解决特征图与原始图像上的感兴趣区域不对准的问题。Hao等[5]提出的BlendMask采用一种自顶向下与自底向上设计相结合的策略,不但可以用在实例级别的识别检测任务上,还能很好地解决全景分割问题。

虽然两阶段的目标检测算法精度更高,但检测速度较慢,而一般的工业或是自动驾驶等领域对实时性的要求又很高,所以相比两阶段检测算法,速度较快的一阶段检测算法更有发展空间。最有代表性的一阶段目标检测算法是SSD算法[6]和Yolo系列算法[7-12],其中Yolov3[12]是Yolo系列中应用最为广泛的目标检测算法。张智等[8]将Yolov3中采用不同深度的空洞卷积引入低层纹理特征丰富高层的语义信息。谭芳等[9]利用FAST角点检测算法与BRISK特征点描述算法改进Yolov3完成多目标行人跟踪任务。李轩等[10]在Yolov3的基础上利用暗通道去雾算法实现图片增强。许多改进的算法仅仅是针对某个类别,泛化能力较差,无法应对类别多的场景,并不适用于通用目标检测,尤其是在复杂的环境和背景下,原Yolov3算法往往存在边界框的定位不准、对物体的检测精度不高等问题。本文以Yolov3算法为基础,提出融合跨阶段局部网络和空间金字塔池化的Yolov3目标检测算法,通过将主干网络融合跨阶段局部网络CSPNet提高网络的学习能力,引入改进的空间金字塔池化结构增强网络的局部区域特征,在损失函数中融入focal loss解决正负样本不均衡所带来的问题,旨在保证速度的前提下,提高Yolov3的检测精度。

1 Yolov3算法原理

2018年提出的Yolov3在Yolov1[7]和Yolov2[11]的基础做更进一步的改进,采用Darknet53作为基础网络,运用残差结构使得网络的层数可以更深,网络结构中有大量的1×1和3×3的卷积层,特征图的大小通过调节卷积步长确定,其网络结构如图1所示。

图1 Yolov3网络结构框图

Yolov3借鉴FPN的思想,大的尺寸特征图用来预测小物体,小的尺寸特征图用来预测大物体,检测层共有3个尺度的输出,分别是在32倍降采样、16倍降采样、8倍降采样进行检测。输入图像是经过主干网络等一系列卷积层生成的特征图,经过3×3、1×1卷积之后生成Feature Map1,用经过1×1的卷积层加上上采样层,与主干网络的中间层输出特征进行concat操作,生成Feature Map2,同样的操作之后产生Feature Map3,Yolov3从主干网络DarkNet53中共提取了3个不同的特征层进行预测,使用逻辑回归预测每个边界框的是否存在检测目标,然后采用非极大值抑制筛选出最终的检测结果。此外,Yolov3还借助残差网络residual network[13]的思想,在一些层之间设置了快捷路径(shortcut connections)[13]。这种结构的特点就是能够通过增加一定的深度来提高准确率,并且能缓解增加深度带来的梯度消失问题。

Yolov3算法的损失函数共有3个组成部分,分别是bbox、置信度和类别带来的误差。具体损失函数如下:

Loss=bbxloss+confloss+probloss=

(1)

2 改进型Yolov3算法

2.1 主干网络的改进

Yolov3的特征提取网络DarkNet53借鉴了Resnet[13]的跨层连接操作(如图2(a)),随着网络的层数加深,对神经网络所需的推理计算能力的要求进一步提高,目前先进的检测技术之所以能在计算机视觉任务上取得显著的成果,很大原因在于具备昂贵的计算资源。为了减轻这种需要大量推理计算能力的问题,本文中将跨阶段局部网络(CSPNet)应用于DarkNet53,CSPNet是wang等[14]提出的一种新型网络结构体系,主要目的是丰富梯度组合,在缓解计算量的情况下还能提高网络的学习能力和推理速度,大大减少内存开销。CSPNet的基本思想是将特征层拆分为2个部分:一部分进行卷积操作,另一部分和之前进行卷积操作的结果concat,利用跨阶段的分割与合并策略,能够有效地减少信息在集成过程中重复使用的可能性[15]。改进的网络结构如图2(b)所示。

图2 融合CSPNet的网络结构框图

首先,改进的网络结构将原来DarkNet53残差块的堆叠分成了Shortconv和Mainconv两部分。Shortconv部分的目的是生成一个大的残差边,经过1×1卷积调整通道数后连至最后。Mainconv部分作为主干部分继续进行残差块的堆叠,先经过1×1的卷积调整通道数,再经过的卷积增强特征的提取,接着将其输出进行跨层连接。之后经过的卷积将其通道数调整为与Shortconv部分相同。最后,将Shortconv部分和Mainconv部分进行堆叠。其中,N的取值依次为1、2、8、8、4。通过将基础层的特征分成2个部分,然后通过一个跨阶段的层次结构合并他们,利用这种方式,使得网络传播的梯度信息可以产生较大的相关差异。此外,本文还对激活函数进行了改进,将原Yolov3的激活函数LeakyReLU函数换成Mish函数。Mish函数[16]具有“有下界无上界“的特点,可以在训练过程中有效地避免梯度饱和。此外,Mish激活函数还具有非单调性和光滑的特点,此特点优于LeakyRelu函数在零点处不光滑、梯度为零的情况。改进的Mish激活函数能够很好地提高网络的学习能力,提升梯度的传递效率,公式如下:

Mish=x*tanh(ln(1+ex))

(2)

2.2 特征增强网络

空间金字塔池化结构(spatial pyramid pooling)原是用于解决卷积神经网络对图像重复特征提取的问题[17],并且可以将不同大小的特征图进行一系列尺度的池化操作,再转化为所需要的维度的特征向量,有效避免了图像因为裁剪、缩放所带来的问题。本文借鉴空间金字塔池化思想,目的是为了进一步获得局部特征信息,与改进的主干网络得到的全局特征信息融合,提高检测精度。如图3所示,在主干网络的最后一个特征层的卷积里加入改进的空间金字塔池化结构,先对13×13的特征图进行1次卷积操作,然后借鉴空间金字塔池化的思想对卷积后的特征图进行3个不同尺度的池化处理,池化核大小分别为13×13、9×9、5×5,步长均为1,最后将13×13的全局特征图和经过3个池化操作的局部特征图进行concat后,再进行1次卷积操作。改进的空间金字塔池化结构可以在很大程度上增加最后一个特征层的感受野,使得上下文特征更加明显,能够进一步获得丰富的局部特征信息。

图3 改进的空间金字塔池化结构框图

2.3 改进的损失函数

单阶段目标检测器直接从输入图像中产生成千上万的候选框,在这些密集的检测框中,只有很少的一部分候选框是包含目标的,其他的都是背景框,因此在训练过程中存在正负样本的严重不均衡问题。此外,在这些大量的候选框中,还存在许多易分类样本与难分类样本,使得损失函数很难对模型做出正确的指导。Lin等[18]提出一种新的loss计算方案,通过控制正负样本的权重和控制易分类样本和难分类样本的权重来解决上述问题。先以简单的二分类为例,普通的交叉熵loss为:

(3)

其中,y代表目标的类别标签,取值为0或1;p代表模型预测y=1的概率。利用简化交叉熵损失,具体如下:

(4)

此时,交叉熵loss变为:

CE(p,y)=CE(pt)=-loga(pt)

(5)

由于数据集中存在极大的正负样本不均衡问题,因此在交叉熵损失函数中利用与目标存在概率成反比的系数来调整,在常规的交叉熵损失函数前加上一个系数at来调整正负样本的影响,通过改变at的值来控制正负样本对loss的影响,at的表示如下:

(6)

结合式(4)~(6),则可得到:

(7)

其中,a的取值范围为0~1。如果将a的值设置成0~0.5,就会降低正样本的权重,增加负样本的权重;如果将a的值设置成0.5~1,就能增加正样本的权重,减少负样本的权重,因此通过改变a的值就能改变正负样本的权重。此外,focal loss还在交叉熵损失函数的基础上设置了一个(1-pt)r调制参数。以正样本为例,当网络能够正确分类时,此时的样本是容易分类样本,pt趋于1,整个调制参数趋于0,对loss的贡献很小;当网络不能很好地分类时,此时的样本是难分类样本,pt趋于0,调制参数趋于1。和容易分类样本相比,难分类样本的权重就大得多,对loss的贡献大。通过调整r值以实现调制系数的改变,其具体公式如下:

FL(pt)=-at(1-pt)γloga(pt)

(8)

改进后的Yolov3损失函数为:

Loss=bbxloss+confloss+probloss=

(9)

3 实验

3.1 实验环境

实验环境为Linux操作系统Ubuntu 16.04,深度学习开发环境的各个软件版本为:python 3.7,cuda 9.2,cudnn 7.1,Anaconda 3,Pytorch 0.4.1。CPU型号为Intel I7-7800,选用NVIDIA Titan X的GPU。

3.2 实验数据集

采用PASCAL VOC数据集,总共有20种类别。训练数据采用VOC 2007训练验证集和VOC 2012训练验证集,总共有16 551张图片,包含40 058个样本框。VOC 2007部分数据作为验证集。选用VOC 2012测试集作为测试数据,总共有4 952张图片,包含12 032个样本框。

3.3 实验细节

采用端到端的方式优化模型,使用多任务损失函数优化网络参数。训练之前,先将训练集数据中的真实框使用K-means聚类的方法得到先验框的宽和高,总共得到3个尺度9个锚框,分别是(10×13)、(16×30)、(33×23)、(30×61)、(62×45)、(59×119)、(116×90)、(156×198)和(373×326)。实验在Pytorch框架上进行,图像输入大小为 416×416,通道数为3,训练时批量大小设置为16,动量值设置成0.9,在训练的初始阶段,为了加强模型的稳定,采用warm up[19]预热学习率方式。warm up阶段分两轮,先让学习率逐步增大到0.000 1,等模型相对稳定后采用consine衰减[19]让学习率逐步降低以减小网络的损失。其模型训练的学习率示意图如图4所示。

图4 学习率示意图

损失函数中的a值设置为0.75,γ值设置为2。图5为损失函数训练曲线,其中横坐标是迭代次数,纵坐标是loss值,蓝色线代表损失值,红色线代表验证集的平均精度,数字是每迭代1 000次的评估结果。从图5中可以看出:损失函数一开始下降较快,之后变慢到最后基本稳定在0.1左右。

图5 损失函数训练曲线

3.4 实验结果及分析

进行原Yolov3算法与改进Yolov3算法的对比实验。训练数据均采用VOC 07训练验证集加VOC 12训练验证集,使用平均准确率(mAP)作为评价指标,选取VOC 07测试集作为测试数据。表1为不同算法在VOC 07测试集上的测试结果。从表1可以看出:在图像大小输入相同的情况下,与原Yolov3_416算法相比,改进的算法的mAP值提升了1.8%,与原Yolov2_416算法相比,改进的算法的mAP值提升了4.4%。并且本文改进的算法比一阶段检测算法FSSD的mAP值高9.8%,比两阶段检测算法R-FCN的mAP值高0.7%,可以看出本文的算法在目标检测任务上的提升效果较明显。

表1 不同算法在VOC 07测试集上的结果

将改进型Yolov3算法与原算法在PASCAL VOC 07测试集上进行单种类别的比较,结果如表2所示。

表2 VOC 07测试集单类AP结果 %

从表2可以看出:改进型的Yolov3算法对像鸟、船、瓶子以及飞机等小物体的检测精度有了明显提升,说明引入的空间金字塔池化结构对尺度不同的物体尤其是小尺度的物体具有很好的检测效果。随机选取VOC 07测试图片进行测试,如图6(a)、图6(c)所示为原Yolov3算法检测,图6(b)、图6(d)所示为改进的算法检测。从图中很明显可以看出:改进的算法检测出原算法没有检测出来的小尺度的人和车,并且相同的目标改进的算法也比原算法检测精度高。此外,为了证明改进算法在面对现实场景中环境的复杂性和背景的多样性时具有较好的鲁棒性,对现实中的图片进行了检测与展示,如图6(e)所示为Yolov3算法检测,图6(f)所示为本文改进的算法检测。从检测效果图看到,改进的算法检测出了远处的卡车和行人,说明改进的算法泛化性能更好。

图6 测试图对比

3.5 消融实验

为了验证每个改进模块对最终性能的影响,进行了消融实验,检测结果均在VOC 07测试集上进行评估,图片输入大小均为416×416。实验结果如表3所示。第1组为原Yolov3算法,其mAP值为79.4%;第2组为融合CSPNet的Yolov3算法,其mAP值为80.3%,因为采用跨阶段的分割与合并策略,增强了主干网络的学习能力,使得其检测精度提高了0.9%;第3组在前一组的基础上加入改进的空间金字塔池化结构,其mAP值为80.7%,增加最后一个特征层的感受野,使模型能更好地获得丰富的局部特征信息,使得其检测精度提高了0.4%,说明改进的空间金字塔结构对模型整体性能的提升有一定的影响;第4组也就是本文算法,在前一组的基础上使用了Focal loss,其mAP值为81.2%,说明所改进的损失函数使得正负样本不均衡问题得到缓解,不但使检测精度进一步提升,而且总体相比于原始的Yolov3算法有了很好的改进效果。

表3 消融实验结果

4 结论

以Yolov3算法为基础,针对原算法在复杂的环境和背景下存在边界框定位不准、对各个尺度的目标检测精度不高等问题,提出了一种融合跨阶段局部网络和空间金字塔池化的Yolov3目标检测算法。该算法将主干网络融合跨阶段局部网络CSPNet提高网络的学习能力;为了充分利用网络的多尺度局部区域特征,引入一种改进的空间金字塔池化结构增强特征提取能力;在损失函数中融入focal loss解决正负样本不均衡所带来的问题。实验结果表明:该算法在PASCAL VOC数据集上的平均精度达到81.2%,比原Yolov3算法精度提高0.7%,并且能够很好地检测一些小尺度的目标。从效果图中可以看出:对于一些遮挡比较严重的目标还不能很好地检测,因此,下一阶段的任务是研究如何提高遮挡目标的检测效果。

猜你喜欢

池化金字塔损失
基于Sobel算子的池化算法设计
基于高斯函数的池化算法
“金字塔”
卷积神经网络中的自适应加权池化
胖胖损失了多少元
Great Vacation Places
海上有座“金字塔”
基于卷积神经网络和池化算法的表情识别研究
玉米抽穗前倒伏怎么办?怎么减少损失?
神秘金字塔