DETR详解

 1.概述

  • DETR,全称为Detection Transformer,是Facebook在ECCV2020上提出的基于Transformer的端到端目标检测网络
  • 最大的特点就是:不需要预定义的先验anchor,也不需要NMS的后处理策略,就可以实现端到端的目标检测。
  • 但是,DETR大目标检测上性能是最好的,而小目标上稍差,而且基于match的loss导致学习很难收敛(即难以学习到最优的情况)。
  • DETR的总体框架如下,先通过CNN提取图像的特征;再送入到transformer encoder-decoder中,该编码器解码器的结构基本与transformer相同,主要是在输入部分和输出部分的修改;最后得到类别和bbox的预测,并通过二分匹配计算损失来优化网络。

源码地址:https://link.zhihu.com/?target=https%3A//github.com/facebookresearch/detr

2、transformer的基本结构

  • DETR其实基本遵循了transformer的encoder-decoder结构,如下:
  • encoder-decoder的基本流程为:

1)对于输入,首先进行embedding操作,即将输入映射为向量的形式,包含两部分操作,第一部分是input embedding:例如,在NLP领域,称为token embedding,即将输入序列中的token(如单词或字符)映射为连续的向量表示;在CV领域,可以是将每个像素或者每个patch块映射为向量形式,例如,patch embedding层
2)另一个embedding操作为positional encoding即位置编码,即一组与输入经过embedding操作后的向量相同维度的向量(例如都为[N, HW, C]),用于提供位置信息。位置编码与input embedding相加得到transformer 编码器的输入。
3)transformer encoder:是由多个编码模块组成的编码器层,每个编码模块由多头自注意力机制+残差add+层归一化LayerNorm+前馈网络FFN+残差add+层归一化LayerNorm组成

多头自注意力机制:核心部分,例如,在CV领域,经过embedding层后的输入为[N, HW, C],N为Batch num,HW为像素个数,每个像素映射为一个维度为C的向量;然后通过QKV的自注意力机制和划分为多头的方式,得到输出为[N, HW, C]:

要除以^{\sqrt{}}d_{k}的原因:查询(Query)与键(Key)之间的点积,然后将这个点积除以一个缩放因子,最后应用softmax函数来获得注意力权重。如果不进行缩放,当键的维度dk很大时,点积的结果可能会非常大,这会导致softmax函数的梯度非常小,从而引起梯度消失问题。通过除以根号dk,提高训练的稳定性。

add+LayerNorm:经过多头自注意力机制后再与输入相加,并经过层归一化LayerNorm,即在最后一个维度C上做归一化,详见https://blog.csdn.net/m0_48086806/article/details/132153059
前馈网络FFN:是由两个全连接层+ReLu激活函数组成

4)transformer decoder:是由多个解码模块组成的解码器层,每个解码模块由Masked多头自注意力机制+残差add&层归一化LayerNorm+多头cross attention机制+add&LayerNorm+前馈网络FFN+add&LayerNorm
5)此外需要注意的是,第一个解码模块的输入为output(可以初始化为0或者随机初始化)经过embedding操作后的结果,之后各个解码模块的输入就变为前一个解码模块的输出了;第二个cross attention机制的QKV输入分别为:KV键值对都是等于编码器最终的输出;Query为Masked多头自注意力的输出

Masked多头自注意力机制:一个通俗解释为:一个词序列中,每个词只能被它前面的词所影响,所以这个词后面的所有位置都需要被忽略,所以在计算Attention的时候,该词向量和它后面的词向量的相关性为0。因此为Mask

6)最后通过Linear层+Softmax得到最终的输出

3、DETR详解

  • DETR基本结构如下:简单来说,就是通过CNN提取图像特征(通常 Backbone 的输出通道为 2048,图像高和宽都变为了 1/32),并经过input embedding+positional encoding操作转换为图像序列(如下图所说,就是类似[N, HW, C]的序列)作为transformer encoder的输入,得到了编码后的图像序列,在图像序列的帮助下,将object queries(下图中说的是固定数量的可学习的位置embeddings)转换/预测为固定数量的类别+bbox预测。也就是说Transformer本质上起了一个序列转换的作用。
  • 总结一下,DETR 分为四个部分,首先是一个 CNN 的 backbone,Transformer 的 Encoder,Transformer 的 Decoder,最后的预测层 FFN。

  • 详细结构如下:

  • DETR中的encoder-decoder中与transformer的区别有

1)spatial positional encoding:新提出的二维空间位置编码方法,该位置编码分别被加入到了encoder的self attention的QK和decoder的cross attention的K,同时object queries也被加入到了decoder的两个attention(第一个加到了QK中,第二个加入了Q)中。而原版的Transformer将位置编码加到了input和output embedding中。
2)DETR在计算attention的时候没有使用masked attention,因为将特征图展开成一维以后,所有像素都可能是互相关联的,因此没必要规定mask。
3)object queries的转换过程:object queries是预定义的目标查询的个数,代码中默认为100。它的意义是:根据Encoder编码的特征,Decoder将100个查询转化成100个目标,即最终预测这100个目标的类别和bbox位置。最终预测得到的shape应该为[N, 100, C],N为Batch Num,100个目标,C为预测的100个目标的类别数+1(背景类)以及bbox位置(4个值)。
4)得到预测结果以后,将object predictions和ground truth box之间通过匈牙利算法进行二分匹配:假如有K个目标,那么100个object predictions中就会有K个能够匹配到这K个ground truth,其他的都会和“no object”匹配成功,使其在理论上每个object query都有唯一匹配的目标,不会存在重叠,所以DETR不需要nms进行后处理
5)分类loss采用的是交叉熵损失,针对所有predictions;bbox loss采用了L1 loss和giou loss,针对匹配成功的predictions.

3.1 CNN Backbone

CNN 的特征提取部分没有什么可以说的,在 2020 年时候,还没有 Swin 这样的可以针对不同分辨率图像输入的 Transformer Backbone。目标检测的图一般比较大,那么直接上 Transformer 计算上吃不消,所以先用 CNN 进行特征提取并缩减尺寸,再使用 Transformer 是常规操作(或者说无奈之举)。

原始 DETR 使用 Imagenet 预训练好的 Resnet,这一部分就极其多变了,可以上 Swin 等等了。那么通常 Backbone 的输出通道为 2048,图像高和宽都变为了 1/32。

3.2 Transformer Encoder

经过 Backbone 后,将输出特征图 reshape 为 C × H W C \times HWC×HW,因为 C = 2048 C = 2048C=2048 是每个 token 的维度,还是比较大,所以先经过一个 1 × 1 1 \times 11×1 的卷积进行降维,然后再输入 Transformer Encoder 会更好。此时自注意力机制在特征图上进行全局分析,因为最后一个特征图对于大物体比较友好,那么在上面进行 Self-Attention 会便于网络更好的提取不同位置不同大物体之间的相互关系的联系,比如有桌子的地方可能有杯子,有草坪的地方有树,有一个鸟的地方可能还有一个鸟等等。所以 DETR 在大目标上效果比 Faster RCNN 好就比较容易理解到了。然后位置编码是被每一个 Multi-Head Self-Attention 前都加入了的,这个就比较狠了。为了体现图像在 x 和 y 维度上的信息,作者的代码里分别计算了两个维度的 Positional Encoding,然后 Cat 到一起。整个 Transformer Encoder 和之前的没什么不同。

3.3 Transformer Decoder

Transformer Decoder 也有几个地方需要着重强调。首先就是如何考虑同时进行一个集合预测?之前讲分类的时候都是给一个 class token,因为只进行一类预测。那么现在同时进行不知道多少类怎么办呢?因为目标预测框和输入 token 是一一对应的,所以最简单的做法就是给超多的查询 token,超过图像中会出现的目标的个数(在过去也是先生成 2000 个框再说)。所以在 DETR 中,作者选择了固定的 N = 100 个 token 作为输入,只能最多同时检测 100 个物体。据闻,这种操作可能跟 COCO 评测的时候取 top 100 的框有关。输入 100 个 decoder query slots (Object Query),并行解码N个object,对应的 Transformer decoder 也就会输出 100 个经过注意力和映射之后的 token,然后将它们同时喂给一个 FFN 就能得到 100 个框的位置和类别分数(因为是多分类,所以类别个数是 K + 1,1 指的是背景类别)。

固定预测个数更为简单,定长的输出有利于显存对齐,但是 N = 100 会不会冗杂呢?作者的实验表明,当图像内目标个数在 50 左右的时候,网络就已经区域饱和了,之后就会出现目标丢失。当图像内目标在一百个左右时,其实网络只能检测出来三四十个,这比图像中只有 50 个实例被检测到的情况还要少。作者认为出现这样反常的原因还是因为检测结果与训练分布相差甚远,是训练集中没有那么多多目标图片所造成的。

为了提升 AP,作者也坦然说到对应推理时出现的一些预测为背景的,用第二高分的类别覆盖这些槽的预测,使用相应的置信度。但是具体是怎么选的,比如背景概率在0.7以下使用还是怎么,就从论文中不可知了…

At inference time, some slots predict empty class. To optimize for AP, we override the prediction of these slots with the second highest scoring class, using the corresponding confidence.

与 ViT 他们不同的另外一点是,DETR 的 Decoder 也加了 Positional Encoding。这个思想其实也很自然。当作图像分类是,其实 class token 就一个,对应整个图片,那么自然无需 positional encoding,自己把整个图都占全了。但是在做目标检测时,可能会希望不同的 Object Query 是不是对应图像中不同的位置会好一些。那么按照这个思想,Object Query 自然就是 positional encodings,也就是我就是要查询这里的物体,你预测出来的就是对应的如果有物体的话就是它的类别和位置。

怎么加,在哪里加 positional encodings? Transformer Decoder 做得比 Encoder 还要狠,不仅 encoder 用的那个 position encodings,也要给每层的 key 加上;Decoder 每一层的 query 还是加了 positional encodings (Object Query) 的。

还有一点值得注意的是:Decoder 每一层的输出结果也经过参数共享的最后的那个 FFN 进行预测并计算loss,实现 深监督。

作者给出了可视化结果,对应于 100 个 Object Query 中的 20 个 Object Query 在 COCO2017 验证集中预测得到的目标的中心点位置分布。绿色表示小物体,红色表示水平的大物体,蓝色表示竖直的大物体。可见不同的 Object Query 确实实现了想要去查询不同地方出现的小物体,比如左下,右边,右上等等。但是对于大物体而言,大家检测出来的定位是相近的。

3.4 FFN

最后的 FFN 是由具有 ReLU 激活函数且具有隐藏层的 3 层线性层计算的,或者说就是 1 × 1 1 \times 11×1 卷积。FFN 预测框标准化中心坐标,高度和宽度,然后使用 softmax 函数激活获得预测类标签。

最终网络的大致推理过程如下图所示:

4.二分图匹配和损失函数

DETR 预测了一组固定大小的 N = 100 个边界框,这比图像中感兴趣的对象的实际数量大得多。怎么样来计算损失呢?或者说预测出来的框我们怎么知道对应哪一个 ground-truth 的框呢?

为了解决这个问题,第一步是将 ground-truth 也扩展成 N = 100 个检测框。使用了一个额外的特殊类标签 ϕ 来表示在未检测到任何对象,或者认为是背景类别。这样预测和真实都是两个100 个元素的集合了。这时候采用匈牙利算法进行二分图匹配,即对预测集合和真实集合的元素进行一一对应,使得匹配损失最小

我们来看看 ground truth y i  和预测出来的第 δ ( i ) 个结果之间的匹配损失。首先是对于那些不是背景的,获得其对应的预测是目标类别的概率,然后用框损失减去预测类别概率。这也就是说不仅框要近,类别也要基本一致,是最好的。经过匈牙利算法之后,我们就得到了 ground truth 和预测目标框之间的一一对应关系。然后就可以计算损失函数了。

损失函数和匹配损失不同之处在于,损失函数需要是正值,所以使用了 log-probability。对于 c i = ϕ 的类别损失,将分类损失除了 10,降低其作用,因为正负样本不均衡。这种思想和 Faster R-CNN 等一致。

分类loss采用的是交叉熵损失,针对所有predictions;box loss采用了l1 loss和giou loss,针对匹配成功的predictions;target_boxes 是按target index获取的所有匹配成功的真值box,src_boxes是按src index获取的匹配成功的predictions,计算它们之间的l1_loss和giou loss。

5.总结

之前还有幸接触外国博主的一种理解,说 Transformer 的 Self-Attention 对于目标检测友好的观点,个人觉得非常好。他说:Backbone 输出的特征图经过 1 × 1 1 \times 11×1 卷积后进行降维,得到的是 d × H × W d \times H \times Wd×H×W,被 reshape 成 d × H W d \times HWd×HW 作为 Transformer Block 的输入。在 Encoder 阶段,会计算 H W × H W HW \times HWHW×HW 的 Attention Matrix,那么其实 Attention Matrix 上每一个值,其实就是考虑了 Backbone 输出的特征图空间上的两个点,因为 token 数量和特征图空间像素个数一样,那么这两个点,其实就已经构建出来了一个 box(左上角和右下角)。从这个角度来看,神经网络在基于 Attention Matrix 进行思考时,其实也可以从某种意义上就是在对一个个 bounding box 进行思考,这对于目标检测任务似乎是非常利好的。

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

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

相关文章

南昌长空STONE 60A-M 无人机电调深度测评:轻量化设计与工业级安全的融合典范

引言 在无人机技术不断革新的今天,电调作为动力系统的核心组件,其性能直接影响飞行稳定性与操控体验。STONE 系列凭借 “轻量化设计” 理念,在竞争激烈的市场中独树一帜。本文将深度解析 STONE 60A-M 电调的技术亮点与实际表现,探…

初阶数据结构(C语言实现)——4.2队列

目录 2.队列2.1队列的概念及结构2.2队列的实现2.2.1 初始化队列2.2.2 销毁队列2.2.3 队尾入队列2.2.4 队头出队列2.2.5获取队列头部元素2.2.6 获取队列队尾元素2.2.7获取队列中有效元素个数2.2.8 检测队列是否为空,如果为空返回非零结果,如果非空返回0 3…

C++和OpenGL实现3D游戏编程【连载24】——父物体和子物体之间的坐标转换

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 父子物体的坐标转换 1、本节要实现的内容 前面章节我们了解了父物体与子物体的结构,它不仅能够表示物体之间的层次关系,更重要的一个作用就是展示物…

怎么实现: 大语言模型微调案例

怎么实现: 大语言模型微调案例 目录 怎么实现: 大语言模型微调案例输入一个反常识的问题:首都在北京天安门之后对输出模型进行测试:首都在北京天安门微调代码:测试微调模型代码:微调输出模型结构输出模型参数大小对比Qwen 2.5_0.5:53MB输出模型:951MB 是一样的,没有进行…

知乎后台管理系统:数据库系统原理实验1——数据库基础概念

实验背景 通过练习绘制语义网络,加深对于基本概念之间关系的理解和掌握。掌握在VISIO中绘制能准确表达基本概念之间关系的语义网络的技能。了解并比较数据模型的Chen’s表示法和UML表示法。理解关系模型设计中的完整性约束的重要性。掌握在Linux操作系统下远程访问…

超过 37000 台 VMwareESXi 服务器可能受到持续攻击威胁

近日,威胁监测平台影子服务器基金会(The Shadowserver Foundation)发布报告,指出超 3.7 万个互联网暴露的威睿(VMware)ESXi 实例存在严重安全隐患,极易受到 CVE-2025-22224 漏洞的攻击。该漏洞属…

Linux《基础开发工具(中)》

在之前的Linux《基础开发工具(上)》当中已经了解了Linux当中到的两大基础的开发工具yum与vim;了解了在Linux当中如何进行软件的下载以及实现的基本原理、知道了编辑器vim的基本使用方式,那么接下来在本篇当中将接下去继续来了解另…

Vue3 Pinia 符合直觉的Vue.js状态管理库

Pinia 符合直觉的Vue.js状态管理库 什么时候使用Pinia 当两个关系非常远的组件,要传递参数时使用Pinia组件的公共参数使用Pinia

知识库Dify和cherry无法解析影印pdf word解决方案

近期收到大量读者反馈:上传pdf/图文PDF到Dify、Cherry Studio等知识库时,普遍存在格式错乱、图片丢失、表格失效三大痛点。 在试用的几款知识库中除了ragflow具备图片解析的能力外,其他的都只能解析文本。 如果想要解析扫描件&#xff0c…

Webservice创建

Webservice创建 服务端创建 3层架构 service注解(commom模块) serviceimpl(server) 服务端拦截器的编写 客户端拦截器 客户端调用服务端(CXF代理) 客户端调用服务端(动态模式调用&a…

腾讯云低代码开发应用

创建客户端应用 如上所示,登录腾讯云微搭低代码业务控制台,开始搭建企业官网应用 如上所示,在腾讯云微搭低代码业务控制台中,开始创建企业官网应用 如上所示,在腾讯云微搭低代码业务控制台中,开始编辑企业官…

【Java开发指南 | 第三十四篇】IDEA没有Java Enterprise——解决方法

读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 1、新建Java项目2、单击项目名,并连续按两次shift键3、在搜索栏搜索"添加框架支持"4、勾选Web应用程序5、最终界面6、添加Tomcat 1、新建Java项目 2、单击项目名,并连续按两次…

深度学习原理与Pytorch实战

深度学习原理与Pytorch实战 第2版 强化学习人工智能神经网络书籍 python动手学深度学习框架书 TransformerBERT图神经网络: 技术讲解 编辑推荐 1.基于PyTorch新版本,涵盖深度学习基础知识和前沿技术,由浅入深,通俗易懂&#xf…

uniapp项目运行失败Error: getaddrinfo *.bspapp.com 文件查找失败uview-ui及推荐MarkDown软件 Typora

一、uniapp项目运行失败Error: getaddrinfo *.bspapp.com 文件查找失败uview-ui 在运行一个uniapp项目时,出现报错 文件查找失败:uview-ui,Error: getaddrinfo ENOTFOUND 960c0a.bspapp.com。hostname异常,报错的详细信息如下&…

什么是vue的keep-alive?它是如何实现的?具体缓存了什么内容?

文章目录 一、keep-alive 的核心作用二、实现原理1. 缓存管理策略2. 核心源码解析(Vue 2.x 简化版)3. 缓存生命周期 三、缓存的具体内容1. 缓存对象结构2. 具体缓存内容 四、使用示例1. 基础用法2. 配置缓存策略 五、注意事项六、实现流程图解 Vue 的 k…

pytest基础知识

pytest知识了解 pytest的基础知识了解:Python测试框架之pytest详解_lovedingd的博客-CSDN博客_pytest框架 (包含设置断点,pdb,获取最慢的10个用例的执行耗时) pytest-pytest.main()运行测试用例,pytest参数: pytest-…

Liunx(CentOS-6-x86_64)使用Nginx部署Vue项目

一:编译vue项目和上传到linux系统 通过本地编译器编译后的文件 上传服务器后的 二:安装 node(版本 v16.20.2)和npm( 8.19.4或 9.6.5) 备注一:安装nodejs就是安装node和npm, su…

分布式锁—Redisson的同步器组件

1.Redisson的分布式锁简单总结 Redisson分布式锁包括:可重入锁、公平锁、联锁、红锁、读写锁。 (1)可重入锁RedissonLock 非公平锁,最基础的分布式锁,最常用的锁。 (2)公平锁RedissonFairLock 各个客户端尝试获取锁时会排队,按照队…

2025年渗透测试面试题总结-字某某动-安全研究实习生(一面)(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 字某某动-安全研究实习生(一面) 一、岗位认知与方向选择 1. 对公司业务的理解 …

Dify平台部署记录

安装dify项目 官网地址:http://difyai.com/ github地址:https://github.com/langgenius/dify 下载项目: git clone https://github.com/langgenius/dify.git下载过慢,直接访问网页下载zip压缩包: 解压,…