IoU、GIoU、DIoU、CIoU详解及python代码实现

本文详细介绍了IoU、GIoU、DIoU和CIoU的概念,讨论了它们在深度学习中的优缺点,并提供了Python代码实现。IoU作为经典指标,存在不相交时无梯度回传的问题,GIoU和DIoU分别尝试解决这一问题,而CIoU进一步考虑了长宽比,以提高损失函数的优化效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、IoU、GIoU、DIoU、CIoU详解:

(1)IoU

IoU 的全称为交并比(Intersection over Union),其计算是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。计算过程可以由下图表示:
在这里插入图片描述
由图可知IoU的值域为[0, 1]。
IoU的优点:
1、IOU可以作为损失函数,IoU loss=1-IOU。但是当两个物体不相交时无回传梯度。
2、 IOU对尺度变化具有不变性,即不受两个物体尺度大小的影响。
IoU的缺点:
1、当预测框和真实框不相交时,IoU(A,B)=0时,不能反映A,B距离的远近,此时损失函数不可导,IoU Loss 无法优化两个框不相交的情况。
2、假设预测框和真实框的大小都确定,只要两个框的相交值是确定的,其IoU值是相同时,IoU值不能反映两个框是如何相交的。

(2)GIoU

GIoU是为克服IoU的缺点同时充分利用优点而提出的,GIoU计算如下:
在这里插入图片描述
上图C是包含A与B的最小框。
GIoU的值域为(-1, 1]。
GIoU的优点:
1、GIoU和IoU一样,可以作为损失函数,GIoU Loss = 1 - GIoU。
2、GIoU能够更好地反应相交情况。如下图,虽然两种情况下IOU一致,但是(a)中相交的更为整齐,因此GIOU要比(b)中大。
在这里插入图片描述
GIoU缺点
当目标框完全包裹预测框的时候,IoU和GIoU的值都一样,此时GIoU退化为IoU, 无法区分其相对位置关系。
在这里插入图片描述

(3)DIoU

基于GIoU的缺点,DIoU被提出。其论文为:Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression
论文给出DIoU Loss为:
在这里插入图片描述
在这里插入图片描述
上图中绿色框为目标框,黑色框为预测框,灰色框为两者的最小外界矩形框,d表示目标框和真实框的中心点距离,c表示最小外界矩形框的距离。

DIoU的性质:
1、尺度不变性。
2、DIoU Loss可以直接优化2个框直接的距离,比GIoU Loss收敛速度更快。
3、对于目标框包裹预测框的这种情况,DIoU Loss可以收敛的很快,而GIoU Loss此时退化为IoU Loss收敛速度较慢

(4)CIoU

一个好的目标框回归损失应该考虑三个重要的几何因素:重叠面积、中心点距离、长宽比。
GIoU:为了归一化坐标尺度,利用IoU,并初步解决IoU为零的情况。
DIoU:DIoU损失同时考虑了边界框的重叠面积和中心点距离。
然而,anchor框和目标框之间的长宽比的一致性也是极其重要的。基于此,论文作者提出了Complete IoU Loss。
CIoU Loss又引入一个box长宽比的惩罚项,该Loss考虑了box的长宽比,定义如下:
在这里插入图片描述
上述损失函数中,CIoU比DIoU多出了α和v这两个参数。其中α是用于平衡比例的参数。v用来衡量anchor框和目标框之间的比例一致性。
从α参数的定义可以看出,损失函数会更加倾向于往重叠区域增多方向优化,尤其是IoU为零的时候。

二、Python代码实现:

这里是实现IoU、GIoU、DIoU、CIoU并非实现其Loss。代码如下:
定义框BBox类:

import math
def euclidean_distance(p1, p2):
    '''
    计算两个点的欧式距离
    '''
    x1, y1 = p1
    x2, y2 = p2
    return math.sqrt((x2-x1)**2 + (y2-y1)**2)

class BBox:
    def __init__
### YOLOv11 Head Prediction Network Analysis YOLOv11中的头部预测网络负责从特征图中提取信息并生成边界框、类别概率和其他相关信息。具体来说,该网络会输出三个主要组成部分: - 边界框坐标(x, y, w, h) - 物体置信度分数 - 类别概率分布 为了提高检测精度和效率,YOLOv11采用多尺度特征融合技术,结合低层细节信息和高层语义信息,从而增强对小物体的检测能力。 ### 不同失真函数原理分析 #### IoU Loss IoU Loss是最基础的目标检测损失函数之一,其定义为预测框与真实框之间交集面积除以并集面积的比例[^1]。然而,当两个框完全不相交时,IoU值固定为0,无法提供有效的梯度指导。 ```python def iou_loss(pred_box, gt_box): intersection_area = calculate_intersection(pred_box, gt_box) union_area = calculate_union(pred_box, gt_box) return 1 - (intersection_area / union_area) ``` #### GIoU Loss GIoU Loss扩展了传统IoU的概念,引入了一个最小闭包区域C,即能够包围住两个矩形框的最小矩形区域。这样即使两框无重叠也能给出有意义的距离惩罚项[^3]。 $$ \text{GIoU} = \text{IoU} - \frac{\left| C - U\right|}{\left | C \right | } $$ 其中\( C \)表示最小封闭矩形,\( U \)代表两个框的联合区域。 #### DIoU Loss DIoU进一步改进了GIoU的思想,在此基础上增加了中心点距离因子,用来衡量两个框质心间的相对位置关系。这种设计有助于加速收敛速度,并减少训练初期不稳定现象的发生。 $$ D_{iou}=D_{giou}-\alpha\rho^{2}\left(\hat{x}_{p},\hat{x}_{g}\right)/c^{2} $$ 这里 \( c \) 是包含两个框的最大外接圆直径;\( \rho() \) 表示欧氏距离。 #### CIoU Loss CIoU综合考虑了几何形状相似性和宽高比例一致性等因素,相比前几种方法能更全面地反映实际物理空间内的匹配程度。特别适合处理极端长宽比的情况。 $$ CIOU=DIOU+\beta v $$ 这里的参数 \( v=\left(4/\pi ^ {2}\right)\cdot arctan(w_g/h_g)-arctan(w_p/h_p)^2 \),用于调整纵横比的影响权重。 #### EIoU Loss EIoUCIoU基础上又加入了一维方向上的误差补偿机制,旨在解决某些特定场景下的定位不准问题。通过额外增加宽度高度差分项来强化对尺寸变化敏感性的捕捉。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛虎兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值