yolov5的trick总结

15 篇文章 3 订阅

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,体现不出差异
    在这里插入图片描述

GIOU

针对普通的IOU存在的问题使用GIOU,引入了最小闭包的关系,公式如下所示:在这里插入图片描述
存在的缺陷:
在这里插入图片描述

DIOU

引入了中心距离关系,去解决GIOU与IOU相同的情况,其公式如下:
在这里插入图片描述
存在的缺陷:
在这里插入图片描述

CIOU

引入了宽高+距离的因素
公式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值