YOLOv8改进,YOLOv8改进损失函数采用Powerful-IoU(2024年最新IOU),助力涨点


在这里插入图片描述


摘要

边界框回归(BBR)是目标检测中的核心任务之一,BBR损失函数显著影响其性能。然而,观察到现有基于IoU的损失函数存在不合理的惩罚因子,导致回归过程中锚框扩展,并显著减缓收敛速度。为了解决这个问题,深入分析了锚框扩展的原因。针对这个问题,提出了一种新的Powerful-IoU(PIoU)损失函数,该函数结合了目标尺寸自适应惩罚因子和基于锚框质量的梯度调节函数。PIoU损失引导锚框沿着高效路径回归,收敛速度比现有基于IoU的损失函数更快。此外,还研究了聚焦机制,并引入了一种非单调注意力层,与PIoU结合形成了新的损失函数PIoU v2。PIoU v2损失增强了对中等质量锚框的聚焦能力。


Powerful-IoU介绍

物体定位是物体检测中的一项关键任务,它严重依赖于边界框回归 (BBR) 损失函数的评估和优化。因此,边界框回归损失函数显著影响物体检测器的性能。大多数 BBR 损失可归类为 𝑙𝑛-norm 和基于 IoU 的损失。如下图所示,不同IoU 损失函数引导的锚框回归过程。彩色框为不同损失函数引导的锚框在回归过程中的分布。很明显,PIoU 损失引导的锚框回归最快,可以最快地逼近目标框。而且,除 PIoU 损失外,所有损失函数引导的锚框都存在面积扩大的问题,而 PIoU 损失引导的锚框不存在此问题。
在这里插入图片描述
现有的基于IoU的损失函数在回归过程中首先增加锚框的尺寸以达到与目标框的重叠,即使锚框的面积已经大于目标框的面积。这种回归方式复杂且缓慢,需要更多轮次才能收敛。此外,它们的惩罚项包含不合理的成分,不能准确反映锚框和目标框之间的差异。它们没有充分考虑目标尺寸,在某些情况下可能会出现退化。为了解决锚框增大等问题,提出了一个具有尺寸自适应性的惩罚因子,引导锚框直接高效地回归。将这个惩罚因子与一个根据锚框质量调整梯度的函数相结合,得到一个新的基于 IoU 的损失,称为 Powerful-IoU (PIoU) 损失。PIoU 损失直接最小化锚框的四个边缘与目标框相应边缘之间的距离。因此在YOLOv10中将原始的损失替换为Powerful-IoU,实现更快的收敛速度和更高的准确率。

理论详解可以参考链接:论文地址
代码可在

### YOLOv8改进损失函数 Wise-IOU 的实现方法 #### 1. Wise-IoU 概述 Wise-IoU 是一种新型的边界框损失函数,旨在通过引入动态非单调聚焦机制来改善目标检测中的定位精度。相比传统的 IoU 变体如 CIoU 和 SIoU,Wise-IoU 能够更好地处理不同尺度的目标,并显著提高小目标检测的效果[^2]。 #### 2. Wise-IoU 版本解析 Wise-IoU 存在多个版本,具体如下: - **Wise-IoU v1**: 初步实现了基于距离加权的交并比计算方式。 - **Wise-IoU v2**: 引入了自适应权重调整策略,使得模型能够根据不同场景自动调节参数。 - **Wise-IoU v3**: 结合注意力机制进一步增强了对复杂背景下的鲁棒性[^3]。 #### 3. 在 YOLOv8 中集成 Wise-IoU 为了将 Wise-IoU 集成到 YOLOv8 中,需按照以下步骤操作: ##### 修改 `bbox_iou` 函数 首先需要重定义原有的 `bbox_iou` 函数以支持新的 IoU 计算逻辑。以下是 Python 实现示例: ```python def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False, WIoU=True): """ Calculate the Intersection over Union (IoU) between two bounding boxes. Args: ... WIoU (bool): Whether to use Wise-IoU loss function Returns: iou value or wise-iou value based on input parameters """ if WIoU: # Implementing specific logic for Wise-IoU here... pass # Original implementation remains unchanged when not using WIoU ... ``` ##### 更新 `_call_` 方法内的 IoU 计算部分 接着要确保每次调用 IoU 时都能正确识别是否启用 Wise-IoU 并执行相应分支路径: ```python class ComputeLoss(nn.Module): def __init__(self, model, autobalance=False): super().__init__() self.sort_obj_iou = False ... def forward(self, pred, targets): device = targets.device lcls, lbox, lobj = torch.zeros(1, device=device), torch.zeros(1, device=device), torch.zeros(1, device=device) # ... other codes remain same until reaching IOU calculation part... if compute_loss.WIou: tbox = targets[:, 2:6].to(device) * whwh_gain anchors = anchor_wh.to(device).unsqueeze(dim=0) giou = bbox_iou(pred[..., :4], tbox, x1y1x2y2=False, WIoU=True)[..., None] # Apply weights from attention mechanism as described in paper att_weights = get_attention_weights(pred, target_boxes=tbox) weighted_giou = giou * att_weights lbox += ((weighted_giou - 1.0)**2).mean() # Use squared difference instead of direct subtraction else: # Standard GIoU/CIoU computation continues normally without changes ... ``` #### 4. 测试与验证 完成上述修改后,可以通过标准的数据集进行训练和评估,观察 Wise-IoU 对整体性能的影响。特别注意对比之前使用的传统 IoU 类型的结果差异,记录下任何可能存在的优势或劣势[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

挂科边缘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值