APP下载

基于YOLOv3的目标检测算法提升研究

2021-11-26杨鲁江

化工自动化及仪表 2021年6期
关键词:集上网络结构损失

高 杨 杨鲁江 高 平

(浙江中控技术股份有限公司)

目前,目标检测算法有两个研究方向:一是基于手工特征的传统目标检测算法[1],另一个是基于深度学习的目标检测算法[2]。2012年之前,大多是通过先验知识设计的人工特征进行目标检测研究,随后深度学习技术被应用到目标检测算法中,算法性能较之前有了很大提升。

基于深度学习的目标检测算法利用卷积神经网络提取图像特征,能够学习图像更深层次的特征和语义信息,对图像像素分布进行很好的描述。 因其对于图像特征强大的学习能力,基于深度学习的目标检测算法渐渐取代了传统目标检测算法成为目标检测领域的主流方法。 基于深度学习的目标检测算法主要分为两个研究方向:一是先生成可能包含待检测物体的候选框,然后进行细粒度物体检测的两步式目标检测算法;另一个是直接在网络中提取特征来预测物体分类和位置的一步式目标检测算法。 实际场景的目标检测对检测速度有较高的要求,两步式目标检测算法可以保证不错的检测精度,但不能满足实时需求,因此一般采用一步式目标检测算法进行目标检测。 一步式目标检测算法就是运用回归思想直接在网络中提取特征来预测物体分类和位置,主要包括YOLO系列和SSD系列[3]。 YOLO的提出使得目标检测在工业应用上有了很大的进步,包括巡检机器人、工业零件计数、工业缺陷检测及人脸识别等。

笔者基于YOLOv3[4]设计合适的网络结构,比较Darknet-19和Darknet-53,提取各自的优点组合成更好的特征提取网络,加强目标提取能力。 采用合适的分类损失函数和回归损失函数对损失函数进行提升,并采用效果较好的损失函数使整个目标检测算法在保证检测精度的前提下有更快的检测速度。

1 YOLOv3

1.1 YOLO系列

YOLO将回归思想运用到目标检测算法上,是一个端到端的目标检测模型[5],不 像R-CNN[6]系列目标检测算法需要先生成目标候选区域,再进行目标分类。 对于输入的图像数据,YOLO只需“看”一次就能得到图像的目标类别和位置信息,加快了目标检测速度。 YOLO也存在明显不足,即检测精度相较于两步式目标检测算法有一定的下降,物体的定位也不够准确,对于小目标和密集目标检测都不够优秀。

YOLOv2 在YOLO 的基础上做了很大的改进[7]。 网络结构使用Darknet-19,精度比VGGNet[8]好, 浮点运算量减少约1/5, 进一步提升了速度。YOLOv2使用了批归一化, 通过均衡输入数据分布,标准化输出层,有助于缓解梯度消失和梯度爆炸问题,使得mAP(mean Average Precision)明显提升。 YOLOv2借鉴了RPN网络锚框[9]的思想,在每个网格中设置锚框, 使得召回率明显提升,运用聚类思想对训练集中标注的边框进行分析,可以获得更好的锚框尺寸。 YOLOv2还增加了一个passthrough层来重组高层低分辨率特征图与低层高分辨率特征图。 虽然YOLOv2采取了一些手段来增强对小目标的检测能力,整体效果有限提升, 但其在COCO数据集上的表现效果不如SSD512。

YOLOv3在YOLOv2的基础上提出了一些改进策略, 主要包括新的网络结构和借鉴FPN的思路,增强了对小目标检测的能力。

1.2 网络结构

如图1 所示,YOLOv3 使用的网络结构在Darknet-19的基础上继续改进, 提出了Darknet-53, 其中引入了残差网络中的跨层加和操作,使网络达到更深的层次。 整个网络结构中只有卷积层,没有了池化层和全连接层。

图1 YOLOv3网络结构

YOLOv2引入passthrough层以增强模型对小目标的检测能力,但效果并不明显,经分析该方法仍在一个尺度上检测,对于小目标还是没有合适的感受野。

YOLOv3则借鉴FPN的思想引入多尺度预测。从图1可以看到YOLOv3使用了32倍、16倍和8倍降采样3个尺度预测, 极大地提升了对小目标的检测能力, 使其总体检测性能较YOLOv2有了较大的提升。

1.3 损失函数

YOLO系列的损失函数大致分为回归损失、置信度误差损失和分类损失。 3个系列也存在一定的差异, 主要是具体损失函数选择有所区别。YOLO是没有锚框的, 对于回归损失是非常粗暴的,3个部分都使用了平方差损失函数,YOLO损失函数对于目标坐标的预测更加重视,赋予了较大的权重,对于没有目标的边框置信度预测赋予较小的权重。

YOLOv2总体的损失函数和YOLO的没有太大的差异, 主要差别就在于坐标损失函数的计算, 坐标x,y的误差由相对于输入图像的偏移坐标误差的均方改为相对于网格的偏移坐标误差的均方,YOLOv2的长宽放缩因子采用取对数的方法。

YOLOv3的损失函数是在YOLOv2的基础上进行一些改变,运用Sigmoid[10]函数使得每个类别的分类更加独立,减少类别之间的影响。 分类损失不再采用平方差损失函数,而是采用了二分类的交叉熵损失函数,可避免Sigmoid函数后损失函数学习率降低的问题,加快收敛速度。 YOLOv3的损失函数可以分为4个部分:中心坐标误差、宽高坐标误差、置信度误差和分类误差,这4个部分对整个网络损失函数的影响不同,所以分配了不同的权重,λcoord是中心坐标误差和宽高坐标误差的权重,λobj是含目标的置信度的权重,λnoobj是不含目标的置信度的权重,λcls是分类误差的权重,其计算式如下:

2 改进算法

经过不断发展,YOLO系列对于目标检测的效果越来越好, 工业应用越来越广阔。 笔者以YOLOv3为基础进行改进, 以满足实际场景的目标检测:采用合适的网络结构保证目标检测精度且不牺牲检测速度, 针对YOLOv3的召回率不足和定位精度不够的问题,采用优秀的损失函数提升召回率和定位精度。

2.1 网络结构设计

YOLOv3 的 网 络 结 构 是Darknet-53,Darknet-53的精度比Darknet-19要高, 但同时也牺牲了目标检测速度,这也是目标检测算法中常见的问题之一,目标检测精度的提升常常会牺牲掉检测速度,反之亦然。 对于目标检测的实际场景,目标检测速度的要求是严格的,本项目中的目标种类相对较少, 所以选择以网络结构Darkneto-19为基础,进行一些修改来适应实际场景的目标检测。

Darknet-19网络结构的设计思路与VGGNet相似,主要由3×3、1×1的卷积层和2×2的最大池化层组成。 Darknet-19中用两个卷积层和两个最大池化层实现了4倍的降采样, 笔者简化了这一过程(图2),将第1个卷积层的步长设为2用作降采样,再加上1个最大池化层就实现了4倍的降采样,相比于原来的网络舍弃了1个卷积层和1个最大池化层,减少了一些参数量,用卷积层实现降采样和最大池化没有区别,而且可以让网络自己选择抛弃掉一些信息,池化不能保证抛弃的点不包含所需要的信息,尤其是在网络前几层包含的信息量足够多的情况下。 后面的网络与原网络相似,Darknet-19和Darknet-53最后得到的特征图与输入图片相比都进行了32倍的降采样, 因此放弃passthrough层的设计,参照Darknet-53的多尺度预测,在Darknet-19实现多尺度预测,增强模型的综合检测能力。

图2 改进的网络结构

2.2 损失函数设计

损失函数的设计主要有两点: 一是针对YOLOv3的召回率不足;二是针对YOLOv3的定位不够精确。 总的来说,就是对分类损失和回归损失分别做一些改进,提升改进模型的性能。

2.2.1 分类损失

分类损失中,用Focalloss代替YOLOv3的二分类交叉熵损失函数。

Focalloss是2017年何凯明团队提出的损失函数,当时用于Retinanet的训练[11]。 Focalloss的提出主要是为了提升一步式目标检测算法的准确度,他们认为一步式目标检测算法的准确度往往不如两步式目标检测算法的主要原因是样本的类别不平衡。

样本的类别不平衡主要可以分为两个方面:一是正、负样本不平衡;二是难分和易分样本不平衡,负样本数量多,占总损失中的大部分,而负样本大多是容易分类的,使得模型的优化方向不符合期待, 易分样本会使模型收敛速度加快,但这不一定是好的模型,需要把难分样本训练好。

Focalloss的引入可以很好地缓解样本类别不平衡,该损失函数是在交叉熵损失函数的基础上进行改进的,引入两个新参数γ和α,具体形式为:

其中,LFl是Focalloss损失函数; 参数y′表示样本属于正确类别的概率; 参数γ对损失函数有缩放作用,可以减少易分类样本的损失,使模型更关注困难的、错分的样本,保证模型不会因为太多易分类样本而产生偏移; 参数α则是一个平衡因子,主要负责平衡正、负样本本身的数量比例不均。

将Focalloss应用到一步式目标检测算法,通过试验使得一步式目标检测算法的检测精度可以和两步式目标检测算法相媲美,而且还保留了一步式目标检测算法的检测速度优势。

提出YOLOv3的学者也尝试使用Focalloss,但试验发现对于目标检测精度的提升不明显,甚至略有下降,对于召回率有一定的提升。 后来发现可能是没有用对地方, 经验证,YOLOv3使用Focalloss后在Pascal VOC上的mAP可以增加一个点左右,效果已经很明显了。

而对于实际场景的目标检测,由于一些目标会使前景与后景区分不明显, 所以Focalloss对于这些目标检测应用会有很好的效果。

2.2.2 回归损失

目标检测算法中用于边框回归的损失函数有很多, 从L1损失函数到Faster R-CNN的Smooth L1损失函数,再到YOLO的均方差损失函数,它们对边框回归都有不错的效果, 但是YOLO系列的定位精度一直不高。 YOLO系列采用的均方差损失函数主要有两方面的不足:一是均方差损失函数对于边界框4个点坐标的预测是独立的, 与正常情况不符; 二是均方差损失函数对于4个坐标没有实现正则化。 因此,有了很多对于边框回归损失函数的研究,不再将损失函数局限在“距离”的研究上,检测框本身就是一个矩形框。 目标检测任务试图获得更准确的预测框即较大的IoU值, 所以将IoU通过某种映射直接作为损失函数提出来。 2016年,旷视科技提出了IoUloss(LossIoU=-ln(IoU),不再将各个坐标做独立预测,而是将其看成一个整体,使得到的预测框更加准确,训练可以更快收敛。 但是IoUloss还是存在一定的局限性,该损失函数只能适应很少的目标,当时提出来主要运用在人脸检测上。 如果两个框不重叠,那么IoU=0,对应的损失函数值为0,没有了梯度反传,致使损失函数无法对其进一步优化,而且无法反映出两个框到底距离多远。

2019年,斯坦福大学提出损失函数GIoUloss[12]解决IoUloss存在的问题(IoUloss无法辨别不同方式的对齐,如方向不一致等)。 检测框和标定框的空间位置关系如图3所示, 当两个框是水平平移相交或是垂直方向相交,对应的重合度有着很好的效果,当存在第3种情况时,重合度效果不好导致最终的回归效果不理想,GIoUloss可以很好地解决这类问题。

图3 检测框和标定框的空间位置关系

为了验证GIoUloss的优点,将其与L1、L2损失函数和IoUloss作对比,具体如图4所示,图4a表示两个矩形框的两个顶点坐标计算L2范数距离、IoU和GIoU的结果,可见3个L2范数在距离相同的情况下,第3个的IoU显然比前两个要高,从主观上来说也是第3个的效果最好。 图4b表示矩形框的中点坐标和长宽信息计算L1范数距离、IoU和GIoU的结果, 可见3个L1范数在距离相同的情况下,也是第3个的效果最好。 根据上述对比结果提出GIoUloss。

图4 范数、IoU和GIoU结果对比

GIoU的计算比较容易理解,对于两个矩形框A、B,可以算出其最小凸集C,计算最小凸集C去掉A、B并集后的面积与C自身面积的比值, 用IoU减去比值就可以得出GIoU:

这样设计后,GIoU有很多不错的性质,GIoU可以作为一个距离,具有非负性,用于损失函数就十分方便。 IoU的范围是0~1,而GIoU的范围则是-1~1,拥有了对称的区间值。 GIoU中引入了最小凸集, 使得两个框不重合时依然可以进行优化。 总的来说,GIoUloss有着IoUloss的所有优点,而且克服了IoUloss的缺点。

e. 计算最终的损失值,LGIoU=1-GIoU。

因此,GIoUloss作为边框回归损失函数可以取得良好的效果。 将YOLOv3中的均方差损失函数替换为GIoUloss, 有效提升了模型的边框回归性能。

2.3 训练过程

训练过程主要在PascalVOC数据集[13]进行训练测试, 这一部分主要是获得改进算法在PascalVOC数据集上的结果,将改进算法和YOLOv3、YOLOv2进行对比, 随后在自己制作的烟火数据集上验证改进算法在这种实际场景中的效果。

在PascalVOC数据集训练前,要先获得Darknet-19在ImageNet数据集上的预训练模型的参数,再用改进网络结构进行fine tuning,随后进行PascalVOC数据集的训练。

训练参数设置为:输入图片像素为416×416;为了保证最后特征图的尺寸, 图像饱和度范围saturation设为1.5,图像曝光度exposure设为1.5,图像色调范围hue设为0.1,类别20,置信度阈值0.3;动量设为0.9,权重衰减0.000 5,将Batch Size设为16; 采用批量随机梯度下降法进行模型优化,设置初始学习率0.001,在迭代次数达到40 000次时学习率衰减10倍, 迭代次数达到45 000次时学习率再衰减10倍。

在烟火数据集上进行训练阶段, 将用PascalVOC数据集训练得到的模型作为烟火预训练模型,将输入图片的尺寸转化为416×416;考虑内存原因,Batch Size设为8;其余参数与上述训练过程相似;学习率变化也进行修改,在迭代次数达到10 000次时学习率衰减10倍, 在迭代次数达到20 000次时学习率再衰减10倍。 学习率衰减主要是保证模型一开始在较大的学习率下可以进行快速的梯度下降,保证训练速度,动态调整学习率可以使损失函数在小范围内周旋,获得满意的值。

2.4 试验结果分析

2.4.1 PascalVOC数据集试验结果

为了验证改进算法的有效性, 用PascalVOC数据集对改进算法进行训练和测试。 将改进算法与YOLOv3、YOLOv2比较, 评价指标采用mAP和FPS,mAP是各个类别AP的平均值,AP表示精确率和召回率曲线下的面积,FPS表示每秒传输帧数。 试验结果见表1。 可以看出,改进算法在PascalVOC数据集上的检测精度比YOLOv3的降低了1.4%, 主要原因是网络结构不同,Darknet-53比本项目网络结构在检测精度上表现更好,但本项目网络结构模型内存比Darknet-53更小且有更快的检测速度, 可以用于实际场景的目标检测。

表1 算法在PascalVOC数据集的试验结果

2.4.2 烟火数据集试验结果

对于烟火目标检测的评价指标,主要采用精确率和召回率。 分别用YOLOv3和改进算法在数据集上进行训练和测试, 评价指标采用精确率、召回率和FPS,试验结果见表2。 可以看出,改进算法在针对烟火目标检测时有更好的效果,精确率比YOLOv3提高了2.2%,召回率比YOLOv3提高了4.5%。 精确率提升是因为本项目只用于两个目标的检测,改进算法更适合两个目标的检测。 召回率的提升对于烟火实际场景的目标检测更有意义。

表2 烟火目标试验结果对比

2.4.3 试验效果展示

在两个数据集上验证后,改进算法都取得了不错的效果, 在PascalVOC数据集上的试验效果如图5所示, 自己制作的烟火数据集上的试验效果如图6所示。

图5 改进算法在PascalVOC数据集的应用效果

图6 改进算法在烟火数据集的应用效果

3 结束语

基于YOLOv3 改进的目标检测算法,以YOLOv3为基础, 改进网络结构适应实际场景目标检测,并且使浮点数运算更少,有效提升了检测速度;选取更合适的分类损失函数和回归损失函数, 使得模型整体性能与YOLOv3相似且检测速度更快;通过两个数据集的试验验证了改进检测算法在实际场景有着更好的检出率,而且检测的实时性也能够满足要求,在烟火这种实际场景检测中有不错的效果。

对于工作中遇到的目标检测方面的问题,可以采用笔者方法改善,对于流程图中的一些物体识别会起到很好的预研工作,为流程图的转化工作提供一种可行方法,未来对视频分析也会有很好的引导作用。

猜你喜欢

集上网络结构损失
关于短文本匹配的泛化性和迁移性的研究分析
胖胖损失了多少元
基于互信息的多级特征选择算法
快递网络结构研究进展
基于AutoML的保护区物种识别①
玉米抽穗前倒伏怎么办?怎么减少损失?
基于时效网络的空间信息网络结构脆弱性分析方法研究
基于互信息的贝叶斯网络结构学习
菜烧好了应该尽量马上吃
师如明灯,清凉温润