• yolov5的trick总结


    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    IOU

    优点

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

    缺点

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

    GIOU

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

    DIOU

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

    CIOU

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

  • 相关阅读:
    音视频码流分配策略
    Python爬虫实战案例——第五例
    docker-compose 部署 MySQL 8
    【Python 千题 —— 基础篇】输出列表中的偶数
    【二分查找】【键值皆有序】1840最高建筑高度
    虚拟化与Docker基本概念与Docker的安装
    MySQL模糊搜索优化
    GO 常用设计模式
    Mybatis学习笔记2
    Flink状态管理与检查点机制
  • 原文地址:https://blog.csdn.net/weixin_42295969/article/details/126466245