YOLOv5改进 | 模块缝合 | C3 融合Self-Calibrated Convolutions丰富特征图【CVPR2020】

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


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


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


本文介绍一种新的自校准卷积方法,无需改变网络架构,即可增强CNN的表征能力该方法通过内部通信扩展卷积层的视野,自适应建立长距离的空间和跨通道依赖,从而丰富特征输出。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

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

目录

1. 原理

2. 将C3_SCConv添加到yolov5网络中

2.1 C3_SCConv代码实现

2.2 C3_SCConv的神经网络模块代码解析

2.3 新增yaml文件

2.4 注册模块

2.5 执行程序

3. 完整代码分享 

4. GFLOPs

5. 进阶

6. 总结


1. 原理

论文地址:Improving Convolutional Networks with Self-Calibrated Convolutions——点击即可跳转

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

SCConv(自校准卷积)旨在通过扩大视野并整合更丰富的空间和通道信息来改进传统卷积,而无需修改整体架构或增加复杂性。

SCConv 的关键原则包括:

  1. 内部通信:SCConv 在每个空间位置上实现长距离空间和通道间依赖性,与传统的小核卷积相比,增强了特征图的丰富性。

  2. 异构卷积:滤波器被分成多个部分,每个部分处理不同的任务。一些滤波器对输入进行下采样,执行卷积,然后上采样,允许校准主卷积。

  3. 自校准操作:输入特征图被分成两部分,一部分由标准卷积处理,另一部分经过自校准过程,引入低分辨率嵌入。这种由下采样创建的嵌入会影响原始分辨率空间中的卷积。

  4. 增强的感受野:通过处理多个尺度(低分辨率和高分辨率)的特征图,SCConv 增加了每个卷积层的感受野,使其能够捕获更多的上下文信息。

  5. 无额外参数:尽管 SCConv 有诸多好处,但它不会引入额外参数或显著增加计算复杂度,因此非常高效,并且易于应用于现有网络。

2. 将C3_SCConv添加到yolov5网络中

2.1 C3_SCConv代码实现

关键步骤一: 将下面的代码粘贴到\yolov5\models\common.py中


import torch.nn.functional as Fclass SCConv(nn.Module):# https://github.com/MCG-NKU/SCNet/blob/master/scnet.pydef __init__(self, c1, c2, s=1, d=1, g=1, pooling_r=4):super(SCConv, self).__init__()self.k2 = nn.Sequential(nn.AvgPool2d(kernel_size=pooling_r, stride=pooling_r), Conv(c1, c2, k=3, d=d, g=g, act=False))self.k3 = Conv(c1, c2, k=3, d=d, g=g, act=False)self.k4 = Conv(c1, c2, k=3, s=s, d=d, g=g, act=False)def forward(self, x):identity = xout = torch.sigmoid(torch.add(identity, F.interpolate(self.k2(x), identity.size()[2:]))) # sigmoid(identity + k2)out = torch.mul(self.k3(x), out) # k3 * sigmoid(identity + k2)out = self.k4(out) # k4return outclass Bottleneck_SCConv(Bottleneck):def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):super().__init__(c1, c2, shortcut, g, e)c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1)self.cv2 = SCConv(c_, c2, g=g)class C3_SCConv(C3):def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):super().__init__(c1, c2, n, shortcut, g, e)c_ = int(c2 * e)  # hidden channelsself.m = nn.Sequential(*(Bottleneck_SCConv(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

2.2 C3_SCConv的神经网络模块代码解析

C3_SCConv 类将自校准卷积 (SCConv) 机制集成到经过修改的 C2f 块结构中,增强了其通过扩展的接受场捕获更多上下文信息的能力,同时保持了高效的计算复杂度。

  1. 基础结构(C3 继承)C3_SCConv 继承自 C3 类,后者通常是用于融合深度学习网络中特征的自定义卷积块。这允许基于 SCConv 的块直接替换或增强现有架构中的标准卷积。

  2. Bottleneck_SCConv 集成C3_SCConv 的核心功能是使用 Bottleneck_SCConv,它用 SCConv 替换标准卷积。这种瓶颈结构有助于通过引入缩小的中间表示(c_)来减少参数数量,该中间表示随后使用 SCConv 操作进行扩展。

  3. SCConv 机制C3_SCConv 中的每个瓶颈都使用 SCConv 来:

  • 将卷积滤波器拆分为单独的部分,从而实现多尺度特征提取。

  • 使用下采样生成的低分辨率嵌入来指导原始分辨率空间中的卷积过程,从而改善空间和通道级信息聚合。

  1. Bottleneck_SCConv 的顺序应用C3_SCConv 使用 ModuleList 来包含多个 Bottleneck_SCConv 实例,每个实例负责执行 SCConv 增强的转换。这些按顺序应用以捕获越来越丰富和详细的特征表示。

  2. 特征融合:与 C3 类似,C3_SCConv 块可执行有效的特征融合,但具有 SCConv 增强卷积,这提高了模型收集长距离空间依赖性的能力,使最终的特征图更具辨别性。

总体而言,C3_SCConv 的主要目标是通过将 SCConv 嵌入 C3 块来改进特征表示,从而增强空间和通道特征提取,而不会显着增加计算负荷。

2.3 新增yaml文件

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

  • 目标检测yaml文件 
# Ultralytics YOLOv5 🚀, AGPL-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, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3_SCConv, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3_SCConv, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3_SCConv, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3_SCConv, [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_SCConv, [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_SCConv, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3_SCConv, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3_SCConv, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
  • 语义分割yaml文件
# Ultralytics YOLOv5 🚀, AGPL-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, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3_SCConv, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3_SCConv, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3_SCConv, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3_SCConv, [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_SCConv, [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_SCConv, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3_SCConv, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3_SCConv, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Segment, [nc, anchors, 32, 256]], # Segment (P3, P4, P5)]

2.4 注册模块

关键步骤三在yolo.py的parse_model函数替换添加C3_SCConv

2.5 执行程序

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

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

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

                 from  n    params  module                                  arguments0                -1  1      7040  models.common.Conv                      [3, 64, 6, 2, 2]1                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]2                -1  3    378880  models.common.C3_SCConv                 [128, 128, 3]3                -1  1    295424  models.common.Conv                      [128, 256, 3, 2]4                -1  6   2890752  models.common.C3_SCConv                 [256, 256, 6]5                -1  1   1180672  models.common.Conv                      [256, 512, 3, 2]6                -1  9  17059840  models.common.C3_SCConv                 [512, 512, 9]7                -1  1   4720640  models.common.Conv                      [512, 1024, 3, 2]8                -1  3  24133632  models.common.C3_SCConv                 [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']12           [-1, 6]  1         0  models.common.Concat                    [1]13                -1  3   6299648  models.common.C3_SCConv                 [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   1576960  models.common.C3_SCConv                 [512, 256, 3, False]18                -1  1    590336  models.common.Conv                      [256, 256, 3, 2]19          [-1, 14]  1         0  models.common.Concat                    [1]20                -1  3   6037504  models.common.C3_SCConv                 [512, 512, 3, False]21                -1  1   2360320  models.common.Conv                      [512, 512, 3, 2]22          [-1, 10]  1         0  models.common.Concat                    [1]23                -1  3  24133632  models.common.C3_SCConv                 [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]]
YOLOv5_C3_SCConv summary: 764 layers, 95478397 parameters, 95478397 gradients

3. 完整代码分享 

https://pan.baidu.com/s/1tU2ys_qlK2gmOdr1bPCOXw?pwd=7u5f

 提取码: 7u5f

4. GFLOPs

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

未改进的GFLOPs

img

改进后的GFLOPs

有需要的同学自己测一下

5. 进阶

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

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

6. 总结

自校准卷积 (SCConv) 旨在通过扩展感受野并结合更丰富的上下文信息(包括空间和跨通道信息)来增强传统卷积运算,而无需修改整体网络架构或添加额外参数。它将卷积滤波器划分为多个部分,每个部分都发挥着不同的作用。输入的一部分被下采样并转换为低分辨率嵌入,然后被上采样并用于指导原始分辨率空间中的卷积过程。这种自校准机制使 SCConv 能够捕获长距离空间依赖性和通道间相关性,从而提高特征图的判别能力。该方法增加了感受野,使每个空间位置能够自适应地从更大的区域收集信息,从而生成更详细、更具代表性的特征,同时保持计算效率。

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

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

相关文章

37拼购:电商新风尚,共享双赢的购物革命

随着2024年电商市场的日益繁荣,商品海洋中的同质化问题愈发严峻,消费者在茫茫商海中寻觅独特价值的难度陡增。在此背景下,一种名为“37悦享拼”的创新电商模式横空出世,它巧妙融合了私域社交与电商精髓,旨在打破传统壁…

【Go】-Gin框架

目录 Gin框架简介 简单示例 Gin渲染 HTML渲染 自定义模板函数 静态文件处理 使用模板继承 JSON渲染和XML渲染 获取参数 获取querystring参数 获取form参数 获取Path参数 c.Params.Get c.Params() 参数绑定 文件上传 单个文件上传 参数 多个文件上传 重定向…

无人机应用新纪元:图形工作站配置推荐与硬件解析

低空经济作为国家新兴的战略性产业,正逐步成为经济高质量发展的新动力。据统计,2023年中国低空经济规模达到5059.5亿元,增速为33.8%,预计到2026年有望突破万亿元大关。政府对低空经济的发展高度重视,不仅出台了相关法规…

Ubuntu22.04系统安装opencv步骤简述及问题解决方法

前言 opencv是一个功能强大、开源且跨平台的计算机视觉库,适用于多种编程语言和操作系统,能够帮助开发者构建各种视觉项目。其模块众多,提供了诸多功能,能够进行图像处理、视频处理等等。比如:Highgui模块提供图像用户…

OSSEC搭建与环境配置Ubuntu

尝试使用Ubuntu配置了OSSEC,碰见很多问题并解决了,发表博客让后来者不要踩那么多坑 环境 : server :Ubuntu22.04 64位 内存4GB 处理器4 硬盘60G agent: 1.Windows11 64位 2.Ubuntu22.04 64位 服务端配置 一、配置安装依赖项&…

电源模块测试系统中都可以定制哪些内容?

在电源测试系统中,可以定制的内容相当广泛,以满足不同客户、不同应用场景下的特定需求。以下是一些常见的可定制内容: 1. 测试项目 对于电源模块的基础测试项目而言,一般都无需定制基础测试项目,因为电源模块测试的基…

(k8s)kubernetes 挂载 minio csi 的方式(pod挂载pvc存在csi驱动问题,挂载不上)

一、安装Minio(Minio分布式集群搭建部署_minio集群最少几台-CSDN博客) 生成accessKeyID和secretAccessKey: 二、安装csi-s3插件(在k8s集群上) 首先我们把插件的yaml文件都下载下来,为了保证版本测试的一致性,我们下载…

idea中java及java web项目的常见问题

1、乱码问题,主要有几处地方,需要检查。 ①确保文件编码,其实主要就是在idea启动文件中,增加了 -Dfile.encodingUTF-8的设置 ②编辑器默认编码,都改为UTF-8 ③Tomcat的运行配置,编码也改为UTF-8,同样使用…

Excel文档的读取(1)

熟悉使用Excel的同学应该都知道,在单个Excel表格里想要分商品计算总销售额,使用数据透视表也可以非常快速方便的获得结果。但当有非常大量的Excel文件需要处理时,每一个Excel文件单独去做数据透视也会消耗大量的时间。就算使用Power Query这样…

TCP套接字【网络】

文章目录 代码 创建套接字:(TCP/UDP) int socket(int domain, int type, int protocol);inet_aton,将字符串IP转换成整数IP int inet_aton(const char *cp, struct in_addr *inp);监听套接字:(TCP,服务器…

Vue - 详细介绍vue-qr在线生成二维码组件(Vue2 Vue3)

Vue - 详细介绍vue-qr在线生成二维码组件(Vue2 & Vue3) 在对于二维码生成中有许多组件,下面介绍关于自定义比较高的vue-qr组件,能自定义设置背景颜色、背景图片、背景Gif图、实点和空白区的颜色、中心Logo的图片和边距。 一…

Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题

1:Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题,成功搞定 见这里的文章: https://blog.csdn.net/ppppppppila/article/details/139653675 2: 重装Docker desktop 或者 当打开Docker Desktop时候,启动dock…

新能源汽车 BMS 学习笔记篇——如何选择继电器 MOS 管作为开关

序:继电器和 MOSFET(俗称 MOS 管)都可以用作 BMS(Battery Management System,电池管理系统) 中控制电池充放电的开关,但它们在原理、结构和特性上存在一些区别,以下总结它们之间主要…

什么是APT攻击,有哪些防御策略

在数字化时代,网络安全已成为国家、企业和个人不可忽视的重要议题。其中,高级持续性威胁(APT)攻击以其隐蔽性强、攻击规模大、持续时间长等特点,成为网络安全领域最为棘手的问题之一。面对APT攻击的严峻挑战&#xff0…

27 顺序表 · 链表

目录 一、单链表 (一)概念 1、节点 2、链表的性质 (二)单链表的实现 (三)单链表算法题 1、移除链表元素 2、反转链表 3、链表的中间节点 4、合并两个有序的单链表 5、链表分割 6、链表的回文结构…

vue3+ant design vue实现可编辑表格弹出气泡弹出窗~

1、这里主要是介绍下::v-deep伪元素的作用。用于穿透组件作用域&#xff0c;以便在组件内部修改样式。用来覆盖Ant Design Vue组件库中的样式 <a-table:dataSource"dataList":columns"columns":scroll"{ x: 100% }":pagination"false&q…

react-intl——react国际化使用方案

国际化介绍 i18n&#xff1a;internationalization 国家化简称&#xff0c;首字母首尾字母间隔的字母个数尾字母&#xff0c;类似的还有 k8s(Kubernetes) <br /> React-intl是 React 中最受欢迎的库。 使用步骤 安装 # use npm npm install react-intl -D # use yarn项目…

6.6高斯噪声

在OpenCV联合C中给一张图片添加高斯噪声&#xff08;Gaussian Noise&#xff09;&#xff0c;可以通过生成随机数并在图像的每个像素上加上这些随机数来实现。高斯噪声是一种统计分布服从正态分布的噪声&#xff0c;通常用于模拟自然界的许多物理现象。 示例代码 以下是一个使…

云曦2024秋季开学考

ezezssrf 第一关&#xff1a;md5弱比较 yunxi%5B%5D1&wlgf%5B%5D2 第二关&#xff1a; md5强比较 需要在bp中传参&#xff0c;在hackbar里不行 yunxiiM%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DC V%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_B…

华为HCIA、HCIP和HCIE认证考试明细

华为认证体系包括三个主要等级&#xff1a;HCIA&#xff08;华为认证ICT助理&#xff09;、HCIP&#xff08;华为认证ICT高级工程师&#xff09;和HCIE&#xff08;华为认证ICT专家&#xff09;。每个等级的认证都有其特定的考试内容和费用。 HCIA&#xff08;华为认证ICT助理…