目标检测 RT-DETR(2023)详细解读

文章目录

    • 主干网络:
    • Encoder:
    • 不确定性最小Query选择
    • Decoder网络:

将DETR扩展到实时场景,提高了模型的检测速度。网络架构分为三部分组成:主干网络、混合编码器、带有辅助预测头的变换器编码器。具体来说,先利用主干网络的最后三个阶段的输出特征 {S3, S4,S5} 作为编码器的输入。混合编码器通过内尺度交互(intra-scaleinteraction)和跨尺度融合(cross-scale fusion)将多尺度特征转换成一系列图像特征。随后,采用loU感知查询选择(loU-aware query selection)从编码器输出序列中选择一定数量的图像特征,作为解码器的输入(初始对象查询)。最后,带有辅助预测头的解码器迭代优化对象查询,以生成类别和方框。解码器采用的是DINO的解码器结构,由6层dcoder layer组成,每层decoder layer包含self-attention和cross attention两部分。

主干网络:

对于主干网络,RT-DETR采用CNN网络,如流行的ResNet系列,或者百度自家研发的HGNet。当然也可以采用如Vit系列的主干网络,虽然精度可能更高,但是速度不行CNN架构无疑是快于ViT架构的。因此,从实时性的角度出发,选择CNN架构来做特征提取还是有助于提高DETR系列的实时性,进而提升实用性——毫无疑问,这是阶段性的措施,不难想象,未来一定会有新架构全面——不论是性能还是推理速度——取代CNN架构。

和以往的检测器一样,RT-DETR也是从主干网络中抽取三个尺度的输出,其输出步长分别为8、16和32(输出步长output stride通常指的是网络中特征图的空间尺寸相对于输入图像的缩小比例)

Encoder:

对于颈部网络,RT-DETR采用了一层Transformer的Encoder,只处理主干网络输出的 S5 特征,即AIFI(Attention-based Intra-scale Feature Interaction)模块。

首先,我们将二维的S5 特征拉成向量,然后交给AIFI模块处理,其数学过程就是多头自注意力与FFN,随后,我们再将输出调整回二维,记作 F5 ,以便去完成后续的所谓的“跨尺度特征融合。

之所以RT-DETR的AIFI只处理最后的S5 特征,是出于两点考虑:

  1. 一方面,以往的DETR,如Deformable DETR是将多尺度的特征展平成序列( RB×C×H×W→RB×N×C ),然后拼接到一起,构成一个序列很长的向量,随后再交给核心为self attention技术的Transformer encoder去做多尺度之间的特征交互,但这无疑会造成巨大的计算资源的消耗,毕竟self attention技术的平方计算复杂度一直是其广受诟病的缺陷之一;
  2. 另一方面,RT-DETR认为相较于较浅的S3 特征和S4 特征,S5 特征拥有更深、更高级、更丰富的语义特征,而self attention机制可能更关注特征的语义性,而非空间局部细节等,因此,作者团队认为不必让多尺度特征都放到一个篮子中去。

综上,作者团队认为只需将Encoder作用在空间尺寸不太大,信息语义程度有很高的S5 特征上即可,以此来平衡性能和速度——既可以大幅度地减小计算量、提高计算速度,又不会损伤到模型的性能。作者团队设计了若干对照组验证了这一点。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

不确定性最小Query选择

Uncertainty-minimal Query Selection:

关于 Query Selection(查询向量选择),大家应该并不陌生,这个方法可谓在DETR领域大杀四方,如DAB-DETR对查询向量进行重构理解,将其解释为Anchor,DN-DETR通过查询降噪来应对匈牙利匹配的二义性所导致的训练时间长的问题,DINO提出从Encoder中选择Top-k特征进行学习等一系列方法,这都无疑向我们证明,查询向量很重要,选择好的Query能够让我们事半功倍。

在RT-DETR中,Query selection 的作用是从 Encoder 输出的特征序列中选择固定数量的特征作为 object queries ,其经过 Decoder 后由预测头映射为置信度和边界框。

DETR中的对象查询是一组可学习的嵌入,由解码器优化并由预测头映射到分类分数和边界框。然而,这些对象查询难以解释和优化,因为它们没有明确的物理含义。后续工作改进了对象查询的初始化,并将其扩展到内容查询和位置查询(锚点)。其中,提出了查询选择方案,它们共同的特点是利用分类分数从编码器中选择排名靠前的K个特征来初始化对象查询(或仅位置查询)。然而,由于分类分数和位置置信度的分布不一致,一些预测框虽有高分类分数,但与真实框(GT)不接近,这导致选择了分类分数高但loU分数低的框,而丢弃了分类分数低但loU分数高的框。这降低了检测器的性能。为了解决这个问题,我们提出了loU感知查询选择,通过在训练期间对模型施加约束,使其对loU分数高的特征产生高分类分数,对loU分数低的特征产生低分类分数。因此,模型根据分类分数选择的排名靠前的K个编码器特征的预测框,既有高分类分数又有高loU分数。我们重新制定了检测器的优化目标如下:

在这里插入图片描述

之所以使用IoU软标签,是因为按照以往的one-hot方式,完全有可能出现“当定位还不够准确的时候,类别就已经先学好了”的“未对齐”的情况,毕竟类别的标签非0即1。但如果将IoU作为类别的标签,那么类别的学习就要受到回归的调制,只有当回归学得也足够好的时候,类别才会学得足够好,否则,类别不会过快地先学得比回归好,因此后者显式地制约着前者。在使用了这个技巧后,显然训练过程中,类别的标签不再是此前的0和1离散值,而是0~1的连续值。

Decoder网络:

RT-DETR选择了基于cross attention的Transformer decoder,并连接若干MLP作为检测头,因此,RT-DETR无疑是DETR架构。具体来说,RT-DETR选择DINO的decoder,使用了具体线性复杂度的deformable attention,同时,在训练阶段,使用到了DINO的“去噪思想”来提升双边匹配的样本质量,加快训练的收敛速度。整体来看,RT-DETR的检测头几乎就是把DINO的照搬了过来,当然,其中的一些边边角角的操作给抹掉了,尽可能达到“精简”的目的。

部分图片截取自b站 Enzo_Mi

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

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

相关文章

学习 Pinia 状态管理【Plan - May - Week 2】

一、定义 Store Store 由 defineStore() 定义,它的第一个参数要求独一无二的id import { defineStore } from piniaexport const useAlertsStore defineStore(alert, {// 配置 })最好使用以 use 开头且以 Store 结尾 (比如 useUserStore,useCartStore&a…

智能制造:基于AI制造企业解决方案架构设计【附全文阅读】

该方案面向制造企业管理者、技术工程师及智能制造转型需求企业,聚焦AI技术在制造业的落地应用。核心内容以AI开放平台为基础,构建“感知层-算法层-平台层-认知层”技术架构,提供从数据采集、模型训练到智能检测的全流程解决方案。 方案通过机…

JVM 高质量面试题

📌 文章目录 一、JVM 内存结构与运行时模型1. JVM 内存结构分区及作用2. 栈帧结构及方法调用链维护3. 逃逸分析及其对对象分配策略的影响4. TLAB 的作用及提升对象创建效率的机制二、垃圾回收器与 GC 调优1. CMS 与 G1 垃圾收集器的设计区别及适用场景2. Full GC 频繁问题的排…

使用Spring Boot和Spring Security构建安全的RESTful API

使用Spring Boot和Spring Security构建安全的RESTful API 引言 在现代Web开发中,安全性是一个不可忽视的重要方面。Spring Boot和Spring Security是Java生态中广泛使用的框架,它们提供了强大的工具来保护RESTful API。本文将介绍如何结合这两个框架&am…

Web项目流程总结

前端 1.下载pnpm管理器 pnpm是一种JavaScript包管理器。 前提:确保安装了Node.js 和 npm 打开cmd,以管理员身份运行(输入以下指令) npm install -g pnpm 安装成功后显示: npm: 这是 Node.js 的包管理工具&#xf…

Java中static关键字深度解析:从入门到高阶实战

Java中static关键字深度解析:从入门到高阶实战 目录 static的本质与核心特性静态变量 vs 实例变量:底层对比静态方法的设计哲学与应用场景高级用法:突破常规的static技巧 4.1 静态代码块:类加载的“初始化引擎”4.2 静态内部类&…

学习人工智能:从0到1的破局指南与职业成长路径

当AI绘画工具在几秒内生成一幅媲美专业画师的作品,当AI程序员自主优化代码逻辑,当AI客服精准解答复杂问题——一个现实愈发清晰:人工智能(AI)不再是科技公司的专属游戏,而是每个普通人必须直面的时代命题。…

2025年医美行业报告60+份汇总解读 | 附 PDF 下载

原文链接:https://tecdat.cn/?p42122 医美行业在消费升级与技术迭代的双重驱动下,已从边缘市场逐步走向主流。数据显示,2024 年中国医美市场规模突破 3000 亿元,年复合增长率达 15%,但行业仍面临正品率不足、区域发展…

深入了解Springboot框架的启动流程

目录 1、介绍 2、执行流程 1、运行run方法 2、初始化SpringApplication对象 1、确定容器类型 3、加载所有的初始化器 4、加载Spring上下文监听器 5、设置程序运行的主类 3、进入run方法 1、开启计时器 2、Headless模式配置 3、获取并启用监听器 4、准备环境 1、设…

【Java多态】:灵活编程的核心

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:【Java】内容概括 【前言】 在Java面向对象编程的世界中,多(Polymorphism) 是一个核…

Python打卡训练营day33——2025.05.22

知识点回顾: PyTorch和cuda的安装 查看显卡信息的命令行命令(cmd中使用) cuda的检查 简单神经网络的流程 数据预处理(归一化、转换成张量) 模型的定义 继承nn.Module类 定义每一个层 定义前向传播流程 定义损失函数和优…

uni-app学习笔记九-vue3 v-for指令

v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名&#xff1a; <template><view v-for"(item,index) in 10" :key"index"…

【C++算法】70.队列+宽搜_N 叉树的层序遍历

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 429. N 叉树的层序遍历 题目描述&#xff1a; 解法 使用队列层序遍历就可以了。 先入根节点1。queue&#xff1a;1 然后出根节点1&#xff0c;入孩子节点2&#xff0c;3&a…

pycharm无法正常调试问题

pycharm无法正常调试问题 1.错误代码 已连接到 pydev 调试器(内部版本号 231.8109.197)Traceback (most recent call last):File "E:\Python\pycharm\PyCharm 2023.1\plugins\python\helpers\pydev\_pydevd_bundle\pydevd_comm.py", line 304, in _on_runr r.deco…

【机器学习基础】机器学习入门核心算法:线性回归(Linear Regression)

机器学习入门核心算法&#xff1a;线性回归&#xff08;Linear Regression&#xff09; 1. 算法逻辑2. 算法原理与数学推导3. 评估指标4. 应用案例5. 面试题6. 扩展分析总结 1. 算法逻辑 核心思想 通过线性方程拟合数据&#xff0c;最小化预测值与真实值的误差平方和&#xff0…

手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)

手机打电话时由对方DTMF响应切换多级IVR语音菜单 &#xff08;话术脚本与实战&#xff09; --本地AI电话机器人 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音应答&#xff08;二&#xff09; 下一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音…

flutter dart class语法说明、示例

&#x1f539; Dart 中的 class 基本语法 class ClassName {// 属性&#xff08;字段&#xff09;数据类型 属性名;// 构造函数ClassName(this.属性名);// 方法返回类型 方法名() {// 方法体} }✅ 示例&#xff1a;创建一个简单的 Person 类 class Person {// 属性String name;…

Apollo10.0学习——planning模块(10)之依赖注入器injector_

好不好奇injector_是干什么用的&#xff1f;为什么planning每个模块都要初始化这个变量&#xff1f; 类功能概述 DependencyInjector&#xff08;依赖注入器&#xff09;是一个 集中管理规划模块关键数据和服务 的容器类。它通过提供统一的访问接口&#xff0c;解耦各个组件之…

关于vue彻底删除node_modules文件夹

Vue彻底删除node_modules的命令 vue的node_modules文件夹非常大,常规手段根本无法删除. 解决方法: 在node_modules文件夹所在的路径运行命令窗口,并执行下面的命令. npm install rimraf -g rimraf node_modules说明&#xff1a; npm install rimraf -g 该命令是安装 node…

MCTS-RAG:通过树搜索重塑小模型中的检索增强生成(RAG)

https://arxiv.org/pdf/2503.20757v1这篇论文提出了MCTS-RAG框架&#xff0c;用于解决小型语言模型在知识密集型任务上的推理能力不足问题。具体来说&#xff0c; ​​MCTS-RAG框架​​&#xff1a;MCTS-RAG通过迭代地精炼检索和推理过程来工作。给定一个查询&#xff0c;它探…