YOLOv5改进实战 | 更换损失函数(四)之NWD(小目标检测)篇

本文介绍如何将NWD损失函数应用到YOLOv5 v7.0模型,以增强小目标检测能力。NWD通过建模边界框为高斯分布并使用Wasserstein距离,提供尺度不变性和更平滑的位置差异处理。文章详细阐述了NWD的优势,并提供了代码实现。

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


在这里插入图片描述


前言

本文使用的YOLOv5版本为v7.0,该版本为YOLOv5最新版本,默认损失函数采用的是CIoU。本章节主要介绍如何将NWD损失函数应用于目标检测YOLOv5模型。


🚀🚀🚀 YOLOv5改进损失函数系列:

YOLOv5改进实战(1)| 更换损失函数(一)之EIoU、Alpha-IoU、SIoU篇
YOLOv5改进实战(2)| 更换损失函数(二)之WIOU(Wise IoU)篇
YOLOv5改进实战(3)| 更换损失函数(三)之MPDIOU(2023最新IOU)篇
YOLOv5改进实战(6)| 更换损失函数(四)之NWD(小目标检测)篇


一、NWD(提升小目标检测能力)

论文链接A Normalized Gaussian Wasserstein Distance for Tiny Object Detection

NWD是一个新的度量方法来计算框和框之间的相似度,就是把框建模成高斯分布,然后用Wasserstein距离来度量这两个分布之间的相似度,来代替IoU。这个距离的好处是,即便是2个框完全不重叠,或者重叠很少,还是可以度量出相似度出来。另外,NWD对于目标的尺度不敏感,对于小目标的更加的稳定。

相比于IoU,NWD有以下好处:

  1. 尺度不变性。
  2. 对于位置的差别变换平缓。
  3. 具有度量不想交的框的相似度的能力。
    在这里插入图片描述
    假设边界框 R = ( c x , c y , w , h ) R=(cx,cy,w,h) R=cx,cy,w,h,对于两个边界框来说,其2阶Wasserstein距离可以定义为:
    在这里插入图片描述
    不过这是个距离度量,不能直接用于相似度。我们用归一化后的指数来得到一个新的度量,叫做归一化的Wasserstein距离:
    在这里插入图片描述
    基于NWD的loss:

在这里插入图片描述

二、代码实现

添加损失函数

  1. utils/metrics.py文件中添加下述源代码
    • 源代码如下:
      def wasserstein_loss(pred, target, eps=1e-7, constant=12.8):
          """`Implementation of paper `Enhancing Geometric Factors into
          Model Learning and Inference for Object Detection and Instance
          Segmentation <https://arxiv.org/abs/2005.03572>`_.
          Code is modified from https://github.com/Zzh-tju/CIoU.
          Args:
              pred (Tensor): Predicted bboxes of format (x_center, y_center, w, h),
                  shape (n, 4).
              target (Tensor): Corresponding gt bboxes, shape (n, 4).
              eps (float): Eps to avoid log(0).
          Return:
              Tensor: Loss tensor.
          """
      
          center1 = pred[:, :2]
          center2 = target[:, :2]
      
          whs = center1[:, :2] - center2[:, :2]
      
          center_distance = whs[:, 0] * whs[:, 0] + whs[:, 1] * whs[:, 1] + eps #
      
          w1 = pred[:, 2]  + eps
          h1 = pred[:, 3]  + eps
          w2 = target[:, 2] + eps
          h2 = target[:, 3] + eps
      
          wh_distance = ((w1 - w2) ** 2 + (h1 - h2) ** 2) / 4
      
          wasserstein_2 = center_distance + wh_distance
          return torch.exp(-torch.sqrt(wasserstein_2) / constant)
      

更换NWD

按照上述更改metrics.py文件中的bbox_iou函数后,在utils/loss.py中,找到ComputeLoss类中的__call__()函数
在这里插入图片描述

from utils.metrics import bbox_iou, wasserstein_loss
# NWD
nwd = wasserstein_loss(pbox, tbox[i]).squeeze()
iou_ratio = 0.5
lbox += (1 - iou_ratio) * (1.0 - nwd).mean() + iou_ratio * (1.0 - iou).mean()  # iou loss

# Objectness
iou = (iou.detach() * iou_ratio + nwd.detach() * (1 - iou_ratio)).clamp(0, 1).type(tobj.dtype)

在这里插入图片描述

在这里插入图片描述

### NWD 损失函数的图表与可视化 对于YOLOv5中的`yolov5-NWD.py`文件,该文件实现了Wasserstein损失函数用于目标检测[^1]。然而,在提及NWD(假设为噪声到唤醒网络)时,并未找到直接关联于这种特定架构或方法下的损失函数图表或可视化的具体描述。 通常情况下,为了展示任何类型的损失函数的变化情况及其性能表现,可以采用如下几种常见的可视化方式: #### 1. 训练过程中的损失变化曲线图 通过记录训练过程中每轮迭代后的损失值,绘制出随着epoch增加而对应的平均损失下降趋势图。这有助于直观了解模型收敛速度以及是否存在过拟合等问题。 ```python import matplotlib.pyplot as plt def plot_loss_curve(epochs, losses): plt.figure(figsize=(8,6)) plt.plot(range(1, epochs+1), losses) plt.title('Training Loss Curve') plt.xlabel('Epochs') plt.ylabel('Loss Value') plt.grid(True) plt.show() ``` #### 2. 不同超参数设置下对比分析图 当调整某些关键性的超参数比如学习率、正则项系数等之后,可以通过多条不同颜色或者样式的折线来比较它们各自带来的影响效果差异。 #### 3. 测试集上预测结果分布直方图 除了关注整体上的数值指标外,还可以针对测试样本生成其真实标签和预测得分之间的差距统计图形,以此评估模型泛化能力的好坏程度。 由于当前关于NWD的具体定义不够清晰,上述建议更多基于一般意义上的机器学习项目实践给出。如果确实存在名为"NWD"的独特技术方案,则可能需要查阅更专业的资料源获取针对性更强的信息。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

w94ghz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值