基于transformer的目标检测:DETR

目录

一、背景介绍

二、DETR的工作流程

三、DETR的架构

1. 损失函数

2. 网络框架讲解及举例

一、背景介绍

在深度学习和计算机视觉领域,目标检测一直是一个核心问题。传统方法依赖于复杂的流程和手工设计的组件,如非极大值抑制(nms)和锚点(anchor)生成,这些都需要对任务有深入的先验知识。然而,DETR的出现,为我们提供了一种全新的视角,将目标检测视为一个直接的集合预测问题,实现了端到端的检测。

DETR,即DEtection TRansformer,是一种创新的框架,它通过简化检测流程,消除了对许多手工设计组件的需求。这一方法的核心在于其集合基础的全局损失函数,它通过二分图匹配(bi-partite matching)强制实现唯一的预测结果,以及其Transformer编码器-解码器架构。DETR利用一组固定且学习得到的对象查询(object queries),推理对象之间的关系和全局图像上下文,直接并行输出最终的预测集合。

额外提一下,最初的DETR训练很慢,原作者训练了500个epoch。不过这些问题在后续都被慢慢解决了。

二、DETR的工作流程

根据原文的流程图,训练部分可以分成4部分:

  1. 特征提取(Feature Extraction):

    在这个阶段,输入的图像通过一个卷积神经网络(CNN)来提取图像特征。这些特征是图像的高级表示,捕捉了图像中的重要信息,为后续的编码阶段提供基础。
  2. 编码(Encoding):

    编码阶段使用Transformer的编码器部分。编码器接收CNN提取的图像特征,并将其转换为一系列特征表示。这些特征表示能够捕捉图像的全局信息,为解码阶段提供丰富的上下文。
  3. 解码(Decoding):

    解码阶段由Transformer的解码器部分负责。解码器利用编码器提供的特征表示,并通过自注意力机制来预测目标的类别和位置。解码器的输出是一组边界框预测,每个预测对应一个可能的目标。
  4. 损失计算(Loss Calculation):

    在损失计算阶段,DETR使用二分图匹配损失来优化模型。这种损失函数确保预测的边界框与真实边界框之间建立一对一的匹配关系。如果一个预测没有与任何真实边界框匹配,那么它应该被分类为“无对象”类别。

推理过程中,解码器同样生成一组边界框预测。但是,与训练不同,推理过程中不会使用二分图匹配损失。相反,会应用一个置信度阈值(例如0.7),只保留那些置信度高于这个阈值的预测。这样可以过滤掉那些不太确定的预测,只保留模型认为更有可能正确的预测。

三、DETR的架构

1. 损失函数

在DETR中,不管输入什么图片,都会在decoder输出100个框,但是一张图片中正常只会有几个target。一个预测框对应一个真实目标,模型怎么知道哪个预测框对应真实的目标框呢?于是该问题转换为了一个二分图匹配问题。

举个例子,假设我们有一张图片,其中包含3个真实目标,而DETR的解码器输出了100个预测框。二分图匹配问题就是要在这100个预测框和3个真实目标之间找到最佳的匹配关系,使得匹配的总成本(预测框与真实目标之间的损失函数)最小化。

如图所示,预测框和真值的对应问题可以列成一个矩阵,矩阵中放的是损失值,然后利用现成的匈牙利算法解决这个二分图匹配问题。

这里的损失函数分为类别损失定位损失。

每个预测框都会有一个类别损失,但只有那些通过二分图匹配与真实目标框匹配的预测框才会有位置损失

2. 网络框架讲解及举例

根据DETR流程图,举个例子描述输入图像经过DETR模型处理的精炼详细步骤:

  1. 输入图像: 输入一张尺寸为 3×800×1066 的图像。

  2. CNN骨干网络: 使用传统的CNN骨干网络提取图像特征,得到一个 2048×25×34 的特征图,25*34是输入图像大小的1/32。

  3. 特征降维: 通过1*1卷积将特征图降维到 256×25×34。

  4. 位置编码: 为降维后的特征图添加位置编码,位置编码的尺寸同样为 256×25×34。

  5. 特征图拉平: 将添加了位置编码的特征图拉平成一维向量,尺寸为 850×256,800是像素点个数。

  6. Transformer编码器: 将拉平后的特征向量输入到Transformer编码器中进行编码。

  7. Transformer解码器输入: 解码器的输入是一个固定大小的向量,尺寸为 100×256,这代表了模型将输出100个预测框。通过QKV的计算公式可知,decoder的输出与输入相同。

  8. 交叉注意力: 解码器中的每个输出嵌入与编码器的输出进行交叉注意力操作,以结合编码器的全局信息。

  9. 解码器输出: 交叉注意力操作后,解码器输出尺寸为 100×256 的向量。

  10. 预测头: 将解码器的输出通过一个共享的前馈网络(FFN),每个FFN预测一个类别(包括“无对象”类别)和边界框。

  11. 最终预测: FFN输出最终的100个预测框,每个预测包括类别和边界框信息。

这个流程展示了DETR如何通过Transformer架构实现端到端的目标检测,从输入图像到最终的预测框,整个过程不需要传统的目标检测组件,如锚点生成或非极大值抑制。

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

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

相关文章

代码随想录18

20. 有效的括号 给定一个只包括 (,),{,},[,] 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有…

Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)

Vue Amazing UI 一个 Vue 3 组件库 使用 TypeScript,都是单文件组件 (SFC),支持 tree shaking 有点意思 English | 中文 Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常…

git:指令集

以下是对这些 Git 新特性和命令的更详细解读和实际用例分析,帮助更好地理解它们的作用及适用场景: 1. git switch 和 git restore 背景: 传统上,git checkout 是一个多功能命令,用于切换分支、检出文件、创建分支等&…

C语言----指针

目录 1.概念 2.格式 3.指针操作符 4.初始化 1. 将普通变量的地址赋值给指针变量 a. 将数组的首地址赋值给指针变量 b. 将指针变量里面保存的地址赋值给另一个指针变量 5.指针运算 5.1算术运算 5.2 关系运算 指针的大小 总结: 段错误 指针修饰 1. con…

ElasticSearch系列(一)

一.了解ES、倒排索引、es的一些概念、安装es、kibana 二.DSL;索引库操作 三.Java RestClient:索引库操作 一、了解ES、倒排索引、es的一些概念、安装es、kibana kibana、logstash、beats Elasticserach 存储,计算 ,搜索数据 –…

Python应用——将Matplotlib图形嵌入Tkinter窗口

Python应用——将Matplotlib图形嵌入Tkinter窗口 目录 Python应用——将Matplotlib图形嵌入Tkinter窗口1 模块简介2 示例代码2.1 Matplotlib嵌入Tkinter2.2 Matplotlib嵌入Tkinter并显示工具栏 1 模块简介 Tkinter是Python的标准GUI(图形用户界面)库&…

C#语言的网络编程

C#语言的网络编程 引言 随着互联网的飞速发展,网络编程成为了软件开发中的一个重要领域。C#语言作为一种现代编程语言,凭借其丰富的类库、良好的可读性和强大的功能,广泛应用于开发各种网络应用程序。无论是Windows应用、Web应用还是云服务…

软件工程大复习之(四)——面向对象与UML

4.1 面向对象概述 面向对象(OO)是一种编程范式,它将数据和处理数据的方法封装在对象中。面向对象的主要概念包括: 对象:实例化的数据和方法的集合。类:对象的蓝图或模板。封装:隐藏对象的内部…

【linux基础I/O(2)】理解文件系统|文件缓冲区|软硬链接|动静态库

目录 前言1. 理解C语言的缓冲区2. 对文件系统的初认识3. 理解软硬链接1. 软硬链接的特征2.软硬链接的作用 4. 理解动静态库5. 总结 前言 对于文件来讲,有打开的在内存中的文件,也有没有打开的在磁盘上文件,上一篇文章讲解的是前者,本篇文章将带大家了解后者! 本章重点: 本篇文…

什么是Redis的渐进式ReHash?

文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 文章内容收录到个人网站,方便阅读:http://hardyfish.top/ Redis 的渐进式 rehash 是一…

Linux应用软件编程--网络通信(udp协议,tcp协议)

网络通信:不同主机,进程间通信,分为广域网和局域网 OSI 七层模型:是一种理论模型 应用层:通信传输的数据内容 http、FTP、TFTP、MQTT 表述层:数据加密,解密操作,压缩&#xff…

深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题

在训练过程中,训练集的准确率稳步上升,但是验证集的准确率一直在40%左右徘徊,从网上搜索可能的原因有: 1、学习率太小,陷入局部最优。 2、数据量太小(4000多条数据,应该还可以吧) …

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数! 默认成员函数是程序猿不显示声明定义,编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的,关于类与对象不才在前面笔记中有详细的介绍:点我…

期刊选择【生物医学工程】

所有数据来源letpub Academic radiology【共一共通,速度√杠杠的】 【LetPub】ACADEMIC RADIOLOGY 影响因子3.800分,是几区,2023-2024年期刊投稿经验分享,ACADEMIC RADIOLOGY主页,推荐审稿人、编辑,审稿…

【简博士统计学习方法】3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间(Hypothesis Space):所有可能的条件概率分布或决策函数,用 F \mathcal{F} F表示。 若定义为决策函数的集合: F { f ∣ Y f ( X ) } \mathcal{F…

Flink如何设置合理的并行度

一个Flink程序由多个Operator组成(source、transformation和 sink)。 一个Operator由多个并行的Task(线程)来执行, 一个Operator的并行Task(线程)数目就被称为该Operator(任务)的并行度(Parallel)。即并行度就是相对于Operator来说的。 合理设置并行度可以有效提高Flink作业…

【PostgreSQL】PG多实例部署

注释 PGPORT 和 PGDATA 环境变量 su - postgresvim ~/.bash_profileexport PATH=/usr/local/pgsql/bin:$PATH export MANPATH=/usr/local/pgsql/share/man:$MANPATH export LD_LIBRARY_PATH=/usr/local/pgsql/lib #export PGPORT=5432 export LANG=en_US.UTF8 export PS1=&quo…

【llm/ollama/qwen】在本地部署qwen2.5-coder并在vscode中集成使用代码提示功能

说在前面 操作系统:windows11ollama版本:0.5.4vscode版本:1.96.2continue插件版本:0.8.66 ollama安装 访问官网,点击下载安装即可 默认装在了C盘,比较蛋疼;但是可以指定路径安装:Ol…

PHP零基础入门笔记

表达式:任何有值的东西就是表达式 php可以解析双引号,不可以解析单引号,双引号中引用变量可以输出引用变量的值,但是单引号不可以 1.变量和变量的销毁 unset(变量名) //销毁变量 变量是严格区分大小写的,在php中…

《CPython Internals》阅读笔记:p1-p19

《CPython Internals》学习第 1 天,p1-p19 总结,总计 19 页。 一、技术总结 无。 二、英语总结(生词:2) 1.humble vs humbled (1)humble: humus(“earth”) adj. 字面意思是“on the ground”, 后面引申为“lowly in kind, state, cond…