[重读经典论文]YOLOv3

1. 前言

YOLOV3是单阶段目标检测算法YOLO系列的第三个版本,由华盛顿大学Joseph Redmon发布于2018年4月,广泛用于工业界。

改进了正负样本选取、损失函数、Darknet-53骨干网络,并引入了特征金字塔多尺度预测,显著提升了速度和精度。

2. 网络结构

换了骨干网络,把backbone在darknet19的基础上融合残差模块,形成darknet-53。

网络结构

v3,输入416*416的图片,经过backbone,提取三个尺度的feature map,然后在Neck部分,融合不同尺度的feature map信息(撒上采样+通道方向拼接),最后输出三个尺度的预测结果,根据感受野不同分别负责预测大物体,中等物体和小物体。

v3结构分部分

v3结构2

更详细网络结构图:

v3结构3

3. 细节

3.1. anchor

沿袭YOLOv2中的设定。将特征图分割为n*n的grid cell,每个grid cell大小归一化为1,对每个anchor预测的位置偏移tx,ty,tw,th通过sigmoid和exp函数进行值域限制,如下图所示:

anchor2

anchor1

3.2. 正负样本

对于每一个gt,按照v3的特征金子塔,应该有三个grid cell共9个anchor可能对其进行预测,方法是选出与之IOU最大的anchor负责预测这个gt,IOU的计算方法是将anchor与gt的中心点对齐后再算,与v1v2不同的是,选出来之后将这个anchor的object的Confidence标签值置为1。而v1v2中使用IOU作为置信度标签的坏处有以下原因:

  • 很多预测框与gt的IOU最高只有0.7,导致很难训练。
  • coco中的小目标IOU对像素偏移敏感,无法有效学习。

对于IOU大于一定阈值(本文是0.5)但又不是最大的,在loss中将其直接忽略。对于小于这个阈值的,定义为负样本,在loss中指对置信度学习产生贡献。

值得注意的是和faster rcnn不一样,v3对每个gt只分配一个anchor对其负责预测。anchor三种情况如下:

正例 与gt IOU最大 计算置信度、分类和定位误差
负例 IOU<0.5 仅计算置信度误差
其他 IOU>0.5但非最大 忽略

3.3. 类别预测

不同于以往对类别的logit输出进行softmax回归,v3使用多分类的方法,对每个类别的输出逐一使用sigmoid函数输出概率,让类别之间不是互斥的,也可以有多个类别同时输出高概率。

3.4. 多尺度目标检测

参考了特征金字塔FPN,V3在三个尺度上对gt进行预测,每个尺度输出的tensor尺寸为:

N * N *[3 * (4 + 1 + 80)]

其中N*N为grid cell数量,3为每个grid cell生产的anchor数量,4为tx,ty,tw,th,1为物体检测置信度,80为类别概率。

在本文中,输入256*256的图片,最后输出三个尺度,分别为:

  • 52*52,负责小物体。
  • 26*26,负责中等尺寸。
  • 13*13,负责大物体。

由于深层的特征通过上采样与浅层特征进行融合, 使得浅层细粒度的像素结构信息融合深层抽象语义信息。

与v2一样,anchor也是通过kmean聚类算法计算获得9个anchor,每个尺度分配三个anchor。

3.5. 训练阶段标签分配

anchor标签

中心点落在三个尺度的grid cell上,由与gt的IOU最大的anchor去负责预测这个物体。

3.6. 特征提取器

也就是backbone,混合了Darknet-19和残差模块,总共有53个参数层(52卷积+1全连接),因此也称为Darknet-53

网络结构

对比Darknet-19,ResNet-10,ResNet-152,在精度上不差,但是效率更高,如下图所示:

网络性能

3.7. 训练

端到端,没有使用难例挖掘。另外使用了多尺度训练,数据增广,bn等标准操作。

3.8. 损失函数

loss

损失函数主要分为三部分。

第一部分是正样本坐标损失,遍历所有anchor,如果是正样本,求bx,by,bw,bh的平方和损失,后面还乘以2*wi*hi用来惩罚小框。

第二部分是正样本的置信度和类别损失,也是遍历所有anchor,分布求执行度和类别的交叉熵损失并相加。

第三部分是负样本的置信度损失,预测值pc越接近0,损失越小。

4.其他细节

V3在IOU=0.5的Ap50上的性能很好,但是在mAP@0.5:0.95上性能不是很好,证明V3在精准定位上性能依然不行,但是对小目标的检测性能相比以前提高了,这归结于几个原因:

  • grid cell个数增加,使得更容易应付稠密目标
  • 为小目标定制的anchor尺寸
  • 多尺度预测,融合深层语义特征和浅层细粒度特征
  • 损失函数惩罚小框项
  • backbone网络引入残差连接,性能提高

5. 参考

[1] 【精读AI论文】YOLO V3目标检测(附YOLOV3代码复现)

[2] 其他拓展:

江大白:https://zhuanlan.zhihu.com/p/143747206

郭冠华:https://zhuanlan.zhihu.com/p/40332004

Netron可视化YOLOV3网络结构:https://blog.csdn.net/nan355655600/article/details/106246355

木盏:https://blog.csdn.net/leviopku/article/details/82660381

太阳花的小绿豆:https://blog.csdn.net/qq_37541097/article/details/81214953

B站工程师Algernon鉴黄YOLO:https://github.com/thisiszhou/SexyYolo

B站工程师Algernon博客:https://zhuanlan.zhihu.com/p/76802514

损失函数:https://blog.csdn.net/qq_34795071/article/details/92803741

代码复现
Ultralytics公司:https://github.com/ultralytics/yolov3

https://github.com/qqwweee/keras-yolo3

https://github.com/bubbliiiing/yolo3-pytorch

cvpods:https://github.com/Megvii-BaseDetection/cvpods/blob/master/cvpods/modeling/meta_arch/yolov3.py

(完)

posted @ 2023-04-28 16:48  大师兄啊哈  阅读(117)  评论(0编辑  收藏  举报