YOLO V3

主要改进

  1. Anchor: 9个大小的anchor,每个尺度分配3个anchor。
  2. Backbone改为Darknet-53, 引入了残差模块
  3. 引入了FPN,可以进行多个尺度的训练,同时对于小目标的检测有了一定的提升 (因为有3个不同大小的feature map 用来做检测)。
  4. Loss function的改进。

Network structure improvement

Backbone: Darknet-53

分别要下采样 32, 16, 8。因此输入的图片尺度一定要是32的倍数。改进点在于引进了残差模块

yolov5 改为gpu yolov3怎么改进_yolov5 改为gpu

FPN-多尺度学习

论文链接: Feature Pyramid Networks for Object Detection

Backbone是一个全卷积的网路结构,不含有全连接层,所以可以适用于各种不同尺度的输入大小。

yolov5 改为gpu yolov3怎么改进_目标检测_02

多尺度的含义:

  • 3个尺度的feature map 来预测大目标和小目标。
  • 通过上采样的方法将深层的特征与浅层的特征相融合。
  • 比如,52×52的特征是由darknet浅层的细粒度像素级别的特征和深层的语义全局的特征的融合。

Loss Function

预测框分为三种:

  1. 正样本: 与GT的IOU最大
  2. 负样本: 与GT的IOU < 0.5
  3. 忽略样本:与GT的IOU > 0.5 但不是最大的。
    忽略样本不参与loss的计算。

正负样本

  • YOLO v3 只选取与groud truth的IOU最大的预测框进行拟合。而前面两个版本只是按照置信度标签及IOU值进行拟合。
  • 区别于前面版本的YOLO,置信度标签 (objectness score)是预测框和ground truth的IOU值, YOLO v3 对于正样本的置信度标签直接设为1。这样的好处在于,如果是用IOU值作为置信度标签,对于一些IOU值较低的样本不能很好的学习,同时对于小目标IOU对于像素的偏移很敏感。

Loss Function

  • 正样本对于分类和定位学习产生贡献,而负样本只对置信度学习产生贡献。
  • 多标签范式不再使用softmax来进行分类(即假设所有的类别都是互斥的,同一个框只可能属于一个类)。而使用对于每个类别都进行二分类任务,这样的好处在于对于同一个框可能可以存在不同的标签 (e.g. 学生、人).

在YOLOv3中,Loss分为三个部分:

  • 一个是xywh部分带来的误差,也就是bbox带来的loss
  • 一个是置信度带来的误差,也就是obj带来的loss
  • 最后一个是类别带来的误差, 也就是class带来的loss
    在代码中分别对应lbox, lobj, Icls,yolov3中使用的loss公式如下:
    yolov5 改为gpu yolov3怎么改进_拟合_03
    其中:
    yolov5 改为gpu yolov3怎么改进_目标检测_04: 代表grid size
    yolov5 改为gpu yolov3怎么改进_目标检测_05: box
    yolov5 改为gpu yolov3怎么改进_深度学习_06 : 如果在i,j 处的box有目标,其值为 1 ,否则为 0
    yolov5 改为gpu yolov3怎么改进_拟合_07

Focal Loss

为什么YOLO v3使用focal loss效果不好?
Focal loss解决单阶段目标检测,正负样本不均衡,有用的负样本较少的问题。相当于挖掘负样本信息。而YOLO v3对于负样本的IOU阈值设置为0.5过高,因此负样本中其实存在一些疑似正样本的样本,对于这些样本,focal loss基于过高的noise权重会导致效果不好。