【计算机视觉 | 目标检测】DETR风格的目标检测框架解读

文章目录

  • 一、前言
  • 二、理解
    • 2.1 DETR的理解
    • 2.2 DETR的细致理解
      • 2.2.1 Backbone
      • 2.2.2 Transformer encoder
      • 2.2.3 Transformer decoder
      • 2.2.4 Prediction feed-forward networks (FFNs)
      • 2.2.5 Auxiliary decoding losses
    • 2.3 更具体的结构
    • 2.4 编码器的原理和作用
    • 2.5 解码器的原理和作用
  • 三、注意力机制的理解

一、前言

在最近的论文阅读中,我遇到了一个新的框架—DETR风格的框架。

在这里插入图片描述
对此,感觉不是很了解,这里总结一下。

二、理解

2.1 DETR的理解

DETR(DEtection TRansformer)是一种基于Transformer的端到端目标检测模型,由Facebook AI Research团队提出。它使用Transformer将目标检测任务转换为一种集合预测问题(set prediction),即将输入的图像和目标集合编码为两个集合,然后通过匹配这两个集合来预测目标的类别、位置和数量。

没有NMS后处理步骤、没有anchor,结果在coco数据集上效果与Faster RCNN相当,且可以很容易地将DETR迁移到其他任务例如全景分割。

引用知乎大佬的话来说,这种做目标检测的方法更合理:

对于一个没接触过任何检测知识的人,去设计检测的方法,更容易想到的应该是DETR类似的方法,而不是RCNN系列的方法,因为它更直接更本质。所以这篇文章的主要意义也便是—将检测方法回归到了本质。
最初的检测方法,无法直接获取到检测结果,所以用proposal + classifier方法,是一种曲线救国的策略。无论RCNN系列还是YOLO系列,都无法像生物一样,直接指出哪个位置是什么物体,而是用密集的先验,覆盖整幅图可能出现物体的部分,然后预测该视野区域的实例类别以及该视野区域所应做出的调整。打一个比方,就像是刺激战场,开着八倍镜,找敌人一样。
判断视野里面的类别—调整视野—判断视野里面的类别—调整视野—…
而DETR方法则是,不开镜的情况下,确认那个地方有敌人,然后开着八倍镜去锁定目标。
确认整幅图实例情况—调整具体实例的视野。

DETR模型的整体结构分为编码器和解码器两部分。

  • 编码器由一系列的Transformer编码层组成,用于提取图像中的特征信息。
  • 解码器则将编码器提取的特征信息与目标集合中的先验信息进行结合,最终生成目标的类别、位置和数量等信息。

总体思路是把检测看成一个set prediction的问题,并且使用Transformer来预测box的set。DETR 利用标准 Transformer 架构来执行传统上特定于目标检测的操作,从而简化了检测 pipeline。

在这里插入图片描述
DETR包含三个主要组件:

  • CNN骨干网
  • 编码器-解码器transformer
  • 一个简单的前馈网络

首先,CNN骨干网从输入图像生成特征图。

然后,将CNN骨干网的输出转换为一维特征图,并将其作为输入传递到Transformer编码器。该编码器的输出是N个固定长度的嵌入(向量),其中N是模型假设的图像中的对象数。

Transformer解码器借助自身和编码器-解码器注意机制将这些嵌入解码为边界框坐标。

最后,前馈神经网络预测边界框的标准化中心坐标,高度和宽度,而线性层使用softmax函数预测类别标签。

详细见下图:

在这里插入图片描述
DETR采用Transformer的自注意力机制来对输入进行编码,而不是使用传统的卷积神经网络。

这样做的好处是可以充分考虑整张图像中不同位置之间的关系,提高了模型对目标的感知能力和准确率。此外,DETR还使用了一个新的位置编码方法,称为Sinusoidal Positional Encoding,用于对不同位置的特征进行区分和定位。

与传统目标检测方法相比,DETR具有以下优点:

  • 高效性:DETR采用端到端的方式训练,无需使用繁琐的手工设计过程,因此模型训练和推理速度较快。
  • 灵活性:DETR的目标检测过程可以看作是对集合进行预测,因此可以灵活地处理各种数量和种类的目标。
  • 鲁棒性:DETR通过将目标检测问题转换为集合预测问题,避免了传统目标检测算法中的anchor设计等问题,从而具有更强的鲁棒性。

2.2 DETR的细致理解

2.2.1 Backbone

在DETR中,Backbone指的是在输入图片上提取特征的卷积神经网络(Convolutional Neural Network,CNN)。它负责将输入的图片经过一系列卷积、池化等操作,转换成特征图。这些特征图将作为编码器的输入,编码器再将其转换为定位和分类的对象特征。

DETR使用ResNet作为其Backbone,ResNet是一种非常深的卷积神经网络,能够学习到更加复杂的特征表示。DETR使用ResNet的前面几个卷积块(例如ResNet50中的前四个卷积块)来提取特征,并且通过一个降采样操作将特征图缩小到一定的尺寸。这样可以提高特征的表达能力,同时缩小特征图的尺寸,从而减少后续处理的计算量。

需要注意的是,DETR中的Backbone与传统的目标检测模型中的Backbone有所不同。在传统的目标检测模型中,Backbone通常指的是将输入图片经过卷积神经网络得到的特征图,而在DETR中,Backbone只是负责提取特征的卷积神经网络部分。特征图的生成则是通过Encoder和Decoder两个阶段完成的。

2.2.2 Transformer encoder

在DETR中,Transformer encoder被用作编码器(Encoder)模块,用于将图像编码为一组特征向量。

Transformer encoder由若干个Transformer block组成,每个Transformer block又由两个子层组成,分别是self-attention层和前向神经网络(feed-forward neural network)层。

Transformer encoder通过对输入特征进行多层处理,逐渐提取出特征的高级抽象表示,最终输出一组特征向量。在DETR中,这些特征向量被用于表示输入图像中的目标。

自注意力机制(self-attention)是Transformer encoder的关键组成部分,用于在特征向量之间建立全局上下文关系。在self-attention层中,每个特征向量都会与其它所有特征向量进行交互,以便在全局上下文中获取更准确的特征表示。

另一方面,前向神经网络(feed-forward neural network)层是Transformer block的另一个组成部分。它是由全连接层和非线性激活函数组成的,用于在局部特征表示上进行非线性变换。这样可以更好地学习局部特征之间的关系,从而更好地对目标进行定位和分类。

总之,DETR中的Transformer encoder是用于从图像中提取特征的关键组件,通过多层的self-attention和前向神经网络层对特征进行处理,最终输出一组高级抽象的特征向量,用于目标检测和定位。

2.2.3 Transformer decoder

在DETR中,Transformer decoder主要用于解码器的实现,将编码器得到的信息和预测的位置、类别等信息进行解码,从而得到最终的目标检测结果。

在具体实现上,DETR使用了一个由若干个Transformer decoder堆叠而成的结构。每个Transformer decoder由若干个Multi-Head Attention和Feedforward网络组成,其中每个Multi-Head Attention和Feedforward网络都是一个Transformer decoder中的基本构建单元。Multi-Head Attention用于进行编码器和解码器信息的交互,Feedforward网络用于提取特征和信息的变换。

具体来说,DETR的解码器包括两个主要的部分:Transformer decoder和位置嵌入(position embedding)。位置嵌入是一种特殊的嵌入方式,用于将目标位置信息转换为可被神经网络学习的形式。在DETR中,位置嵌入的维度与编码器输出的特征维度相同,因此可以与特征向量进行拼接,作为解码器的输入。

在解码器中,每个Transformer decoder都负责处理编码器输出特征和目标位置信息的交互。具体来说,每个解码器包括三个主要的部分:Multi-Head Attention、Feedforward网络和LayerNorm。在Multi-Head Attention中,编码器输出的特征和目标位置信息作为查询向量和键值向量,分别用于计算注意力权重。计算出的注意力权重与编码器输出特征进行加权求和,得到解码器的输入特征。在Feedforward网络中,解码器的输入特征进行变换和非线性映射,从而得到更高层次的特征表示。最后,在LayerNorm中进行归一化,得到最终的解码器输出特征,供下一层解码器或最终的预测使用。

总的来说,DETR中的Transformer decoder主要用于解码器的实现,实现了目标检测任务中目标位置和编码器特征的有效融合。通过使用Transformer decoder,DETR可以在不需要使用先验框或区域提议的情况下,实现端到端的目标检测。

2.2.4 Prediction feed-forward networks (FFNs)

在DETR中,Prediction feed-forward networks (FFNs)是指在解码器中使用的两个全连接层,用于将编码器和解码器之间的注意力层输出进行处理,以生成最终的目标检测结果。这两个全连接层被称为class predictor和box predictor。

class predictor接收来自注意力层的输出,并为每个可能的目标类别输出一个分数,以表示其属于该类别的概率。在训练期间,模型使用交叉熵损失来最小化这些预测与真实类别之间的差异。

box predictor接收来自注意力层的输出,并对每个检测框的位置和大小进行预测。具体来说,它输出四个值,分别表示左上角和右下角坐标的偏移量。在训练期间,模型使用平滑L1损失来最小化这些预测与真实边界框之间的差异。

这两个预测器以并行的方式工作,并且在生成最终的目标检测结果时,它们的输出被合并起来,形成一个元组,其中包含预测的类别分数和边界框坐标。这些预测结果会经过一个非极大抑制算法以去除重叠的框,并保留最终的检测结果。

2.2.5 Auxiliary decoding losses

在DETR中,为了提高目标检测的性能,使用了一些辅助的解码损失。这些辅助损失的作用是在训练过程中提供更多的监督信号,以帮助网络更好地学习目标检测任务。

具体来说,DETR中使用了两个辅助损失:

  1. 位置损失(Position loss):在解码器中,每个位置都有一个预测的位置向量。该位置向量和真实位置之间的距离可以作为一个位置损失,用于指导模型更好地学习目标的位置信息。
  2. 类别损失(Class loss):DETR中使用了交叉熵损失来衡量预测类别和真实类别之间的距离。该损失可以促使模型更好地区分不同类别的目标。

这些辅助损失可以在模型训练中与主要的目标检测损失一起使用,以提高模型性能。

2.3 更具体的结构

在这里插入图片描述

2.4 编码器的原理和作用

在目标检测任务中,编码器是深度学习模型的一部分,主要负责将输入的图像特征提取并编码为一组向量表示,通常称为“特征向量”或“特征嵌入”。编码器的作用是将图像中的信息转换为一组有意义且易于处理的数字特征,以便用于后续的目标检测任务。

通常,编码器采用卷积神经网络(Convolutional Neural Networks,CNN)的结构进行设计,通过多层卷积和池化操作,逐步提取图像中的抽象特征。这些抽象特征能够代表图像中的局部和全局信息,包括纹理、形状、颜色等,同时具有一定的平移不变性尺度不变性,使得它们适用于不同大小和位置的物体的检测。

在DETR(Detection Transformer)中,编码器是由Transformer编码器层组成的,这是一种基于自注意力机制(Self-Attention)的网络结构,能够捕获输入序列中的长程依赖关系,因此可以用于图像序列的编码。在DETR中,编码器将输入的图像划分为一系列图像块,对每个图像块进行特征提取和编码,生成一组图像块特征向量表示。

2.5 解码器的原理和作用

在目标检测任务中,解码器的作用是将编码器输出的特征图转换为目标框的位置和类别信息。具体来说,解码器接受编码器输出的特征图,并对其进行处理和解码,得到目标的位置和类别信息。

解码器通常包含一系列卷积层、池化层和全连接层,以及用于位置解码和类别预测的不同层。

  • 对于位置解码,解码器通常使用回归器来预测目标框的位置和大小,例如使用四个参数来表示目标框的左上角坐标、宽度和高度。
  • 对于类别预测,解码器使用分类器来预测每个目标框所属的类别。

在DETR中,解码器使用Transformer结构,将编码器的特征图转换为一组对象嵌入向量,并将其输入到Transformer解码器中。解码器通过多层自注意力机制来将特征图中的对象嵌入向量与目标框的位置和类别信息相结合,从而得到最终的检测结果。

在DETR中,解码器主要通过注意力机制(self-attention)来实现对编码器输出特征图的解码,从而得到目标的位置和类别信息。

具体来说,解码器在每个解码步骤中:

  1. 首先使用一个自注意力模块来对编码器输出特征图进行注意力计算;

  2. 然后将自注意力计算结果和编码器输出特征图的信息融合,得到解码器当前的输入;

  3. 接下来,解码器使用一个多层感知机(MLP)来对当前输入进行处理,得到目标类别的概率分布和位置信息的偏移量,进而得到最终的目标位置和类别信息。

值得注意的是,在DETR中,解码器是通过自注意力机制来获取不同目标之间的交互信息,从而实现全局推理。这种方式相比于传统的基于区域提取的目标检测方法,可以减少手工设计的模块,同时还能更好地处理目标之间的遮挡和重叠等问题,因此具有更好的鲁棒性和泛化能力。

三、注意力机制的理解

注意力机制是一种计算机视觉和自然语言处理等领域常用的技术,用于指导模型在输入数据中聚焦于重要的部分。

其基本思想是,将输入数据映射到一个高维空间中,在这个空间中计算每个输入位置的重要性分数,并根据分数的大小分配不同的权重。这样,模型就可以聚焦于那些具有更高重要性分数的输入位置,从而提高模型的性能。

在注意力机制中,有多种不同的实现方式,比较常见的有以下两种:

  1. 自注意力机制(self-attention):自注意力机制是指在同一序列中的每个元素之间进行注意力计算。具体来说,对于输入序列 X = [ x 1 , x 2 , . . . , x n ] X=[x_1, x_2, ..., x_n] X=[x1,x2,...,xn],其中每个 x i x_i xi 都表示一个向量,自注意力机制会对每个 x i x_i xi 计算一个对应的权重向量 w i w_i wi,并根据权重向量对输入序列进行加权求和,得到表示整个序列的向量 v v v。自注意力机制的目的是在同一序列中学习不同位置之间的依赖关系。
  2. 注意力机制(attention):注意力机制是指将两个不同的序列之间的注意力计算。具体来说,假设有两个输入序列 X = [ x 1 , x 2 , . . . , x n ] X=[x_1, x_2, ..., x_n] X=[x1,x2,...,xn] Y = [ y 1 , y 2 , . . . , y m ] Y=[y_1, y_2, ..., y_m] Y=[y1,y2,...,ym],其中每个 x i x_i xi y j y_j yj 都表示一个向量,注意力机制会对每个 x i x_i xi 计算一个对应的权重向量 w i w_i wi,并将其与 Y Y Y 进行加权求和,得到一个表示 X X X 中每个元素对 Y Y Y 的贡献的向量 v v v。注意力机制的目的是在不同序列之间学习相关性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刚刚,Frontiers in Psychology 取消on hold状态,但这本期刊仍在评估中

3月28日时,Frontiers in Psychology仍处于on hold状态。 就在刚刚!小编查询Frontiers in Psychology时,发现Master Journal List中,期刊Frontiers in Psychology的on hold标识没有了,这表示期刊目前正被SSCI数据库收录…

独立部署基于apiKey或accessToken的GPT聊天工具

最近chat-GPT的强大功能让人新潮澎湃,大家都在讨论,都想尝试一下。。。 奈何用不了!自己整整,内附具体步骤,如何用手机验证码注册,如何自己搭一个前端,nodejs后端,可以访问自己的GTP。 先上图: 自己搭的: 官网: 步骤一、用个代理 因为没这个无法访问GPT官网 忍…

类与对象,对象在内存的存在形式,java方法

类是抽象的,概念的,代表一类事物,比如人类,猫类..即它是数据类型对象是具体的实际的,代表一个具体事物,即实例。类是对象的模板,对象是类的一个个体,对应一个实例 public class Targ…

Jenkins入门

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具 持续集成(CI)是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程 可以简单将jenkins理解为一个代码部署工具。 在没有持续部署工具之前&#x…

【Redis进阶】Redis数据结构

文章目录1. 前言2. SDS2. 链表3. 压缩链表4. 哈希表5. 整数集合6. 跳表7. quicklist8. listpack1. 前言 Redis常用的数据结构为String,List,Hash,Set,Sorted Set。但这只是我们在用的时候键值对的表现形式,他们底层真…

《程序员面试金典(第6版)》面试题 08.05. 递归乘法

题目描述 递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。 示例1: 输入:A 1, B 10 输出:10 示例2: 输入:A 3, B 4 输出:…

vue3使用useMouseInElement实现图片局部放大预览效果

1、首先要安装vueuse/core npm i vueuse/core2、实现过程如下&#xff1a; <template><div class"goods-image"><!-- 大图 --><div v-show"show" class"large" :style"[{backgroundImage:url(${images[currIndex]})…

Cursor,程序员的 AI 代码编辑助手

相信大家都或多或少地听说过、了解过 chatGPT &#xff0c;半个月前发布的 GPT-4 &#xff0c;可谓是 AI 赛道上的一个王炸 那么今天咸鱼给大家分享一个开源的 AI 代码编辑器——Cursor&#xff0c;让各位程序员在编程之路上一骑绝尘 &#x1f603; 介绍 Cursor 是一个人工智…

深度学习应用技巧4-模型融合:投票法、加权平均法、集成模型法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下&#xff0c;深度学习中的模型融合。它是将多个深度学习模型或其预测结果结合起来&#xff0c;以提高模型整体性能的一种技术。 深度学习中的模型融合技术&#xff0c;也叫做集成学习&#xff0c;是指同时使用多个…

209. 长度最小的子数组

209. 长度最小的子数组 力扣题目链接(opens new window) 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入…

Java实现查找文件

1 问题 如何利用java来查找文件&#xff1f; 2 方法 2.1定义一个查找类&#xff0c;设置两个参数&#xff08;查找的目录和文件后缀名&#xff09;&#xff0c;然后判断文件夹是否为空 2.2 判断是否是文件夹&#xff0c;如果是文件夹则将里面的文件放入数组进行遍历&#xff08…

【Python零基础学习入门篇①】——基本语法与变量

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello&#xff0c;大家好呀我是陈童学&#xff0c;一个普通大一在校生&#xff0c;请大家多多关照呀嘿嘿&#x1f601;&#x1f60a;&#x1f618; &#x1f31f;&#x1f31f;&#x1f31f;技术这条路固然很艰辛&#xff0c;但既已选择&#x…

Redis 事务相关操作

Redis 作为一个非关系型内存数据库&#xff0c;也有事务定义 1. 事务的定义-ACID特性 A表示原子性&#xff1a;即事务是一个不可分割的实体&#xff0c;事务中的操作要么都完成&#xff0c;要么都不完成 C表示一致性&#xff1a;即事务前后数据完整性必须一致&#xff0c;假…

基于springboot实现数码论坛系统设计与实现演示【附项目源码+论文说明】

基于springboot实现数码论坛系统设计与实现演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Jieba分词的准确率提升:使用paddle模式进行分词(使用百度飞桨深度学习模型进行分词)

1 Paddle模式简介 jieba中的paddle模式是指使用飞桨&#xff08;PaddlePaddle&#xff09;深度学习框架加速分词的一种模式。相对于传统的分词算法&#xff0c;paddle模式采用了深度学习模型&#xff0c;可以获得更高的分词准确度和更快的分词速度。 paddle模式是基于卷积神经…

数据分析之Pandas(2)

3.Pandas 文章目录3.Pandas3.3 Pandas进阶3.3.1 数据重塑和轴向旋转&#xff08;1&#xff09;层次化索引Series的层次化索引DataFrame的层次化索引层次化——电影数据示列&#xff08;2&#xff09;数据旋转3.3.2 数据分组、分组运算3.3.3 离散化处理3.3.4 合并数据集&#xf…

使用langchain打造自己的大型语言模型(LLMs)

我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知&#xff0c;无所不能&#xff0c;但是由于有机器人所学习到的是截止到2021年9月以前的知识&#xff0c;所以当用户询问机器人关于2021年9月以后发送的事情时&#xff0c;它无法给出正确的答案&#x…

【Java 21 新特性 】顺序集合(Sequenced Collections)

Java 21 中增加了一种新的集合类型&#xff1a;顺序集合&#xff08;Sequenced Collections&#xff09;。要介绍顺序集合&#xff0c;就首先要说明一下出现顺序&#xff08;encounter order&#xff09;。出现顺序指的是在遍历一个集合时&#xff0c;集合中元素的出现顺序。有…

Redis高频40问

Redis连环40问&#xff0c;绝对够全&#xff01; Redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用 C 语言编写的&#xff0c;高性能非关系型的键值对数据库。与传统数据库不同的是&#xff0c;Redis 的数据是存在内存中的&#xf…

Python:每日一题之《全排列的价值》真题练习

问题描述 对于一个排列 A(a1​,a2​,⋯,an​), 定义价值 ci​ 为 a1​ 至 ai−1​ 中小于 ai​ 的数 的个数, 即 。 ci​∣{aj​∣j<i,aj​<ai​}∣。 ​ 定义 A 的价值为 ∑i1n​ci​ 。 给定 n, 求 1 至 n 的全排列中所有排列的价值之和。 输入格式 输入一行包含…