yolov3损失函数改进_基于改进损失函数的YOLOv3网络

目标检测具有广阔的发展前景和巨大的商业价值, 已经成为国内外相关从业者的研究热点, 在智能安防、自动驾驶等领域具有广泛应用. 经典的目标检测方法有Dalal于2005年提出的基于HOG特征的检测方法[, Felzenswalb等人于2008年提出的可变行组件模型(Deformable Part Model, DPM)检测方法[, 该方法先利用梯度算子计算出目标物体的HOG特征并采用滑动窗口+SVM的方法进行分类, 在目标检测问题中表现良好.

与经典方法相比, 深度神经网络提取特征能力强, 准确率高, 在计算机文本、图像分析等领域取得令人瞩目的成果, 受益于深度学习的快速发展, 基于卷积神经网络(CNN)的目标检测模型层出不穷, 检测效果不断提升, Girshick R等人于2014年提出R-CNN网络[, 采用选择性搜索(selective search)方法代替传统的滑动窗口, 将VOC2012数据集上目标检测平均准确率(mean Average Precision, mAP)提高了30%; Girshick R和Ren SQ等人相继提出了Fast R-CNN[与Faster R-CNN[网络, Faster R-CNN采用区域推荐网络(Region Proposal Network, RPN)生成候选框, 再对这些候选框进行分类和坐标回归, 检测精度大幅提升, 检测速度约5 fps, 这些方法由于生成候选框和进行预测分成两个步骤进行, 所以称为为Two-Stage方法, 同时进行这两种操作的网络称为One-Stage方法, 代表有YOLO[, SSD[等. 2016年Redmon J等提出YOLO网络, 其特点是将生成候选框与分类回归合并成一个步骤, 预测时特征图被分成S×S(S为常数, 在YOLOv1中取7)个cell, 对每个cell进行预测, 这就大大降低了计算复杂度, 加快了目标检测的速度, 帧率最高可达45 fps, 之后, Redmon J再次提出了YOLOv2[, 与前代相比, 在VOC2007测试集上的mAP由67.4%提高到76.8%, 然而由于一个cell只负责预测一个物体, 面对被遮挡目标的识别表现不够好. 2018年4月, YOLO发布第三个版本YOLOv3[, 在COCO数据集上的mAP-50由YOLOv2的44.0%提高到57.9%, 与mAP61.1%的RetinaNet[相比, RetinaNet在输入尺寸500×500的情况下检测速度约98 ms/帧, 而YOLOv3在输入尺寸416×416时检测速度可达29 ms/帧, 在保证速度的前提下, 达到了很高的准确率.

为了实现实时分析的目标, 本文针对One-Stage方法的代表YOLOv3网络模型进行研究和改进, 根据坐标预测值和Sigmoid函数的特殊性质, 将原版的损失函数进行优化, 不仅减少了梯度消失的情况, 而且可以使网络收敛更加快速, 同时通过分析数据集中目标的分布情况修正anchor box, 使得anchor box更加符合目标尺寸, 增强收敛效果, 在Pascal VOC[数据集上的实验表明, 在不影响检测速度的情况下准确率提高了1个百分点左右, 且收敛速度变快, 使目标检测能力进一步提升.

1 传统YOLOv3网络

YOLO网络将目标检测问题转化为回归问题, 合并分类和定位任务到一个步骤, 直接预测物体的位置及类别, 检测速度可以满足实时分析的要求. YOLOv3包含了新的特征提取网络Darknet-53, 以及三种尺度的YOLO层, 也就是预测层. 通过在三种尺度上进行预测的方法, 有效的增强了对不同大小物体及被遮挡物体的检测效果, 并引入跃层连接以强化收敛效果, 同时采用随机多尺度训练的方式增强了鲁棒性.

1.1 检测过程

YOLOv3提出了新的提取图片特征的网络Darknet53, 作为全卷积网络, darknet53主要由卷积层、Batch Normalization及跃层连接组成, 激活函数采用LeakyRelu, 其网络结构如

图 1

Fig. 1

图 1 YOLOv3的网络结构

YOLO卷积层负责输出检测结果, 包括目标的中心位置xy, 宽高wh, 置信度, 以及类别, 这种检测分别在三个尺度上进行, 13×13, 26×26, 52×52, 通道数为3, 也就是每个box负责对三个anchor box进行回归, 取其中的一个作为最终检测结果, 共对9个anchor box进行回归, 所以对于一张输入图像, 最后的输出尺寸为1×(3×(13×13+26×26+52×52))×(5+k) = 1×10647×(5+k), k代表类别数, 在COCO数据集上为80, VOC数据集上为20, 如

图 2

Fig. 2

图 2 YOLOv3网络的输出格式

在YOLOv1版本中, x, y, w, h是直接预测物体实际值, 预测值的微小变化都会被放大到整个图像的范围, 导致坐标波动较大, 预测不准确. YOLOv2对其进行了改进, 其公式为:

${b_x} = \sigma \left( {{t_x}} \right) + {c_x}$

${b_y} = \sigma \left( {{t_y}} \right) + {c_y}$

${b_w} = {p_w}{e^{{t_w}}}$

${b_h} = {p_h}{e^{{t_h}}}$

其中, tx, ty为网络预测值, 经过Sigmoid运算将其缩放到0和1之间, tw, th也为网络预测值, 无需Sigmoid; cx, cy为cell坐标, 也就是距离左上角的偏移量; pw, ph代表该cell对应anchor box的宽高, 计算出bounding box的位置, 如

图 3

Fig. 3

图 3 YOLOv3的bounding box坐标转换公式

1.2 损失函数

对于YOLOv3的损失函数, Redmon J在论文中并没有进行讲解, 本文作者根据对Darknet, 也就是Redmon J实现YOLOv3网络的平台的源代码进行解读, 总结出YOLOv3网络的损失函数为:

$\begin{aligned} {{Loss}} = &\frac{1}{2}\mathop \sum \limits_{i = 1}^{10647} {\lambda _{\rm{obj}}}*\left( \begin{gathered} \left( {2 - trut{h_w}*trut{h_h}} \right)* \mathop \sum \limits_{r \in \left( {x, y, w, h} \right)} {\left( {trut{h_r} - predic{t_r}} \right)^2} + \mathop \sum \limits_{r = 0}^{k - 1} \left(\left( {r = = trut{h_{\rm{class}}}} \right)? 1: 0 - predic{t_{{\rm{class}}{_r}}}\right)^2 \end{gathered} \right) \\ &+ {\left( {trut{h_{\rm{conf}}} - predic{t_{\rm{conf}}}} \right)^2} \end{aligned} $

其主要分为三大部分, 坐标损失, 置信度损失及分类损失, λobj在该cell存在物体时为1, 其他cell为0, 且均采用SSE计算, 最终Loss采用和的形式而不是平均Loss, 主要原因为预测的特殊机制, 造成正负样本比巨大, 尤其是置信度损失部分, 以一片包含一个目标为例, 置信度部分的正负样本比可以高达1:10646, 如果采用平均损失, 会使损失趋近于0, 网络预测变为全零, 失去预测能力. 并且, 根据作者描述, Lin TY等提出的, 用于解决正负样本不均衡, 使得网络专注于困难样本计算的Focal Loss无法解决这个问题, 会导致mAP下降.

2 模型训练与改进

2.1 Anchor参数设定

PASCAL VOC数据集是目标分类、检测等常用的数据集, 通过模型在VOC2007 test部分的表现衡量目标检测模型的性能已经成为常用的验证方法, 在实际训练过程中, 一般使用VOC2012的全部样本及VOC2007的train及val部分样本作为训练集, VOC2007 test部分作为测试集, 本文也是如此. 训练集部分包含图片16 551张, 物体40 058个, 测试集包含图片4952张, 物体12 032个. 根据标签数据, 对训练集的物体宽高进行分析, 其分布情况如

作为聚类算法的一种, K-means具备简洁快速, 易于实现的优点, 应用非常广泛, 其基本思想是以空间中K个点作为形心, 将最靠近他们的点进行归类, 然后迭代更新这K个点的值, 直到K个值不再变化或达到最大迭代次数. 本文使用K-means算法对VOC数据集进行分析, 结果如K值为9, 并确定相应的anchor box.

图 4

Fig. 4

图 4 VOC物体宽高分布情况, 大点为聚类结果

图 5

Fig. 5

图 5 K-means聚类分析结果

2.2 损失函数分析

作为深度神经网络对误检测样本进行惩罚的根据, 损失函数可以在很大程度上影响模型收敛的效果, 如何设计更合适的损失函数以获得更好地预测效果也成为模型优化的重要方向, 学界对此也进行了很多研究x, y, 物体置信度以及类别置信度部分均经过Sigmoid函数激活, 然后采用SSE计算最终损失, 从Sigmoid函数的导数图像($\sigma '\left( x \right)$会变得非常小, 此时使用平方误差得到的误差值很小, 导致网络收敛很慢, 出现误差越大收敛越慢, 也就是梯度消失的情况, 为了解决这个问题, 当真实值只能取0或1时, 一个常用的方法是采用交叉熵(cross-entropy)损失函数, 其形式为:

${{Loss}} = - \frac{1}{n} \sum \limits_x \left( {y{*}\ln \left( a \right) + \left( {1 - y} \right)*\ln \left( {1 - a} \right)} \right)$

a代表神经网络经过Sigmoid以后的输出值, 也就是

${{a}} = \sigma\left( {{\omega x} + {{b}}} \right)$, 令

${{z}} = {\omega x} + {{b}}$, 可以计算出交叉熵函数的导数.

$\frac{{\partial {{L}}}}{{\partial {\omega}}} = \frac{1}{n} \sum \limits_x x\left( {\sigma \left( z \right) - y} \right),\;\; \frac{{\partial L}}{{\partial b}} = \frac{1}{n}\mathop \sum \limits_x \left( {\sigma \left( z \right) - y} \right), $

图 6

Fig. 6

图 6 Sigmoid函数及其导数

这样就消除了

$\sigma '\left( z \right)$的影响, 是目标检测网络常用的损失函数. 但是, 在YOLOv3网络中, 如果直接采用交叉熵损失, 由于输出值高达10647×(3+k)个(predw, predh, 没有采用Sigmoid), 又由于交叉熵在误差较大时梯度也非常大, 与平方损失的梯度变化并不相同, 难以对不同损失项之间的权重进行调整. 另外, 巨大的正负样本比也决定了采用求和而不是常见的求平均的方式计算损失值可以更好地体现预测误差.

特别的, 对于

${{pre}}{{{d}}_x}$和

${{pre}}{{{d}}_y}$的输出, 它们的真实值并不是0或1, 而是0和1之间的某个值, 也就是说

${{pre}}{{{d}}_x}, {{pre}}{{{d}}_y}$并不是离散变量, 以

${{trut}}{{{h}}_x} = pre{d_x} = 0.7$为例, 交叉熵损失为

$ - 0.7{\rm{*ln}}\left( {0.7} \right) - 0.3{\rm{*ln}}\left( {0.3} \right) \approx 0.61$, 不为0, 所以不能采用交叉熵损失函数.

通过以上分析可知, 损失函数的导数形式

$f\left( x \right)$需要具备以下性质: ①

$f\left( x \right)$的定义域为

$x \in \left( { - 1, 1} \right)$, 值域

$f\left( x \right) \in \left( { - 1, 1} \right)$; ②

$f\left( x \right)$为单调递增函数, 且

$f\left( 0 \right) = 0$; ③

$f\left( x \right)$的图像需要关于坐标原点对称; ④

$f'\left( x \right) \ne 0$. 因此, 本文设计了一种新的损失函数, 称为tan方损失(Tan-Squared Error, TSE), 导数形式为

${{Loss Grad}} = {\tan\left( {t - \sigma \left( z \right)} \right)/}$

${\tan}\left( 1 \right)$, 在YOLOv3中,

${ {t}} - \sigma\left( { {z}} \right) \in \left( { - 1, 1} \right)$, 由于t也是不定项, 此差值与

$\sigma\left( { {z}} \right)$本身的取值无关, 令

${ {x}} = { {t}} - \sigma\left( { {z}} \right)$, 作出函数图像如

图 7

Fig. 7

图 7 TSE与SSE导数图像

在本网络的训练过程中, 由于极其巨大的正负样本比, 训练开始时会难以避免地出现网络输出全零的情况, 此时负样本部分, 也就是真实值为0的部分, 其误差逼近于0, 而真实值为1的部分, 误差则非常的大, 对于

$pre{d_x}$和

$pre{d_y}$来说, 差值更是为(–1, 1), 而不是常见的(0, 1), 作者采用平方损失进行计算, 并且是定义了梯度值的计算方法, 也就是直接使用公式

${{grad}} = {t_x} - pre{d_x}$进行梯度计算, 这也正是平方损失函数的导数形式, 遵循同样的思路, 本文定义了TSE导数形式的计算公式, 通过TSE与SSE的图像($\frac{{\partial \sigma}}{{\partial { {w}}}}, \frac{{\partial \sigma}}{{\partial { {b}}}}$. 小幅度地增大, 加快初始时的收敛速度, 减小梯度消失的影响; 同样的, 对于误差已经逼近0的情况, 由于TSE要略微小于SSE, 可以使输出层权重的调整幅度更小, 使模型得到更好收敛. 这种调整也应该控制在一个较小的幅度, 防止对输出层的权重作出过大的调整, 导致模型不收敛或者发散的情形. 对两函数求导, 得到他们的导数图像如

可以看到, TSE导数的值域约为(–2.2, 2.2), 即使误差极大导数也在有限范围内, 并且最小值约为0.64, 不会出现梯度为0从而导致梯度消失. 不同于SSE的常数梯度值, TSE的梯度会随着误差的变化而变化, 具有误差大时梯度大, 误差小时梯度小的性质, 既能在误差较大时加大权重的调整, 也在误差减小以后, 以更小的变化率调整权重, 使网络模型可以收敛得更好, 这是对于连续变量

$pre{d_x}$和

$pre{d_y}$TSE所具有的优势.

图 8

Fig. 8

图 8 TSE与SSE导数的梯度变化

2.3 调整幅度验证

对预测损失值的大小进行控制可以增强反向传播时卷积层权重调整的效果, TSE控制梯度变化的幅度是否合适也需要验证. 将TSE与梯度调整幅度更大的损失函数进行对比, 其导数形式为:

$ \begin{gathered} {{Loss Grad}} = \left( {{{se}}{{{c}}^2}\left( x \right)*{\tan}\left( x \right)} \right)/ \left( {{{se}}{{{c}}^2}\left( 1 \right)*\tan \left( 1 \right)} \right) \end{gathered} $

从它与TSE的对比图像如

图 9

Fig. 9

图 9 TSE与另一函数对比

从Loss下降得非常快, 正样本的置信度上升速度也加快了很多, 但是由于误差靠近0时梯度的过度减小, 负样本的置信度未能得到有效下降, 训练后期梯度消失的现象也导致正负样本没有被很好地区分开, 模型收敛效果变差, 最终的mAP很低; 而且由于采用较大的学习率, 训练中也出现了预测值变为Nan的情况, 说明过大的调整幅度也可能导致梯度发散.

3 实验结果

在Pascal VOC数据集上进行实验, 使用两块1080TI的显卡, 显存为2×12 GB, CPU为Intel Xeon E5-2620 V4@2.10 GHz, 软件环境为cuda9.0 + cudnn7, 训练集为VOC07+12, 测试集为07 test-dev, 由于作者并未公布相关的mAP数据, 本文直接使用作者提供的训练配置文件进行训练, 总计训练了50 000个batch, 除了更换损失函数和修改anchor box外不作其他改动, 结果如

表 1(Table 1)

表 1 VOC数据集训练结果

方法

训练集

测试集

mAP

SSE

07+12

07test

0.753

TSE

07+12

07test

0.764

表 1 VOC数据集训练结果

由于本实验的主要目的是验证TSE的有效性, 作者并没有对训练时的超参数进行仔细调参, 不保证该mAP一定为YOLOv3网络模型在VOC数据集上可以达到的最高值. 通过最终的mAP值可以表明, 只是改用TSE就可以得到1个百分点左右的提升, TSE可以使网络获得更好地收敛效果.

为了验证TSE相比于SSE在收敛速度方面所获得的优势, 采取每10 000个batch保存一次模型的方式, 收集了5个阶段的mAP数据, 如

如$\begin{gathered} {{Loss Grad}} = \left( {{{se}}{{{c}}^2}\left( x \right)*\tan \left( x \right)} \right)/ \left( {{{se}}{{{c}}^2}\left( 1 \right)*\tan \left( 1 \right)} \right) \\ \end{gathered} $, 实验结果表明, 对损失值进行较大幅度调整, 虽然收敛更加快速, 10 000个batch的模型准确率要略高于其他方法, 但是最终的收敛效果要远差于TSE. 从训练过程中正负样本置信度的平均值来看, 采用TSE会使得正负样本的置信度均有小幅度的上升, 但是这种调整在不影响正负样本区分的基础上, 增强了正样本的置信度, 从而获得了良好收敛效果. 与Other项的对比结果说明了TSE能够以一个合适的幅度对梯度进行调整, 可以实现损失减少与置信度增加, 具有良好的函数性质.

图 10

Fig. 10

图 10 三种方法训练的mAP

4 总结与展望

4.1 本文工作总结

本文分析了YOLOv3模型的结构, 并且对它实际的训练应用过程做出了有益尝试. 通过对原版损失函数特点的分析, 提出了一种新的损失函数TSE, 在VOC数据集上的实验结果表明: ① 与SSE相比, TSE适用于连续变量的情况, 减少了梯度消失的情况, mAP稳步提升; ② 模型的收敛速度得到提升, 能够使训练所需轮数减少, 节省训练所需时间; ③ 对比实验表明TSE进行梯度调整的幅度比较合适, 可以在保证正负样本区分度的基础上有效增强正样本的置信度. 基于改进损失函数的网络模型取得1个百分点左右的mAP提升, 获得了更好的检测效果.

目前, YOLO系列网络由于其检测快速的优点, 已经在实际生产中获得了大量应用. 如郑志强等将YOLO网络应用于遥感图像的飞机识别[, 王福建等将YOLO网络应用于车辆信息的快速检测[, 蔡成涛等基于YOLO网络实现机场跑道目标的快速检测[, 都取得了非常好的效果, 本文提出的方法适用面广, 通用性强, 可以很好地应用于现有的YOLO检测系统中, 获得更为准确的检测效果, 使系统性能获得进一步增强.

4.2 未来工作展望

本文从损失函数的角度, 提出了现有网络的改进方法. 在下一步的研究工作中, 将会在更多其他的网络模型中, 采用更大规模的数据集如MSCOCO[等, 用以验证TSE的通用性与鲁棒性; 同时也对连续变量的梯度控制问题, 寻求更好的解决方案; 另外, 针对于网络结构本身的改进, 如何设计出性能更强的网络来提取图像特征, 也需要更加细致地研究.

图 11

Fig. 11

图 11 检测结果示例

版权声明:本文为CSDN博主「weixin_39737757」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39737757/article/details/111516437

weixin_39737757

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

单目3D目标检测调研

单目3D目标检测调研
一、 简介 现有的单目3D目标检测方案主要方案主要分为两类,分别为基于图片的方法和基于伪雷达点云的方法。   基于图片的方法一般通过2D-3D之间的几何约束来学习,包括目标形状信息&#xff0