当前位置: 首页 > article >正文

RT-DETR-R18版本的ultralytics的yaml更改分享!!

0.前言

起因: 本人深度学习,无奈组内没有好的显卡,只有我自己拥有的一张4060卡跑CV,稍微大一点的模型跑不了,我的模型主打一个轻量化...  在找模型与我的模型进行比较的时候,看的RT-DETR-R18版本(GFLPOS也是相当高...),但是也是一个开源的比较好的模型。但是,官方开源的代码一直跑不了,总是出现各种错误... 而且本人也习惯用ultralytics的模型了,而且我看文件夹里面只有RT-DETR-R50版本,但是参数量太大。但是网上一直没有分享该yaml与该改法,因此有了本文。

当我拿ultralytics公司版本的rt-detr-r50,发现和官方版本的差别很大,但是对比发现,其实官方版本做了封装而已,下面来对比一下

U版本的rt-detr-r50.yaml

官方版本

对比发现:
1. U版本的检测头是官方的检测头没问题。最主要的还是HybridEncoder,U版本没有进行封装,而是采用习惯的写法(个人还是蛮喜欢的)。
2. 在官方文档r18和r50参数对比中发现,r18的backbone从ResNet50换成了ResNet18,HybridEncoder的参数有些改变,检测头一个参数更改了
3.U版本的RT-DETR其实没有完全按照官方的RT-DETR进行编写,有些函数有些不同... 但总的区别不大。

因此,本文从U版本的rt-detr-r50.yaml的参数开始修改,变成rt-detr-r18。

​​​​​​1.Backbone修改: 从ResNet50变成ResNet18

首先,在U的模块文件中,是没有ResNet18/34的基础块的,有了解的小伙伴就知道ResNet50/101的基础层和ResNet18/34是不同的。因此,我们需要添加ResNet18/34的基础块,这个是通用的,关于ResNet在网上的教程特别多,这里我只贴代码。

class BasicBlock(nn.Module):"""Basic ResNet block for ResNet18/34"""expansion = 1  # No expansion in basic blocksdef __init__(self, in_channels, out_channels, stride=1):super().__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)self.bn1 = nn.BatchNorm2d(out_channels)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)self.bn2 = nn.BatchNorm2d(out_channels)self.shortcut = nn.Sequential()if stride != 1 or in_channels != out_channels * self.expansion:self.shortcut = nn.Sequential(nn.Conv2d(in_channels, out_channels * self.expansion, kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(out_channels * self.expansion))def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = self.bn2(self.conv2(out))out += self.shortcut(x)out = F.relu(out)return out# 命名为了和U版本中的ResNetLayer区分开
class ResNetBasic(nn.Module):def __init__(self, c1, c2, s=1, is_first=False, n=2, e=1):  # 修改默认n=2,e=1super().__init__()self.is_first = is_firstif self.is_first:self.layer = nn.Sequential(nn.Conv2d(c1, c2, kernel_size=7, stride=2, padding=3, bias=False),nn.BatchNorm2d(c2),nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))else:blocks = [BasicBlock(c1, c2, s)]blocks.extend([BasicBlock(c2, c2, 1) for _ in range(n - 1)])self.layer = nn.Sequential(*blocks)def forward(self, x):return self.layer(x)

关于该模块怎么用,请搜索yolo8如何添加模块,这个教程十分多且详细~这里就不多赘述

2. HybridEncoder的参数修改:在原yaml文件基础上修改

我们首先来对比,官方版本的rt-detr-r18和rt-detr-r50的HybridEncoder的区别在哪,区别在参数上

a) 可以看到,in_channels整体缩小了,但是,由于我们的backbone变化了,实际上in_channels是随着Backbone变化而变化了。这一点只需要按照1来操作换掉backbone即可

b) hidden_dim是没有变化的,r50也是256,r18也是256

c)expansion从1变化到了0.5,这个expansion在官方版本是修改CSPRepLayer的参数

那在U版本中,实际上是RepC3的参数(注意,RepC3和CSPRepLayer实际上是有一些差别的,差别在一些激活的处理... 所以,能用官方的跑就用官方的跑),所以我们只需要修改RepC3中的expansion从1变到0.5即可,这里不用动,知道原理就可以了,yaml修改就行。

3. 检测头的参数修改

检测头的num_decoder_layers从6变到了3,由于该检测头在U版本的参数十分多,所以我们直接去U版本的检测头函数,修改默认参数从1变到0.5即可

检测头的路径

   把这里的6改成3即可(图中已经改过了)

4. rt-detr-r18的yaml代码

在做上述修改后,再使用

# Ultralytics YOLO 🚀, AGPL-3.0 license
# RT-DETR-ResNet50 object detection model with P3-P5 outputs.# Parameters
nc: 1 # 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, ResNetBasic, [3, 64, 2, True, 2]]    # Stage 0 (初始conv7x7+maxpool)- [-1, 1, ResNetBasic, [64, 64, 1, False, 2]]  # Stage1 (2个基本块)- [-1, 1, ResNetBasic, [64, 128, 2, False, 2]] # Stage2 (下采样)   ###- [-1, 1, ResNetBasic, [128, 256, 2, False, 2]] # Stage3 (下采样)  ###- [-1, 1, ResNetBasic, [256, 512, 2, False, 2]] # Stage4 (下采样)  ###head: # hidden dim = 256- [-1, 1, Conv, [256, 1, 1, None, 1, 1, False]] # 5 #### input Channel- [-1, 1, AIFI, [1024, 8]]- [-1, 1, Conv, [256, 1, 1]] # 7- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [3, 1, Conv, [256, 1, 1, None, 1, 1, False]] # 9  ####### input Channel- [[-2, -1], 1, Concat, [1]]- [-1, 3, RepC3, [256, 0.5]] # 11- [-1, 1, Conv, [256, 1, 1]] # 12- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [2, 1, Conv, [256, 1, 1, None, 1, 1, False]] # 14 ###### input Channel- [[-2, -1], 1, Concat, [1]] # cat backbone P4- [-1, 3, RepC3, [256, 0.5]] # X3 (16), fpn_blocks.1 ####- [-1, 1, Conv, [256, 3, 2]] # 17, downsample_convs.0- [[-1, 12], 1, Concat, [1]] # cat Y4- [-1, 3, RepC3, [256, 0.5]] # F4 (19), pan_blocks.0 ###- [-1, 1, Conv, [256, 3, 2]] # 20, downsample_convs.1- [[-1, 7], 1, Concat, [1]] # cat Y5- [-1, 3, RepC3, [256, 0.5]] # F5 (22), pan_blocks.1 ####- [[16, 19, 22], 1, RTDETRDecoder, [nc]] # Detect(P3, P4, P5)

注意,head层的RepC3参数有所调整,复制即可,根据修改后的rt-detr-r18参数如下

本人对比了,已有的u版本rt-detr和官方所给的参数,发现都有些差别,所以最好是用官方的rt-detr,如果用不了再用u版本的。

本人代码能力有限,根据官方版本,尽力的还原成原来版本的rt-detr-r18。如果有错误,请大佬们一定及时给我指出来!!希望能帮助到各位小伙伴们~~~

相关文章:

RT-DETR-R18版本的ultralytics的yaml更改分享!!

0.前言 起因: 本人深度学习,无奈组内没有好的显卡,只有我自己拥有的一张4060卡跑CV,稍微大一点的模型跑不了,我的模型主打一个轻量化... 在找模型与我的模型进行比较的时候,看的RT-DETR-R18版本(GFLPOS也…...

网工基础 | 常见英文术语注解

原创:厦门微思网络 以下是一些网工专业常见的英文术语注解: IP Address(Internet Protocol Address) 互联网协议地址,是分配给连接到互联网的设备的唯一标识符,用于在网络中定位和通信。例如,“…...

[特殊字符] 各领域 Dummy 开关实现方式大集合

涵盖硬件、软件、工业控制、游戏开发及网络虚拟化场景: 🔌 1. 电子 / 硬件工程 🛠️ (1) 物理替代方案 🧲 跳线帽(Jumper)或短路块 👉 模拟开关“开/关”状态 ✅ 示例:开发板上的 B…...

AI低代码平台:开启高效智能开发新时代

科技飞速发展的当下,全球正加速迈向 AI 化。DeepSeek 等主流 AI 厂商的发展极大地改变了技术格局。众多企业为紧跟时代步伐,对高效开发工具的需求愈发迫切。百特搭AI低代码开发平台与 AI 技术的融合,为企业带来了开发高效化与智能化的全新解决…...

苍穹外卖2

根据id查询员工 调用顺序:Controller—>Service—>ServiceImpl—>Mapper—>xml 1.controller层一个tab秒了(ai生成) 由于result泛型中希望返回一个employee对象,所以定义一个employee来接受Service的getbyid方法,在…...

Redis 键(Key)详解

1. 键的基本概念 Redis 的键(key)是每条数据的唯一标识符。Redis 使用键来存取各种类型的数据结构,包括字符串、哈希、列表、集合、有序集合等。每个键都是唯一的,它决定了你访问哪条数据。 Redis 中所有读写操作都以键为基础&a…...

mac|使用scrcpy实现无线Android投屏

scrcpy是一个开源项目,从项目的releases可以得知它适用于windows、linux、mac github:https://github.com/Genymobile/scrcpy/releases github中提供了应用于mac系统的静态版本(也就是上图的scrcpy-macos-aarch64-v3.1.tar.gz和scrcpy-macos…...

【智驾中的大模型 -1】自动驾驶场景中的大模型

1. 前言 我们知道,大模型现在很火爆,尤其是 deepseek 风靡全球后,大模型毫无疑问成为为中国新质生产力的代表。百度创始人李彦宏也说:“2025 年可能会成为 AI 智能体爆发的元年”。 随着科技的飞速发展,大模型的影响…...

Python中的eval()函数详解

文章目录 Python中的eval()函数详解基本语法基本用法安全性问题安全使用建议实际应用场景与exec()的区别性能考虑总结 Python中的eval()函数详解 eval()是Python的一个内置函数,用于执行字符串形式的Python表达式并返回结果。它是一个强大但需要谨慎使用的函数。 …...

网络4 OSI7层

OSI七层模型:数据如何传送,向下传送变成了什么样子 应用层 和用户打交道,向用户提供服务。 例如:web服务、http协议、FTP协议 1.用户接口 2.提供各种服务 通过浏览器(接口)提供Web服务 表示层 翻译 我的“…...

数字世界的免疫系统:恶意流量检测如何守护网络安全

在2023年全球网络安全威胁报告中,某跨国电商平台每秒拦截的恶意请求峰值达到217万次,这个数字背后是无数黑客精心设计的自动化攻击脚本。恶意流量如同数字世界的埃博拉病毒,正在以指数级速度进化,传统安全防线频频失守。这场没有硝烟的战争中,恶意流量检测技术已成为守护网…...

在PyCharm中出现 **全角字符与非英文符号混合输入** 的问题

在PyCharm中出现 全角字符与非英文符号混合输入 的问题(如 124345dfs$¥cvd)&#xff0…...

我的计算机网络(总览篇)

总览--网络协议的角度 在一个庞大的网络中,该从哪里去了解呢?我先细细的讲一下我们访问一个网站的全部流程,当我们的电脑连上网络的时候,就会启动DHCP协议,来进行IP地址,MAC地址,DNS地址的分配…...

文件IO6(开机动画的显示原理/触摸屏的原理与应用)

开机动画的显示原理 ⦁ 基本原理 一般电子产品在开机之后都会加深用户印象,一般开机之后都会播放一段开机动画(视频、GIF…),不管哪种采用形式,内部原理都是相同,都是利用人类的眼睛的视觉暂留效应实现的…...

低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡

低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡 在科技迅猛发展的当下,软件开发领域新思潮与新技术不断涌现,引发行业内外热烈探讨。近日,笔者收到这样一个颇具争议的问题:“低代码开发能取代后端吗&#xff1f…...

反向代理断线重连优化

背景 1. 部分时候,反向代理因为路由重启,或者其他断网原因,等网络恢复后,无法对隧道重连。 2. 增加了心跳机制 在DEBUG调试过程中,发现禁用网卡后,在反向代理重连时候,服务器没有释放掉占用的…...

NLP中的“触发器”形式

在自然语言处理(NLP)中,触发器的设计更加依赖于文本特征,而非视觉特征。以下是NLP中常见的触发器类型及其实现方式: 1. 特定词汇或短语 定义:在文本中插入特定的单词、短语或符号。示例: 罕见…...

OJ 基础 | 输入处理

目录 一行输入一个整数: 一行输入2个整数 第一行有一个整数 m。接下来 m 行,每行两个整数 u,v : 一行输入一个整数: Nint(input()) #int类型 numinput() #字符串,一般用于需要去切片/遍历或者处理输入的数据 一行…...

array和list在sql中的foreach写法

在MyBatis中&#xff0c;<foreach>标签用于处理集合或数组类型的参数&#xff0c;以便在SQL语句中动态生成IN子句或其他需要遍历集合的场景。以下是array和list在SQL中的<foreach>写法总结。 <if test"taskIds ! null and taskIds.length > 0">…...

SDP(一)

SDP(Session Description Protocol)会话描述协议相关参数 Session Description Protocol Version (v): 0 --说明&#xff1a;SDP当前版本号 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --说明&#xff1a;发起者/创建者 会话ID&#xff0c;那么该I…...

STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)

本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。 一、模块化 UART 的设计目标…...

【基于 Vue3 的原子化时间线组件实现与应用】

基于 Vue3 的原子化时间线组件实现与应用 在前端开发中&#xff0c;我们经常需要使用时间线组件来展示一系列按时间顺序排列的事件。许多项目常常重复开发类似功能&#xff0c;导致代码冗余且维护成本高。为解决这一问题&#xff0c;我们设计了一个高度可定制的原子化时间线组…...

小推桌面tv-小推电视桌面好用吗

想知道小推电视桌面是否好用&#xff1f;来一探究竟&#xff01;小推电视桌面安全稳定&#xff0c;且支持自由定制。它有影视、壁纸、酒店等多种主题&#xff0c;适配不同场景。内置小推语音助手&#xff0c;还支持第三方语音助手&#xff0c;操作便捷。自带正版影视搜索功能&a…...

深入解析嵌入式Linux系统架构:从Bootloader到用户空间 - 结合B站视频教学

B站视频链接,请多多关注本人B站&#xff1a; &#x1f4cc; Yocto项目实战教程&#xff1a;第二章 视频讲解 目录 第2章 Linux系统架构 2.1 GNU/Linux2.2 Bootloader2.3 内核空间2.4 用户空间 总结 第2章 Linux系统架构 {#linux系统架构} 嵌入式Linux系统是Linux内核的精简版…...

Asp.NET Core WebApi 配置文件

在 ASP.NET Core Web API 中&#xff0c;配置文件&#xff08;如 appsettings.json&#xff09;是管理应用程序设置的核心部分。ASP.NET Core 提供了一套灵活的配置系统&#xff0c;允许开发者从多种来源加载配置数据&#xff0c;并根据需要使用这些配置。 以下是关于如何在 A…...

pipe匿名管道实操(Linux)

管道相关函数 1 pipe 是 Unix/Linux 系统中的一个系统调用&#xff0c;用于创建一个匿名管道 #include <unistd.h> int pipe(int pipefd[2]); 参数说明&#xff1a; pipefd[2]&#xff1a;一个包含两个整数的数组&#xff0c;用于存储管道的文件描述符&#xff1a; pi…...

2025.04.10-拼多多春招笔试第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 数字重排最大化问题 问题描述 LYA是一位专业的数字设计师。她手中有两个数字序列 s 1 s_1...

Vue.js组件安全开发实战:从架构设计到攻防对抗

目录 开篇总述&#xff1a;安全视角下的Vue组件开发新范式 一、Vue.js组件开发现状全景扫描 二、安全驱动的Vue组件创新架构 三、工程化组件体系构建指南 四、深度攻防对抗实战解析 五、安全性能平衡策略 结语&#xff1a;安全基因注入前端开发的未来展望 下期预告&…...

质因数之和-蓝桥20249

题目&#xff1a; 代码&#xff1a;无脑直接根据题目&#xff0c;一步步操作就行 #include <iostream> using namespace std;int gcd(int a,int b){if(b0) return a;return gcd(b,a%b); }bool exist_gcd(int a,int b){if(gcd(a,b)1) return false;return true; }bool is…...

《栈区、堆区和静态区:内存管理的三大支柱》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、栈区&#xff08;Stack&#xff09;&#xff08;一&#xff09;栈区的定义&#xff08;二&#xff09;栈区的特点&#xff08;三&#xff09;栈区的使用…...