【深度学习实战(49)】目标检测损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU原理及Pytorch实现

前言

损失函数是用来评价模型的预测值和真实值一致程度,损失函数越小,通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数主要是用在模型的训练阶段,如果我们想让预测值无限接近于真实值,就需要将损失值降到最低,在这个过程中就需要引入损失函数,而损失函数的选择又是十分关键。尤其是在目标检测中,损失函数直接关乎到检测效果是否准确,其中IOU损失函数目前主要应用于目标检测的领域,其演变的过程如下:IOU --> GIOU --> DIOU -->CIOU损失函数,每一种损失函数都较上一种损失函数有所提升,下面来具体介绍这几种损失函数。

1 IoU(Intersection over Union)

1.1 IoU简介

UnitBox: An Advanced Object Detection Network

IoU全称Intersection over Union,交并比。IoU是一种测量在特定数据集中检测相应物体准确度的一个标准。只要是在输出中得出一个预测范围(bounding boxes)的任务都可以用IoU来进行测量。

IoU算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。在目标识别中,我们的预测框与实际框的某种比值就是IoU。
在这里插入图片描述

1.2 IoU公式

在这里插入图片描述

1.3 优点

  • IOU能够直观地反映出目标检测结果与真实情况之间的匹配程度。
  • IOU具有尺度不变性,由于IOU是基于重叠度量的,它不受目标尺度和形状变换的影响,这使得IOU适用于各种不同尺度和形状的目标检测任务。

1.4 缺点

当预测框和目标框不相交时,即IOU=0时,不能反映两个目标之间距离的远近,此时损失函数不可导,IOU Loss 无法优化。
当两个检测框大小相同,两个IOU也相同,IOU_Loss无法精确的反映两个框的重合度大小。
在这里插入图片描述

1.5 IoU代码

def IoU(box1, box2):
    b1_x1, b1_y1, b1_x2, b1_y2 = box1
    b2_x1, b2_y1, b2_x2, b2_y2 = box2
    
    xx1 = np.maximum(b1_x1, b2_x1)
    yy1 = np.maximum(b1_y1, b2_y1)
    xx2 = np.minimum(b1_x2, b2_x2)
    yy2 = np.minimum(b1_y2, b2_y2)
    
    w = np.maximum(0.0, yy2 - yy1)
    h = np.maximum(0.0, xx2 - xx1)
 
    inter = w * h
    IoU = inter/((b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - inter)
    print("IoU: ", IoU)
 
 
if __name__ == "__main__":
    box1 = np.array([100, 100, 210, 210])
    box2 = np.array([150, 150, 230, 220])
    IoU(box1, box2)

2 GIoU

Generalized Intersection over Union: A Metric and A Loss for Bounding BoxRegression

2.1 GIoU简介

通过上述分析,当预测框和真实框不相交时IoU值为0,导致很大范围内损失函数没有梯度。针对这一问题,提出了GIoU作为损失函数。GIoU比IoU多了一个‘Generalized’,能在更广义的层面上计算IoU。当检测框和真实框没有出现重叠的时候IoU的loss都是一样的,因此GIoU就引入了最小封闭形状C(C可以把A,B包含在内),在不重叠情况下能让预测框尽可能朝着真实框前进,这样就可以解决检测框和真实框没有重叠的问题 。
在这里插入图片描述

2.2 GIoU公式

算法公式及其解释:其实想法也很简单(但这一步很难):假如现在有两个box A,B,我们找到一个最小的封闭形状C,让C可以把A,B包含在内,然后再计算C中没有覆盖A和B的面积占C总面积的比值,最后用A与B的IoU减去这个比值,GIoU计算公式如下
在这里插入图片描述

2.3 优点

  • GIOU_Loss中,增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时的尴尬,但是依然没有完全解决IoU存在的问题

2.4 缺点

  • 对每个预测框与真实框均要去计算最小外接矩形,计算及收敛速度受到限制
  • 状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIoU值也都是相同的,这时GIoU退化成了IoU,无法区分相对位置关系。
    在这里插入图片描述

2.5 GIoU代码

def GIoU(box1, box2):
    b1_x1, b1_y1, b1_x2, b1_y2 = box1
    b2_x1, b2_y1, b2_x2, b2_y2 = box2
    
    # IOU
    xx1 = np.maximum(b1_x1, b2_x1)
    yy1 = np.maximum(b1_y1, b2_y1)
    xx2 = np.minimum(b1_x2, b2_x2)
    yy2 = np.minimum(b1_y2, b2_y2)
    inter_w = np.maximum(0.0, yy2 - yy1)
    inter_h = np.maximum(0.0, xx2 - xx1)
    inter = inter_w * inter_h
    Union = (b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - inter
 
    # GIOU
    C_xx1 = np.minimum(b1_x1, b2_x1)
    C_yy1 = np.minimum(b1_y1, b2_y1)
    C_xx2 = np.maximum(b1_x2, b2_x2)
    C_yy2 = np.maximum(b1_y2, b2_y2)
    C_area = (C_xx2 - C_xx1) * (C_yy2 - C_yy1)
 
    IOU = inter / Union
    GIOU = IOU - abs((C_area-Union)/C_area)
    print("GIOU:", GIOU)
 
if __name__ == "__main__":
    box1 = np.array([100, 100, 210, 210])
    box2 = np.array([150, 150, 230, 220])
    GIoU(box1, box2)

3 DIoU

Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression

3.1 简介

好的目标框回归函数应该考虑三个重要几何因素:重叠面积中心点距离长宽比。针对IoU和GIoU存在的问题,作者从两个方面进行考虑

  • 一:如何最小化预测框和目标框之间的归一化距离?
  • 二:如何在预测框和目标框重叠时,回归的更准确?
    针对第一个问题,提出了DIoU_Loss(Distance_IoU_Loss),从而使收敛速度更快,性能更好。
    在这里插入图片描述

3.2 DIoU公式

在这里插入图片描述
在这里插入图片描述

3.3 优点

  • DIOU在与目标框重叠时,仍然可以为边界框提供移动方向;
  • DIOU可以直接最小化两个目标框的距离,因此比GIOU收敛快得多;
  • DIOU还可以替换普通的IOU评价策略,应用于NMS中,使得NMS得到的结果更加合理和有效。

3.4 缺点

  • DIoU考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIoU收敛的更快,但并没有考虑到长宽比
  • 在这里插入图片描述

比如上面三种情况,目标框包裹预测框,本来DIOU_Loss可以起作用。但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。

3.5 DIoU代码

def DIoU(box1, box2):
    b1_x1, b1_y1, b1_x2, b1_y2 = box1
    b2_x1, b2_y1, b2_x2, b2_y2 = box2
    
    # IOU
    xx1 = np.maximum(b1_x1, b2_x1)
    yy1 = np.maximum(b1_y1, b2_y1)
    xx2 = np.minimum(b1_x2, b2_x2)
    yy2 = np.minimum(b1_y2, b2_y2)
    inter_w = np.maximum(0.0, xx2 - xx1)
    inter_h = np.maximum(0.0, yy2 - yy1)
    inter = inter_w * inter_h
    Union = (b1_x2 - b1_x1)*(b1_y2 - b1_y1) + (b2_x2 - b2_x1)*(b2_y2 - b2_y1) - inter
 
    # DISTANCE
    C_xx1 = np.minimum(b1_x1, b2_x1)
    C_yy1 = np.minimum(b1_y1, b2_y1)
    C_xx2 = np.maximum(b1_x2, b2_x2)
    C_yy2 = np.maximum(b1_y2, b2_y2)
    C_area = (C_xx2 - C_xx1) * (C_yy2 - C_yy1)
 
    center_b_x = (b1_x1+b1_x2)/2
    center_b_y = (b1_y1+b1_y2)/2
    center_gtb_x = (b2_x1+b2_x2)/2
    center_gtb_y = (b2_y1+b2_y2)/2
 
    center_distance = (center_gtb_x-center_b_x)**2 + (center_gtb_y-center_b_y)**2
	c_distance = (C_xx2 - C_xx1)**2 + (C_yy2 - C_yy1)**2
	
    IOU = inter/Union
    DIOU = IOU - center_distance /c_distance
    print("DIOU:", DIOU)
 
if __name__ == "__main__":
    box1 = np.array([100, 100, 210, 210])
    box2 = np.array([150, 150, 230, 220])
    DIoU(box1, box2)

4 CIoU

Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression

4.1 简介

DIoU考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIoU收敛的更快,但并没有考虑到长宽比。针对这个问题,又提出了CIOU_Loss,不对不说,科学总是在解决问题中,不断进步!!

CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,使得目标框回归更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。

4.2 CIoU公式

在这里插入图片描述

4.3 优点

  • 形状不变性: CIOU 损失函数在设计上考虑了目标框的形状信息,通过引入修正因子,使得损失对于不同形状的目标框更具鲁棒性。这使得模型更容易捕捉目标的准确形状。
  • 对定位精度的敏感性: CIOU 损失函数对目标框的位置预测更为敏感,因为它考虑了目标框的对角线距离。这有助于提高目标检测模型在定位目标时的精度。
  • 全面性: CIOU 损失函数综合考虑了位置、形状和方向等多个因素,使得模型更全面地学习目标框的特征。这有助于提高模型在复杂场景中的性能。

4.4 缺点

  • 如果预测框和gt框的长宽比是相同的,那么长宽比的惩罚项恒为0,不合理
  • 观察CIoU中w, h相对于v的梯度,发现这两个梯度是一对相反数,也就是说,w和h不能同时增大或减小,这显然也不够合理的。

4.5 代码

def CIoU(box1, box2):
    b1_x1, b1_y1, b1_x2, b1_y2 = box1
    b2_x1, b2_y1, b2_x2, b2_y2 = box2
 
    # IOU
    xx1 = np.maximum(b1_x1, b2_x1)
    yy1 = np.maximum(b1_y1, b2_y1)
    xx2 = np.minimum(b1_x2, b2_x2)
    yy2 = np.minimum(b1_y2, b2_y2)
    inter_w = np.maximum(0.0, xx2 - xx1)
    inter_h = np.maximum(0.0, yy2 - yy1)
    inter = inter_w*inter_h
    Union = (b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - inter
    IOU = inter/Union
 
    C_xx1 = np.minimum(b1_x1, b2_x1)
    C_yy1 = np.minimum(b1_y1, b2_y1)
    C_xx2 = np.maximum(b1_x2, b2_x2)
    C_yy2 = np.maximum(b1_y2, b2_y2)
 
    # DISTANCE
    center_b_x = (b1_x1 + b1_x2)/2
    center_b_y = (b1_y1 + b1_y2)/2
    center_gtb_x = (b2_x1 + b2_x2)/2
    center_gtb_y = (b2_y1 + b2_y2)/2
    C_area = (C_xx2-C_xx1)*(C_yy2-C_yy1)
    Distance = (center_gtb_x-center_b_x)**2 + (center_gtb_y-center_b_y)**2
    Distance_area = Distance/C_area**2
 
    # aspect ratio
    pred_w = b1_y2 - b1_y1
    pred_h = b1_x2 - b1_x1
    gt_w = b2_y2 - b2_y1
    gt_h = b2_x2 - b2_x1
    v = (4/(np.pi)**2)*(np.arctan(gt_w/gt_h) - np.arctan(pred_w/pred_h))**2
    alpha = v/((1-IOU) + v)
 
    CIOU = IOU - Distance_area - alpha*v
    print("CIOU:", CIOU)
 
if __name__ == "__main__":
    box1 = np.array([100, 100, 210, 210])
    box2 = np.array([150, 150, 230, 220])
    CIoU(box1, box2)

参考:https://blog.youkuaiyun.com/qq_40716944/article/details/135026393

<think>嗯,我现在需要了解CIoU损失函数的概念、公式及其实现方法,还有它在深度学习中的用途。首先,我应该回忆一下之前学过的相关损失函数,比如IoUGIoUDIoU这些,这样有助于理解CIoU的改进之处。 根据引用[3],CIoU的全称是Complete IoU loss,它是在DIoU的基础上提出的。而DIoU解决了GIoU收敛速度的问题,但可能没有考虑高宽比。CIoU同时考虑重叠面积、中心点距离和高宽比这三个几何因素。所以,CIoU应该是在DIoU的基础上增加了高宽比的惩罚项。 接下来,我需要找到CIoU的公式。根据引用[3]提到的,CIoU损失函数应该包含三个部分:重叠面积、中心点距离和高宽比。假设损失函数的形式可能是L = 1 - IoU + 距离项 + 高宽比项。比如DIoU的公式是L_{DIoU} = 1 - IoU + (ρ²(b, b^gt))/(),其中ρ是中心点之间的欧氏距离,c是最小包围框的对角线长度。那么CIoU可能在此基础上加上一个关于高宽比的项,比如&alpha;*v,其中v是衡量高宽比一致性的参数,&alpha;是权重系数。 然后,实现方法方面,CIoU需要计算这些额外的项。在代码中,可能需要计算预测框和真实框的中心点距离,找到最小包围框的对角线长度,计算高宽比的差异。比如在PyTorch中,可以分别用坐标计算出中心点坐标,计算欧氏距离,然后计算高宽比的参数v,最后整合到损失函数中。 用途方面,CIoU主要用于目标检测任务中的边界框回归,尤其是在需要更精准的框位置时,比如YOLO系列、Faster R-CNN等模型。它能够提高边界框的预测精度,因为综合考虑了多个几何因素,使得模型在训练时能更快收敛,并且预测框更贴合真实物体。 不过,我需要确认一下具体的公式和参数。比如,高宽比的项v具体是怎么计算的?根据论文,v可能是一个关于预测框和真实框高宽比相似度的函数。例如,v = (4/π²)(arctan(w^gt/h^gt) - arctan(w/h))²,然后用这个v乘以一个系数&alpha;。而&alpha;可能是v/(1 - IoU + v),或者其他形式。 另外,在实现时需要注意梯度计算是否正确,避免出现数值不稳定的情况。例如,当高或宽趋近于零时,如何处理。可能需要加入小的epsilon值来防止除以零的情况。 最后,总结一下,CIoU的公式应该包含IoU项、中心点距离项和高宽比项,其具体实现需要计算这些部分,并组合成最终的损失值。在目标检测中应用CIoU可以提升检测框的准确性,特别是在处理不同形状的物体时效果更好。</think>### CIoU损失函数详解 #### 1. 概念解析 CIoU(Complete Intersection over Union)损失函数目标检测中用于边界框回归的优化指标,在DIoU基础上引入**高宽比惩罚项**,形成三要素协同优化的损失函数: - **重叠面积**(IoU):衡量预测框与真实框的重叠比例 - **中心点距离**:计算两个框中心点的欧式距离 - **高宽比一致性**:通过角度差异评估宽高比例匹配程度 #### 2. 数学公式 CIoU损失函数定义为: $$ \mathcal{L}_{CIoU} = 1 - IoU + \frac{\rho^2(b,b^{gt})}{c^2} + \alpha v $$ 其中: - $\rho$:预测框与真实框中心点的欧氏距离 - $c$:最小包围框对角线长度 - $v = \frac{4}{\pi^2}\left( \arctan\frac{w^{gt}}{h^{gt}} - \arctan\frac{w}{h} \right)^2$ 衡量宽高比差异 - $\alpha = \frac{v}{(1-IoU)+v}$ 自适应权重系数 #### 3. 实现方法(PyTorch示例) ```python def CIoU_loss(pred, target): # 计算交集坐标 inter_ul = torch.max(pred[:, :2], target[:, :2]) inter_br = torch.min(pred[:, 2:], target[:, 2:]) # 计算IoU inter_area = torch.prod(inter_br - inter_ul, dim=1) * (inter_br > inter_ul).all(dim=1).float() area_pred = torch.prod(pred[:, 2:] - pred[:, :2], dim=1) area_target = torch.prod(target[:, 2:] - target[:, :2], dim=1) union = area_pred + area_target - inter_area + 1e-16 iou = inter_area / union # 中心点距离 center_pred = (pred[:, :2] + pred[:, 2:])/2 center_target = (target[:, :2] + target[:, 2:])/2 center_distance = torch.sum((center_pred - center_target)**2, dim=1) # 最小包围框对角线 enclose_ul = torch.min(pred[:, :2], target[:, :2]) enclose_br = torch.max(pred[:, 2:], target[:, 2:]) c_distance = torch.sum((enclose_br - enclose_ul)**2, dim=1) # 宽高比惩罚项 w_pred = pred[:, 2] - pred[:, 0] h_pred = pred[:, 3] - pred[:, 1] w_target = target[:, 2] - target[:, 0] h_target = target[:, 3] - target[:, 1] v = (4/(math.pi**2)) * torch.pow(torch.atan(w_target/h_target) - torch.atan(w_pred/h_pred), 2) alpha = v / (1 - iou + v + 1e-16) return 1 - iou + center_distance/c_distance + alpha*v ``` #### 4. 核心优势 1. **快速收敛**:相比IoUGIoU,中心点距离项加速训练收敛[^3] 2. **形状适应**:高宽比惩罚项提升不规则形状物体的检测精度 3. **三要素平衡**:同时优化定位的三个关键几何因素 #### 5. 应用场景 - **密集物体检测**:人群计数、车辆检测等场景 - **小目标检测**:无人机航拍图像分析 - **旋转物体检测**:遥感图像中的倾斜目标识别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BILLY BILLY

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

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

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

打赏作者

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

抵扣说明:

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

余额充值