【YOLOv8/v9/v10/v11、RT-DETR改进合集】详解SimSPPF,简化设计,提高计算效率

一、本文介绍

本文记录的是基于SimSPPF模块的YOLOv8YOLOv9YOLOv10YOLOv11RT-DETR目标检测改进方法研究。介绍了SPPSPPF以及SimSPPFSimSPPF的设计更加简化,计算效率更高


2.1 SPP

空间金字塔池化(Spatial Pyramid Pooling,SPP)主要是为了解决输入图像尺寸不固定的问题。在传统的卷积神经网络中,通常要求输入图像具有固定的尺寸,这在实际应用中会带来很多不便。而空间金字塔池化能够对不同尺寸的输入图像产生固定长度的输出,使得网络可以接受任意尺寸的图像输入。

原理

  1. 对于输入的特征图,空间金字塔池化将其划分成不同尺度的子区域。例如,可以将特征图划分成多个不同大小的网格,形成多个层次的空间金字塔结构。
  2. 对每个子区域分别进行池化操,例如最大池化或平均池化。这样可以得到不同尺度的特征表示。
  3. 将不同尺度的池化结果进行拼接,得到一个固定长度的特征向量。这个特征向量可以作为后续全连接层的输入。

在这里插入图片描述

特点

  1. 灵活性:可以处理任意尺寸的输入图像,无需对图像进行裁剪或缩放等预处理操作,保留了图像的原始信息。
  2. 多尺度特征提取:通过不同尺度的空间金字塔结构,能够提取图像在不同尺度下的特征,增强了网络对不同大小目标的适应能力。
  3. 减少过拟合:由于可以接受不同尺寸的图像输入,增加了数据的多样性,有助于减少过拟合的风险。
class SPP(nn.Module):
    # Spatial Pyramid Pooling (SPP) layer https://arxiv.org/abs/1406.4729
    def __init__(self, c1, c2, k=(5, 9, 13)):
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * (len(k) + 1), c2, 1, 1)
        self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])

    def forward(self, x):
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
            return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))

2.2 SPPF

SPPF(Spatial Pyramid Pooling - Fast)是一种空间金字塔池化的改进版本

原理

  1. 首先,将输入特征图划分成多个不同大小的区域。这些区域可以是固定大小的网格,也可以是根据特定规则划分的区域。
  2. 对每个区域进行快速池化操作,例如最大池化或平均池化。快速池化可以通过一些高效的算法实现,以减少计算时间。
  3. 将不同尺度的池化结果进行融合,可以通过拼接、相加或其他融合方式。这样得到的融合特征包含了多尺度的信息。
  4. 最后,将融合后的特征输出,作为后续网络层的输入。

在这里插入图片描述

特点

  1. 高效性:相比传统的空间金字塔池化,SPPF在保持相似性能的同时,具有更高的计算效率。它通过对特征图进行更快速的池化操作,减少了计算量和处理时间
  2. 多尺度特征融合:与SPP一样,SPPF也能够提取多尺度的特征信息。它将输入特征图划分成不同大小的区域,并进行池化操作,然后将这些不同尺度的池化结果进行融合,得到更丰富的特征表示
  3. 灵活性:可以很容易地集成到各种卷积神经网络架构中,适用于不同的任务和应用场景。
class SPPF(nn.Module):
    # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
    def __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * 4, c2, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)

    def forward(self, x):
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
            y1 = self.m(x)
            y2 = self.m(y1)
            return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))

2.3 SimSPPF

SimSPPF(Simplified Spatial Pyramid Pooling - Fast)模块YOLOv6中提出的一种简化的空间金字塔池化模块,主要用于计算机视觉任务中的特征提取。以下是其设计原理及特点。

SimSPPF模块由两个主要部分组成:

  1. 一系列卷积操作:包括一个初始的 SimConv 卷积层用于将输入特征图进行初步处理,降低通道数为原来的一半。其中SimConv是一个自定义的卷积模块,包含卷积操作(nn.Conv2d)批归一化(nn.BatchNorm2d)ReLU激活函数。它的作用是对输入特征图进行卷积操作以提取特征,并通过批归一化来加速训练过程和提高模型的稳定性ReLU激活函数则引入非线性,增强模型的表达能力
  2. 多次最大池化和拼接操作:通过多次最大池化操作和拼接操作,实现对不同尺度特征的融合,最后再经过一个 SimConv 卷积层将融合后的特征图转换为指定的输出通道数。

在这里插入图片描述

通过以上设计,SimSPPF模块能够有效地提取多尺度特征,并融合这些特征以增强模型对不同大小物体的识别能力。同时,简化的设计使得计算效率更高,适用于对实时性要求较高的计算机视觉任务。

class SimConv(nn.Module):
    '''Normal Conv with ReLU activation'''
    def __init__(self, in_channels, out_channels, kernel_size, stride, groups=1, bias=False):
        super().__init__()
        padding = kernel_size // 2
        self.conv = nn.Conv2d(
            in_channels,
            out_channels,
            kernel_size=kernel_size,
            stride=stride,
            padding=padding,
            groups=groups,
            bias=bias,
        )
        self.bn = nn.BatchNorm2d(out_channels)
        self.act = nn.ReLU()

    def forward(self, x):
        return self.act(self.bn(self.conv(x)))

    def forward_fuse(self, x):
        return self.act(self.conv(x))

class SimSPPF(nn.Module):
    '''Simplified SPPF with ReLU activation'''
    def __init__(self, in_channels, out_channels, kernel_size=5):
        super().__init__()
        c_ = in_channels // 2  # hidden channels
        self.cv1 = SimConv(in_channels, c_, 1, 1)
        self.cv2 = SimConv(c_ * 4, out_channels, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=kernel_size, stride=1, padding=kernel_size // 2)

    def forward(self, x):
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')
            y1 = self.m(x)
            y2 = self.m(y1)
            return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1))

论文:https://arxiv.org/abs/2209.02976

三、SimSPPF模块的实现代码

四、添加步骤

模块完整介绍个人总结实现代码模块改进yaml配置、以及详细添加步骤请参考对应链接:

YOLOv8:
详细步骤:YOLOv8改进策略【SPPF】| SimSPPF,简化设计,提高计算效率

改进合集:YOLOv8全方位改进目录一览


YOLOv9:
详细步骤:YOLOv9改进策略【SPPF】| SimSPPF,简化设计,提高计算效率

改进合集:YOLOv9全方位改进目录一览


YOLOv10:
详细步骤:YOLOv10改进策略【SPPF】| SimSPPF,简化设计,提高计算效率

改进合集:YOLOv10全方位改进目录一览


YOLOv11:
详细步骤:YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率

改进合集:YOLOv11全方位改进目录一览


RT-DETR:
详细步骤:RT-DETR改进策略【SPPF】| SimSPPF,简化设计,提高计算效率

改进合集:RT-DETR全方位改进目录一览

### YOLORTDETR改进分析 #### 背景介绍 实时目标检测器(Real-Time Detection Transformer, RTDETR)是一种基于Transformer架构的目标检测模型,它通过引入全局上下文建模能力显著提升了性能[^1]。而YOLO系列作为经典的单阶段目标检测算法,在速度和精度上表现出色,但在处理复杂场景时存在一定的局限性。 #### 主要差异与改进点 ##### 1. 架构设计上的变化 YOLO采用的是卷积神经网络(CNN),主要依赖局部特征提取来完成目标定位和分类任务。然而CNN对于远距离像素之间的关系捕捉能力有限。相比之下,RTDETR利用了自注意力机制(Self-Attention Mechanism),能够更好地捕获图像中的长程依赖关系[^2]。这种转变使得RTDETR在面对遮挡或者密集排列物体的情况下表现更优。 ```python import torch.nn as nn class SelfAttention(nn.Module): def __init__(self, dim, heads=8, dropout=0.1): super().__init__() self.heads = heads self.scale = (dim // heads) ** -0.5 # 定义查询、键值向量转换矩阵以及最终线性层 ... def forward(self, x): b, n, _, h = *x.shape, self.heads qkv = ... # 计算QKV并分组 dots = ... @ ... .transpose(-2,-1) * self.scale # 点乘计算相似度得分 attn = dots.softmax(dim=-1) out = (attn @ ...) .reshape(b,n,dim) return out ``` ##### 2. 数据增强策略的不同应用 为了进一步提升泛化能力和鲁棒性,RTDETR还采用了更加多样化且高效的数据增广技术,比如Mixup、Cutout等操作方式相结合的形式来进行训练前预处理步骤设置[^3]。这些方法可以有效增加样本多样性从而帮助模型学习更多样化的模式表示形式。 ##### 3. 损失函数的设计调整 传统版本下的YOLO通常会定义边界框回归损失项为平滑L1范数(smooth L1 loss),而在新提出的方案里则可能考虑使用IoU-based Losses代替原有标准配置选项之一——即GIOU Loss(Generalized Intersection over Union)[^4],因为它可以直接优化预测框与真实标注框之间重叠区域大小这一指标数值本身而非仅仅关注坐标差值绝对误差情况而已. #### 性能对比总结表 | 特性 | YOLO | RTDETR | |-----------------|-------------------------|------------------------| | 基础架构 | CNN | Transformer | | 上下文理解 | 局部特征为主 | 全局关联性强 | | 处理效率 | 高 | 较低 | | 准确率 | 中等到高 | 更高 | 以上是从几个方面对两者进行了比较说明;当然具体实施过程中还需要考虑到硬件资源限制等因素影响实际效果呈现出来的情况可能会有所偏差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Limiiiing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值