Transformer目标检测 | DETR论文解读

news2024/12/27 16:41:42

0. 前言

DETR是首个将Transformer应用到2D目标检测任务中的算法,由Facebook2020年在论文《End-to-End Object Detection with Transformers》中提出。与传统目标检测算法不同的是,DETR将目标检测任务视为一个直接的集合预测问题,采用基于集合的全局损失通过二分匹配实现一对一的预测输出,不需要非极大值抑制(NMS)和手工设计Anchor这些操作,基于Transformer的编码器-解码器架构实现了端到端的目标检测,整个实现流程非常简单明了。

如果对Transformer还不是很了解的话可以看我之前的这篇文章:

Transformer模型结构解析与Python代码实现

1. 实现细节

1.1 网络结构

DETR的网络结构非常简单,主要包括三个部分:一个用于提取图像特征的CNN骨干网络,一个基于编码器-解码器的Transformer结构,一个用于实现最终检测预测的前馈网络(FFN)。

骨干网络

对于一张输入图片 x i m g ∈ R 3 × H 0 × W 0 x_{img} \in \mathbb{R} ^{3 \times H_{0} \times W_{0}} ximgR3×H0×W0,基于传统CNN的骨干网络会输出多个通道的低分辨率特征图 f ∈ R C × H × W f \in \mathbb{R} ^{C \times H \times W} fRC×H×W,其中 C = 2048 C=2048 C=2048 H = H 0 / 32 H=H_{0}/32 H=H0/32 W = W 0 / 32 W=W_{0}/32 W=W0/32

Transformer编码器

首先通过 1 × 1 1 \times 1 1×1的卷积层将特征图 f f f的通道数由 C C C减少到 d d d,得到新的特征图 z 0 ∈ R d × H × W z_{0} \in \mathbb{R} ^{d \times H \times W} z0Rd×H×W,由于Transformer需要输入一个序列,因此还需要特征图 z 0 z_{0} z0的维度变换为 d × H W d \times HW d×HW。每个编码器层都由一个多头自注意模块和一个前馈网络组成,每个注意力层的输入中都会添加位置编码。

Transformer解码器

解码器与标准的Transformer解码器相同,由自注意力和交叉注意力层组成。不同的是,DETR的解码器在每个解码器层并行地解码N个对象。由于解码器也是置换不变的,因此N个输入嵌入必须不同才能产生不同的输出结果,因此在每个注意力层的输入中也需要添加位置编码。N个输入嵌入是可学习的位置编码参数,作者称之为目标查询(object queries)。目标查询经过解码器被转换为输出嵌入,然后送入前馈网络中独立解码为目标框的坐标和类别标签,产生N个最终的预测结果。

前馈网络

前馈网络由带ReLU激活函数的3层感知机以及1个线性映射层组成,输出的预测结果为归一化的目标中心点坐标,检测框相对于输入图像的宽高以及所属类别的标签。模型总共预测N个目标的信息,其中N是一个远大于通常图像中目标数量的常数(比如100)。此外,作者还使用一个额外的特殊类别$\phi $表示空目标,类似于传统目标检测任务中的背景类别。

1.2 损失函数

目标检测集合预测损失

假设N个预测结果为 y ^ = { y ^ i } i = 1 N \hat{y} =\left \{ \hat{y}_{i} \right \}_{i=1}^{N} y^={y^i}i=1N,对应的一组目标的真值为 y y y,其中 y y y用空目标$\phi $进行补齐到N的大小。为了找到真值与预测结果的最优匹配,我们的目标是求匹配代价最小的一组匹配对:

其中, L m a t c h ( y i , y ^ δ ( i ) ) \mathcal{L}_{match}(y_{i},\hat{y}_{\delta (i)}) Lmatch(yi,y^δ(i))表示真值 y i y_{i} yi与预测结果 y ^ δ ( i ) \hat{y}_{\delta (i)} y^δ(i)之间的匹配代价,最优分配可以通过匈牙利算法高效地求得。

匹配代价同时考虑了类别预测结果以及预测的框和真实框的相似度。每个真值可以定义为

y i = ( c i , b i ) y_{i}=(c_{i},b_{i}) yi=(ci,bi)

其中 c i c_{i} ci表示类别标签(可能为空目标$\phi ), ), ),b_{i} \in [0,1]^{4}$是一个包含真实框的中心点坐标和宽高(相对于输入图像尺寸)的向量。

对于一个序号为 δ ( i ) \delta (i) δ(i)的预测结果 y ^ δ ( i ) \hat{y}_{\delta (i)} y^δ(i),定义其类别为 c i c_{i} ci的概率为 p ^ δ ( i ) ( c i ) \hat{p}_{\delta (i)}(c_{i}) p^δ(i)(ci),预测框为 b ^ δ ( i ) \hat{b}_{\delta (i)} b^δ(i)。那么真值 y i y_{i} yi与预测结果 y ^ δ ( i ) \hat{y}_{\delta (i)} y^δ(i)之间的匹配代价 L m a t c h ( y i , y ^ δ ( i ) ) \mathcal{L}_{match}(y_{i},\hat{y}_{\delta (i)}) Lmatch(yi,y^δ(i))可以表示为

L m a t c h ( y i , y ^ δ ( i ) = − 1 { c i ≠ ϕ } p ^ δ ( i ) ( c i ) + 1 { c i ≠ ϕ } L b o x ( b i , b ^ δ ( i ) ) \mathcal{L}_{match}(y_{i},\hat{y}_{\delta (i)}=\mathbb{-1}_{\left \{ c_{i}\ne \phi \right \}} \hat{p}_{\delta (i)}(c_{i}) + \mathbb{1}_{\left \{ c_{i}\ne \phi \right \}} \mathcal{L}_{box} (b_{i},\hat{b}_{\delta (i)}) Lmatch(yi,y^δ(i)=1{ci=ϕ}p^δ(i)(ci)+1{ci=ϕ}Lbox(bi,b^δ(i))

接下来是计算所有匹配对的匈牙利匹配损失:

出于类别平衡的考虑,当 c i = ϕ c_{i}=\phi ci=ϕ时,作者会降低对数概率项的权重。

Bounding box损失

Bounding box损失 L b o x ( ⋅ ) \mathcal{L}_{box}(\cdot) Lbox() l 1 \mathcal{l_{1}} l1损失和GIoU损失的线性组合:

其中 λ i o u , λ L 1 ∈ R \lambda _{iou},\lambda _{L1} \in \mathbb{R} λiou,λL1R是超参数, L i o u ( ⋅ ) \mathcal{L}_{iou}(\cdot) Liou()GIoU损失

其中 ∣ ⋅ ∣ \left | \cdot \right | 表示求面积。

2. 扩展

DETR具有很好的扩展性,作者在Transformer解码器输出的顶部添加了一个掩码头用于预测每个预测框的二进制掩码,将其扩展到全景分割任务中去。这个掩码头将每个对象Transformer解码器的输出作为输入,并在编码器的输出上计算此嵌入的多头(有M个头)注意力分数,为每个对象生成M个小分辨率的注意力热图。为了做出最终预测并提高分辨率,作者使用了类似FPN的架构。

每个掩码都采用DICE/F-1 lossFocal loss独立地进行监督训练,DICE损失的定义如下:

其中$\delta $表示sigmoid函数,loss值会根据目标数量进行归一化。

分割效果:

3. 参考资料

  • End-to-End Object Detection with Transformers

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

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

相关文章

Java同城宠物兼职遛狗系统小程序源码

🐾【同城新宠】遛狗兼职大揭秘!一键解锁“遛狗系统”,狗狗开心你也赚!✨ 🐾 开篇:告别孤单,狗狗也需要社交圈!👭 Hey小伙伴们,你家的小毛球是不是总在家里闷…

周杰伦又救了腾讯音乐一次

文丨郭梦仪 “一个周杰伦撑起了半个腾讯音乐”,近十年前对腾讯音乐的调侃,如今依然成立。 作为中国乐坛霸主,腾讯音乐(简称TME,1698.HK)过去打下的音乐版权江山,似乎已成其取之不尽的金矿&…

Github-vscode联合使用保姆及教程

Github-VScode联合使用保姆及教程 update: 2024/8/10 _Karen bluu 文章目录 Github-VScode联合使用保姆及教程1.Git 和 Github分别是什么2.安装2.1 git安装2.2 vscode安装 3. 使用Github3.1 拉取项目3.1.1 拉取方法3.1.2 注意事项 3.2 寻找合适的项目3.3 创建自己的github仓库3…

【Python学习-UI界面】PyQt5 小部件12-QStackedWidget 多页显示

功能和 QTabWidget 类似,它也有助于高效利用窗口的客户区域。 QStackedWidget 提供了一个窗口堆栈,每次只能查看一个窗口。它是建立在 QStackedLayout 之上的一个有用的布局。 样式如下: 右键可以变型为QTabWidget

养生生活视频素材去哪里找?养生系列视频素材网站分享

如何寻找高质量的养生视频素材。无论您是刚入行的新手,还是拥有众多粉丝的资深创作者,优质的养生视频素材都是吸引观众的关键。接下来,我将介绍一些顶级平台,帮助您轻松获取各类养生视频素材。 蛙学网 首先推荐的平台是蛙学网。这…

redisssion分布式锁

分布式锁的问题 基于setnx的分布式锁实现起来并不复杂,不过却存在一些问题。 锁误删问题 第一个问题就是锁误删问题,目前释放锁的操作是基于DEL,但是在极端情况下会出现问题。 例如,有线程1获取锁成功,并且执行完任…

Vue2 和 Vue3中EventBus使用差异

目录 前言一、EventBus 和 mitt 的对比二、Vue 2 中的 EventBus 使用实例2.1 创建 EventBus2.2 在组件中使用 EventBus2.2.1 组件 A - 发送事件2.2.2 组件 B - 监听事件 2.3 注意事项 三、Vue 3 中的 mitt 使用实例3.1 安装 mitt3.2 创建 mitt 实例3.3 在组件中使用 mitt3.3.1 …

【笔记】MSPM0G3507开发环境搭建——MSPM0G3507与RT_Thread(一)

环境搭建大体过程就不再赘述了,本文记录一下我刚开始搭建环境时踩过的坑以及一些不太懂的地方。后边会出MSPM0G3507RT-Thread 3.1.5相关的教程,感兴趣记得点点关注。 本篇使用立创地猛星MSPM0G3507开发板 参考文章: 【学习笔记一】搭建MSPM…

几种Word Embedding技术详解

NLP 中的词嵌入是一个重要术语,用于以实值向量的形式表示用于文本分析的单词。这是 NLP 的一项进步,提高了计算机更好地理解基于文本的内容的能力。它被认为是深度学习在解决具有挑战性的自然语言处理问题方面最重要的突破之一。 在这种方法中&#xff…

视觉SLAM中的数学基础:李群与李代数

在视觉SLAM(Simultaneous Localization and Mapping)中,理解和应用李群(Lie Group)与李代数(Lie Algebra)是非常关键的。李群与李代数为描述和处理空间中的连续变换(如旋转和平移&am…

【OCR 学习笔记】二值化——局部阈值方法

二值化——局部阈值方法 自适应阈值算法Niblack算法Sauvola算法 自适应阈值算法 自适应阈值算法1用到了积分图(Integral Image)的概念。积分图中任意一点 ( x , y ) (x,y) (x,y)的值是从图左上角到该点形成的矩形区域内所有值的和。即: I (…

逻辑回归之鸢尾花数据集多分类任务

目录 1.导入数据 2.定义多分类模型 3.准备测试数据 4.绘制决策边界 对于多分类任务,其实就是多个二分类任务。 先分黑色(标签为1)和其他(标签为0),在这个基础上再去分红色和绿色,此时就将红色标签设置为1,其他设置为0&#x…

关于 Lora中 Chirp Spread Spectrum(CSS)调制解调、发射接收以及同步估计的分析

本文结合相关论文对CSS信号的数学形式、调制解调、发射接收以及同步估计做了全面分析,希望有助于更好地理解lora信号 long-range (LoRa) modulation, also known as chirp spread spectrum (CSS) modulation, in LoRaWAN to ensure robust transmission over long d…

Unity(2022.3.38LTS) - 页面介绍

目录 A. 创建项目 B.Unity 编辑器页面 C. 自己点点 A. 创建项目 有多个编辑器版本的选择编辑器. 3D和2D的区别就是初始化的包不同,这些包打开项目之后都可以在自行下载,随意切换, B.Unity 编辑器页面 Unity 编辑器页面是一个高度集成且功能丰富的开发环境,为游…

ISE14.7后仿真、烧录教程

ISE14.7后仿真、烧录教程 ISE14.7后仿真、烧录教程 系统版本:win10,EDA工具版本:ISE14.7,modelsim SE 10.4,本文主要包含两部分内容,首先是基于ISE的后仿真,基于ISE和modelsim的联合后仿真&am…

C++简单界面设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {---------------------窗口设置----------------------this->setWindowTitle("南城贤子摄影工作室");//设置窗口标题this->setWindowIcon(QIcon("d:\\Pictures\\C…

上海悠远为您解析芯片管理系统的核心功能

在当今科技日新月异的时代,芯片作为信息技术的基石,其管理效率与安全性直接关系到整个系统的稳定运行与数据安全。因此,一个高效、智能的芯片管理系统成为了不可或缺的技术支撑。该系统通过集成多项核心技术,实现了对芯片从生产到…

统信UOSV20 安装redis

在线安装 在统信软件(UOS)上使用yum安装Redis,可以按照以下步骤进行: 打开终端。首先添加Redis的官方仓库,可以使用以下命令: sudo yum install epel-release安装Redis: sudo yum install r…

简单的spring boot tomcat版本升级

简单的spring boot tomcat版本升级 1. 需求 我们使用的springboot版本为2.3.8.RELEASE,对应的tomcat版本为9.0.41,公司tomcat对应版本发现攻击者可发送不完整的POST请求触发错误响应,从而可能导致获取其他用户先前请求的数据,造…

c# 直接使用c++ 类库文件

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…