【RT-DETR有效改进】SIoU、GIoU、CIoU、DIoU、WIoU等多种损失函数

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 

一、本文介绍

这篇文章介绍给大家介绍的是多种IoU的改进机制,如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU,每种都针对特定的检测场景。文章会详细探讨这些损失函数如何提高RT-DETR在各种检测任务中的性能,包括提升精度、加快收敛速度和增强模型对复杂场景的适应性。其中我经过实验在绝大多数下的效果都要比本文中提到的各种损失效果要好,下面为使用损失数利用我1:1移植过来的模型收敛效果图。 

专栏地址:RT-DETR专栏——持续复现各种顶会内容——论文收割机

目录

一、本文介绍

二、各种损失函数的基本原理 

2.1 交集面积和并集面积

2.2 IoU

2.3 SIoU

2.4 WioU

2.5 GIoU

2.6 DIoU

2.7 EIoU

2.8 CIoU

三、EIoU、SIoU、EIoU、WIoU等损失函数代码块

四、添加EIoU、SIoU、EIoU、WIoUI等损失函数到模型中

4.1 修改一

4.2 修改二

4.3 成功运行记录

### SIOUCIOU 的定义与差异 #### 定义 **CIOU (Complete Intersection over Union)** 是一种改进的边界框回归损失函数,旨在解决 IOU 及其变体(如 GIOU)存在的局限性。除了考虑重叠面积外,还引入了两个额外的因素来衡量预测框和真实框之间的距离以及纵横比的一致性[^1]。 具体来说,CIOU 计算公式如下: \[ \text{CIoU} = \text{IoU} - \alpha v \] 其中, - \( v=\left(\frac{\pi}{4}\right)^2\cdot\left[\arctan(w/g)-\arctan(h/g)\right]^2 \),用于度量宽高比例差异的影响; 而 **SIOU (Symmetric IoU)** 则进一步优化了这一过程,在保持原有特性基础上增加了新的机制以更好地处理极端情况下的定位精度问题。它通过重新设计惩罚项的方式提高了模型对于不同尺度物体检测的能力,并且能够更有效地抑制背景噪声干扰[^3]。 #### 差异分析 两者主要区别在于如何评估并修正非完美匹配时产生的误差: - 对于形状相似但位置偏差较大的情形,CIOU 更加侧重于减少由于中心偏移造成的负面影响。 - 当遇到长宽比失衡严重的目标时,SIOU 能够提供更为合理的评价标准,从而使得训练过程中可以更快收敛到最优解附近。 此外,值得注意的是,尽管两种方法都致力于改善传统指标不足之处,但在实际应用效果上可能会有所差别,取决于具体的任务需求和个人偏好等因素影响。 ```python def ciou_loss(pred_boxes, target_boxes): """计算 CIoU 损失""" # 获取边框参数 pred_xcycwh = torch.cat([pred_boxes[..., :2], pred_boxes[..., 2:] - pred_boxes[..., :2]], dim=-1) tgt_xcycwh = torch.cat([target_boxes[..., :2], target_boxes[..., 2:] - target_boxes[..., :2]],dim=-1) # 中心坐标差距 rho2 = ((pred_xcycwh[:, None, :, 0] - tgt_xcycwh[None, :, :, 0]) ** 2 + (pred_xcycwh[:, None, :, 1] - tgt_xcycwh[None, :, :, 1]) ** 2) # 最小封闭区域直径 c_diag_sqrd = (((torch.max(pred_xcycwh[:, None, :, 0], tgt_xcycwh[None, :, :, 0]) - torch.min(pred_xcycwh[:, None, :, 0], tgt_xcycwh[None, :, :, 0])) ** 2)+ ((torch.max(pred_xcycwh[:, None, :, 1], tgt_xcycwh[None, :, :, 1]) - torch.min(pred_xcycwh[:, None, :, 1], tgt_xcycwh[None, :, :, 1])) ** 2)) ious = bbox_iou(pred_boxes.unsqueeze(1), target_boxes.unsqueeze(0)) u = (rho2 / c_diag_sqrd).clamp(min=1e-7) v = (4 / math.pi ** 2) * \ torch.pow(torch.atan(tgt_xcycwh[None, ..., 2]/tgt_xcycwh[None, ..., 3]) - torch.atan(pred_xcycwh[:, None, ..., 2]/pred_xcycwh[:, None, ..., 3]), 2) alpha = v/(1-ious+v).clamp(min=1e-7) loss_ciou = 1 - ious + u + alpha*v return loss_ciou.mean() def siou_loss(): pass # 这里省略了实现细节,因为具体实现依赖于特定框架和应用场景 ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Snu77

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

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

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

打赏作者

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

抵扣说明:

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

余额充值