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

news2025/4/18 22:00:48

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 blocks

    def __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=1
        super().__init__()
        self.is_first = is_first

        if 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。如果有错误,请大佬们一定及时给我指出来!!希望能帮助到各位小伙伴们~~~

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

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

相关文章

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

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

苍穹外卖2

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

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 智能体爆发的元年”。 随着科技的飞速发展,大模型的影响…

网络4 OSI7层

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

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

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

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

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

反向代理断线重连优化

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

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 的设计目标…

小推桌面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内核的精简版…

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;栈区的使用…

今日行情明日机会——20250411

今天缩量&#xff0c;上方压力依然在&#xff0c;外围还在升级&#xff0c;企稳还需要时日。 2025年4月11日A股涨停主要行业方向分析 一、核心主线方向 芯片&#xff08;半导体&#xff09; • 涨停家数&#xff1a;24家&#xff08;当日最强方向&#xff09;。 • 驱动逻辑&…

【Linux】TCP_Wrappers+iptables实现堡垒机功能

规划 显示jumpserver的简单功能&#xff0c;大致的网络拓扑图如下 功能规划 & 拓扑结构 JumpServer&#xff08;堡垒机&#xff09;主要功能&#xff1a; 对访问目标服务器进行统一入口控制&#xff08;例如 nginx、mysql、redis&#xff09;。使用 iptables 做 NAT 转…

ssh 登录报错集合(FQA)

1、使用root登录失败&#xff08;远程主机不允许root登录&#xff09; 问题&#xff1a;通过 ssh 连接远程主机&#xff08; ubuntu &#xff09;时报错&#xff0c;Permission denied 如下&#xff1a; 解决方法&#xff1a;确认root的登录密码没错&#xff0c;且可以正常与远…

使用Mybatis时在XML中SQL高亮显示的方法

如图所示&#xff0c;上方的SQL代码很像是一个字符串&#xff0c;那么如何把上方的SQL改成和下方一样的SQL,使得IDEA可以识别SQL方言呢&#xff1f; 1.选中SQL中的一部分代码&#xff0c;此时左侧会出现一个黄色的灯泡图案&#xff0c;点击2.选择这个注入语言或者引用