【YOLO改进】换遍IoU损失函数之DIoU Loss(基于MMYOLO)

DIoU损失函数

论文链接:https://arxiv.org/pdf/1911.08287

DIoU损失函数(Distance Intersection over Union Loss)是一种在目标检测任务中常用的损失函数,用于优化边界框的位置。这种损失函数是IoU损失函数的改进版,其不仅考虑了边界框之间的重叠区域,还考虑了它们中心点之间的距离,从而提供更加精确的位置优化。以下是DIoU损失函数的设计原理和计算步骤的详细介绍:

设计原理

一、IoU的局限性

  • IoU(Intersection over Union)损失函数主要基于预测框和真实框之间的交并比,这个比例值越大表示预测框越接近真实框。
  • 但IoU损失函数在预测框和真实框没有重叠时无法提供有效的梯度信息,这限制了模型的学习效率。

二、DIoU的引入

  • DIoU损失在IoU的基础上增加了中心点距离的考量,这使得即使在两个框不重叠的情况下也能有效地进行梯度下降。
  • 通过考虑框的几何中心距离,DIoU损失有助于减少边界框的尺寸误差,并加速收敛。

计算步骤

一、计算IoU

  • 计算两个边界框A和B的交集面积I。
  • 计算两个边界框的并集面积U。
  • IoU计算公式为:\text{IoU} = \frac{I}{U}

二、计算框的中心距离

  • 设预测框的中心为(x_p,y_p),真实框的中心为 (x_g,y_g)
  • 中心点距离 d 的计算公式为:d = \sqrt{(x_{p} - x_{g})^2 + (y_{p} - y_{g})^2}

三、计算归一化中心距离

  • 计算包围预测框和真实框的最小闭合矩形(称为最小闭合框),并求出其对角线长度。
  • 归一化中心距离为 \frac{d}{c}​,这样可以确保距离的比例适应不同大小的边界框。

四、计算DIoU

  • DIoU损失函数定义为:\text{DIoU Loss} = 1 - \text{IoU} + \frac{d^2}{c^2}
  • 其中,\frac{d^2}{c^2}​ 表示中心点距离的归一化平方,这样确保了距离项在损失函数中占有合适的权重。

使用PyTorch实现DIoU计算的源代码

import torch

def diou_loss(pred_boxes, gt_boxes):
    """
    计算 DIoU 损失。
    :param pred_boxes: 预测的边界框,形状为 (batch_size, 4),格式为 (x1, y1, x2, y2)
    :param gt_boxes: 真实的边界框,形状为 (batch_size, 4),格式为 (x1, y1, x2, y2)
    :return: DIoU 损失值
    """
    # 计算交集的坐标
    inter_x1 = torch.max(pred_boxes[:, 0], gt_boxes[:, 0])
    inter_y1 = torch.max(pred_boxes[:, 1], gt_boxes[:, 1])
    inter_x2 = torch.min(pred_boxes[:, 2], gt_boxes[:, 2])
    inter_y2 = torch.min(pred_boxes[:, 3], gt_boxes[:, 3])

    # 计算交集的面积
    inter_area = torch.clamp(inter_x2 - inter_x1, min=0) * torch.clamp(inter_y2 - inter_y1, min=0)

    # 计算预测框和真实框的面积
    pred_area = (pred_boxes[:, 2] - pred_boxes[:, 0]) * (pred_boxes[:, 3] - pred_boxes[:, 1])
    gt_area = (gt_boxes[:, 2] - gt_boxes[:, 0]) * (gt_boxes[:, 3] - gt_boxes[:, 1])

    # 计算并集的面积
    union_area = pred_area + g
### YOLOv11 改进策略:Focaler-IoU 及其变种在边界框回归中的应用 YOLOv11 的改进策略中,引入了 Focaler-IoU 系列损失函数以优化边界框回归性能。这些损失函数通过结合几何关系和样本分布特性,显著提升了检测器对简单样本和困难样本的适应能力[^3]。 #### 一、Focaler-IoU 设计原理 Focaler-IoU 是一种改进型的 IoU 损失函数,其核心思想是通过对不同难度的样本施加不同的权重,从而更聚焦于困难样本或简单样本的回归。具体而言,Focaler-IoU 在传统 IoU 损失的基础上加入了动态调整因子,使得模型能够更好地处理样本不平衡问题[^2]。 #### 二、Focaler-IoU 的优势 1. **动态权重调整**:Focaler-IoU 能够根据样本的难易程度自动调整损失权重,从而提高模型对困难样本的关注度[^3]。 2. **几何关系建模**:通过引入边界框之间的几何关系(如重叠面积、中心点距离等),Focaler-IoU 提供了更精确的回归指导[^1]。 3. **泛化性**:Focaler-IoU 及其变种(如 Focaler-DIoU、Focaler-GIoU 和 Focaler-CIoU)适用于多种检测任务,并能有效提升检测精度[^2]。 #### 三、Focaler-IoU 变种及其特点 以下是 Focaler-IoU 的几种变种及其在边界框回归中的应用: 1. **Focaler-DIoU** Focaler-DIoUDIoU(Distance IoU)的基础上加入了动态权重调整机制。DIoU 不仅考虑了边界框的重叠区域,还引入了中心点距离作为惩罚项。Focaler-DIoU 进一步增强了对困难样本的关注,从而提高了边界框回归的准确性[^1]。 2. **Focaler-GIoU** Focaler-GIoU 基于 GIoU(Generalized IoU)设计,除了计算重叠区域外,还考虑了包含两个边界框的最小闭包区域。这种设计有助于减少预测框超出目标范围的情况,而 Focaler-GIoU 则通过动态权重进一步优化了这一过程[^1]。 3. **Focaler-CIoU** Focaler-CIoU 是 CIoU(Complete IoU)的改进版本,综合了重叠区域、中心点距离和宽高比例三个因素。它能够提供更加全面的回归指导,尤其适合处理形状差异较大的目标。Focaler-CIoU 通过动态权重调整,进一步提升了模型对复杂场景的适应能力[^1]。 #### 四、实现代码示例 以下是 Focaler-CIoU 的实现代码示例: ```python import torch def focaler_ciou_loss(pred_boxes, target_boxes, alpha=1.0, beta=1.0): # 计算CIoU损失 def compute_ciou(pred, target): eps = 1e-7 # 获取边界框的坐标 x1p, y1p, x2p, y2p = pred.unbind(-1) x1g, y1g, x2g, y2g = target.unbind(-1) # 计算交集区域 w_intersect = (torch.min(x2p, x2g) - torch.max(x1p, x1g)).clamp(0) h_intersect = (torch.min(y2p, y2g) - torch.max(y1p, y1g)).clamp(0) area_intersect = w_intersect * h_intersect # 计算并集区域 area_pred = (x2p - x1p) * (y2p - y1p) area_target = (x2g - x1g) * (y2g - y1g) area_union = area_pred + area_target - area_intersect + eps # 计算IoU iou = area_intersect / area_union # 计算中心点距离 center_p = torch.stack([(x1p + x2p) / 2, (y1p + y2p) / 2], dim=-1) center_g = torch.stack([(x1g + x2g) / 2, (y1g + y2g) / 2], dim=-1) dist_center = torch.sum((center_p - center_g) ** 2, dim=-1) # 计算最小闭包区域 c_w = torch.max(x2p, x2g) - torch.min(x1p, x1g) c_h = torch.max(y2p, y2g) - torch.min(y1p, y1g) c_diag = c_w ** 2 + c_h ** 2 + eps # 计算宽高比例差异 v = (4 / math.pi ** 2) * torch.pow( torch.atan(w_pred / h_pred) - torch.atan(w_gt / h_gt), 2 ) with torch.no_grad(): alpha_ciou = v / (1 - iou + v + eps) # 计算CIoU ciou = iou - (dist_center / c_diag) - (alpha_ciou * v) return 1 - ciou # 应用动态权重调整 loss = compute_ciou(pred_boxes, target_boxes) focal_weight = (1 - iou) ** alpha * (beta + loss) ** beta return (focal_weight * loss).mean() ``` #### 五、总结 通过引入 Focaler-IoU 系列损失函数YOLOv11 在边界框回归方面取得了显著的性能提升。这些损失函数不仅关注几何关系,还通过动态权重调整机制解决了样本不平衡问题,从而提高了模型在复杂场景下的检测精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值