《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

这篇具有很好参考价值的文章主要介绍了《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU


IoU出现背景

目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。因此,更好的定位有利于模型精度的提高。在IoU Loss提出来之前,检测上有关候选框的回归主要是通过坐标的回归损失来优化。但L1 LossL2 Loss存在比较大的问题:

  1. L1 Loss的问题:损失函数对x的导数为常数,在训练后期,x很小时,如果learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度
  2. L2 Loss的问题:损失函数对x的导数在x值很大时,其导数也非常大,在训练初期不稳定

而且,基于L1/L2 Loss的坐标回归不具有尺度不变性,且并没有将四个坐标之间的相关性考虑进去。因此,像L1/L2 Loss直接的坐标回归实际上很难描述两框之间的相对位置关系。

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

因此,在ACM2016的论文中提出了IoU loss,它将四个坐标点看成一个整体进行计算,具有尺度不变性(也就是对尺度不敏感)。IoU Loss的定义是先求出预测框和真实框之间的交集和并集之比,再求负对数,但是在实际使用中我们常常将IoU Loss写成1-IoU。如果两个框重合则交并比等于1Loss为0说明重合度非常高。因此,IoU的取值范围为[0,1]

什么是IoU?

IOU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

IoU发展历程

虽然IoU Loss虽然解决了Smooth L1系列变量相互独立和不具有尺度不变性的两大问题,但是它也存在两个问题:

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

  1. 当预测框和目标框不相交时,即IoU(A,B)=0时,不能反映A,B距离的远近,此时损失函数不可导,IoU Loss 无法优化两个框不相交的情况。
  2. 如上图三个框,假设预测框和目标框的大小都确定,只要两个框的相交值是确定的,即其IoU值相同时,IoU值不能反映两个框是如何相交的。
GIoU(CVPR2019)

针对IoU无法反映两个框是如何相交的问题,GIoU通过引入预测框和真实框的最小外接矩形(类似于图像处理中的闭包区域)来获取预测框、真实框在闭包区域中的比重。这样子,GIoU不仅可以关注重叠区域,还可以关注其他非重合区域,能比较好的反映两个框在闭包区域中的相交情况。

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

从公式上来看,GIoU是一种IoU的下界,取值范围[-1,1]。在两者重合的时候取最大值1,在两者无交集且无限远的时候取最小值-1。因此,与IoU相比,GIoU是一个比较好的距离度量指标。


DIoU(AAAI2020)

虽然GIoU通过引入闭包区域缓解了预测框与真实框相交位置的衡量问题,但其实际上仍存在两个问题:

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

  1. 对每个预测框与真实框均要去计算最小外接矩形,计算及收敛速度受到限制
  2. 当预测框在真实框内部时,GIoU退化为IoU,也无法区分相对位置关系

因此,考虑到GIoU的缺点,DIoUIoU的基础上直接回归两个框中心点的欧式距离,加速了收敛速度。DIoU的惩罚项是基于中心点的距离和对角线距离的比值。这样就避免了GIoU在两框距离较远时产生较大闭包时所造成的Loss值较大而难以优化的情况。

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU


CIoU(AAAI2020)

虽然DIoU Loss通过中心点回归缓解了两框距离较远时难优化的问题,但DIoU Loss仍存在两框中心点重合,但宽高比不同时,DIoU Loss退化为IoU Loss的问题。因此,为了得到更加精准的预测框,CIoUDIoU的基础上增加了一个影响因子,即增加了预测框与真实框之间长宽比的一致性的考量。

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

比如上面三种情况,目标框包裹预测框,本来DIoU可以起作用。

但预测框的中心点的位置都是一样的,因此按照DIoU的计算公式,三者的值都是相同的。

CIoU Loss虽然考虑了边界框回归的重叠面积、中心点距离及长宽比。但是其公式中的v反映的时长宽比的差异,而不是宽高分别与其置信度的真实差异,所以有时会阻碍模型有效的优化。


EIoU(arXiv2021)

EIoUCIoU的基础上将长宽比拆开,明确地衡量了三个几何因素的差异,即重叠区域、中心点和边长,同时引入Fcoal loss解决了难易样本不平衡的问题。

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU


αIoU(NeurlPS2021)

αIoU将现有的基于IoU 的损失进行了一个推广

使得αIoU可以显着超越现有的基于 IoU 的损失,通过调节α,使探测器更灵活地实现不同水平的bbox回归精度,并且αIoU对小数据集和噪声的鲁棒性更强
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU


SIoU(arXiv2022)

传统的目标检测损失函数依赖于边界框回归指标的聚合,例如预测框和真实框(即 GIoU、CIoU、ICIoU 等)的距离、重叠区域和纵横比。然而,迄今为止提出和使用的方法都没有考虑期望的真实框和预测框之间不匹配的方向。这种不足导致收敛速度较慢且效率较低,因为预测框在训练过程中可能会“四处游荡”,最终会产生一个更差的模型。

SIoU提出了一种新的损失函数,重新定义了惩罚度量,考虑了期望回归之间的向量夹角。

SIoU损失函数由4个成本函数组成

  • Angle cost

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

  • Distance cost
    《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
    《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

  • Shape cost

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

  • IoU cost

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

SIoU 应用于 COCO-train/COCO-val 与其他损失函数相比,提高了 +2.4% (mAP@0.5:0.95) 和 +3.6%(mAP@0.5)

《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

各IoU源代

IoU
import numpy as np
def Iou(box1, box2, wh=False):
    if wh == False:
	xmin1, ymin1, xmax1, ymax1 = box1
	xmin2, ymin2, xmax2, ymax2 = box2
    else:
	xmin1, ymin1 = int(box1[0]-box1[2]/2.0), int(box1[1]-box1[3]/2.0)
	xmax1, ymax1 = int(box1[0]+box1[2]/2.0), int(box1[1]+box1[3]/2.0)
	xmin2, ymin2 = int(box2[0]-box2[2]/2.0), int(box2[1]-box2[3]/2.0)
	xmax2, ymax2 = int(box2[0]+box2[2]/2.0), int(box2[1]+box2[3]/2.0)
    # 获取矩形框交集对应的左上角和右下角的坐标(intersection)
    xx1 = np.max([xmin1, xmin2])
    yy1 = np.max([ymin1, ymin2])
    xx2 = np.min([xmax1, xmax2])
    yy2 = np.min([ymax1, ymax2])	
    # 计算两个矩形框面积
    area1 = (xmax1-xmin1) * (ymax1-ymin1) 
    area2 = (xmax2-xmin2) * (ymax2-ymin2)
    inter_area = (np.max([0, xx2-xx1])) * (np.max([0, yy2-yy1])) #计算交集面积
    iou = inter_area / (area1+area2-inter_area+1e-6)  #计算交并比

    return iou
GIoU
def Giou(rec1,rec2):
    #分别是第一个矩形左右上下的坐标
    x1,x2,y1,y2 = rec1 
    x3,x4,y3,y4 = rec2
    iou = Iou(rec1,rec2)
    area_C = (max(x1,x2,x3,x4)-min(x1,x2,x3,x4))*(max(y1,y2,y3,y4)-min(y1,y2,y3,y4))
    area_1 = (x2-x1)*(y1-y2)
    area_2 = (x4-x3)*(y3-y4)
    sum_area = area_1 + area_2

    w1 = x2 - x1   #第一个矩形的宽
    w2 = x4 - x3   #第二个矩形的宽
    h1 = y1 - y2
    h2 = y3 - y4
    W = min(x1,x2,x3,x4)+w1+w2-max(x1,x2,x3,x4)    #交叉部分的宽
    H = min(y1,y2,y3,y4)+h1+h2-max(y1,y2,y3,y4)    #交叉部分的高
    Area = W*H    #交叉的面积
    add_area = sum_area - Area    #两矩形并集的面积

    end_area = (area_C - add_area)/area_C    #闭包区域中不属于两个框的区域占闭包区域的比重
    giou = iou - end_area
    return giou
DIoU
def Diou(bboxes1, bboxes2):
    rows = bboxes1.shape[0]
    cols = bboxes2.shape[0]
    dious = torch.zeros((rows, cols))
    if rows * cols == 0:#
        return dious
    exchange = False
    if bboxes1.shape[0] > bboxes2.shape[0]:
        bboxes1, bboxes2 = bboxes2, bboxes1
        dious = torch.zeros((cols, rows))
        exchange = True
    # #xmin,ymin,xmax,ymax->[:,0],[:,1],[:,2],[:,3]
    w1 = bboxes1[:, 2] - bboxes1[:, 0]
    h1 = bboxes1[:, 3] - bboxes1[:, 1] 
    w2 = bboxes2[:, 2] - bboxes2[:, 0]
    h2 = bboxes2[:, 3] - bboxes2[:, 1]
    
    area1 = w1 * h1
    area2 = w2 * h2

    center_x1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2 
    center_y1 = (bboxes1[:, 3] + bboxes1[:, 1]) / 2 
    center_x2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2
    center_y2 = (bboxes2[:, 3] + bboxes2[:, 1]) / 2

    inter_max_xy = torch.min(bboxes1[:, 2:],bboxes2[:, 2:]) 
    inter_min_xy = torch.max(bboxes1[:, :2],bboxes2[:, :2]) 
    out_max_xy = torch.max(bboxes1[:, 2:],bboxes2[:, 2:]) 
    out_min_xy = torch.min(bboxes1[:, :2],bboxes2[:, :2])

    inter = torch.clamp((inter_max_xy - inter_min_xy), min=0)
    inter_area = inter[:, 0] * inter[:, 1]
    inter_diag = (center_x2 - center_x1)**2 + (center_y2 - center_y1)**2
    outer = torch.clamp((out_max_xy - out_min_xy), min=0)
    outer_diag = (outer[:, 0] ** 2) + (outer[:, 1] ** 2)
    union = area1+area2-inter_area
    dious = inter_area / union - (inter_diag) / outer_diag
    dious = torch.clamp(dious,min=-1.0,max = 1.0)
    if exchange:
        dious = dious.T
    return dious
CIoU
def bbox_overlaps_ciou(bboxes1, bboxes2):
    rows = bboxes1.shape[0]
    cols = bboxes2.shape[0]
    cious = torch.zeros((rows, cols))
    if rows * cols == 0:
        return cious
    exchange = False
    if bboxes1.shape[0] > bboxes2.shape[0]:
        bboxes1, bboxes2 = bboxes2, bboxes1
        cious = torch.zeros((cols, rows))
        exchange = True

    w1 = bboxes1[:, 2] - bboxes1[:, 0]
    h1 = bboxes1[:, 3] - bboxes1[:, 1]
    w2 = bboxes2[:, 2] - bboxes2[:, 0]
    h2 = bboxes2[:, 3] - bboxes2[:, 1]

    area1 = w1 * h1
    area2 = w2 * h2

    center_x1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2
    center_y1 = (bboxes1[:, 3] + bboxes1[:, 1]) / 2
    center_x2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2
    center_y2 = (bboxes2[:, 3] + bboxes2[:, 1]) / 2

    inter_max_xy = torch.min(bboxes1[:, 2:],bboxes2[:, 2:])
    inter_min_xy = torch.max(bboxes1[:, :2],bboxes2[:, :2])
    out_max_xy = torch.max(bboxes1[:, 2:],bboxes2[:, 2:])
    out_min_xy = torch.min(bboxes1[:, :2],bboxes2[:, :2])

    inter = torch.clamp((inter_max_xy - inter_min_xy), min=0)
    inter_area = inter[:, 0] * inter[:, 1]
    inter_diag = (center_x2 - center_x1)**2 + (center_y2 - center_y1)**2
    outer = torch.clamp((out_max_xy - out_min_xy), min=0)
    outer_diag = (outer[:, 0] ** 2) + (outer[:, 1] ** 2)
    union = area1+area2-inter_area
    u = (inter_diag) / outer_diag
    iou = inter_area / union
    with torch.no_grad():
        arctan = torch.atan(w2 / h2) - torch.atan(w1 / h1)
        v = (4 / (math.pi ** 2)) * torch.pow((torch.atan(w2 / h2) - torch.atan(w1 / h1)), 2)
        S = 1 - iou
        alpha = v / (S + v)
        w_temp = 2 * w1
    ar = (8 / (math.pi ** 2)) * arctan * ((w1 - w_temp) * h1)
    cious = iou - (u + alpha * ar)
    cious = torch.clamp(cious,min=-1.0,max = 1.0)
    if exchange:
        cious = cious.T
    return cious

参考文献

https://mp.weixin.qq.com/s/jLnde0Xms-99g4z16OE9VQ

DIoU、CIoU、GIoU、IoU再理解结合代码

IoU:《UnitBox: An Advanced Object Detection Network》

GIoU:《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》

D/C IoU:《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》

EIoU:《Focal and Efficient IOU Loss for Accurate Bounding Box Regression》

αIoU:《Alpha-IoU: A Family of Power Intersection over Union Losses for Bounding Box Regression》

SIoU:《SIoU Loss: More Powerful Learning for Bounding Box Regression》文章来源地址https://www.toymoban.com/news/detail-405296.html

到了这里,关于《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • IoU Loss综述(IOU,GIOU,CIOU,EIOU,SIOU,WIOU)

            边界框回归(BBR)的损失函数对于目标检测至关重要。它的良好定义将为模型带来显著的性能改进。大多数现有的工作假设训练数据中的样本是高质量的,并侧重于增强BBR损失的拟合能力。         最初的基于回归的BBR损失定义为L2-norm,L2-norm损失主要有两个

    2023年04月09日
    浏览(58)
  • 目标检测中的损失函数IoU、GIoU、DIoU、CIoU、SIoU

    IoU损失是目标检测中最常见的损失函数,表示的就是真实框和预测框的交并比,数学公式如下: I o U = ∣ A ∩ B ∣ ∣ A ∪ B ∣ IoU =frac{|A cap B|}{|A cup B|} I o U = ∣ A ∪ B ∣ ∣ A ∩ B ∣ ​ L o s s I o U = 1 − I o U Loss_{IoU}=1-IoU L o s s I o U ​ = 1 − I o U IoU损失会有两个主要的缺点 当

    2024年02月04日
    浏览(41)
  • 优化改进YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模块(超详细)

    目录 1、IoU 1.1 什么是IOU  1.2 IOU代码 2、GIOU 2.1 为什么提出GIOU 2.2 GIoU代码 3 DIoU  3.1 为什么提出DIOU 3.2 DIOU代码 4 CIOU 4.1 为什么提出CIOU 4.2 CIOU代码 5 EIOU 5.1 为什么提出EIOU  5.2 EIOU代码 6 Wise-IoU 7 YOLOv5中添加GIoU、DIoU、CIoU、EIoU、Wise-IoU损失函数 论文链接为:UnitBox: An Advanced Objec

    2024年02月04日
    浏览(29)
  • 《一文搞懂NMS发展历程》Soft-NMS、Weighted NMS、IoU-Net、Softer-NMS、Adaptive NMS、DIoU-NMS

    1. NMS介绍 在执行目标检测任务时,算法可能对同一目标有多次检测。 NMS 是一种让你确保算法只对每个对象得到一个检测的方法,即“清理检测”。如下图所示: 如果用一句话概括NMS的意思就是:筛选出一定区域内属于同一种类别得分最大的框 2. NMS算法流程 NMS 算法的大致过

    2023年04月08日
    浏览(24)
  • 【目标检测中对IoU的改进】GIoU,DIoU,CIoU的详细介绍

    IoU为交并比,即对于pred和Ground Truth:交集/并集 1、IoU可以作为评价指标使用,也可以用于构建IoU loss = 1 - IoU 缺点: 2、对于pred和GT相交的情况下,IoU loss可以被反向传播,因为IoU不为0,可以计算梯度。但是二者不相交的话,梯度将会为0,无法优化。 3、pred和GT不相交时,Io

    2024年02月12日
    浏览(26)
  • 【目标检测算法】IOU、GIOU、DIOU、CIOU与YOLOv5损失函数

    classification loss 分类损失 localization loss, 定位损失(预测边界框与GT之间的误差) confidence loss 置信度损失(框的目标性 objectness of the box) 总的损失函数: classification loss + localization loss + confidence loss YOLOv5使用 二元交叉熵损失函数 计算类别 概率和目标置信度得分 的损失。 Y

    2024年01月19日
    浏览(34)
  • yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用)

    MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression (一个有效和准确的边界框损失回归函数) 论文地址 1.1. 主要目的 当预测框与边界框具有相同的纵横比,但宽度和高度值完全不同时,大多数现有的边界框回归损失函数都无法优化。 为了解决上述问题,MPDIoU充分挖掘水平矩形

    2024年02月07日
    浏览(29)
  • YOLOV8改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

    yolov8中box_iou其默认用的是CIoU,其中代码还带有GIoU,DIoU,文件路径: ultralytics/yolo/utils/metrics.py ,函数名为: bbox_iou 我们可以看到函数顶部,有GIoU,DIoU,CIoU的bool参数可以选择,如果全部为False的时候,其会返回最普通的Iou,如果其中一个为True的时候,即返回设定为True的那

    2023年04月15日
    浏览(38)
  • yolov5增加iou loss(SIoU,EIoU,WIoU),无痛涨点trick

            yolo无痛涨点trick,简单实用         先贴一张最近一篇论文的结果 后来的几种iou的消融实验结果在一定程度上要优于CIoU。         本文将在yolov5的基础上增加SIoU,EIoU,Focal-XIoU(X为C,D,G,E,S等)以及AlphaXIoU。         在yolov5的utils文件夹下新增iou.py文件

    2024年01月19日
    浏览(31)
  • YOLOV7改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

    yolov7中box_iou其默认用的是CIoU,其中代码还带有GIoU,DIoU, AlphaIoU,文件路径: utils/general.py ,函数名为: bbox_iou 我们可以看到函数顶部,有GIoU,DIoU,CIoU的bool参数可以选择,如果全部为False的时候,其会返回最普通的Iou,如果其中一个为True的时候,即返回设定为True的那个I

    2023年04月20日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包