yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用)

这篇具有很好参考价值的文章主要介绍了yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 论文

MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression
(一个有效和准确的边界框损失回归函数)
论文地址

1.1. 主要目的

当预测框与边界框具有相同的纵横比,但宽度和高度值完全不同时,大多数现有的边界框回归损失函数都无法优化。
为了解决上述问题,MPDIoU充分挖掘水平矩形的几何特征,提出了一种新的基于最小点距离的边界框相似性比较指标MPDIoU,该指标包含了现有损失函数中考虑的所有相关因素,即重叠或不重叠区域、中心点距离、宽度和高度偏差,同时简化了计算过程。
yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用),yolo系列改进计划,YOLO

论文中举例了,绿色框为真实目标框,红色框表示预测目标框,两幅图中预测目标框和真实目标框存在相同的长宽比,但是现象是不一致的,一个在真实框内部一个在真实框外部。

此时GIoU/EIoU/CIoU/EIoU计算结果确实一致,上述用于边界框回归的损失函数将失去有效性,这将限制收敛速度和精度,而MPDIOU能够计算两者的差异,
因此使用MPDIoU损失函数用于边界框回归,具有更高的边界框回归效率和精度。。

1.2. 设计思路

在分析了IOU系列损失函数的优势和劣势之后,开始思考如何提高边界框回归的准确性和效率。
通常情况下,使用左上角和右下角点的坐标来定义一个唯一的矩形。受到边界框几何特性的启发,作者设计了一种新颖的基于交并比的度量标准,名为MPDIoU,直接最小化预测边界框与实际标注边界框之间的左上角和右下角点距离。
综上所述,提出的MPDIoU简化了两个边界框之间的相似性比较,可以适应重叠或非重叠的边界框回归。

在训练阶段,通过最小化以下损失函数,使得模型预测的每个边界框Bprd = [xprd, yprd, wprd, hprd]T趋近于其对应的真实标注边界框Bgt = [xgt, ygt, wgt, hgt]T:
yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用),yolo系列改进计划,YOLO
因此,现有边界框回归损失函数的所有因素都可以通过4个点的坐标来确定。转换公式如下所示:
yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用),yolo系列改进计划,YOLO
在上述公式中, |C|表示覆盖Bgt和Bprd的最小外接矩形的面积,yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用),yolo系列改进计划,YOLO
yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用),yolo系列改进计划,YOLO
分别表示真实标注边界框和预测边界框的中心点坐标。w_gt和h_gt表示真实标注边界框的宽度和高度,w_prd和h_prd表示预测边界框的宽度和高度。

从公式中可以发现所有现有损失函数中考虑的因素都可以通过左上角点和右下角点的坐标来确定,例如非重叠面积、中心点距离、宽度和高度的偏差,这意味着作者提出的L_MPDIoU不仅考虑全面,还简化了计算过程。

MPDIoU的计算过程如下:
yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用),yolo系列改进计划,YOLOMPDIoU作为损失函数的计算过程如下:
yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用),yolo系列改进计划,YOLOyolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用),yolo系列改进计划,YOLO
上图表示MPDIOU损失函数的参数

2 代码

在metrics.py中修改bbox_iou函数

def bbox_iou(box1, box2, image_size=[128, 1024], xywh=True, GIoU=False, DIoU=False, CIoU=False, EIoU=False,
             MPDIoU=False, eps=1e-7):
    # Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4)

    # Get the coordinates of bounding boxes
    if xywh:  # transform from xywh to xyxy
        (x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, 1), box2.chunk(4, 1)
        w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2
        b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_
        b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_
    else:  # x1, y1, x2, y2 = box1
        b1_x1, b1_y1, b1_x2, b1_y2 = box1.chunk(4, 1)
        b2_x1, b2_y1, b2_x2, b2_y2 = box2.chunk(4, 1)
        w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps
        w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps

    # Intersection area
    inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \
            (torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0)

    # Union Area
    union = w1 * h1 + w2 * h2 - inter + eps

    # IoU
    iou = inter / union
    if GIoU or CIoU or DIoU or EIoU or MPDIoU:
        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 or EIoU or MPDIoU:  # 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) - torch.atan(w1 / h1), 2)
                with torch.no_grad():
                    alpha = v / (v - iou + (1 + eps))
                return iou - (rho2 / c2 + v * alpha)  # CIoU
            elif EIoU:
                rho_w2 = ((b2_x2 - b2_x1) - (b1_x2 - b1_x1)) ** 2
                rho_h2 = ((b2_y2 - b2_y1) - (b1_y2 - b1_y1)) ** 2
                cw2 = cw ** 2 + eps
                ch2 = ch ** 2 + eps
                return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2)  # EIoU
            elif DIoU:
                return iou - rho2 / c2  # DIoU
            elif MPDIoU:
                # union = w1 * h1 + w2 * h2 - inter + eps
                mpd_d1 = (b1_x1 - b2_x1) ** 2 + (b1_y1 - b2_y1) ** 2
                mpd_d2 = (b1_x2 - b2_x2) ** 2 + (b1_y2 - b2_y2) ** 2
                mpd_d = image_size[0] ** 2 + image_size[1] ** 2
                return inter / union - mpd_d1 / mpd_d - mpd_d2 / mpd_d

        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

在loss.py中修改class ComputeLoss类中的def call(self, p, targets):函数

# iou = bbox_iou(pbox, tbox[i], EIoU=True).squeeze() 将这行改成如下
iou = bbox_iou(pbox, tbox[i], self.hyp['image_size'], MPDIoU=True).squeeze()

在超参数配置文件hyp.scratch.yaml中添加

image_size: [ 128,2048 ]

这个是你训练时图片的尺寸,本文这里使用128*2048的图片尺寸进行训练。
若使用默认尺寸不开启矩形框训练,传入640的,则超参数需要使用image_size: [ 640,640]

#这个是本文在训练时的图像尺寸
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=[128, 2048],
                        help='train, val image size (pixels)')

3.总结

MPDIOU 能够有效解决重叠和包含问题,并且能够有效地处理预测框和目标框长宽比相同的情况,而且计算量小,模型训练速度快。
在数据集上测试和验证,发现能够提升训练精度,并且有效地区分两个目标存在包含的关系的预测框回归,推荐大家使用MPDIOU 进行训练。

强烈建议大家阅读一下原文,有效地加深和理解GIoU/EIoU/CIoU/EIoU文章来源地址https://www.toymoban.com/news/detail-731959.html

到了这里,关于yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包