YOLOv9改进策略 | 损失函数篇 | 利用真实边界框损失之MPDIoU助力YOLOv9精度更上一层楼

本文介绍了YOLOv9系列的第一篇改进策略,焦点在于利用MPDIoU损失函数提高模型精度。MPDIoU解决了传统BBR损失在宽高比相同但尺寸不一时的优化难题,通过最小化预测框和真实框关键点距离,提供更精确的损失度量。作者提供了添加MPDIoU到YOLOv9代码的详细步骤,适用于DualDetect和GELAN版本。

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

一、本文介绍

Hello,大家好我是Snu77,这里给大家带来的是YOLOv9系列的第一篇改进策略,本文的内容是用了YOLOv9官方集成的MPDIoU损失来给大家进行改进 | MPDIoU需要图片的真实大小,但是官方并没有传递这个参数,在训练的阶段还好因为YOLO系列是固定图片大小训练,但是在训练时的验证确是不固定的所以我们需要将图片的真实大小传递进去但是官方并没有做这个功能,但是它预留了两个参数位可以看出我们这么做是没有任何问题的。

PS:最近群里很多读者都在催更YOLOv9系列(不下于二十人),这里再次讲一下没有更新的原因,一是因为YOLOv9的论文还没有收录,二是目前官方的项目中Bug众多,其次最重要的就是YOLOv9并没有放出其轻量化的版本(这对于众多算力有限的读者是一个很严重的问题),在一个以前的许多机制放在YOLOv9上的效果可能并不好因为V9的各方面比较完美。所以我们的改进策略专栏会从损失函数切入,随着今年更多的定会机制推出我们会将更多真实有效的改进放在YOLOv9上,助力大家发表论文。

专栏地址YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏  

目录

一、本文介绍

二、MPDIoU介绍

2.1 问题提出

2.2 MPDIoU的提出

2.3 实验验证

三、手把手教你添加MPDIoU

3.1 步骤1

03-15
### MPDIoU 的定义与实现 MPDIoU 是一种改进的边界盒相似性比较度量,旨在解决传统 IoU 度量在某些特定场景下的不足之处。具体来说,在目标检测任务中,当预测框与真实框 (Ground Truth Box) 具有相同纵横比但尺寸差异较大时,传统的 IoU 和其他损失函数可能无法有效地优化模型参数[^2]。 #### MPDIoU 的核心特性 MPDIoU 不仅考虑了两个边界框之间的重叠区域面积比例,还额外引入了几何特征作为衡量标准,这些特征包括但不限于: - **中心点距离**:通过测量两边界框中心的距离来反映它们的空间分布关系。 - **宽度和高度偏差**:分别计算两者宽度差值以及高度差值的比例因子,从而捕捉形状上的细微变化。 - **非重叠部分的影响**:即使没有实际交集区域存在,仍然可以通过上述附加项给予一定惩罚权重[^4]。 这种综合考量使得 MPDIoU 更加鲁棒适用于复杂环境中的物体定位问题尤其是针对那些远离摄像头的小型或者模糊不清的目标物体会有更好的表现效果因此也被认为是在现代计算机视觉框架下非常有价值的技术创新之一. #### LMPDIoU 损失函数的设计原理及其优势 基于以上提到的新颖度量方式——MPDIoU ,进一步设计出了相应的回归损失函数形式即所谓的"LMPDIoU". 这一新型损失函数不仅继承了前者的优点而且特别强调对于不同难度级别的样本应该采取差异化对待策略以便更好地服务于整体网络结构收敛速度提升的同时还能兼顾到局部细节精度改善方面的需求. 以下是 Python 中实现的一个简单版本: ```python import torch def mpdiou_loss(pred_boxes, gt_boxes): """ Calculate the Mean Point Distance Intersection over Union Loss between predicted and ground truth boxes. Args: pred_boxes (Tensor): Predicted bounding boxes with shape [N, 4], where N is number of samples. Each row contains values as follows: [x_min, y_min, x_max, y_max]. gt_boxes (Tensor): Ground-truth bounding boxes with same format and dimensions as `pred_boxes`. Returns: Tensor: Scalar tensor representing computed loss value. """ # Compute areas of both types of rectangles separately first... area_pred = (pred_boxes[:, 2]-pred_boxes[:, 0])*(pred_boxes[:, 3]-pred_boxes[:, 1]) area_gt = (gt_boxes[:, :, 2]-gt_boxes[:, :, 0]) * \ (gt_boxes[:, :, 3]-gt_boxes[:, :, 1]) max_x = torch.max(pred_boxes[:, None, :][:,:,None,[0]], gt_boxes[:,:,:,[0]]) min_xx = torch.min(pred_boxes[:, None, :][:,:,None,[2]], gt_boxes[:,:,:,[2]]) inter_wid = ((min_xx-max_x)>0).float() *(min_xx -max_x) max_y = torch.max(pred_boxes[:, None, :][:,:,None,[1]], gt_boxes[:,:,:,[1]]) min_yy = torch.min(pred_boxes[:, None, :][:,:,None,[3]], gt_boxes[:,:,:,[3]]) inter_hig =((min_yy -max_y )>0 ).float()* (min_yy -max_y ) intersection_area=inter_wid*inter_hig union_area =(area_pred.view(-1,1)+area_gt-intersection_area) ious =intersection_area/union_area.clamp(min=1e-6) center_dist_sqrd=((pred_boxes[:, None, :][:,:,None,[0]]+ .5*(pred_boxes[:, None, :][:,:,None,[2]]- pred_boxes[:, None, :][:,:,None,[0]]) - (gt_boxes[:,:,:,[0]].view(1,-1,1)+ .5*(gt_boxes[:,:,:,[2]]-.view(1,-1,1))))**2 + (.5*(pred_boxes[:, None, :][:,:,None,[3]]- pred_boxes[:, None, :][:,:,None,[1]])+ pred_boxes[:, None, :][:,:,None,[1]] - (.5*(gt_boxes[:,:,:,[3]]-.view(1,-1,1))+ gt_boxes[:,:,:,[1]].view(1,-1,1)))**2 ) wh_ratio=torch.abs(((pred_boxes[:, None, :][:,:,None,[2]]- pred_boxes[:, None, :][:,:,None,[0]])/ (gt_boxes[:,:,:,[2]]-.view(1,-1,1))-1.)+ (((pred_boxes[:, None, :][:,:,None,[3]]- pred_boxes[:, None, :][:,:,None,[1]])/ (gt_boxes[:,:,:,[3]]-.view(1,-1,1))-1.)) lmpdiou=(ious-(center_dist_sqrd/(wh_ratio+1))).mean() return (-lmpdiou) ``` 此代码片段实现了基于 PyTorch 的 MPDIoU 损失函数计算逻辑。需要注意的是,这里假设输入张量已按照 `[batch_size, num_bboxes, coords]` 形状排列好,并且坐标遵循 `(xmin,ymin,xmax,ymax)` 格式。 --- ###
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Snu77

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

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

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

打赏作者

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

抵扣说明:

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

余额充值