YOLOv5改进 | 卷积模块 | 无卷积步长用于低分辨率图像和小物体的新 CNN 模块SPD-Conv

 秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录: 《YOLOv5入门 + 改进涨点》专栏介绍 & 专栏目录 |目前已有50+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进


卷积神经网络(CNNs)在许多计算机视觉任务中取得了巨大成功,图像分类和目标检测。然而,在处理更复杂的任务时,如图像分辨率低或目标小的情况下,它们的性能会迅速下降。这一问题的根源在于现有CNN架构中一个有缺陷但常见的设计,即使用步进卷积和/或池化层,这导致了细粒度信息的丢失和次优特征表示的学习。为此,研究人员提出了一个新的CNN构建模块,称为SPD-Conv,以取代每个步进卷积层和每个池化层(从而完全消除它们)。SPD-Conv由一个空间到深度(SPD)层和一个非步进卷积(Conv)层组成,并且可以被应用于大多数甚至所有的CNN架构中。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址YOLOv5改进+入门——持续更新各种有效涨点方法——点击即可跳转  订阅专栏学习不迷路 

目录

1.原理

2. 将SPD-Conv代码添加到YOLOv5中

2.1 SPD-Conv代码实现

2.2 新增yaml文件

2.3 注册模块

2.4 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结 


1.原理

论文地址: No More Strided Convolutions or Pooling: A New CNN Building Block for Low-Resolution Images and Small Objects——点击即可跳转

官方代码: 官方代码仓库——点击即可跳转

SPD-Conv(空间到深度卷积)是卷积神经网络(CNN)的一个新的构建块,旨在解决由于传统使用步幅卷积和池化层而导致的低分辨率图像和小物体检测的性能下降问题。下面详细解释其主要原理:

SPD-Conv 的关键原理

传统 CNN 的问题:

  • 传统 CNN 通常使用步幅卷积和池化层来对特征图进行下采样。虽然这减少了特征图的空间维度,但也会导致细粒度信息的大量丢失。

  • 这种信息丢失在涉及低分辨率图像或小物体的任务中尤其有害,因为在这些任务中,保持细节对于准确的分类和检测至关重要。

SPD-Conv 设计:

  • 空间到深度 (SPD) 转换:

  • SPD 层通过增加通道维度来减少特征图的空间维度,但保留所有信息。此转换可确保在下采样期间不会丢失任何信息。

  • 对于大小为 S \times S \times C1 的特征图 (X),SPD 通过将 (X) 切成较小的网格并沿通道维度重新排列这些网格来创建子特征图。例如,在下采样因子为 2 的情况下,S \times S \times C1 特征图将转换为 \frac{S}{2} \times \frac{S}{2} \times 4C1 特征图。

  • 非步进卷积:

  • 在 SPD 层之后,应用非步进卷积层(步进 = 1),将增加的通道数量减少到可管理的大小,同时保持空间分辨率。这确保保留了判别性特征,而不会出现步进卷积会引入的不对称采样或信息丢失。

在 CNN 架构中的应用:

  • SPD-Conv 取代了 CNN 架构中所有步进卷积和池化层。

  • 只需进行少量修改,即可应用于大多数现有的 CNN 架构,使其成为各种计算机视觉任务的通用统一解决方案。

实证评估:

  • SPD-Conv 已通过将其集成到  ResNet(用于图像分类)等流行模型中进行测试。

  • 结果显示准确度和性能显著提高,尤其是在涉及低分辨率图像和小物体的任务上。例如,ResNet-SPD 变体在这些具有挑战性的场景中表现优于传统变体。

SPD-Conv 的优势

  • 无信息丢失:通过将空间细节转换为通道维度,SPD-Conv 避免了传统步幅卷积和池化层中发生的信息丢失。

  • 性能提升:对于低分辨率图像和小物体检测特别有效,可在具有挑战性的条件下实现更好的准确性和鲁棒性。

  • 多功能性:可以集成到各种 CNN 架构中,使其成为计算机视觉深度学习模型的广泛适用的改进。

总结

SPD-Conv 用空间到深度变换和非步幅卷积的组合取代了 CNN 中的步幅卷积和池化层。这种创新方法保留了细粒度信息,增强了特征表示,并显著提高了涉及低分辨率图像和小物体的任务的性能。

2. 将SPD-Conv代码添加到YOLOv5中

2.1 SPD-Conv代码实现

关键步骤一: 将下面代码添加到 yolov5/models/common.py中

class SPDConv(nn.Module):"""Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""default_act = nn.SiLU()  # default activationdef __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):"""Initialize Conv layer with given arguments including activation."""super().__init__()c1 = c1 * 4self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):x = torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)"""Apply convolution, batch normalization and activation to input tensor."""return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):"""Perform transposed convolution of 2D data."""x = torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)return self.act(self.conv(x))

 并将该文件中的第一个函数autopad修改为


def autopad(k, p=None, d=1):  # kernel, padding, dilation# Pad to 'same' shape outputsif d > 1:k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-padreturn p

SPD-Conv,即空间到深度卷积,是一种新的构建块,旨在通过解决步进卷积和池化层的局限性来改进卷积神经网络 (CNN) 中的图像处理,尤其是在处理低分辨率图像和小物体时。以下是其主要原理及其处理图像方式的概述:

SPD-Conv 的主要原理:

消除步进卷积和池化

  • 传统 CNN 使用步进卷积和池化层对特征图进行下采样,这可能导致细粒度信息的丢失。在处理低分辨率图像或检测小物体时,这种损失是有害的。

空间到深度 (SPD) 层

  • SPD 层通过对特征图进行下采样而不丢失信息来取代步进卷积。它将空间维度转换为通道维度,从而保留所有信息。

  • 对于大小为 S \times S \times C_1 的特征图 ( X ),SPD 将其划分为多个子图。例如,如果比例因子为 2,则将图划分为四个子图。然后沿通道维度连接这些子图,以减小空间维度,同时将通道数增加比例因子平方的倍数。

非步进卷积:

  • 在 SPD 变换之后,应用非步进卷积层。该层处理由 SPD 生成的高维特征图以提取特征并使用可学习参数降低通道维数。

使用 SPD-Conv 的图像处理流程:

输入特征图:

  • 从大小为 S \times S \times C_1 的中间特征图 ( X ) 开始。

空间到深度转换

  • 通过将 ( X ) 划分为子图来应用 SPD 转换。对于比例因子 2,创建四个子图 f{0,0}, f{1,0}, f{0,1}, f{1,1},每个子图的大小为 \left(\frac{S}{2}, \frac{S}{2}, C_1\right)

  • 沿通道维度连接这些子图,得到一个新的特征图 ( X' ),其大小为 \left(\frac{S}{2}, \frac{S}{2}, 4C_1\right)

非步进卷积

  • 将 (X') 传递到非步进卷积层以提取特征并将通道数减少到可管理的大小。

特征提取

  • 处理后的特征图用于 CNN 的后续层,用于对象检测和图像分类等任务。

SPD-Conv 的优势:

信息保留:

  • 与步进卷积和池化不同,SPD-Conv 通过将空间信息转换为通道维度来保留原始特征图中的所有信息。

在小物体和低分辨率图像上的性能提升

  • 通过避免丢失细粒度细节,SPD-Conv 增强了模型检测小物体和有效处理低分辨率图像的能力。

通用和统一方法

  • SPD-Conv 可以集成到各种 CNN 架构中,统一替换步进卷积和池化层。

应用和结果:

  • 物体检测

  • 本文使用流行的物体检测模型 YOLOv5 评估 SPD-Conv,创建了一个名为 YOLOv5-SPD 的变体。此变体在平均精度 (AP) 方面显示出显着的改进,尤其是对于小物体和低分辨率图像。

  • 图像分类

  • 本文还将 SPD-Conv 应用于 ResNet 架构 (ResNet18-SPD 和 ResNet50-SPD),在 Tiny ImageNet 和 CIFAR-10 等数据集的分类任务中展示了增强的性能。

SPD-Conv 的创新方法为传统 CNN 设计的局限性提供了强大的解决方案,使其成为基于深度学习的计算机视觉任务的宝贵补充。

2.2 新增yaml文件

关键步骤二在下/yolov5-6.1/models下新建文件 yolov5_SPDConv.yaml并将下面代码复制进去

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2[-1, 1, SPDConv, [128]],  # 1-P2/4[-1, 3, C3, [128]],[-1, 1, SPDConv, [256]],  # 3-P3/8[-1, 6, C3, [256]],[-1, 1, SPDConv, [512]],  # 5-P4/16[-1, 9, C3, [512]],[-1, 1, SPDConv, [1024]],  # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]],  # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, SPDConv, [256]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, SPDConv, [512]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

温馨提示:本文只是对yolov5基础上添加模块,如果要对yolov5n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple# YOLOv5s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.3 注册模块

关键步骤三在yolo.py的parse_model函数中注册 添加“SPDConv",

2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_SPDConv.yaml的路径

建议大家写绝对路径,确保一定能找到

🚀运行程序,如果出现下面的内容则说明添加成功🚀 

           from  n    params  module                                  arguments0                -1  1      7040  models.common.Conv                      [3, 64, 6, 2, 2]1                -1  1     33024  models.common.SPDConv                   [64, 128]2                -1  3    156928  models.common.C3                        [128, 128, 3]3                -1  1    131584  models.common.SPDConv                   [128, 256]4                -1  6   1118208  models.common.C3                        [256, 256, 6]5                -1  1    525312  models.common.SPDConv                   [256, 512]6                -1  9   6433792  models.common.C3                        [512, 512, 9]7                -1  1   2099200  models.common.SPDConv                   [512, 1024]8                -1  3   9971712  models.common.C3                        [1024, 1024, 3]9                -1  1   2624512  models.common.SPPF                      [1024, 1024, 5]10                -1  1    525312  models.common.Conv                      [1024, 512, 1, 1]11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']12           [-1, 6]  1         0  models.common.Concat                    [1]12           [-1, 6]  1         0  models.common.Concat                    [1]13                -1  3   2757632  models.common.C3                        [1024, 512, 3, False]13                -1  3   2757632  models.common.C3                        [1024, 512, 3, False]14                -1  1    131584  models.common.Conv                      [512, 256, 1, 1]15                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']16           [-1, 4]  1         0  models.common.Concat                    [1]17                -1  3    690688  models.common.C3                        [512, 256, 3, False]18                -1  1    262656  models.common.SPDConv                   [256, 256]19          [-1, 14]  1         0  models.common.Concat                    [1]20                -1  3   2495488  models.common.C3                        [512, 512, 3, False]21                -1  1   1049600  models.common.SPDConv                   [512, 512]22          [-1, 10]  1         0  models.common.Concat                    [1]23                -1  3   9971712  models.common.C3                        [1024, 1024, 3, False]24      [17, 20, 23]  1    457725  Detect                                  [80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [256, 512, 1024]]

3. 完整代码分享

https://pan.baidu.com/s/1OzzOx1Cxs4YUxeM79VF8fg?pwd=xhit

提取码: xhit 

4. GFLOPs

关于GFLOPs的计算方式可以查看百面算法工程师 | 卷积基础知识——Convolution

未改进的GFLOPs

img

改进后的GFLOPs

现在手上没有卡了,等过段时候有卡了把这补上,需要的同学自己测一下

5. 进阶

可以结合损失函数或者卷积模块进行多重改进

YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocuSIoU等多种损失函数——点击即可跳转

6. 总结 

SPD-Conv(Space-to-Depth Convolution)通过空间到通道的转换和非步幅卷积来代替传统的步幅卷积和池化层,解决了低分辨率图像和小物体检测中信息丢失的问题。SPD-Conv首先将特征图分割成多个子图,并沿着通道维度重新排列这些子图,从而减小空间维度但保留所有信息。接着,通过非步幅卷积处理这些高维特征图,提取特征并减少通道维度。这样,SPD-Conv在不丢失细节信息的情况下,实现了特征图的下采样,提高了在低分辨率图像和小物体检测任务中的表现,同时能够无缝集成到各种现有的卷积神经网络架构中。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ WARN:0@0.014] global loadsave.cpp:248 cv::findDecoder imread_

[ WARN:00.014] global loadsave.cpp:248 cv::findDecoder imread_ 目录 [ WARN:00.014] global loadsave.cpp:248 cv::findDecoder imread_ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰…

20240729 每日AI必读资讯

Meta科学家最新采访,揭秘Llama 3.1是如何炼成的 - Llama 3.1都使用了哪些数据?其中有多少合成数据?为什么不使用MoE架构?后训练与RLHF流程是如何进行的?模型评估是如何进行的? - 受访者Thomas Scialom现任…

Go语言教程(一看就会)

全篇文章 7000 字左右, 建议阅读时长 1h 以上。 Go语言是一门开源的编程语言,目的在于降低构建简单、可靠、高效软件的门槛。Go平衡了底层系统语言的能力,以及在现代语言中所见到的高级特性。它是快速的、静态类型编译语言。 第一个GO程序…

嵌入式人工智能(32-基于树莓派4B的旋转编码器-EnCoder11)

1、旋转编码器 旋转编码器是一种输入设备,通常用于测量和控制旋转运动。它由一个旋转轴和一系列编码器组成。旋转编码器可以根据旋转轴的位置和方向来测量旋转角度,并将其转化为电子信号输出。 旋转编码器通常分为两种类型:绝对值编码器和增…

嵌入式学习Day13---C语言提升

目录 一、二级指针 1.1.什么是二级指针 2.2.使用情况 2.3.二级指针与数组指针 二、指针函数 2.1.含义 2.2.格式 2.3.注意 2.4.练习 三、函数指针 3.1.含义 3.2.格式 3.3.存储 3.4.练习 ​编辑 四、void*指针 4.1.void缺省类型 4.2.void* 4.3.格式 4.4.注…

H3CNE(OSPF动态路由)

目录 7.1 静态路由的缺点与动态路由分类 7.1.1 静态路由的缺点 7.1.2 动态路由的分类 7.2 OSPF基础 7.2.1 OSPF的区域 ​编辑 7.2.2 Router-id 7.2.3 开销-Cost or Metric 7.2.4 路由转发 7.3 OSPF邻居表建立过程 7.3.1 五种包 7.3.2 建立邻居表的第一步 7.3.3 邻居建立…

模拟实现短信登录功能 (session 和 Redis 两种代码实例) 带前端演示

目录 整体流程 发送验证码 短信验证码登录、注册 校验登录状态 基于 session 实现登录 实现发送短信验证码功能 1. 前端发送请求 2. 后端处理请求 3. 演示 实现登录功能 1. 前端发送请求 2. 后端处理请求 校验登录状态 1. 登录拦截器 2. 注册拦截器 3. 登录完整…

RocketMQ事务消息机制原理

RocketMQ工作流程 在RocketMQ当中,当消息的生产者将消息生产完成之后,并不会直接将生产好的消息直接投递给消费者,而是先将消息投递个中间的服务,通过这个服务来协调RocketMQ中生产者与消费者之间的消费速度。 那么生产者是如何…

昇思25天学习打卡营第19天|DCGAN生成漫画头像

DCGAN生成漫画头像总结 实验概述 本实验旨在利用深度卷积生成对抗网络(DCGAN)生成动漫头像,通过设置网络、优化器以及损失函数,使用MindSpore进行实现。 实验目的 学习和掌握DCGAN的基本原理和应用。熟悉使用MindSpore进行图像…

网络协议一 : 搭建tomacat,intellij IDEA Ultimate 的下载,安装,配置,启动, 访问

需要搭建的环境 1.客户端--服务器开发环境 客户端:浏览器(HTMLCSSJS) 服务器:JAVA 1.安装JDK,配置JAVA_HOME 和 PATH 2.安装Tomcat 3.安装IDE--intellij IDEA Ultimate 是旗舰版的意思。 2.TOMCAT 的下载和解…

文件操作相关的精讲

目录: 思维导图 一. 文件定义 二. 文件的打开和关闭 三. 文件的顺序读写操作 四. 文件的随机读写操作 五. 文本文件和二进制文件 六. 文件读取结束的判断 七.文件缓冲区 思维导图: 一. 文件定义 1.文件定义 C语言中,文件是指一组相…

Java中的二叉搜索树(如果想知道Java中有关二叉搜索树的知识点,那么只看这一篇就足够了!)

前言:Java 提供了丰富的数据结构来处理和管理数据,其中 TreeSet 和 TreeMap 是基于红黑树实现的集合和映射接口。它们有序地存储数据,提供高效的搜索、插入和删除操作。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…

web基础,http协议,apache概念及nginx

一、web相关概念 Web,全称World Wide Web,通常简称为WWW、Web或万维网,是一个基于超文本和HTTP(超文本传输协议)的、全球性的、动态交互的、跨平台的分布式图形信息系统。它起源于1989年,由英国科学家蒂姆…

文本编辑三剑客(grep)

目录 正则表达式 元字符 grep 案例 我在编写脚本的时候发现,三个文本编辑的命令(grep、sed、awk,被称为文本编辑三剑客,我习惯叫它三巨头)用的还挺多的,说实话我一开始学的时候也有些懵,主要…

(史上最全的)Spring6框架学习教程

一、什么是Spring 1.javaWeb框架发展史 1、ServletJSPJavaBean(跳转页面、业务逻辑判断、数据库查询) 2、MVC三层架构(M Model pojo(User)V-view(USP)C-(controller-servlet)) (web-跳转页面service-业务逻辑判断 new UserService0;dao-数据库查询 new UserDao(); ) 3、使用…

二、八、十、十六进制介绍及相互转换

目录 1、引言: 2、进制介绍及区分 2.1 介绍 2.2 区分 2.3 各进制的数字组成 3、2进制与10进制 3.1 十进制的介绍 3.2 二进制的介绍 4、2进制与10进制的转换 4.1 二进制转十进制 4.2 十进制转二进制 5、8进制和16进制 5.1 八进制的介绍 5.2 十六进制的介…

告别抠图烦恼,1秒搞定100张图片背景更换!

想象一下,你手头有几十张甚至上百张证件照需要从白底换成蓝底,而你只能用Photoshop一张张抠图,调整,然后保存。这个过程不仅耗时,还容易出错,特别是当你急需处理大量图片时,简直让人抓狂。 千鹿…

“云+端”体系覆盖590余所学校,张家口如何建设“教育一朵云”?

当将装有小苏打的气球套在装有白醋的塑料瓶瓶口时,一场令人惊叹的化学反应开始上演——瓶内瞬间白雾腾起弥漫,气泡翻滚不息,气球逐渐吹了起来......这是在张家口教育云平台上的由学生及家长上传的关于“小苏打吹气球”的科学实验视频,而学生们与家长参与的便是张家口市中小学云…

昇思MindSpore学习入门-静态图高级编程技巧二

如何优化执行性能 使用jit_class 使用场景:使用jit_class装饰器修饰自定义类,提高执行性能。jit_class应用于静态图模式,在动态图模式下,jit_class会被忽略,不影响动态图模式的执行逻辑。 jit_class的介绍 用户在网…

快递代拿系统/快递代领系统

摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括快递代拿系统的网络应用,在外国快递代拿已经是很普遍的方式,不过国内的快递代拿可能还处于起步阶段。快递代拿系统具有代取物品功能。快递代拿系…