GIoU详解

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

一、动机:

在目标检测任务中,回归loss相同的情况下,IoU却可能大不相同。
如下图(a)所示:三张图有一样的L2距离,但是IoU值却完全不同。坐标表示方法为(x1,y1,x2,y2)。
图(b)为L1距离。坐标表示方法为(x,y,w,h),x,y为中心点坐标。

IoU有尺度不变性的优点,但是将其作为损失函数,由于某些方面的问题,无法直接使用。

二、IoU的优点:

  1. IoU作为距离时(比如: L I o U = 1 − I o U L_{IoU} =1-IoU LIoU=1IoU),是一个度量。因为它包含了作为度量的所有属性,比如:非负性,不确定性对称性和三角不等性。
  2. IoU有尺度不变性,这意味着任意两个方框A和B的相似性与他们的空间尺度的无关。

三、IoU同时作为度量和损失函数时,存在两个问题:

  1. 如果两个目标没有重叠,IoU将会为0,并且不会反应两个目标之间的距离,在这种无重叠目标的情况下,如果IoU用作于损失函数,梯度为0,无法优化。
  2. IoU无法区分两个对象之间不同的对齐方式。更确切地讲,不同方向上有相同交叉级别的两个重叠对象的IoU会完全相等。

四、本文的主要贡献:

  1. 将GIoU作为比较任意两个边框的度量。
  2. 使用GIoU作为两个轴对齐矩形的的损失,并提供了解析解。
  3. 把GIoU损失加入到最流行的目标检测算法中(例如:Faster R-CNN,Mask R-CNN和YOLO v3),并且展示了他们在标准目标检测基准中提高的性能。

五、GIoU:

对于任意的两个A、B框,首先找到一个能够包住它们的最小方框C。然后计算C \ (A ∪ B) 的面积与C的面积的比值,注:C \ (A ∪ B) 的面积为C的面积减去A∪B的面积。再用A、B的IoU值减去这个比值得到GIoU

GIoU作为度量时的性能:
  1. GIoU作为距离时, L G I o U = 1 − G I o U L_{GIoU} =1-GIoU LGIoU=1GIoU,非负性,不确定性,对称性以及三角不等性。
  2. 尺度不变性。
  3. GIoU始终是IoU的下限,即GIoU(A,B) <= IoU(A,B)。当A,B形状相似,并且接近时, l i m A → B G I o U ( A , B ) = I o U ( A , B ) lim_{A→B}GIoU(A,B) = IoU(A,B) limABGIoU(A,B)=IoU(A,B).
  4. -1 ≤ GIoU(A,B) ≤ 1。A,B完全重合时,GIoU(A,B) = IoU(A,B) = 1. (A∪B)/C→0 时,也就是A∪B的面积相对于C可很小很小时,GIoU收敛于-1.
  5. GIoU考虑到了 IoU 没有考虑到的非重叠区域,能够反应出 A,B 重叠的方式。
GIoU:

IoU和GIoU做为边框损失函数时的算法流程:

B p B^p Bp:预测框       B g B^g Bg:ground truth      B c B^c Bc:最小包围框
A p A^p Ap:预测框面积     A g A^g Ag:ground truth面积

  1. 输入预测框的 ( x 1 , y 1 , x 2 , y 2 ) 值 (x_{1},y_{1},x_{2},y_{2})值 (x1,y1,x2,y2)和 ground truth 的 ( X 1 , Y 1 , X 2 , Y 2 ) (X_{1},Y_{1},X_{2},Y_{2}) (X1,Y1,X2,Y2)值。
  2. 将预测值排序:使得 x 2 > x 1 , y 2 > y 1 x_{2}>x_{1},y_{2}>y_{1} x2>x1,y2>y1
  3. 分别计算预测框的面积 A p A^p Ap和 ground truth 的面积 A g A^g Ag
  4. 计算两者交集的面积 I .
  5. 找出最小包围框 ( x c 1 , y c 1 , x c 2 , y c 2 ) (x_{c1},y_{c1},x_{c2},y_{c2}) (xc1,yc1,xc2,yc2).
  6. 计算IoU,GIoU
  7. 计算 L I o U L_{IoU} LIoU L G I o U L_{GIoU} LGIoU

六、实验结果

所有对比实验中(网络:Faster R-CNN,Mask R-CNN and YOLOv3 / 数据集:PASCAL VOC, MS COCO),加过IoU损失和GIoU损失的mAP都在原来的基础得到了提升,在此不一一分析。下图为检测效果图,从左往右分别为 L G I o U L_{GIoU} LGIoU, L I o U L_{IoU} LIoU ,网络原来的损失函数。实线为ground truth,虚线为预测框。
在这里插入图片描述在这里插入图片描述

### GIoU 的计算公式 GIoU (Generalized Intersection over Union) 是一种扩展的 IoU 损失函数,解决了传统 IoU 在边界框无重叠情况下的不足。其核心思想是在 IoU 基础上引入了一个额外项,用于衡量预测框和真实框之间的相对位置关系。 #### 定义与公式 设 \( B \) 和 \( B^{gt} \) 分别表示预测框和真实框,\( C \) 表示能够覆盖 \( B \) 和 \( B^{gt} \) 的最小闭合区域(即包围盒)。则: \[ \text{IoU}(B, B^{gt}) = \frac{\text{Area}(B \cap B^{gt})}{\text{Area}(B \cup B^{gt})} \] 而 GIoU 的定义为: \[ \text{GIoU}(B, B^{gt}) = \text{IoU}(B, B^{gt}) - \frac{\text{Area}(C \setminus (B \cup B^{gt}))}{\text{Area}(C)} \] 其中: - \( \text{Area}(B \cap B^{gt}) \) 表示预测框和真实框交集面积。 - \( \text{Area}(B \cup B^{gt}) \) 表示预测框和真实框并集面积。 - \( \text{Area}(C) \) 表示最小闭包矩形 \( C \) 的总面积。 - \( \text{Area}(C \setminus (B \cup B^{gt})) \) 表示最小闭包矩形减去预测框和真实框并集部分的剩余面积。 通过这一公式,即使预测框和真实框完全不相交,也可以得到一个有意义的损失值[^1]。 --- ### 通用 IoU 损失函数定义 传统的 IoU 损失函数可以被定义为: \[ L_{\text{IoU}}(B, B^{gt}) = 1 - \text{IoU}(B, B^{gt}) \] 然而,这种形式在预测框和真实框完全没有重叠的情况下会失效,因为此时 \( \text{IoU}(B, B^{gt}) = 0 \),导致梯度消失问题。 相比之下,GIoU 提供了一种更鲁棒的方式处理这种情况,使得即使没有重叠也能提供有效的梯度方向[^2]。 --- ### Python 实现代码 以下是基于上述公式的 GIoU 计算实现: ```python import torch def giou_loss(pred_boxes, target_boxes): """ Calculate the Generalized IoU loss between predicted and target bounding boxes. Args: pred_boxes: Tensor of shape (N, 4), where N is the number of boxes, each box represented as [x1, y1, x2, y2]. target_boxes: Tensor of shape (N, 4). Returns: A scalar tensor representing the mean GIoU loss across all boxes. """ # Compute intersection coordinates xA = torch.max(pred_boxes[:, 0], target_boxes[:, 0]) yA = torch.max(pred_boxes[:, 1], target_boxes[:, 1]) xB = torch.min(pred_boxes[:, 2], target_boxes[:, 2]) yB = torch.min(pred_boxes[:, 3], target_boxes[:, 3]) # Compute area of intersection rectangle I inter_area = torch.clamp(xB - xA + 1, min=0.0) * torch.clamp(yB - yA + 1, min=0.0) # Compute areas of prediction and ground truth rectangles pred_area = (pred_boxes[:, 2] - pred_boxes[:, 0] + 1) * \ (pred_boxes[:, 3] - pred_boxes[:, 1] + 1) target_area = (target_boxes[:, 2] - target_boxes[:, 0] + 1) * \ (target_boxes[:, 3] - target_boxes[:, 1] + 1) # Compute union area U union_area = pred_area + target_area - inter_area # Compute IOU iou = inter_area / union_area # Compute smallest enclosing box C c_xA = torch.min(pred_boxes[:, 0], target_boxes[:, 0]) c_yA = torch.min(pred_boxes[:, 1], target_boxes[:, 1]) c_xB = torch.max(pred_boxes[:, 2], target_boxes[:, 2]) c_yB = torch.max(pred_boxes[:, 3], target_boxes[:, 3]) # Area of enclosing box C enclose_area = (c_xB - c_xA + 1) * (c_yB - c_yA + 1) # Compute GIoU giou = iou - ((enclose_area - union_area) / enclose_area) # Return GIoU loss return 1 - giou.mean() ``` 此代码实现了 GIoU 损失的计算过程,并支持批量输入的张量操作。 --- ### 总结 GIoU 改进了传统 IoU 损失函数存在的缺陷,特别是在预测框和真实框无重叠的情况下的表现更为优越。它不仅保留了 IoU 对于重叠区域的有效评估能力,还通过引入外部闭包区域进一步增强了模型的学习效果。 ---
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值