一、本文介绍
本文记录的是基于SimSPPF模块的YOLOv8、YOLOv9、YOLOv10、YOLOv11、RT-DETR目标检测改进方法研究。介绍了SPP
,SPPF
以及SimSPPF
。SimSPPF
的设计更加简化,计算效率更高。
2.1 SPP
空间金字塔池化(Spatial Pyramid Pooling,SPP)
主要是为了解决输入图像尺寸不固定的问题。在传统的卷积神经网络中,通常要求输入图像具有固定的尺寸,这在实际应用中会带来很多不便。而空间金字塔池化能够对不同尺寸的输入图像产生固定长度的输出,使得网络可以接受任意尺寸的图像输入。
原理
- 对于输入的特征图,空间金字塔池化将其划分成不同尺度的子区域。例如,可以将特征图划分成多个不同大小的网格,形成多个层次的空间金字塔结构。
- 对每个子区域分别进行池化操作,例如最大池化或平均池化。这样可以得到不同尺度的特征表示。
- 将不同尺度的池化结果进行拼接,得到一个固定长度的特征向量。这个特征向量可以作为后续全连接层的输入。
特点
- 灵活性:可以处理任意尺寸的输入图像,无需对图像进行裁剪或缩放等预处理操作,保留了图像的原始信息。
- 多尺度特征提取:通过不同尺度的空间金字塔结构,能够提取图像在不同尺度下的特征,增强了网络对不同大小目标的适应能力。
- 减少过拟合:由于可以接受不同尺寸的图像输入,增加了数据的多样性,有助于减少过拟合的风险。
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)
是一种空间金字塔池化的改进版本。
原理
- 首先,将输入特征图划分成多个不同大小的区域。这些区域可以是固定大小的网格,也可以是根据特定规则划分的区域。
- 对每个区域进行快速池化操作,例如最大池化或平均池化。快速池化可以通过一些高效的算法实现,以减少计算时间。
- 将不同尺度的池化结果进行融合,可以通过拼接、相加或其他融合方式。这样得到的融合特征包含了多尺度的信息。
- 最后,将融合后的特征输出,作为后续网络层的输入。
特点
- 高效性:相比传统的空间金字塔池化,
SPPF
在保持相似性能的同时,具有更高的计算效率。它通过对特征图进行更快速的池化操作,减少了计算量和处理时间。 - 多尺度特征融合:与
SPP
一样,SPPF
也能够提取多尺度的特征信息。它将输入特征图划分成不同大小的区域,并进行池化操作,然后将这些不同尺度的池化结果进行融合,得到更丰富的特征表示。 - 灵活性:可以很容易地集成到各种卷积神经网络架构中,适用于不同的任务和应用场景。
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模块
由两个主要部分组成:
- 一系列卷积操作:包括一个初始的
SimConv
卷积层用于将输入特征图进行初步处理,降低通道数为原来的一半。其中SimConv
是一个自定义的卷积模块,包含卷积操作(nn.Conv2d)
、批归一化(nn.BatchNorm2d)
和ReLU激活函数
。它的作用是对输入特征图进行卷积操作以提取特征,并通过批归一化来加速训练过程和提高模型的稳定性,ReLU激活函数
则引入非线性,增强模型的表达能力。 - 多次最大池化和拼接操作:通过多次最大池化操作和拼接操作,实现对不同尺度特征的融合,最后再经过一个
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))
三、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全方位改进目录一览