前言本文介绍了一种名为SPD-Conv的新型CNN构建块及其在YOLO26中的结合。传统CNN在处理低分辨率图像或小物体时因使用步长卷积和池化层导致细粒度信息丢失、性能下降。SPD-Conv由空间到深度SPD层和非步长卷积Conv层组成完全消除卷积步长和池化层避免信息损失。SPD层重排特征图元素将空间信息转换到深度维度非步长卷积层进一步处理特征图。我们将SPD-Conv集成进YOLO26实验证明其在低分辨率图像和小物体检测任务上显著优于现有模型。文章目录 YOLO26改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLO26改进专栏文章目录前言介绍摘要创新点文章链接基本原理核心代码YOLO26引入代码tasks注册步骤1导包步骤2配置 yolo26-SPDConv.yaml实验脚本结果介绍摘要卷积神经网络CNNs在许多计算机视觉任务中取得了巨大成功例如图像分类和目标检测。然而当面对图像分辨率低或对象较小的更加困难的任务时它们的性能迅速下降。在本文中我们指出这一问题根源于现有CNN架构中一个有缺陷但常见的设计即使用了步长卷积和/或池化层这导致了细粒度信息的丢失和较不有效的特征表示的学习。为此我们提出了一种新的CNN构建块名为SPD-Conv用以替代每个步长卷积层和每个池化层从而完全消除它们。SPD-Conv由一个空间到深度SPD层和一个非步长卷积Conv层组成并且可以应用于大多数如果不是全部的话CNN架构中。我们在两个最具代表性的计算机视觉任务下解释这一新设计目标检测和图像分类。然后我们通过将SPD-Conv应用于YOLOv5和ResNet来创建新的CNN架构并通过实验证明我们的方法特别是在图像分辨率低和小对象的困难任务上显著优于最先进的深度学习模型。我们已经在开放源代码。创新点SPD-Conv的创新点在于其独特的设计理念和结构它旨在解决当处理低分辨率图像或小物体时传统卷积神经网络CNN性能下降的问题。以下是SPD-Conv的主要创新点完全消除卷积步长和池化层传统CNN中卷积步长和池化层被广泛用于减小特征图的空间尺寸以减少计算量和增加感受野。然而这种设计会导致细粒度信息的损失特别是在处理低分辨率图像和小物体时。SPD-Conv通过完全摒弃这些操作避免了信息损失有助于保持更多的细节和特征信息。空间到深度(SPD)层SPD-Conv包含一个SPD层该层通过重排特征图的元素将空间信息转换到深度通道维度从而实现下采样而不损失信息。这种方法保留了通道维度中的所有信息避免了传统下采样方法中的信息丢失。非步长卷积层在SPD层之后SPD-Conv使用非步长(即步长为1的卷积层进一步处理特征图。这种设计允许网络在不丢失空间信息的前提下通过可学习的参数精细调整特征表示有助于提高模型对小物体和低分辨率图像的处理能力。通用性和统一性SPD-Conv不仅可以替代CNN中的卷积步长和池化层还能广泛应用于各种CNN架构中提供一种统一的改进策略。这增加了SPD-Conv的适用范围和灵活性使其能够在不同的深度学习任务和模型中发挥作用。性能提升通过在目标检测和图像分类任务中的应用和验证SPD-Conv展现了其在处理低分辨率图像和小物体时相比传统CNN模型的显著性能提升。这证明了其设计理念在实际应用中的有效性和优势。文章链接论文地址论文地址代码地址代码地址基本原理SPD-Con是一种创新的模块旨在现有卷积神经网络CNN架构中替代传统的步进卷积及池化层。该结构包括一个空间到深度SPD层及一个非步进卷积Conv层。空间到深度SPD层的功能在于将输入特征图中的空间维度降维至通道维度同时确保通道信息的完整性。具体通过将输入特征图的每一像素或特征映射至独立通道来实现此过程中空间维度缩减而通道维度相应扩增。非步进卷积Conv层执行标准的卷积操作紧随SPD层之后进行。不同于步进卷积非步进卷积不在特征图上进行滑动而是对每个像素或特征映射执行卷积操作。这有助于缓解SPD层可能导致的过度下采样问题保留更丰富的细节信息。SPD-Conv通过串联SPD层与Conv层的方式进行组合。具体而言输入特征图首先经SPD层转换其输出随后通过Conv层进行卷积处理。该组合策略在不丧失信息的前提下有效减少空间维度尺寸保持通道信息从而提升CNN在低分辨率图像及小型物体检测上的性能。通常对于任意给定的原始特征映射(X)子映射(f_{x,y})由特征图(X(i, j))中(i x)和(j y)可被比例因子整除的所有特征映射组成。因而每个子图实现了对(X)的比例因子下采样。例如当比例因子为2时可以得到四个子映射(f_{0,0}, f_{1,0}, f_{0,1}, f_{1,1})它们的尺寸为((S/2, S/2, C_1))对(X)实现2倍下采样。随后这些子特征映射沿通道维度进行连接形成一个新的特征映射(X’)其空间维度按比例因子减少而通道维度按比例因子2增加。SPD借鉴了一种原始图像转换技术用于在CNN内部及其整体中对特征映射进行下采样如此操作。考虑任意尺寸为(S \times S \times C_1)的中间特征映射(X)其子特征映射序列按上述方式进行切割。核心代码classspace_to_depth(nn.Module): space_to_depth类继承自nn.Module用于实现空间到深度的转换这种转换通过重排输入张量的元素来降低其空间维度 同时增加深度维度常用于深度学习中对图像进行下采样。 参数: dimension: 用于指定转换的维度默认为1。此参数设置转换操作的深度维度增加的倍数。 def__init__(self,dimension1): 初始化space_to_depth模块。 参数: dimension: 转换的维度决定了深度增加的倍数默认值为1。 super().__init__()# 调用父类的构造函数来进行初始化self.ddimension# 保存维度参数defforward(self,x): 前向传播函数实现输入x的空间到深度的转换。 通过将输入张量x的空间维度重新排列到深度维度来实现转换具体操作是将x的高和宽每隔一个像素取一个形成四个部分 然后将这四个部分在深度通道维度上进行拼接。 参数: x: 输入张量需要进行空间到深度转换的数据。 返回: 转换后的张量其空间维度减小深度维度增加。 # 对输入x进行空间到深度的转换操作并在指定维度上进行拼接returntorch.cat([x[...,::2,::2],x[...,1::2,::2],x[...,::2,1::2],x[...,1::2,1::2]],1)YOLO26引入代码在根目录下的ultralytics/nn/目录新建一个conv目录然后新建一个以SPDConv为文件名的py文件 把代码拷贝进去。importtorch.nnasnnimporttorchclassspace_to_depth(nn.Module):# Changing the dimension of the Tensordef__init__(self,dimension1):super().__init__()self.ddimensiondefforward(self,x):returntorch.cat([x[...,::2,::2],x[...,1::2,::2],x[...,::2,1::2],x[...,1::2,1::2]],1)tasks注册在ultralytics/nn/tasks.py中加入以下代码步骤1导包from ultralytics.nn.conv.SPDConv import space_to_depth步骤2修改def parse_model(d, ch, verboseTrue):只需要添加截图中标明的其他没有的模块不需要添加elifmisspace_to_depth:c24*ch[f]配置 yolo26-SPDConv.yamlultralytics/cfg/models/26/yolo26-SPDConv.yaml# Ultralytics AGPL-3.0 License - https://ultralytics.com/license# Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs# Model docs: https://docs.ultralytics.com/models/yolo26# Task docs: https://docs.ultralytics.com/tasks/detect# Parametersnc:80# number of classesend2end:True# whether to use end-to-end modereg_max:1# DFL binsscales:# model compound scaling constants, i.e. modelyolo26n.yaml will call yolo26.yaml with scale n# [depth, width, max_channels]n:[0.50,0.25,1024]# summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPss:[0.50,0.50,1024]# summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPsm:[0.50,1.00,512]# summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPsl:[1.00,1.00,512]# summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPsx:[1.00,1.50,512]# summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs# YOLO26n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,space_to_depth,[128]]# 1-P2/4-[-1,2,C3k2,[256,False,0.25]]-[-1,1,space_to_depth,[256]]# 3-P3/8-[-1,2,C3k2,[512,False,0.25]]-[-1,1,space_to_depth,[512]]# 5-P4/16-[-1,2,C3k2,[512,True]]-[-1,1,space_to_depth,[1024]]# 7-P5/32-[-1,2,C3k2,[1024,True]]-[-1,1,SPPF,[1024,5,3,True]]# 9-[-1,2,C2PSA,[1024]]# 10# YOLO26n headhead:-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,6],1,Concat,[1]]# cat backbone P4-[-1,2,C3k2,[512,True]]# 13-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,2,C3k2,[256,True]]# 16 (P3/8-small)-[-1,1,Conv,[256,3,2]]-[[-1,13],1,Concat,[1]]# cat head P4-[-1,2,C3k2,[512,True]]# 19 (P4/16-medium)-[-1,1,Conv,[512,3,2]]-[[-1,10],1,Concat,[1]]# cat head P5-[-1,1,C3k2,[1024,True,0.5,True]]# 22 (P5/32-large)-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)实验脚本importwarnings warnings.filterwarnings(ignore)fromultralyticsimportYOLOif__name____main__:# 修改为自己的配置文件地址modelYOLO(./ultralytics/cfg/models/26/yolo26-SPDConv.yaml)# 修改为自己的数据集地址model.train(data./ultralytics/cfg/datasets/coco8.yaml,cacheFalse,imgsz640,epochs10,single_clsFalse,# 是否是单类别检测batch8,close_mosaic10,workers0,optimizerMuSGD,# optimizerSGD,ampFalse,projectruns/train,nameyolo26-SPDConv,)结果