yolov5的trick总结

文章目录

  • yolov5的trick总结
    • 输入端的 Mosaic 数据增强
    • 自适应锚框计算
    • 自适应图片缩放操作
    • CSP 结构
    • SPP 结构
    • FPN + PAN 结构
    • IOU_Loss
      • IOU
      • GIOU
      • DIOU
      • CIOU

yolov5的trick总结

输入端的 Mosaic 数据增强、自适应锚框计算、自适应图片缩放操作、Focus 结构(之后6.0就不用了)、CSP 结构、SPP 结构、FPN + PAN 结构、CIOU_Loss 等等。

输入端的 Mosaic 数据增强

mosaic数据增强则利用了四张图片,对四张图片进行拼接,每一张图片都有其对应的框框,将四张图片拼接之后就获得一张新的图片,同时也获得这张图片对应的框框,然后我们将这样一张新的图片传入到神经网络当中去学习,相当于一下子传入四张图片进行学习了。

  1. 首先随机取四张图片;
  2. 分别对四张图片进行数据增广操作,并分别粘贴至与最终输出图像大小相等掩模的对应位置;
    1. 翻转(对原始图片进行左右的翻转);
    2. 缩放(对原始图片进行大小的缩放);
    3. 色域变化(对原始图片的明亮度、饱和度、色调进行改变)等操作。
  3. 进行图片的组合和框的组合,完成四张图片的摆放之后,我们利用矩阵的方式将四张图片它固定的区域截取下来,然后将它们拼接起来,拼接成一 张新的图片,新的图片上含有框框等一系列的内容——对应的区域被剪裁掉后,框坐标做对应处理。对于过小的目标,则丢弃掉;

自适应锚框计算

  1. 使用k-means聚类获得最佳的锚框
  2. 用超参数学习

自适应图片缩放操作

自适应图片缩放letterbox
实现步骤:

  1. 计算收缩比;
  2. 计算收缩后图片的长宽;
  3. 计算需要填充的像素;
  4. 最后resize图片并填充像素
def letterbox(im, new_shape=(640, 640), color=(114, 114, 114), auto=True, scaleFill=False, stride=32):
    # Resize and pad image while meeting stride-multiple constraints
    shape = im.shape[:2]  # current shape [height, width]
    if isinstance(new_shape, int):
        new_shape = (new_shape, new_shape)
   
    # Scale ratio (new / old)
    r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])
 
    # Compute padding
    ratio = r, r  # width, height ratios
    new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))
    
    dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # wh padding
    if auto:  # minimum rectangle
        dw, dh = np.mod(dw, stride), np.mod(dh, stride)  # wh padding
 
    dw /= 2  # divide padding into 2 sides
    dh /= 2
    print(dw, dh)
    if shape[::-1] != new_unpad:  # resize
        im = cv.resize(im, new_unpad, interpolation=cv.INTER_LINEAR)
    top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))
    left, right = int(round(dw - 0.1)), int(round(dw + 0.1))
    im = cv.copyMakeBorder(im, top, bottom, left, right, cv.BORDER_CONSTANT, value=color)  # add border
    return im, ratio, (dw, dh)

CSP 结构

SPP 结构

金字塔结构

FPN + PAN 结构

FPN 高维度向低维度传递语义信息(大目标更明确)
PAN 低维度向高维度再传递一次语义信息(小目标也更明确)

IOU_Loss

可以自己选择CIOU、DIOU以及GIOU三种IOU的方式。

# IoU
iou = inter / union
if CIoU or DIoU or GIoU:
    cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1)  # convex (smallest enclosing box) width
    ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1)  # convex height
    if CIoU or DIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1
        c2 = cw ** 2 + ch ** 2 + eps  # convex diagonal squared
        rho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4  # center dist ** 2
        if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47
            v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / (h2 + eps)) - torch.atan(w1 / (h1 + eps)), 2)
            with torch.no_grad():
                alpha = v / (v - iou + (1 + eps))
            return iou - (rho2 / c2 + v * alpha)  # CIoU
        return iou - rho2 / c2  # DIoU
    c_area = cw * ch + eps  # convex area
    return iou - (c_area - union) / c_area  # GIoU https://arxiv.org/pdf/1902.09630.pdf
return iou  # IoU

IOU

优点

  1. IOU具有尺度不变性;
  2. 满足非负性;

缺点

  1. 在A框与B框不重合的时候IOU为0,不能正确反映两者的距离大小;
  2. IoU无法精确的反映两者的重合度大小。
    一般的IOU的劣势之一就是:不同的交叉但是同样的IOU,体现不出差异
    yolov5的trick总结_第1张图片

GIOU

针对普通的IOU存在的问题使用GIOU,引入了最小闭包的关系,公式如下所示:yolov5的trick总结_第2张图片
存在的缺陷:
yolov5的trick总结_第3张图片

DIOU

引入了中心距离关系,去解决GIOU与IOU相同的情况,其公式如下:
yolov5的trick总结_第4张图片
存在的缺陷:
yolov5的trick总结_第5张图片

CIOU

引入了宽高+距离的因素
yolov5的trick总结_第6张图片

你可能感兴趣的:(python,AI-CV,python,开发语言,计算机视觉,深度学习,pytorch)