DIoU

本文解析了Distance-IoU Loss在2019年论文中的贡献,包括其改进了IoU和GIoU,考虑了中心距离并加速收敛,尤其在处理包含关系时展现出优势。实验对比了不同损失函数在回归过程中的表现,并介绍了DIoU-NMS在解决遮挡NMS问题的应用。关键概念如LIoU, LGIoU, LDIoU和CIoU也被详细解释。

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

论文Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression(2019)
代码Zzh-tju/DIoU-darknet

DIoU

DIoU Loss 具备 GIoU Loss 优势的同时:

  • 考虑与目标中心距离,收敛更快
  • 在被预测框包含的情况下,GIoU Loss基本退化为 IoU Loss,DIoU Loss 仍能发挥较大优势,如下图所示,根据 DIoU Loss 可以认为右侧预测框相对较好,这也符合直观感受在这里插入图片描述
  • 可作为 NMS 评价指标

GIoU 和 DIoU 效果

在这里插入图片描述
L I o U = 1 − ∣ B ∩ B g t ∣ ∣ B ∪ B g t ∣ L G I o U = 1 − I o U + ∣ C − B ∪ B g t ∣ ∣ C ∣ L D I o U = 1 − I o U + ρ 2 ( b , b g t ) c 2 ⏟ R D I o U \begin{aligned} \mathcal{L}_{I o U}&= 1-\frac{\left|B \cap B^{g t}\right|}{\left|B \cup B^{g t}\right|} \\ \mathcal{L}_{G I o U} &=1-I o U+\frac{\left|C-B \cup B^{g t}\right|}{|C|} \\ \mathcal{L}_{D I o U} &=1-I o U+\underbrace{\frac{\rho^{2}\left(\mathbf{b}, \mathbf{b}^{g t}\right)}{c^{2}}}_{\mathcal{R}_{DIoU}} \end{aligned} LIoULGIoULDIoU=1BBgtBBgt=1IoU+CCBBgt=1IoU+RDIoU c2ρ2(b,bgt)

其中 b b b 表示框的中心点, c c c 表示包含两框(预测框和目标框)的最小矩形的对角线长度, ρ \rho ρ 表示取欧氏距离,除以 c 2 c^2 c2 是为了减小目标尺度的影响

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

CIoU

考虑框的长宽比, v v v 表示长宽比的相似性, α \alpha α 为权重函数
在这里插入图片描述
在这里插入图片描述
设置仿真实验比较 IoU、GIoU、DIoU、CIoU 损失,蓝色点为 Anchors 的位置,每个位置有七个尺寸的 Anchor Boxes,中间黑点位置有七个不同尺寸的目标框,对 Anchor Boxes 进行迭代回归, IoU、GIoU、DIoU、CIoU 四种 Loss 表现如下图:

  • IoU误差曲线:IoU无法横衡量与目标框没有重叠的 Anchor Boxes,离中心较远的 Anchor Boxes 基本训练不到,所以保持较高误差
  • GIoU误差曲:对于与目标框没有重叠的 Anchor Boxes,GIoU 表现明显比 IoU 更好。但是当没有重叠时,GIoU对水平和竖直方向监督效果不够(由GIoU Loss公式即可知道),误差也比较难降下来
  • DIoU和CIoU误差曲线:收敛快速稳定

在这里插入图片描述

DIoU-NMS

标准 NMS 以 IoU 作为指标,在遮挡情况下可能产生虚假抑制,可以用 DIoU 代替 IoU
在这里插入图片描述
s i s_i si表示分数, M \mathcal{M} M 为最高分数预测框, B i B_i Bi表示 其余预测框, ε ε ε 为阈值,DIoU-NMS可以较为方便地嵌入检测器

相关实验

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

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

在这里插入图片描述

参考文献

【1】IoU、GIoU、DIoU、CIoU损失函数的那点事儿
【2】GIOU

### 关于DIoU Loss的研究 DIoU(Distance-IoU)Loss 是一种改进的损失函数,旨在解决目标检测任务中边界框回归问题。它不仅考虑了预测框与真实框之间的重叠区域(IoU),还加入了中心点距离和宽高比例的因素,从而提高了定位精度[^1]。 #### DIoU Loss 的定义 DIoU Loss 可以表示为以下形式: \[ \text{DIoU} = 1 - \frac{\text{IoU}}{1 + \rho(b, b_{\text{gt}})^2 / c^2} \] 其中: - \( \text{IoU} \) 表示交并比; - \( \rho(b, b_{\text{gt}}) \) 表示预测框和真实框中心点的距离; - \( c \) 表示覆盖两个框最小闭包对角线长度。 这种设计使得优化过程中不仅可以最大化 IoU 值,还可以减小预测框与真实框之间中心点的距离以及宽高的差异[^4]。 --- ### 相关论文推荐 以下是几篇涉及 DIoU 或其扩展算法的研究论文: 1. **《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》** - 这是 DIoU 和 CIoU 的基础研究工作,首次提出了 GIoU 概念,并在此基础上衍生出了更优的 DIoU 和 CIoU。 - 论文链接:[https://arxiv.org/abs/1902.09630](https://arxiv.org/abs/1902.09630) 2. **《Enhancing Geometric Factors in Model Learning and Inference for Object Detection and Instance Segmentation》** - 提出了 Distance-IoU (DIoU),并通过实验验证了其在多种目标检测框架中的有效性。 - 论文链接:[https://arxiv.org/abs/1911.08287](https://arxiv.org/abs/1911.08287) 3. **《YOLOv4: Optimal Speed and Accuracy of Object Detection》** - YOLOv4 中采用了 CmBN、Mish 激活函数等多种优化手段,并引入了 CIoU Loss 来提升检测性能。 - 论文链接:[https://arxiv.org/abs/2004.10934][^3] --- ### 实现代码示例 以下是一个简单的 Python 实现 DIoU Loss 的代码片段: ```python import torch def diou_loss(pred_boxes, target_boxes): """ Calculate the DIoU loss between predicted boxes and target boxes. Args: pred_boxes (Tensor): Predicted bounding boxes with shape [n, 4]. target_boxes (Tensor): Target bounding boxes with shape [n, 4]. Returns: Tensor: The computed DIoU loss value. """ # Convert to center coordinates and width-height format cxp, cyp = (pred_boxes[:, 0] + pred_boxes[:, 2]) / 2, (pred_boxes[:, 1] + pred_boxes[:, 3]) / 2 cxt, cyt = (target_boxes[:, 0] + target_boxes[:, 2]) / 2, (target_boxes[:, 1] + target_boxes[:, 3]) / 2 w_pred, h_pred = pred_boxes[:, 2] - pred_boxes[:, 0], pred_boxes[:, 3] - pred_boxes[:, 1] w_target, h_target = target_boxes[:, 2] - target_boxes[:, 0], target_boxes[:, 3] - target_boxes[:, 1] iou = calculate_iou(pred_boxes, target_boxes) rho_squared = ((cxp - cxt)**2 + (cyp - cyt)**2) diagonal_distance_squared = ((torch.max(pred_boxes[:, 2], target_boxes[:, 2]) - torch.min(pred_boxes[:, 0], target_boxes[:, 0]))**2 + (torch.max(pred_boxes[:, 3], target_boxes[:, 3]) - torch.min(pred_boxes[:, 1], target_boxes[:, 1]))**2) diou_term = rho_squared / diagonal_distance_squared diou = iou - diou_term return 1 - diou.mean() def calculate_iou(box_a, box_b): """Calculate intersection-over-union.""" max_xy = torch.min(box_a[:, 2:], box_b[:, 2:]) min_xy = torch.max(box_a[:, :2], box_b[:, :2]) inter_wh = (max_xy - min_xy).clamp(min=0) inter_area = inter_wh[:, 0] * inter_wh[:, 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 = area_a + area_b - inter_area return inter_area / union_area.clamp(min=1e-6) ``` 上述代码实现了 DIoU Loss 的计算逻辑,适用于 PyTorch 框架下的目标检测任务。 --- ### 结论 DIoU Loss 在目标检测领域具有重要意义,尤其对于需要精确位置估计的任务表现优异。通过结合中心点距离和宽高比例的信息,它可以有效改善传统 IoU 存在的问题。如果希望深入理解 DIoU 的理论及其实际应用,建议阅读前述提到的相关论文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值