基于级联SSD的目标检测算法

2020-12-28 06:38雷华迪陈东方王晓峰
计算机工程与设计 2020年12期
关键词:边框损失分类

雷华迪,陈东方+,王晓峰

(1.武汉科技大学 计算机科学与技术学院,湖北 武汉 430065;2.武汉科技大学 智能信息处理与实时工业系统湖北省重点实验室,湖北 武汉 430065)

0 引 言

目标检测技术[1-3]主要分为两种研究方向:一种是传统的目标检测方法,主要通过构建特征描述子提取特征后利用分类器对特征进行分类实现目标检测[4];另一种是基于深度学习的目标检测,在目标检测算法中引入卷积神经网络,提高了目标检测的准确性和速度[5-11]。

在各种目标检测方法中,SSD算法(single shot multibox detector)采用分层检测目标的方式,拥有良好的检测速度和检测精度,是当前在工业生产中效果最好的目标检测算法之一。针对SSD算法,也有了许多改进,例如DSSD[12]在算法中加入上下文信息,利用反卷积操作,单向融合高低层特征,提高了整体目标检测效果,对小目标检测也有一些提高;RSSD[13]通过rainbow concatenation方式(pooling加deconvolution)融合不同层的特征,在增加不同层之间feature map关系的同时也增加了不同层的feature map个数,提高了整体目标检测效果,对小目标检测也有一些提高。

上述算法虽然取得比较好的检测效果,但是仍然存在一些不足。其中原始SSD算法对小目标的检测效果不好,这主要由3个原因造成的。第一个原因是训练样本不平衡。第二个原因是底层特征表征能力弱,小目标难以精准分类。第三个原因是小目标区域的特征很小,无法在高层特征检测器中检测。而DSSD与RSSD采用特征融合的方式导致网络参数很大,计算量变多,使得检测速度很慢。为了解决上述方法中存在的问题,本文提出一种基于级联SSD的目标检测算法。算法的优点有:

(1)针对训练样本不平衡的问题,设计基于Focal Loss和截断梯度法(truncated gradient,TG)改进的损失函数,使训练更专注于损失值较大不容易分类的样本,训练出的模型能更好检测到目标。

(2)针对底层特征表征能力不够,无法精准分类的问题,设计小目标强化检测模块与SSD网络级联。该模块在位置信息与表征能力都充足的高层特征检测小目标。

(3)针对小目标区域的特征很小,无法在高层特征检测器中检测的问题,采用双三次插值算法的上采样方式,将小目标区域的底层特征上采样到原始底层特征大小,从而可以在高层特征检测器中检测出小目标。

(4)针对实时检测需要较快的检测速度,而特征融合的方式增加的网络参数太多导致检测速度很慢的问题,本文采用分阶段检测的方式检测目标,网络的计算量没有增大很多,实时性能良好。

1 相关工作

1.1 经典SSD算法

SSD算法,由Wei Liu提出,该算法是one-stage类算法,特点是检测速度快且检测精度较好,可以满足一般工业需求,是如今应用最多的几个检测算法之一。

如图1所示为经典SSD网络结构,该网络采用分层检测的模式,即底层检测小目标,高层检测大目标,最后通过NMS(非极大值抑制)去除冗余的边界框,得到最终检测结果。由于小目标在底层语义信息不够,在高层的位置信息不够,导致虽然SSD对大目标检测效果很好,但对小目标的检测效果比较差,在小目标多的目标检测任务上有所不足。

图1 经典SSD网络结构

基于此,本文算法借鉴这种分层检测的模式,检测时分为两个阶段,第一阶段先通过训练好的模型提取图片各高层特征并分别检测目标,得到不知具体类别的小目标区域和已知具体类别的大目标边框,第二阶段设计小目标强化检测模块与SSD网络级联,单独提取小目标区域对应的高层特征来检测小目标。这种检测采用分阶段形式,可以达到提升检测效果的同时拥有良好的实时性能。

1.2 Focal Loss 简介

Focal Loss[14]是Kaiming和RBG等提出的目标检测用的新型损失函数,该损失函数主要是用来处理训练样本类别不均衡的问题。通过减少易分类样本的权重,使模型在训练时能越发专注于难分类的样本,加强了训练效果,提高了检测结果。以二分类为例,具体公式如下

(1)

式中:p为网络对样本的预测概率,γ为添加的抑制参数,且大于0,用来抑制易分类样本的权重,y为实际类别。

例如当γ=2时,对于正类样本而言,预测结果为0.9肯定是简单样本,所以(1-0.9)γ就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负样本而言同样如此,预测0.1的结果应当远比预测0.7的样本损失值要小得多。使得在训练中会专注于难分类样本。

SSD算法采用cross entropy(交叉熵)损失函数作为分类损失函数,对于样本不平衡问题采用hard negative mining(困难负样本挖掘)的方式,忽略了数量更多的损失值低的负样本对训练的影响;网络的训练偏重取决于两者的损失值差距,Focal Loss中难易样本损失值相对于交叉熵损失函数都是减少的,只是易分类样本减少的更多,基于此,本文算法在Focal Loss的基础上融入Truncated Gradient思想,使训练更专注于难分类样本,训练效果更好。

2 基于级联SSD的目标检测算法

本文算法在训练时对底层检测器采用改进的分类损失函数,使训练更偏向于难分类样本,得到对小目标位置检测效果更好的模型;预测时分为两个阶段,第一阶段先通过训练好的模型提取图片各层特征并分别检测目标,得到不知具体类别的小目标边框FBbs和已知具体类别的大目标边框Bbb,第二阶段设计小目标强化检测模块与SSD网络级联,对FBbs提取高层特征,再进行检测,得到小目标检测结果Bbs,最后对Bbb和Bbs使用非极大值抑制(NMS),得到最终检测结果Bb。算法主要分为3个部分,分别为小目标位置检测模块、大目标检测模块和小目标强化检测模块。具体的网络结构如图2所示。

图2 本文算法具体网络结构

2.1 小目标位置检测模块

在整个网络的初始阶段,设置一个小目标位置检测模块。采用VGG16[15]作为基础特征提取网络,图片输入后进行多次卷积,到conv4_3层,将这一层的特征作为图片的底层特征图进行检测,此时使用的检测器为2分类和位置回归,只进行小目标位置检测而不检测这个小目标具体是什么类别,从而得到不知具体类别的小目标位置边框。此模块主要工作为:

(1)改进分类损失函数Enhanced Focal Loss代替原始的cross entropy(交叉熵)损失函数,提高网络检测效果;

(2)设计新的小目标检测器来检测小目标位置,提高网络检测效果并减少网络计算量。

2.1.1 Enhanced Focal Loss

在网络的训练阶段,易分类样本、难分类样本的不平衡会对训练结果产生较大影响。易分类样本是指容易被网络检测,一般指网络对样本的预测概率pt>0.6的样本,而另一种样本的网络预测概率pt≤0.6,难以准确预测,网络学习这种模糊样本较为困难,称为困难样本。如果不作样本平衡,困难样本对网络学习过程中产生的权值影响小,随着网络训练,困难样本可能会被当成背景进而被忽视。

原始SSD网络采用cross entropy(交叉熵)损失函数作为分类损失函数,对于样本不平衡问题采用hard negative mining(困难负样本挖掘)的方式选择负样本,实现正负样本1∶3来处理这个问题,但是其中负样本是按照样本损失值大小排序,从中选出损失较大的负样本作为训练的负样本,但是这样的方式忽略了那些损失较小的负样本,虽然这些负样本损失较小,但数量多,加起来的损失较大,对最终损失有一定贡献,所以这种方式存在不足。

基于Focal Loss和Truncated Gradient(截断梯度法)的思想,本文提出改进的分类损失函数Enhanced Focal Loss代替原始交叉熵损失函数。优点是考虑了数量大但损失值小的负样本对训练的影响,且使网络训练更明显的偏向于难分类样本。该函数主要分为以下4个部分:

(1)以原始cross entropy(交叉熵)损失函数为基础,刻画的是实际输出p(网络对样本的预测概率)与期望输出(样本实际类别)的距离,也就是交叉熵的值越小即损失值越小,网络预测的越准

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

(2)

(3)

式(3)为整体交叉熵损失函数,其中p为输出概率,y为实际类别,pt为交叉熵损失函数p的意义。

(2)添加平衡系数alpha,优化正负样本不平衡情况

CE(pt)=-αtlog(pt)

(4)

(5)

其中,αt为平衡系数,a为需自己设置的平衡参数,用来控制正负样本权重,y为样本实际类别,pt为样本输出概率。

(3)融入Focal Loss思想,添加抑制系数(1-pt)γ,使网络训练小幅偏向难分类样本

(6)

式中:(1-pt)γ为抑制系数,γ为需自己设置的抑制参数,用来抑制易分类样本的权重,y为样本实际类别,pt为样本输出概率。

(4)融入Truncated Gradient思想,添加截断系数λ(pt),考虑了数量大但损失值小的负样本对训练的影响,使网络训练大幅偏向于难分类样本

(7)

(8)

式(7)为截断系数定义,以pt为截断点,分段计算损失值,γ为需自己设置的参数,用来抑制易分类样本的权重,pt为网络对样本的预测概率。式(8)为整体Enhanced Focal Loss函数,a为需自己设置的平衡参数,用来控制正负样本权重。

2.1.2 小目标检测器

使用了Enhanced Focal Loss作为损失函数后,网络在预测阶段可以更好地提取图片的底层特征。提取到用来检测小目标的底层特征图之后,输入到检测器进行检测。

原始底层特征检测器为直接进行21分类和位置回归,由于低层特征图位置信息足够,能检测到一些含有目标的区域,但是由于语义信息不够,难以做到精准分类,最终都会被舍去,导致对小目标的检测效果差。基于此,本文设计小目标检测器,进行2分类和位置回归,只对小目标区域检测而不检测这个小目标具体是什么类别,从而得到较好的小目标位置检测效果,同时,这种方式改21分类为2分类,减少了网络参数和计算量。该检测器具体步骤如下:

(1)将原图x输入到检测网络中,提取到用来检测小目标的底层特征图D1

D1=F4(F3(…F1(x))

(9)

式中:x表示原图,F1(x)表示经过第一次卷积后提取的特征。

(2)对特征图D1进行2分类检测和位置回归,得到多个小目标位置边框fbs

fbs=Detector1(D1)

(10)

式中:D1表示用来检测小目标的底层特征图,Detector1为小目标检测器。

(3)对这些边框fbs进行非极大值抑制处理,抑制掉一部分重叠或者不正确的边框,得到不知具体类别但位置精准的小目标位置边框FBbs

FBbs=NMS(fbs)

(11)

式中:fbs表示小目标检测器得到的所有小目标边框,NMS(fbs)表示对fbs进行非极大值抑制操作。

2.2 大目标检测模块

基于原始SSD的思想,对大目标的检测将使用多个检测器在多个高层特征图上进行检测,得到具体类别的大目标检测边框。大目标在高层特征图上的位置信息和语义信息都足够,能够直接检测到具体类别和位置,所以,所有高层检测器都为21分类检测和位置回归。该模块具体检测步骤如下:

(1)将原图x输入到检测网络中,提取到用来检测小目标的底层特征图D1。

(2)对特征图D1继续进行3次卷积,得到第一个用来检测大目标的高层特征图D2

D2=F7(F6(F5(D1)))

(12)

其中,D1为底层特征图,F5(D1)为对D1进行第5次卷积。

(3)类似于第二步操作,继续向后卷积及池化得到后面4个用来检测大目标的特征图D3,D4,D5,D6。

(4)对这些高层特征图使用它们对应的检测器,得到多个大目标边框bb

bb=Detector2(D2)+…+Detector6(D6)

(13)

其中,Detectorn(Dn)表示使用与特征图对应的检测器进行检测。

(5)对这些边框bb进行非极大值抑制处理,抑制掉一部分重叠或者不正确的边框,得到具体类别且位置准确的大目标边框Bbb

Bbb=NMS(bb)

(14)

其中,bb表示大目标检测器得到的多个大目标边框,NMS(bb)表示对bb进行非极大值抑制操作。

2.3 小目标强化检测模块

小目标在底层特征图上检测时,由于底层语义信息不够无法检测具体类别;在高层特征图上检测时,由于尺寸很小的小目标在高层语义信息足够的特征中已经没有了足够的位置信息无法检测到小目标。基于此,本文设计小目标强化检测模块与SSD级联来检测具体类别且位置准确的小目标边框Bbs。该模块分为两部分,第一个部分是将小目标检测转化为大目标检测,将小目标位置的底层特征上采样到原图底层特征D1大小,从而将小目标检测问题转化为大目标检测问题。第二个部分是提取高层特征并进行检测,学习原始SSD网络对大目标检测效果好的优点,该模块的后续阶段就是对上采样后的特征图提取高层特征后再进行检测,此时采用与原始SSD网络类似的网络层提取高层特征,并只在最后的高层特征进行目标检测。

该模块主要步骤如下:

(1)输入从小目标位置检测模块得到的小目标位置边框FBbs,基于CNN(卷积神经网络)具有平移不变性的原理,从底层特征图D1得到FBbs对应位置的底层特征Ds。

(2)对这些小目标底层特征Ds采用双三次插值算法进行上采样,得到与原图的底层特征图D1相同大小的小目标底层特征图DBs

DBs=Ds↑s

(15)

式中:↑s表示上采样操作符。

(3)然后对小目标底层特征图DBs进行多次卷积及池化,提取其高层特征DUs,并对高层特征DUs进行21分类和位置检测,得到多个小目标边框bs

DUs=P(F10(F9(…F5(DUs)))

(16)

bs=Detector6(DUs)

(17)

其中,P()表示平均池化操作,F()表示卷积操作,Detector6为检测器。

(4)最后对这些边框bs进行非极大值抑制处理,抑制掉一部分重叠或者不正确的边框,得到具体类别且位置准确的大目标边框Bbs

Bbs=NMS(bs)

(18)

式中:bs表示从小目标高层特征检测到的多个小目标边框,NMS(bs)表示对bs进行非极大值抑制操作。

3 实验与分析

3.1 实验环境与数据集

实验的软件环境操作系统为Ubuntu 14.04,使用Tensor Flow深度学习框架。硬件环境使用8核CPU、8G内存、NVIDIA(R)GTX(R)1080TI显卡。

实验使用的训练集为PASCAL VOC 07+12中的训练集,由7924幅图像共14 235个物体组成,这些物体有20类,同一张图像可能出现多个尺寸的不同物体,是一套非常优秀的目标检测训练集。测试集有两个,一个使用PASCAL VOC 2007的测试集,由4952幅图像共7013个物体组成。另一个测试集使用PASCAL VOC 2007的测试集中选取的100张含小目标图片组成的测试集,共719个物体,其中大部分为小尺寸物体。

3.2 评价标准

本文使用MAP(mean average precision)用于评价算法的检测性能。使用每秒识别的图像数(frames per se-cond,Fps)评价算法的检测速度。

Fps是指每秒内可以处理的图片数量,对比Fps需要在同一硬件上进行。MAP是指对于所有类物体在所有图上的精度,它的计算公式如下

(19)

式中:∑AveragePrecisionC表示所有类别的平均精度求和,N(Classes)表示所有类别。

(20)

式中:∑PrecisionC表示在测试集上所有的图像对类c的精度值的求和,N(TotalImages)C表示有类c这个目标的所有图像的数量

(21)

式中:N(TruePositives)C表示图像正确预测(True Positives)的数量,N(TotalObjects)C表示在图像中这一类的总的目标数量。

3.3 实验分析

为更好地验证本文算法的检测效果,将从以下几个方面进行实验。

3.3.1 分类损失函数的选择

为了验证本文设计的损失函数Enhanced Focal Loss在本文算法中比交叉熵损失函数及Focal Loss更有效,将这3种损失函数分别应用于本文算法中训练。此时使用的训练集为PASCAL VOC 07+12,测试集为PASCAL VOC 2007中的测试集,3种函数训练样本的选择、函数构成及检测准确率对比见表1。

表1 损失函数对比

如表1所示,原始cross entropy(交叉熵)损失函数选取了正样本和损失值大的负样本作为训练样本,这种方式丢失了数量大但损失值小的负样本的损失,对网络训练明显不利,最终在本文算法上的检测精度为77.62%;Focal Loss选取了所有样本包括数量大但损失值小的负样本作为训练样本,同时添加抑制系数控制难分类样本和易分类样本的损失,使得易分类样本损失大幅下降,难分类样本损失小幅下降,整体上难分类样本权重小幅上升,使得网络训练偏向于难分类样本,最终在本文算法上的检测精度为77.69%;本文使用的Enhanced Focal Loss融入Truncated Gradient思想,使得易分类样本损失下降,难分类样本损失上升,整体上难分类样本权重大幅上升,使得网络训练更明显偏向于难分类样本,最终在本文算法上的检测精度为77.83%。

为了提升网络训练效果放弃使用丢失了部分负样本损失的原始cross entropy(交叉熵)损失函数;又因为图片中小目标尺寸小、模糊,大都属于难分类样本,为了使训练更偏向于这些小目标,所以本文使用Enhanced Focal Loss作为小目标检测器的分类损失函数,使用此分类损失函数时的检测精度也是最高的达到77.83%,验证了在本文算法中用Enhanced Focal Loss作为小目标检测器的分类损失函数效果更好。

3.3.2 Enhanced Focal Loss中的参数设定

为了确定Enhance Focal Loss中系数λ(pt)的参数λ和系数αt的参数a的取值,进行了不同取值情况下的对比实验。此时使用的训练集为PASCAL VOC 07+12,测试集为PASCAL VOC 2007中的测试集,采用的网络为本文训练的网络。实验结果见表2,λ取1时损失函数为原始Focal Loss,当λ取3时发现检测精度骤降,故没再增加λ值,最终发现采用的λ值为2,a值为0.25时检测效果最好。

表2 几组不同λ和a取值时本文算法的检测精度

3.3.3 不同算法在一般检测任务中的检测效果对比

实验选择原始SSD算法以及当前对原始SSD改进的代表算法DSSD算法进行对比,来验证本文算法在一般检测任务中的有效性和实时性。此时使用的训练集为PASCAL VOC 07+12的训练集,测试集为PASCAL VOC 2007中的测试集。对比结果见表3,其中Net为算法采用的基础特征提取网络,MAP为算法的整体检测精度,Fps为算法的检测速度,单位为帧/秒,加*表示在本文实验环境下训练和测试得到的结果,our表示本文算法的实验结果。

表3 在PASCAL VOC 2007测试集上的测试对比结果

如表3所示,原始SSD网络SSD300整体检测精度MAP(mean average precision)为77.5,本文算法整体检测精度MAP为77.8,总体上增进了0.3个百分点。在每一类的检测准确度中,含小目标多的类别增进的精度多,如飞机、船等,其余类别检测精度相近,验证了本文算法总体上能达到在保持对非小目标的检测质量的同时增强对小目标的检测能力。在与DSSD网络的对比中发现,总体上检测精度MAP比DSSD低,但在其中小目标多的类别中(如飞机、瓶子等),发现仍然是本文算法精度更高,验证在小目标多的类别中仍是本文算法检测效果好。

DSSD使用特征融合的方式,额外增加了很多网络参数,导致检测速度很慢,如表3所示,DSSD检测速度Fps为4.2帧/秒,无法满足实时工业需求,而本文算法采用分阶段检测的方式检测,网络的计算量没有增大很多,检测速度依旧比较快,如表4所示,本文算法检测速度Fps为12.7帧/秒,可以满足实时工业需求,要比DSSD速度快近3倍。综合来看,在实时工业生产检测中,本文算法更具实用性。

3.3.4 不同算法在小目标多的检测任务中的检测效果对比

实验选择原始SSD算法以及当前对原始SSD改进的代表算法DSSD算法进行对比,来验证本文算法在小目标多的检测任务中的明显提升。此时使用的训练集为PASCAL VOC 07+12的训练集,测试集使用PASCAL VOC 2007的测试集中选取的100张含小目标图片组成的测试集,共719个物体,其中大部分为小尺寸物体。在去除部分数量较少的类别后,检测的物体类别有11种,包含了飞机、羊、鸟、摩托车、牛、狗、汽车、瓶子、船、人、自行车。从其中选取了部分检测结果,如图3所示。

从图3可以看出,本文改进后的SSD在检测目标时检测到更多目标且置信度比较高;而即使是原始SSD或DSSD没有检测到的物体,本文算法也能检测到一定数量的目标,其原因还是因为图片中存在一些尺寸过小的目标导致。

图3 经典SSD(第1列)、DSSD(第2列)、与本文算法(第三列部分检测结果对比)

计算原始SSD、DSSD以及本文算法的MAP值,在去除样本数量太少类别结果后,得到的精确度见表4。

从表4可以看出,在对小目标多的数据集的检测上,本文改进的SSD检测的11类目标的平均精度都比原始SSD及DSSD要大。可以看到,总体上,原始SSD总的MAP为0.445,DSSD总的MAP为0.509,而本文改进的SSD的MAP为0.536,相对于原始SSD提高了9.1%,相对于DSSD提高了2.7%。可以验证在对小目标检测上,本文改进的SSD在检测速度较快的同时,检测质量也有明显增强。

表4 在小目标多的数据集上的检测结果对比

4 结束语

本文提出了一种强化SSD的小目标检测算法,训练时使用在Focal Loss和Truncated Gradient的基础上改进的分类损失函数来处理小目标训练样本不平衡的问题;测试时分为两个阶段,第一阶段先通过训练好的模型提取图片各层特征并分别检测目标,得到不知具体类别的小目标边框和已知具体类别的大目标边框,第二阶段设计小目标强化检测模块与SSD网络级联,单独提取小目标区域对应的高层特征来检测小目标。

本文算法的优点是,新的分类损失函数增强了网络的小目标区域定位能力。测试采用分阶段检测的方式,网络的计算量没有增大很多,检测速度依旧比较快。设计小目标强化检测模块与SSD网络级联,采用双三次插值算法提取小目标区域对应的高层特征来检测小目标的方式更是解决了小目标在高层失去位置信息以及小目标在底层特征没有足够语义信息的问题,使得算法对小目标检测效果明显提高。

通过最终的实验对比,可以看出本文算法相对于原始SSD以及DSSD算法等的优越性。未来可以从改进上采样方式,增强小目标定位能力,这两个方向来进一步提升检测质量。

猜你喜欢
边框损失分类
胖胖损失了多少元
分类算一算
分类讨论求坐标
玉米抽穗前倒伏怎么办?怎么减少损失?
数据分析中的分类讨论
用Lightroom添加宝丽来边框
给照片制作专业级的边框
教你一招:数的分类
外出玩
摆脱边框的束缚优派