IoU、GIoU、DIoU

IOU是目标检测中的关键指标,用于衡量预测框与真实框的匹配程度,具有尺度不变性。然而,当两框无交集时,IoU无法体现它们的距离。为解决此问题,GIoU引入了最小闭包区域的概念,进一步DIoU加入了距离信息,提供更稳定的框回归。

IOU(Intersection over Union)

1. 特性(优点)

IoU就是我们所说的交并比,是目标检测中最常用的指标,在anchor-based的方法中,他的作用不仅用来确定正样本和负样本,还可以用来评价输出框(predict box)和ground-truth的距离。

 

  1. 可以说它可以反映预测检测框与真实检测框的检测效果。
  2. 还有一个很好的特性就是尺度不变性,也就是对尺度不敏感(scale invariant), 在regression任务中,判断predict box和gt的距离最直接的指标就是IoU。(满足非负性;同一性;对称性;三角不等性)

 

2. 作为损失函数会出现的问题(缺点)

  1. 如果两个框没有相交,根据定义,IoU=0,不能反映两者的距离大小(重合度)。同时因为loss=0,没有梯度回传,无法进行学习训练。
  2. IoU无法精确的反映两者的重合度大小。如下图所示,三种情况IoU都相等,但看得出来他们的重合度是不一样的,左边的图回归的效果最好,右边的最差。

二、GIOU(Generalized Intersection over Union)

### IOUDIOUGIOU 的概念及应用 #### 交并比 (Intersection over Union, IOU) 交并比是一种衡量两个边界框之间相似程度的方法。具体来说,它通过计算预测框 \( A \) 和真实框 \( B \) 的交集与它们的并集之比来评估两者的重合度: \[ IOU = \frac{A \cap B}{A \cup B} \] 该方法广泛应用于目标检测领域,用于评价模型预测的效果[^2]。 #### 广义交并比 (Generalized Intersection over Union, GIOU) 广义交并比不仅考虑了传统IOU所关注的重叠区域,还解决了当两个边界框完全不相交时如何量化差异的问题。对于这种情况,GIoU会利用最小外接矩形作为参考框架,从而提供了一种即使在无重叠情况下也能有效测量距离的方式[^1]。 #### 距离交并比 (Distance Intersection over Union, DIOU) 距离交并比进一步扩展了上述两种指标的功能,在考量重叠面积的同时加入了中心点之间的欧几里得距离因子。这一改进有助于加速优化过程,并提高定位精度,特别是在处理那些形状接近但位置略有偏差的目标时表现尤为突出[^3]。 ```python def calculate_iou(box_a, box_b): # 计算两个边界的交集和并集 inter_area = max(0, min(box_a[2], box_b[2]) - max(box_a[0], box_b[0])) * \ max(0, min(box_a[3], box_b[3]) - max(box_a[1], box_b[1])) area_a = (box_a[2]-box_a[0])*(box_a[3]-box_a[1]) area_b = (box_b[2]-box_b[0])*(box_b[3]-box_b[1]) union_area = float(area_a + area_b - inter_area) iou = inter_area / union_area return iou def calculate_giou(box_a, box_b): # 计算GIoU iou = calculate_iou(box_a, box_b) enclosing_box = [ min(box_a[0], box_b[0]), min(box_a[1], box_b[1]), max(box_a[2], box_b[2]), max(box_a[3], box_b[3]) ] c_area = (enclosing_box[2] - enclosing_box[0]) * (enclosing_box[3] - enclosing_box[1]) giou = iou - ((c_area - union_area) / c_area) return giou def calculate_diou(box_a, box_b): # 计算DIoU center_distance_squared = pow((box_a[0]+box_a[2])/2-(box_b[0]+box_b[2])/2, 2) + \ pow((box_a[1]+box_a[3])/2-(box_b[1]+box_b[3])/2, 2) diagonal_length_squared_of_c = pow(enclosing_box[2]-enclosing_box[0], 2) + \ pow(enclosing_box[3]-enclosing_box[1], 2) diou_term = center_distance_squared / diagonal_length_squared_of_c diou = calculate_iou(box_a, box_b) - diou_term return diou ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值