【目标检测(七)】YOLOv3——准确率的全面提升

【目标检测(七)】YOLOv3——准确率的全面提升本文主要介绍YOLOv3的算法原理和改进策略,YOLOv3在精度和速度上在2018年都达到了sota的程度,经过一系列小改动,YOLOv3的准确率获得了较大程度的提升。

【目标检测(一)】RCNN详解——深度学习目标检测的开山之作
【目标检测(二)】SPP Net——让卷积计算共享
【目标检测(三)】Fast RCNN——让RCNN模型能端到端训练
【目标检测(四)】Faster RCNN——RPN网络替代selective search
【目标检测(五)】YOLOv1——开启one-stage目标检测的篇章
【目标检测(六)】YOLOv2——引入anchor, Better, Faster, Stronger
【目标检测(七)】YOLOv3——准确率的全面提升
【目标检测(八)】一文吃透目标检测回归框损失函数——IoU、GIoU、DIoU、CIoU原理及Python代码
【目标检测(九)】FPN详解——通过特征金字塔网络进行多尺度特征融合
【目标检测(十)】RetinaNet详解——Focal Loss将one-stage算法推向巅峰
【目标检测(十一)】CenterNet——Anchor Free, NMS Free
【目标检测(十二)】FCOS——用实例分割的思想做Anchor Free的目标检测

YOLOv3去掉参考文献只有四页A4纸内容,没什么大的改动和创新点,而是在一些小的地方进行改动,最终取得了不错的效果。但是YOLO的作者风格比较洒脱,在文中许多细节都没有说清楚,也许是想让人去欣赏他的代码吧。论文主要有如下细节的改动:

  • 主干网络:由Darknet-19切换为Darknet-53。
  • 使用了三个不同尺度的输出特征层,来更好的适应小物体的检测。
  • 增加了anchor数量。
  • 损失函数:由softmax的交叉熵损失切换为二分类交叉熵损失。

1. Darknet-53 网络结构

如下图所示,Darknet-53是作者设计的分类网络,作为YOLOv3的backbone,有一系列的3*31*1卷积构成,每个卷积层后面都会有一个BN层和LeakyReLU激活函数。作者将最后的全连接层也算作了一层卷积,总共有53层卷积。作者也借鉴了ResNet残差结构的思想,下图中每个框都代表了一个残差结构。下图是用256*256输入来作分类网络的,而目标检测中使用416*416分辨率作为网络输入,下面第二章节主要讲在哪3个feature map上做预测。

【目标检测(七)】YOLOv3——准确率的全面提升
【目标检测(七)】YOLOv3——准确率的全面提升

2. YOLOv3模型结构

浅层的网络学习到的特征更多是角点和边的细节性特征,而深层次网络学到的特征更倾向于抽象的语义特征。同时浅层网络的感受野小,更适合小目标的检测,深层次网络感受野大,更适合预测大物体。类似FPN的思想,作者也在YOLOv3中使用了多个维度的特征进行预测。

在YOLOV2中作者就融合了更细粒度的特征,concat到一起进行最终的预测。YOLOv3使用Darknet-53作为backbone,去除了全连接层,作者选取最后三个残差层之后得到的feature map,来作为三个特征图尺度,分别是52*52*256(小目标)、26*26*512(中目标)和13*13*1024(大目标)。这三个特征层的融合是通过一系列卷积层和上采样层实现的,高维度特征和低维度特征进行concat连接融合。这里看到一幅图说的非常清楚,搬运了过来,如下所示。

image.png

上图最后输出预测的三个tensor,维度分别为52*52*25526*26*25513*13*255,这里是在COCO任务上跑的,共有80个分类,每个anchor只输出一个bbox的坐标预测和confidence预测,每个位置生成3个不同的anchor,即255=3×(80+4+1)

3. Anchor

Yolov3沿用YOLOv2的anchor机制,需要理解anchor、predictated bboxes和GT Boxes的关系(不太容易),可以参考上一篇YOLOv2中的2.3.3章节。YOLOv3中的anchor数量增加比较多,主要还是由于三个尺度上每个尺度都会生成相应的anchor(尺寸比例是coco数据集上聚类得到的)。

image.png

4. Loss函数设计

作者在论文中并没有给出明确的Loss损失函数,下面的损失函数主要是基于作者的描述和复现代码总结的,主要包括目标定位损失、confidence损失和分类损失三部分构成。

image.png

4.1 Confidence损失

目标confidence可以理解为confidence=P(obj)*IOU,包含了预测的这个框是否是目标、预测框和真实框的重合程度两部分,YOLOv3将confidence由误差平方和的方式调整为binary cross entropy loss的方法,下图中oi表示预测目标边界框i中是否真实存在目标,1表示存在目标,0表示不存在目标(也有复现代码中认为oi是预测目标边界框与真实目标边界框的IOU),这里预测概率值是经过sigmoid处理的。

【目标检测(七)】YOLOv3——准确率的全面提升

4.2 分类损失

这里同样是使用二分类交叉熵,作者认为同一目标可同时归为多类,比如猫可归为猫类以及动物类,这样能够应对更加复杂的场景(但是个人认为一般目标检测并没有这类情况)。公式中Oij表示预测目标边界框i中是否真实存在第j类目标,0表示不存在,1表示存在,公式中概率值也是经过sigmoid处理的。

【目标检测(七)】YOLOv3——准确率的全面提升

4.3 边界框定位损失

这部分与YOLOv2一致,使用误差平方和的方式来进行计算,进行offset regression,只计算当前区域确实有目标的情况,Offset定义如下所示:
{ σ ( t x p ) = b x C x , σ ( t y p ) = b y C y t w p = l o g ( w p w a ) , t h p = l o g ( h p h a ) t x g = g x f l o o r ( g x ) , t y g = g y f l o o r ( g y ) t w g = l o g ( w g w a ) , t h g = l o g ( h g h a ) \begin{cases} σ(t_x^p) = b_x – C_x, σ(t_y^p) = b_y – C_y\\ t_w^p = log(\frac{w_p}{w_a’}), t_h^p = log(\frac{h_p}{h_a’})\\ t_x^g = g_x – floor(g_x), t_y^g = g_y – floor(g_y)\\ t_w^g = log(\frac{w_g}{w_a’}), t_h^g = log(\frac{h_g}{h_a’}) \end{cases}

13*13尺度为例,上面公式中σ表示sigmoid函数;
b x , b y [ 0 , 13 ] b_x, b_y ∈ [0, 13]
是映射到0-13维度上的框中心坐标;
( C x , C y ) (C_x, C_y)
,是
b x , b y b_x, b_y
最近的离散整数点,
w a , h a [ 0 , 13 ] w_a’, h_a’ ∈ [0, 13]
,是映射到0-13维度上的anchor宽度和高度,
g x , g y [ 0 , 13 ] g_x, g_y ∈ [0, 13]
,是GT Box的中心点坐标映射到0-13维度上;
g w , g h [ 0 , 13 ] g_w, g_h ∈ [0, 13]
同理。

5. YOLOv3效果及贡献

  • backbone: YOLOv3换了性能更强的主干网络,提升了准确率。
  • 小目标效果变好了:YOLOv3拉取了多层分支,而且最大的特征图达到了52 × 52,这让小目标更容易被检测到。
  • 准确率进一步提升,同时推理速度也达到实时程度,超过同期其他模型。
  • 相比Faster RCNN,在工业界上准确率仍然略有逊色,不如两阶段算法。

image.png

Reference:

  1. arxiv.org/pdf/1804.02…
  2. blog.csdn.net/qq_37541097…
  3. zhangxu.blog.csdn.net/article/det…

今天的文章【目标检测(七)】YOLOv3——准确率的全面提升分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/20937.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注