Yolov5收敛快的理解

训练过很多目标检测网络,个人觉得yolov5是使用过的收敛最快的网络,训练10多个epoch就能达到很高的P、R. 收敛快的原因也不是网络本身,而是作者新的anchor匹配机制,增加了高质量的正样本数量从而加快收敛速度,ATSS论文中也说过该问题

V5的anchor匹配机制以及与之前版本的不同

  • 同一个bbox 可以同时由多层进行预测,区别于之前的YOLO一个gt 只会在某一层是正样本(取与anchor最大IOU)
  • 针对某一 bbox 的anchor由之前版本的一个增加到 3、6、9,某一个网格的三个anchor都可能预测这一个物体,另外增加最邻近两个网格预测该bbox,因此anchor 个数可能为 1 *3, 2 *3, 3 *3,正样本anchor数量显著增加. 如下图:左图为yolov3,v4,,物体的中心落在某个网格内,那该网格负责检测改物体。右图为v5,除开物体中心所在的网格,还会选择网格上下左右(也可以增加左上,右上,左下,右下四个网格增加更多正样本,代码中给注释掉了)四个网格中最接近物体中心的两个网格也负责检测改物体,图中的黄色网格, 蓝色点为物体中心
  • 某些gt bbox 由于和anchor匹配度不高而不能成为前景. 这在基于IOU 的之前版本中不会出现.

YoloV5 中的回归计算

先回顾一下v3、v4中的边框回归,如下图

x,y 的偏移计算物体中心点相对于网格左上角的偏移,约束在0~1之间

w,h 是相对于anchor的比例. 由于制作gt 时取了对数:log(w / w_a) ,解码时取指数

v5 的x,y 偏移计算

上文中说道,YOLOv5负责检测某一 bbox的网格增加到了三个,因此x,y的偏移坐标不再是0~1

假如物体中心落在网格的右上角,那么离它最近的两个网格是右边、上边, 物体中心相对于所在网格x,y偏移在均在 0~1, 相对于右边网格,x 轴偏移在 -0.5 ~0,y轴偏移0~1,相对于上边网格x轴偏移 0~1,y轴偏移 0~1.5,可以类比另外三种情况,xy 偏移值均在-0.5~1.5之间.

y = x[i].sigmoid()
y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i].to(x[i].device)) * self.stride[i]  # xy
               ( -0.5  ~  1.5       +        网格左上角坐标 )           * 下采样倍数  = 原图坐标

v5的w,h 偏移

       for i in range(self.nl): # 遍历每一层
            anchors = self.anchors[i] # 当前层的anchor
            gain[2:6] = torch.tensor(p[i].shape)[[3, 2, 3, 2]]  # 特征图的大小
            t = targets * gain # targets 是归一化数据,将其转换成所在特征图的尺寸
            if nt:
                # Matches
                r = t[:, :, 4:6] / anchors[:, None]  # 计算targets 与 anchor的长宽比
                # 挑选出长宽比中最大值小于设定阈值的index作为有效目标, 不匹配的全部作为背景
                # 代码设定anchor_t = 4 ,表示 物体和anchor比例可以在1/4 到4之内都是匹配的
                # 物体高和anchor高的比或者物体宽和anchor宽的比的最大值小于设定的4
                j = torch.max(r, 1. / r).max(2)[0] < self.hyp['anchor_t'] 
                # j = wh_iou(anchors, t[:, 4:6]) > model.hyp['iou_t']  舍弃的IOU匹配
                t = t[j]  # 过滤出有效targets

上诉代码中,所有gt bbox 在每一个检测层会和当前层的所有anchor进行匹配,因此,某一个Bbox可能会在每一层都属于正样本,也可能每一个anchor都激活

因此,wh预测输出也不再是任意范围,而是0-4,解码时

y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]
              (((0 ~ 1) * 2 )^ 平方)  --> (0 ~ 4) * anchor 的宽、高