基于CBD-YOLOv3的小目标检测算法
2022-10-15潘昕晖卢军国
潘昕晖,邵 清,卢军国
1(上海理工大学 光电信息与计算机工程学院,上海 200093)
2(上海外高桥造船有限公司,上海 200137)
E-mail:pxh_shlg@163.com
1 引 言
目标检测是计算机视觉领域的重要研究方向,发展至今历经20余年.近年来,目标检测因其广泛的应用和技术突破而受到越来越多的关注,学术界和工业界在不同的领域对其进行了广泛的研究,如安全监控、自动驾驶、无人机场景分析和遥感图像[1]等.在引发目标检测技术快速发展的诸多因素中,深度卷积神经网络的发展和GPU计算能力的提升是其中最为显著的贡献.现有的目标检测算法大多以深度学习网络为主干网络,利用检测网络分别对输入图像进行特征提取、分类和定位.
早期的目标检测算法大多是基于手工特征所构建的,例如HOG特征[2].由于在深度学习诞生之前缺乏有效的图像特征表达方法,研究者不得不尽其所能设计更加丰富和多元化的人工特征以弥补表达能力上的缺陷.在深度学习出现后,多种基于深度学习的目标检测算法被相继提出,此类算法自动提取特征并具有强大的鲁棒性和泛化能力,已成为当前的主流算法.
目前,基于深度学习的目标检测算法主要分为两大类:两阶段目标检测算法和单阶段目标检测算法.两阶段目标检测算法首先使用一个区域提取网络生成候选区域集,再通过卷积神经网络从每个候选框中提取特征,用于分类和边界框回归.常见的算法有R-CNN[3]、Fast R-CNN[4]、Faster R-CNN[5]、R-FCN[6]等.单阶段目标检测算法不使用区域提取网络生成候选框,而是直接对特征图上每个位置的目标进行分类和回归.常见的算法有SSD[7]、YOLO[8]、YOLOv2[9]、RetinaNet[10]、RefineDet[11]、YOLOv3[12]等.两阶段目标检测算法通常具有更好的检测精度,但是往往速度较慢,而单阶段目标检测算法的时间效率显著提高,对实时目标检测的适用性更强,但精度较低.
上述两类算法在小目标的检测性能上却不尽理想,因小目标具有分辨率低、特征提取困难,语义信息不足等特点,导致最终的漏检率很高.本文以单阶段目标检测算法YOLOv3为基础,提出了一种改进的YOLOv3小目标检测算法:CBD-YOLOv3.该算法名称来源于CSPDarkNet53-Tiny、Bi-FPN以及改进的DIoU损失函数的首字母缩写.它通过优化主干特征提取网络、加强特征提取网络、引入新的损失函数以及有效的数据处理与训练方法,实现了在不影响实时性能的前提下,大幅提高小目标检测的平均精度.
本文的主要贡献有:
1)CSPDarkNet53-Tiny主干网络
本文对YOLOv3的主干特征提取网络DarkNet53进行改进,首先将每个卷积层的通道数都缩减为原先的一半,再结合跨阶段局部网络(CSPNet)[13],构造出了CSPDarkNet53-Tiny.它在大幅降低计算量的同时也保持了卷积网络的学习能力.
2 )双层的特征金字塔网络Bi-FPN
Bi-FPN(binary-FPN)由FPN(feature pyramid network)[14]网络改进而来,相比FPN增加了自底向上的下采样过程,为小目标检测提供了更加有效的特征信息,并在最终预测时产生四个YOLO头部,能够更好地识别和定位低分辨率物体.
3 )改进的DIoU损失函数
DIoU函数[15](Distance Intersection over Union)是一种将距离和交并比同时考虑的损失函数.本文在计算边界框回归损失时对DIoU损失函数进行了改进,用来代替原先的均方误差损失.首先对中心点距离进行开平方运算降低大目标的损失权重,其次充分考虑了预测框与真值框纵横比的一致性,同时设置惩罚系数,使其优化方向更倾向于小目标,实现了更有效的损失计算.
2 YOLOv3主体结构
YOLOv3是在YOLOv2算法的基础上,融合了残差网络和特征金字塔网络等方法的单阶段目标检测算法.YOLOv3的主干特征提取网络为DarkNet53,它借鉴了残差网络的思想,通过残差块的堆叠缓解了深层网络梯度消失的问题,实现网络深度的增加.同时使用特征金字塔网络加强特征提取,并最终产生尺度大小为13×13、26×26和52×52的3个YOLO头部,即3张特征图,来进行目标检测,如图1所示.
图1 YOLOv3网络结构Fig.1 YOLOv3 network structure
YOLOv3采用K-means聚类算法生成9类不同大小的先验框,对最小的13×13特征图上分配较大的先验框,因为它具有最大的感受野,适合检测大目标.同理将中等的先验框和较小的先验框分配给26×26和52×52的特征图进行中小目标的检测.网络为每个先验框输出4个偏移量tx、ty、tw、th,并利用公式(1)求出最终的预测框.
bx=σ(tx)+cx
by=σ(ty)+cy
bw=pwetw
bh=pheth
(1)
式中bx、by表示预测框的中心点坐标,bw、bh表示预测框的宽高,cx、cy表示当前单元格的左上角偏移量,pw、ph表示对应先验框的宽高,σ表示Sigmoid激活函数.
YOLOv3的损失函数由3部分构成:置信度损失、分类损失和回归损失,在置信度损失和分类损失上采用交叉熵损失,在回归损失上采用误差平方和的形式,最后将3个损失求和,其公式如下:
(2)
3 CBD-YOLOv3算法
3.1 主干特征提取网络
本文首先对YOLOv3的主干特征提取网络DarkNet53进行了改进,提出了CSPDarkNet53-Tiny,如图2所示.相对于DarkNet53,CSPDarkNet53-Tiny的每个卷积层的长宽与YOLOv3中相同,但通道数都是原先的二分之一,大幅降低了训练和测试时的计算量.
图2 CBD-YOLOv3网络结构Fig.2 CBD-YOLOv3 network structure
主干网络还融合了跨阶段局部网络,该结构能够加强卷积网络的学习能力、降低计算瓶颈以及减少内存消耗.通过将基本层的特征图分成两部分,再使用一个跨阶段的层次结构合并它们来实现更丰富的梯度组合,同时减少计算量.将其与DarkNet53-Tiny结合,解决了以往的工作需要从网络架构的角度进行大量推理计算的问题,把问题转化为优化网络中的重复梯度信息,简化了问题.
如图3所示,在某一个阶段中,首先将基础层的特征图分成两个部分,前者是短接边,仅经过少量处理直接连接到阶段的末尾,后者会经过正常的特征提取处理,最后将两者进行特征融合,形成局部过渡层(Partial Transition Layer).通过分块合并的方式,使梯度路径的数量变为原先的两倍,实现梯度组合的差异最大.局部过渡层本质是一种层次化的特征融合机制,它采用截断梯度流的策略来防止不同的层学习重复的梯度信息,从而在不降低检测精度的前提下,能够减少训练参数,加快训练速度.
图3 跨阶段局部网络示意图Fig.3 Sketch map of cross stage partial network
3.2 加强特征提取网络
在进行了主要特征的提取后,本文采用双层的特征金字塔网络(Bi-FPN)对主干网络中顶部4层提取出的特征进行加强.
在目标检测的任务中,卷积网络深度和卷积网络的平移不变性始终是一对矛盾.初始的目标检测算法只采用顶层特征做预测,然而这样的做法虽然对于分类任务有很好的效果,可是对于定位任务而言,随着网络分辨率的逐层下降,目标位置信息逐层丢失,使得精准的定位成为了目标检测的难题,在小目标的检测问题上尤为明显.本文的双层特征金字塔网络是对单向的特征金字塔网络的改进,利用卷积网络低层的特征语义信息稀少,但是目标位置信息准确;高层的特征语义信息丰富,但是目标位置信息比较粗略的性质,对网络的顶部4层添加了自顶向下的路径增强和自底向上的路径增强,并且采用1×1的卷积核对它们进行横向连接.
自顶向下的过程采用上采样进行,而横向连接则是将上采样的结果与初始网络中相同大小的特征图进行融合.在融合之后还会再采用3×3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应.自底向上的过程采用下采样进行,与自顶向下的过程中产生的4个特征层横向连接进行新一轮特征融合,最终得到了4个尺寸大小不同、包含丰富语义信息和位置信息的特征层.它们的尺寸分别为:13×13、26×26、52×52以及104×104,其中104×104是YOLOv3不具备的,该特征图因其分辨率最高,所以主要用于强化小目标的检测.通过这种融合高低层特征的方式,实现了对小尺寸目标检测效果的明显提升.
3.3 先验框数量的调整与DIoU损失函数的改进
本文算法也采用K-means聚类算法生成不同大小的先验框,与YOLOv3不同的是,因为CBD-YOLOv3算法在经过双层特征金字塔网络后会生成4张特征图用于预测,所以先验框的数量由原先的9个变为12个,新增加的104×104特征图感受野最小,更适合小目标的检测.
YOLOv3的损失函数主要分为3个部分:回归损失、置信度损失以及分类损失.本文在置信度损失和分类损失上沿用YOLOv3的方法,主要在回归损失上进行改进,用DIoU损失代替原先的均方误差损失,实现了预测框与真值框之间更有效的损失计算,对于最终精准的目标定位有良好的效果.
IoU(Intersection over Union)指的是两张图像的交并比,在目标检测中用来计算预测框与真值框交集与并集的比值,衡量预测框的准确度.起初它的作用是通过设定阈值进行非极大值抑制,以此来确定正样本和负样本.近些年来的研究表明基于IoU的损失函数对于回归损失通常有更好的效果,因为它具有尺度不变性的特性,即对尺度不敏感.IoU的损失函数可以被表示为:
(3)
式中B和Bgt分别表示预测框和真值框,它的缺点是当两个框不相交时LIoU始终为1,无法给出优化方向.为了解决上述问题,通过引入了中心点距离归一化的操作,提出了DIoU损失函数,它的表达式如下:
(4)
其中,b、bgt分别代表了预测框和真值框的中心点,ρ(·)代表计算两个中心点间的欧氏距离,c代表能够同时包含预测框和真值框的最小闭包区域的对角线距离.LDIoU的优点在于两个框不相交时,依旧可以提供优化方向,并且因为充分考虑了中心点距离因素,所以它的收敛速度显著快于LIoU.
本文的回归损失在DIoU的基础上做了如下改进:首先将分子上的欧氏距离进行开平方运算,因为目标越大,预测框和真值框的中心点距离通常也会越大,在计算损失时占比会明显高于小目标,不利于小目标的损失计算,所以利用开平方降低其权重.其次,把预测框的长宽比和真值框的长宽比的一致性也纳入考虑范围内,并为其添加惩罚项β,公式如下:
(5)
从公式(5)中,v用来衡量长宽比的一致性,β是人工设置的惩罚系数,具体定义如下:
(6)
(7)
其中,wgt和hgt是真值框的宽、高,w和h是预测框的宽、高,从β的定义式来看,损失函数会更加倾向于往重叠区域增多的方向优化,且如果预测框和真值框的长宽比相似,那么v会趋近于0,该惩罚项就不起作用,所以这个惩罚项的作用就是控制预测框的宽高能够尽快地与真值框的宽高接近.
本文在进行非极大值抑制操作时也借鉴了DIoU的思想,在原始的非极大值抑制中IoU值的大小是唯一的影响因子,对于小目标或者遮挡目标常常产生错误的抑制.而本文将中心点归一化距离也纳入影响因子中,有效改善了这一现象,公式为:
(8)
式中si是分类分数,M是得分最高的预测框,ε是人工设定的阈值.
3.4 非对称卷积网络
非对称卷积网络[16](Asymmetric Convolution Net,ACNet)的主要思想是通过非对称卷积块增强卷积网络的核骨架,即使用非对称的卷积核组替换卷积模型中的方形卷积核.它的优点是不但具有即插即用的性质,可以与任何卷积神经网络架构有效融合,而且在不增加额外超参数和测试阶段计算量的情况下,实现了对小目标检测的增强.
ACNet在整体上分为训练和测试阶段,训练阶段重点在于强化特征提取,实现精度提升;测试阶段重点在于卷积核融合,实现零计算量增加.以3×3的方形卷积核为例,训练阶段会将现有网络中的每一个3×3卷积层替换成3×3+3×1+1×3共3个卷积层,如图4所示,最后将这3个卷积层的计算结果进行融合得到卷积层输出.
图4 训练时的非对称卷积网络Fig.4 Training-time ACNet
在测试阶段会将训练阶段的3个卷积核融合,合并成一个3×3的方形卷积核,使得网络参数采用特征提取能力更强的参数,即融合后的卷积核参数,因此只会在训练阶段增加计算量,而不会在测试阶段增加计算量.卷积计算融合的原理公式为:
I×K1+I×K2=I×(K1⊕K2)
(9)
式中I表示输入,这里可以看做是一个二维矩阵,K1、K2表示表示两个二维卷积核,它们的宽高相同,⊕表示逐点对应相加.该公式说明了先进行卷积操作再相加,与先进行卷积的逐点相加再和输入进行卷积得到的结果是一致的,这也是非对称卷积网络不会在测试阶段增加计算量的原因.
3.5 Swish激活函数
在卷积神经网络中,激活函数可以增加非线性因素,强化网络的非线性建模能力,其中ReLU激活函数是使用范围最广、最为常见的激活函数.近几年来,随着新兴激活函数的不断涌现,更多泛化能力更强、效果更好的激活函数被提了出来,本文的网络结构中为了提高小目标的检测精度,使用Swish激活函数[17]代替ReLU.Swish激活函数的公式为:
f(x)=x·σ(x)
(10)
公式中σ(x)=1/(1+e-x)是Sigmoid函数,Swish激活函数的一阶导数是:
f′(x)=σ(x)+x·σ(x)(1-σ(x))=σ(x)+x·σ(x)-x·σ(x)2
=x·σ(x)+σ(x)(1-x·σ(x))=f(x)+σ(x)(1-f(x))
(11)
从一阶导数中可以看出Swish是平滑且非单调函数,同时具有无上界有下界的性质,它的非单调特性把它与大多数常见的激活函数区别开来,它克服了ReLU在训练时的神经元坏死现象,能够更完整的训练和保留特征,这对于小目标的检测尤为关键,因为大目标的整体特征丰富,部分特征的缺失不影响最终检测结果,但对于特征信息本就稀缺的小目标而言,少量特征损失即可导致检测失败.因此在深层次的网络中Swish 相对于ReLU 能实现更高的测试准确度.
4 实验及分析
本文的实验环境为单张RTX2080TiGPU,内存32GB,基于Windows平台通过Python语言编程实现,使用深度学习框架Pytorch搭建和复现实验中的所有网络模型,消融实验硬件配置环境相同.
在网络参数设定方面,梯度下降采用随机梯度下降,动量设置为0.9,权重衰减设置为0.0005,批处理大小设置为16.同时将训练图像进行水平翻转、垂直翻转、颜色抖动以及曝光度调整等方法处理,增强和扩充训练数据集.
4.1 数据处理与训练方法
除了常规的网络参数设定,本文还采用了以下3种数据处理和训练方法增强卷积网络效果.
4.1.1 采用Warmup策略的余弦退火学习率[18]
由于刚开始训练时,模型的权重是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定,选择Warmup预热学习率的方式,可以使得开始训练的几个epoches内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳.
在达到预设的学习率后利用余弦退火缓慢降低学习率,它的公式为:
(12)
4.1.2 标签平滑
标签平滑是一种正则化方法,它通过在传统的独热编码标签中加入噪声,减少了真实样本标签的类别在计算损失函数时的权重,解决了独热编码可能导致过拟合以及模型对于预测过于绝对,以至于忽略掉可能的小样本标签的问题.它对于提升小目标的检测以及获取更好的泛化网络有一定的帮助.
(13)
式中,K表示分类的类别总数,i表示某一个类别,Pi表示其概率分布,ε是一个接近0的超参数,本文设置为0.05.
4.1.3 DropBlock正则化方法[19]
本文在神经网络训练时使用DropBlock代替传统的Dropout.DropBlock可以看做是Dropout的结构化形式,二者的主要区别在于,前者丢弃特征图的相邻区域,而后者丢弃单独的随机单元.因为卷积层具备空间关联性,所以丢弃独立单元往往收效甚微,而在DropBlock中,同一模块中的特征会被一起丢弃,即特征图的相邻区域也被丢弃了,因此该网络必须从其他地方寻找证据来拟合数据,进而增强网络的泛化能力,提升检测精度.
图5(a)为输入图像,图5(b)为Dropout,图5(c)为DropBlock,深色区域表示包含语义信息的激活单元.可以看出删除连续区域可以去除某些语义信息(例如头或脚),从而强制剩余的单元学习特征,本文在训练时选取的区域大小为7×7.
图5 Dropout与DropBlock对比图Fig.5 Comparison of Dropout and DropBlock
4.2 COCO数据集实验及分析
COCO数据集[20]是一个包含丰富类别以及海量图片的数据集,它可用于多种方向的研究:包括图像标题生成,目标检测,关键点检测和实例分割等.对于目标检测任务,COCO共包含80个类别,训练集和验证数据集包含超过120,000张图片,超过40,000张测试图片.该数据集的显著特点是中小目标数量比大目标更多,它将分辨率小于322的标注为小目标,占总目标数量的41.43%,将分辨率大于322、小于962的标注为中目标,占总目标数量的34.32%,其余分辨率大于962的为大目标.本文在COCO2017的训练集和验证集上训练,并在测试集上获得最终速度和平均精度结果,在不同目标检测算法比较时使用框架均为pytorch,在未特殊说明的情况下,训练时输入图像大小默认为416×416,训练周期为90个epoch,不采用多尺度训练法.表1展示了CBD-YOLOV3算法与其他主流算法的对比,其中FPS表示每秒传输帧数,是衡量速度的指标;AP表示所有目标的整体平均精度,APS、APM、APL分别代表小目标、中目标以及大目标的平均精度.
表1 不同目标检测算法结果对比Table 1 Comparison of results of different object detection algorithms
从表1中可以看出CBD-YOLOv3相比YOLOv3在代表小目标平均精度的检测指标APS上,前者达到了22.1%,而后者仅为15.2%,超出部分为6.9%,实现了对YOLOv3小目标检测结果45.4%的大幅提升.除此之外,相较于其他主流一阶段目标检测算法,本文算法在APS指标上都大幅领先,即使是结果最好的RefineDet512也只能达到16.3%.相较于两阶段目标检测算法,该算法依旧比主干网络使用了ResNet-101-FPN的Faster R-CNN高出了3.9%.虽然在APS上略低于Mask R-CNN以及Cascade R-CNN,但是速度分别是它们的6.2倍和9.5倍.
值得注意的是,因为目标越大,分辨率就越高,其所能学习到的特征信息就越丰富,所以对于目标检测算法的改进往往在大型目标上提升效果最好,中型目标次之,小型目标提升效果最差.然而,本文算法在检测精度的提升幅度上,小型目标高于中型目标,而中型目标又优于大型目标,三者的提升幅度分别为:6.9%、5.8%和4.1%,证明了本文设计的网络结构对小目标检测的针对性和显著效果.
在检测速度方面,本文算法每秒达到了31帧,能够实现端到端的实时检测,在速度与精度之间实现平衡.相比YOLOv3,本文算法在速度上有4帧的微弱下降,这是因为虽然在主干特征提取网络部分进行了通道数减半、引入跨阶段局部网络等减少计算量的操作,但是同时也使用了4个YOLO头部、利用双层金字塔网络强化特征等增加计算量的操作,所以在速度上与YOLOv3接近,同时显著高于其他主流一阶段目标检测算法.相比于多阶段目标检测算法Mask R-CNN 和Cascade R-CNN,虽然其精度高于本文算法,但是其5帧每秒和3.2帧每秒的速度使得它在实际应用中受到限制,无法完成实时检测,没能在速度和精度间实现平衡.
在数据集中选取3组小目标较多的图片进行结果对比,在图6中可以看出CBD-YOLOv3在3组图片中都检测出了更多小目标,YOLOv3在第1张图像中漏检了道路右边的马和图片中间的车,对于远处的行人检测也不够细致,而本文算法能将其全部检测出来.在后两张图像中YOLOv3对小目标均有不同程度的漏检,而本文算法的检测结果则更加全面和细致,证明了该算法对小目标的优秀检测效果.
图6 COCO数据集上小目标检测结果对比Fig.6 Comparison of small object detection results on COCO
4.3 消融实验
本文分别进行了主干网络CSPDarkNet53-Tiny参数消融实验和算法模块消融实验.
首先,进行主干网络的消融实验.本文主干网络以DarkNet53为基础,经过通道减半变为DarkNet53-Tiny,最后结合CSPNet成为CSPDarkNet53-Tiny.表2为消融实验结果.
表2 主干网络消融实验Table 2 Backbone network ablation experiment
从表2中可以看出,在输入尺寸相同的情况下,本文的主干网络有效减少了参数总量,是原先DarkNet53参数总量的49.6%.指标BFLOPs表示每秒能进行10亿次浮点运算的个数,它的数值越大,fps的数值也相应越大,CSPDarkNet53-Tiny的BFLOPs达到了38,性能表现是最优秀的.
其次,为了深入研究网络结构中每个模块对结果速度和精度的影响,本文在进行消融实验时逐一添加,表3中√表示使用该模块,最终得到表3结果.
从表3中可以看出,双层特征金字塔网络Bi-FPN对精度的提升最为明显,从15.5%提升至19.4%,提升幅度为3.9%,原因有如下两点:a) 双向的特征提取不但能更好的保留特征,减少特征损失,而且能够强化特征的学习,小目标精度差、难以检测的主要原因就是因为其特征稀少、难以学习,本文算法很好地解决了这一点;b) 后接4个YOLO头部,其中相比YOLOv3新增加的104×104特征图起到了至关重要的作用.因其分辨率最高、感受野最小,所以能够更大程度保留图像信息,更适合小目标的检测.然而,因为双层网络计算量的增加,它对速度的影响也是最大的,每秒下降了10帧.
表3 模块消融实验Table 3 Module ablation experiment
改进的DIoU损失函数也起到了不错的效果,对精度的提升为1.6%,证明了在进行开平方运算后能有效降低大目标在回归损失中的比例,提高小目标的比重,使得计算向小目标的方向优化.同时引入长宽比一致性的概念,并为之添加本文人工设置的惩罚项,取得了不错的效果.它对速度的影响只有2帧,说明其计算量没有显著变化,是一项有效的改进.
ACNet和Swish激活函数对精度的提升分别为0.5%和0.6%,作为辅助结构,在几乎不增加测试阶段计算量的同时,实现了免费提升精度的效果,它们分别说明了使用更小的卷积核以及保留训练时出现负值的神经元都有助于小目标检测结果的提升.
在所有结构中精度提升最不明显的是CSPDarkNet53-Tiny,只有0.3%,但是本文算法使用该主干网络的主要目标是在不影响精度的前提下降低计算量.因为双层特征金字塔网络、改进的DIoU损失函数会增加计算量,从而导致检测速度降低至30fps以下,失去实时检测性能.使用该主干网络后,fps从原版YOLOv3的35快速提升至44,为后续使用高计算量结构打下基础,使得最终fps结果如表3中所示,达到31fps,实现实时检测的目标.
5 结 论
本文针对常用目标检测算法在检测小目标时精度差、无法满足实时性能的问题提出了改进YOLOv3的小目标检测算法:CBD-YOLOv3.该算法在主干网络部分融合了跨阶段局部网络,有效降低计算量;利用双层特征金字塔网络加强特征提取,产生4个YOLO头部用于预测;使用改进的DIoU损失函数,同时将网络中的激活函数替换为Swish函数.在训练时使用了非对称卷积网络、余弦退火学习率、标签平滑以及DropBlock正则化方法,有效加强了对小目标的检测.在COCO数据集上,该算法在满足实时检测的前提下,相比YOLOv3在小目标平均精度指标APS上提升了6.9%,但是该算法与多阶段目标检测算法相比,精度上还存在一定的差距,如何平衡精度与速度是未来的研究方向.