RT-DETR改进教程|加入SCNet中的SCConv[CVPR2020]自校准卷积模块!


⭐⭐ RT-DETR改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ⭐⭐


 一、 论文介绍

        论文链接:http://mftp.mmcheng.net/Papers/20cvprSCNet.pdf

        代码链接:https://gitcode.com/MCG-NKU/SCNet/

 文章摘要:

        CNN的最新进展主要致力于设计更复杂的架构来增强其表示学习能力。在本文中,我们考虑在不调整模型架构的情况下改进CNN的基本卷积特征转换过程。为此,我们提出了一种新的自校准卷积,通过内部通信显式扩展每个卷积层的视场,从而丰富输出特征。特别是,与使用小核(例如3 × 3)融合空间和通道信息的标准卷积不同,我们的自校准卷积通过一种新的自校准操作,自适应地在每个空间位置周围构建远程空间和通道间依赖关系。因此,它可以通过显式地结合更丰富的信息来帮助CNN生成更具判别性的表示。我们的自校准卷积设计简单而通用,可以很容易地应用于增加标准卷积层,而无需引入额外的参数和复杂性。大量的实验表明,当将我们的自校准卷积应用于不同的主干时,基线模型可以在各种视觉任务中得到显着改进,包括图像识别,目标检测,实例分割和关键点检测,而无需改变网络架构。我们希望这项工作可以为未来的研究提供一种有前途的方法来设计新的卷积特征变换,以改进卷积网络。

总结:作者设计了一个即插即用的自校准卷积模块来替代普通的卷积块,称为SC模块(Self-Calibrated Convolutions), 感受野更大,可以关注到更多的上下文信息;使用方便,可以像普通卷积模块一样使用,不需要引入多余参数,适用于多种任务。


二、 加入到RT-DETR中

2.1 复制代码

        复制代码粘到ultralytics->nn->modules->conv.py文件中,在顶部导入torch.nn.functional包,(torch.nn.functional as F),将代码粘贴于下方,并在__all__中声明,如下图所示:

import torch.nn.functional as F__all__ = ("Conv","Conv2","LightConv","DWConv","DWConvTranspose2d","ConvTranspose","Focus","GhostConv","ChannelAttention","SpatialAttention","CBAM","Concat","RepConv","SCConv",
)class SCConv(nn.Module):def __init__(self, inplanes, planes, stride, padding, dilation, groups, pooling_r, norm_layer):super(SCConv, self).__init__()self.k2 = nn.Sequential(nn.AvgPool2d(kernel_size=pooling_r, stride=pooling_r),nn.Conv2d(inplanes, planes, kernel_size=3, stride=1,padding=padding, dilation=dilation,groups=groups, bias=False),eval(norm_layer)(planes),)self.k3 = nn.Sequential(nn.Conv2d(inplanes, planes, kernel_size=3, stride=1,padding=padding, dilation=dilation,groups=groups, bias=False),eval(norm_layer)(planes),)self.k4 = nn.Sequential(nn.Conv2d(inplanes, planes, kernel_size=3, stride=stride,padding=padding, dilation=dilation,groups=groups, bias=False),eval(norm_layer)(planes),)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 out

2.2 更改modules.__init__.py文件 

       打开ultralytics->nn->modules->__init__.py,在第64行与81行加入SCConv进行声明。

2.3 更改task.py文件 

        打开ultralytics->nn路径下的tasks.py文件,首先在第51行加入SCConv导入模块,然后在第928行(或其他合适的位置)加入下方代码:

   elif m is SCConv:c2 = args[0]c1 = ch[f]args = [c1, c2, *args[1:]]

 2.4 更改yaml文件 

        创建yaml文件,使用SCConv替换yaml文件中原有的Conv模块。

# Ultralytics YOLO 🚀, AGPL-3.0 license
# RT-DETR-l object detection model with P3-P5 outputs. For details see https://docs.ultralytics.com/models/rtdetr# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n-cls.yaml' will call yolov8-cls.yaml with scale 'n'# [depth, width, max_channels]l: [1.00, 1.00, 1024]backbone:# [from, repeats, module, args]- [-1, 1, HGStem, [32, 48]] # 0-P2/4- [-1, 6, HGBlock, [48, 128, 3]] # stage 1- [-1, 1, DWConv, [128, 3, 2, 1, False]] # 2-P3/8- [-1, 6, HGBlock, [96, 512, 3]] # stage 2- [-1, 1, DWConv, [512, 3, 2, 1, False]] # 4-P3/16- [-1, 6, HGBlock, [192, 1024, 5, True, False]] # cm, c2, k, light, shortcut- [-1, 6, HGBlock, [192, 1024, 5, True, True]]- [-1, 6, HGBlock, [192, 1024, 5, True, True]] # stage 3- [-1, 1, DWConv, [1024, 3, 2, 1, False]] # 8-P4/32- [-1, 6, HGBlock, [384, 2048, 5, True, False]] # stage 4head:- [-1, 1, Conv, [256, 1, 1, None, 1, 1, False]] # 10 input_proj.2- [-1, 1, AIFI, [1024, 8]]- [-1, 1, Conv, [256, 1, 1]] # 12, Y5, lateral_convs.0- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [7, 1, Conv, [256, 1, 1, None, 1, 1, False]] # 14 input_proj.1- [[-2, -1], 1, Concat, [1]]- [-1, 3, RepC3, [256]] # 16, fpn_blocks.0- [-1, 1, SCConv, [256, 1, 1, 1, 1, 4, 'nn.BatchNorm2d']] # 17, Y4, lateral_convs.1- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [3, 1, Conv, [256, 1, 1, None, 1, 1, False]] # 19 input_proj.0- [[-2, -1], 1, Concat, [1]] # cat backbone P4- [-1, 3, RepC3, [256]] # X3 (21), fpn_blocks.1- [-1, 1, Conv, [256, 3, 2]] # 22, downsample_convs.0- [[-1, 17], 1, Concat, [1]] # cat Y4- [-1, 3, RepC3, [256]] # F4 (24), pan_blocks.0- [-1, 1, Conv, [256, 3, 2]] # 25, downsample_convs.1- [[-1, 12], 1, Concat, [1]] # cat Y5- [-1, 3, RepC3, [256]] # F5 (27), pan_blocks.1- [[21, 24, 27], 1, RTDETRDecoder, [nc]] # Detect(P3, P4, P5)

 2.5 修改train.py文件

        在train.py脚本中填入创建好的yaml路径,运行即可训练。

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

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

相关文章

微信小程序 - - - - - custom-tab-bar使用自定义tabbar

custom-tab-bar使用自定义tabbar 1. 创建custom-tab-bar组件2. 修改app.json3. tabbar对应页面调整 1. 创建custom-tab-bar组件 各个文件代码如下 /custom-tab-bar/data.js export default [{text: 流水笺,iconPath: /assets/icon/bill.png,selectedIconPath: /assets/icon/bi…

huggingface datasets离线加载文件的解决方案

介绍 Hugging Face Datasets是一个用于加载和处理自然语言处理(NLP)和计算机视觉(CV)数据集的库。它提供了一种统一的API来访问各种数据集,包括来自Hugging Face Hub、本地文件和远程URL。 然而,在离线环…

前端 performance api使用 —— mark、measure计算vue3页面echarts渲染时间

文章目录 ⭐前言💖vue3系列文章 ⭐Performance api计算持续时间💖 mark用法💖 measure用法 ⭐计算echarts渲染的持续时间⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端 performance api使用 —— mark、measure计…

Java网络编程之TCP协议核心机制(一)

目录 题外话 正题 TCP协议核心机制 1.确认应答机制 2.超时重传 3.连接管理 三次握手(建立数据连接)和四次挥手(断开连接) 三次握手 三次握手的意义 为什么不能是四次挥手和两次挥手呢??? 四次挥手(断开连接) 四次挥手的意义 四次挥手能变为三次挥手吗? 小结 题…

leetcode题目9

回文数 简单 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数:是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 思路 对于数字进行反转&a…

基础环境配置

IP地址设置 修改Ip地址 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" # 设置为静态ip static DEFROUTE"yes" IPV4_FAILURE_FATAL"no&qu…

「TypeScript系列」TypeScript 运算符

文章目录 一、TypeScript 运算符二、TypeScript 算术运算符1. 基本算术运算2. 复合赋值运算符3. 自增和自减运算符4. 幂运算符 三、TypeScript 关系运算符四、TypeScript 逻辑运算符五、TypeScript 位运算符六、TypeScript 赋值运算符七、相关链接 一、TypeScript 运算符 Type…

string功能介绍(普及版)

目录 1。初始化(好几种方式),npos和string的使用说明 2。string的拷贝,隐式类型转换,[],size,iterator,begin,end,reverse,reverse_iterator&am…

WLAN技术

冲突域:连接在同一传输线缆上的所有工作站的集合,或者说是同一物理网段上所有节点的集合共同竞争网络资源形成的域叫冲突域。 在OSI模型中,冲突域被看作是第一层的概念,连接同一冲突域的设备有中继器、集线器(hub&…

Redis:常用命令

文章目录 get和setRedis全局命令keysexistsdelexpirettlRedis的删除策略 本篇开始对于Redis的命令进行学习,当然只是学习一些常见的 get和set Redis中是使用键值对来进行存储的,所以get是根据key来取Value的,而set是来设置键值对的 set s…

mysql--表管理

mysql–表管理 查看建表语法:help create table; 查看建表语句:show create table xxxx; 查看表结构信息: show columns from xxxx 或desc xxxx; 查看索引信息 : show index from mysql.db; 查看修改表的语法 : help alter table; 添加列 : alter table users add (email…

基于springboot实现的家具销售电商平台

开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…

Flutter 中的 GridTile 小部件:全面指南

Flutter 中的 GridTile 小部件:全面指南 在Flutter的Material组件库中,GridTile是一个用于创建网格列表项的组件,它允许开发者以网格的形式展示信息,通常用于展示图片、图标或者一些关键信息。GridTile常用于GridTileBar中&#…

DELL服务器配置ILO(idrac)地址、修改管理员密码

服务器型号:DELL PowerEdge R630 1、重启服务器选择F2进入BIOS 2、重启服务器选择F2进入BIOS 3、选择“Network” 4、配置iDRAC的IP,掩码网关,DNS等信息 5、Esc返回,下滑选择“User Configuration” 6、配置iDRAC的用户名密码以及…

Mybatis INSERT ... ON DUPLICATE KEY UPDATE 语句进行批量插入或更新时

Product.java public class Product {private Integer productId;private String productName;private Integer quantity;// getters and setters ... }ProductMapper.xml <mapper namespace"com.example.mapper.ProductMapper"><!-- 其他的SQL映射和操作…

Spring Boot集成Ldap快速入门Demo

1.Ldap介绍 LDAP&#xff0c;Lightweight Directory Access Protocol&#xff0c;轻量级目录访问协议. LDAP是一种特殊的服务器&#xff0c;可以存储数据数据的存储是目录形式的&#xff0c;或者可以理解为树状结构&#xff08;一层套一层&#xff09;一般存储关于用户、用户…

WD—C++课前作业—30题

怎么会手和脚都在桌子上 目录 31&#xff0c;声明一个类 String,其数据成员为 char head[100],构造函数 String(char*Head)实现 head 的初始化&#xff0c;成员函数 void reverse()实现 head 内字符串的逆序存放&#xff0c;成员函数 void print()实现 head 内字符串的输出。…

01基础篇

1、初识 JVM 1.1 什么是 JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 编写Java源代码文件。使用…

Linux chkconfig命令教程:管理系统服务的利器(附实例详解和注意事项)

Linux chkconfig命令介绍 chkconfig命令在Linux中用于列出所有可用的服务并查看或更新它们的运行级别设置。简单来说&#xff0c;它用于列出服务的当前启动信息&#xff0c;更新服务的运行级别设置&#xff0c;以及从管理中添加或删除服务。 Linux chkconfig命令适用的Linux版…

Python轻量级Web框架Flask(14)—— 自己做Flask项目总结

0、前言&#xff1a; 本文意在记录自己在做毕业Flask项目开发时遇到的一些问题&#xff0c;并将问题解决方案记录下来&#xff0c;可做日后查询本文也会记录自己做FLask项目时实现的一些功能&#xff0c;作为开发工作的进程记录注意&#xff1a;用Flask开发的前提是已经设计好…