DETR-《End-to-End Object Detection with Transformers》论文精读笔记

news2024/12/26 11:50:31

DETR(基于Transformer架构的目标检测方法开山之作)

End-to-End Object Detection with Transformers
参考:跟着李沐学AI-DETR 论文精读【论文精读】

摘要

在摘要部分作者,主要说明了如下几点:

  1. DETR是一个端到端(end-to-end)框架,释放了传统基于CNN框架的一阶段(YOLO等)、二阶段(FasterRCNN等)目标检测器中需要大量的人工参与的步骤,例如:NMS后处理或proposals/anchors/centers生成等。使其成为一个真正意义上的端到端(end-to-end)的目标检测框架;
  2. DETR还可以很方便地迁移到诸如全景分割等其他任务当中,只需要在最后的FFN(前向传播头)之后增加分割头等即可;
  3. DETR在当时发表出来的时候(2020年5月左右)已经达到了和经过长时间调参的FasterRCNN基线一样的精度/速度/内存占用(基准为COCO2017);

介绍

DETR模型架构

在这里插入图片描述

第一步,将图片输入到一个CNN中,得到feature map。

第二步,将图片拉直,送入到transformer encoder-decoder。其中,encoder的作用是为了进一步学习全局的信息,为最后的decoder(也就是为最后的出预测框做铺垫)。使用transformer的encoder是为使得图片中每一个特征点与图片中的其他特征有交互,这样就知道了哪块是哪个物体。这种全局的特征非常有利于移除冗余的框(全局建模)。

第三步,decoder生成框的输出,其中输入decoder的不只有encoder的输出,还有object query(用来限制decoder输出多少个框),通过object query和特征不停的做交互(在decoder中间去做self-attention操作),从而得到最后输出的框(论文中,作者选择的框数量为N=100)。

第四步,计算出来的N=100个框与Ground Truth做匹配然后计算loss(本部分是DETR这篇文章中最重要的一个贡献)。作者使用二分图匹配的方法去计算loss,从而决定出在预测出来的100个框中,有哪几个框是与ground-truth框对应的。匹配之后,就会和普通的目标检测一样去计算分类的loss、再算bounding box的loss。剩下的没有匹配上的框就会被标记为没有物体,也就是所谓的背景类。

DETR推理流程

推理的时候前三步和训练时保持一样,第四步因为是test过程,因此只需要在最后的输出上设置一下置信度阈值即可得到预测框,(原始论文中,将置信度设置为0.7,即置信度大于0.7的预测就是前景物体,所有置信度小于0.7的就被当做背景)。

DETR特性

对大物体识别效果很好(归功于Transformer架构的全局建模能力,而不是像原来一样,预测的物体大小受限制于你设置的anchor大小),对小物体识别效果较差(后续的Deformable DETR就提出了多尺度的DETR,同时解决了DETR训练太慢的问题);

相关工作

  1. 集合预测(因为使用集合预测来解决目标检测问题的工作其实并不多);
  2. Transformer架构(同时也介绍了parallel decoding,如何不像原来的transformer一样去做自回归预测);
  3. 介绍了一下目标检测之前的相关工作,其中重点引用了一篇当时最近的工作,指出原来的一阶段或二阶段的目标检测器的性能与初始的猜测(proposals/anchors/centers等)密切相关,这里作者重点想讲的就是不想使用这些复杂的人工先验知识,因此DETR在这个方面具有优势;
  4. 然后作者介绍了基于RNN的目标检测方法,使用的是自回归模型,时效性就比较差,性能也会比较差;DETR使用了不带掩码信息的decoder之后,可以使得预测输出同时进行,所以DETR的时效性大大增强了;

文章主体部分

作者首先介绍了基于二分图匹配的loss目标函数(因为这点比DETR这种架构来说更新,同时DETR架构是比较标准的,比较容易理解的,即便是其中的object query思想,也比较容易讲解,因此作者首先介绍了目标函数),也正是因为这种目标函数,DETR才能做到一对一的预测出框方式。

二分图匹配
举例理解:假如说有三个工人abc,然后需要完成三个工作xyz,因为所有工人的特点不一样,因此三个工人完成工作的时间等都不一致,因此对三个工人和三个不同的工作来说,会有一个 3 × 3 3\times3 3×3的矩阵,矩阵中对应的每个格子具有不同的数值(这个矩阵就叫做cost matrix,也就是损失矩阵);那么,这个二分图匹配的最终目的是:我可以给每个工人找到最擅长的工作,然后使得这三个人完成工作之后的代价最低;

匈牙利算法就是解决这样一个问题的比较好的方式。

scripy库中,包含匈牙利算法的实现:line_sum_assignment。DETR原始论文中使用的也是这个;
这个方法返回的结果就是一个全面的排列:告诉你哪个人应该做哪个事;

其实,DETR将目标检测问题看成是集合预测问题,其中每个工人可以看成是对应的N=100的预测框,然后xyz表示GroundTruth框;
那么,这个cost matrix矩阵的每个格子中放的就是每个预测框与GroundTruth框之间的cost(也就是loss);

这里的每个格子中表示的loss,就是分类损失和bbox loss,总的来说就是遍历所有预测的框,将这些框与GroundTruth进行计算loss,然后使用匈牙利算法得到最匹配的对应的图片中目标数量的框;

然后,作者又说,这里与一阶段/二阶段的目标检测器一样的道理,都是拿着预测出来的框与GroundTruth逐个计算loss。但是,唯一不同的地方在于DETR是只得到一对一的匹配关系,而不像之前方法一样得到一对多的匹配关系,这样DETR就不需要做后边的NMS后处理步骤。

loss目标函数
接下来,由于前边步骤得到了所有匹配的框,那么现在才计算真正的loss来做梯度回传。DETR在计算真正的loss(分类loss和bbox loss),其中对于分类loss,作者和原来的计算分类loss方法不一样,而是将DETR中这个地方的log去掉(作者发现去掉之后效果会更好一些)。然后对于bbox loss这里,与之前的loss计算方式也有所不同,原来计算bbox loss是使用L1 loss,但是l1 loss会出现框越大,计算出来的loss容易越大。而同时DETR这种基于Transformer架构的模型,对大目标(预测出大框很友好),那么得到的loss就会比较大,不利于优化。因此,作者不光使用了l1 loss,还使用了GIoU loss。这里的GIoU loss就是一个与框大小无关的loss函数。

DETR详细架构

在这里插入图片描述

上图中,CONV卷积神经网络的输出向量维度为:2048x25x34,然后使用1x1的卷积将该向量维度减少到256,得到256x25x34的向量,然后使用positional embeddings进行位置编码得到的向量维度也是256x25x34,然后将两个向量相加。

相加之后,将对应的256x25x34这个向量的HW维度进行拉直得到850x256的向量,其中850就是序列的长度,256就是Transformer的head dimension。然后,经过encoder仍然得到850x256的向量。DETR中作者使用了6个encoder。

然后,将最后一个encoder的输出向量(维度为:850x256),输入到decoder中。这里,一同输入的还有object queries(可以看作是learned embeddings,可学习的嵌入),准确地说,它就是一个可学习的positional embeddings。其维度为100x256。这里可以将这个object queries作为一个条件condition,就是告诉模型,我给你一个条件,你需要得到什么结果。接着,将两个输入(一个来自encoder编码器的输出,一个来自object queries)反复做cross attention自注意力操作。最后得到一个100x256的特征。

然后,将最后一个decoder的输出100x256维度的向量通过一个FFN(feed forward network,标准检测头,全连接层)。然后FFN做出来两个预测,一个是类别,一个是bbox位置。原始的DETR是在COCO2017上进行实验的,因此,这里的类别数量就是91类。

最后,将FFN的输出与Ground Truth根据匈牙利算法计算最佳匹配,然后根据最佳匹配计算loss,然后将loss反向传播,更新模型权重。

DETR中的一些细节

  1. decoder部分,首先在object query做自注意力操作,目的是为了移除冗余的框。因为这些object query做自注意力操作之后,就大概之后每个query可能得到什么样的一个框。

  2. 最后做loss的时候,作者为了让这个模型收敛得更快或训练更稳定。作者在decoder之后加了auxiliary loss。作者在6个decoder的输出之后都做了这个loss。这里的FFN都是共享权重。

文章实验部分

在这里插入图片描述

首先,作者介绍了DETR和FasterRCNN在COCO数据集上的结果。发现DETR在大物体上检测的性能更好,而小物体上还是FasterRCNN模型更好一些。这说明DETR使用了Transformer架构,具有较高的全局建模能力,因此DETR想检测多大的目标就检测多大的目标,所以对大目标友好一些。

(延伸)写论文的技巧:当你的想法在一个数据集a上不work的时候,有可能在数据集b上work,如果你的想法很好,但是就是不work的时候,找到一个合适的研究动机其实也是很重要的,找到一个合适的切入点也很重要。

在这里插入图片描述

上图中,作者将Transformer encoder-decoder的自注意力机制可视化。可以看到自注意力机制的巨大威力,三只牛基本上的轮廓基本上都出来了。
实际上,当你使用transformer的encoder之后,图像上的东西就可以分的很开了,那么这个时候再去做检测、分割等任务就很简单了。

在这里插入图片描述

上图展示了不同的encoder数量对DETR最后目标检测精度AP的影响。可以发现,随着encoder层数的增加,AP精度是一直在上升的,且没有饱和的趋势,但是层数的增加带来了计算量的增加。

在这里插入图片描述

上图中展示了DETR中decoder attention的分布情况,可以明显看到在遮挡很严重的情况下,大象和小象身上的不同颜色注意力也是很区分开来的。总之,DETR这里的encoder-decoder架构的作用与CNN的encoder-decoder架构的作用其实差不多是一致的。

在这里插入图片描述

上图展示了20个object query的可视化结果,其中每个正方形代表一个object query,每个object query中出现的多个点表示bounding box。其中,绿色的点表示目标物体,红色点表示水平方向的目标物体,蓝色点表示垂直方向的目标物体。实际上,这里的object query和一阶段目标检测器中的anchors差不多,只不过anchors是预先设定的,而这里的object query是通过学习得到的。总之,这100个query中就像100个问问题的人一样,每个人都会有不同的问问题的方式。需要注意的是,这些object query中都在中间有一个红线,这表示,每个query都会去询问图片中间是否包含大的目标物体,这是因为COCO数据集的问题,因为COCO数据集中很多图片中心都会有一些大物体。

总结

一些基于DETR改进的新工作:
Omni DETR, Up DETR, PnP DETR, Smac DETR, Deformable DETR, DAB DETR, Sam DETR, DN DETR, OW DETR, OV DETR,

pixel to sequence(把输入输出全部搞成序列形式,从而与NLP那边完美兼容)

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

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

相关文章

Python入门之最基础1.0

记录学渣的学习过程 python入门学习1.0 前言一、 python学习之初需要注意的三个问题二、python所有内置函数的查看方式dir(__builtins__) 总结 前言 一、 python学习之初需要注意的三个问题 二、python所有内置函数的查看方式 dir(builtins) 总结 做自己的时候是发光的

【OpenMp】openmp库的基本语法

目录 OpenMP并行运行结构图句式parallel制导命令隐式同步 parallel的for命令parallel的for命令静态调度dynamic参数guided参数 sections制导指令single制导指令解决多线程竞争临界区矩阵所有元素1任务池同步点shared和private单语句原子操作#pragma omp atomic复杂样例程序 Ope…

【day8】驱动

作业:通过GPIO子系统编写LED灯的驱动,应用程序测试 在led驱动中设置一个定时器,实现底板三盏灯一秒亮一秒灭 1.找引脚 led1---->gpioz组5号引脚 led2---->gpioz组6号引脚 led3---->gpioz组7号引脚 2.加设备树节点 //led的设备树节点…

Nginx中location语法有哪些?【杭州多测师_王sir】

1、location 介绍location是Nginx中的块级指令(block directive),location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,这其中较难理解的是多个location的匹配顺序,本文会作为重点来解释和说明。开始之前先明…

【Linux】GNOME图形化界面安装

Linux下具有多种图形化界面,每种图形化界面具有不同的功能,在这里我们安装的是GNOME。 1、 挂载yum源 挂载之前首先确保使用ISO映像文件 2.挂载之前先在/mnt下面创建一个cdrom目录用来作为挂载点目录 挂载完成之后那么就要去修改yum源了 Vi /etc/yum.r…

IntelliJ IDEA maven配置,设置pom.xml的配置文件

IntelliJ IDEA项目,选择 文件 设置,弹窗 构建、执行、部署 构建工具 Maven就可以 maven配置好以后,在pom.xml的配置文件中就可以设置对应的jar包了,这样构建的时候自动需要的jar,在项目中导入即 需要的jar包设置在po…

数据驱动工作效率提升的5个层次—以PreMaint设备数字化平台为例

在现代工业领域,数据分析已成为提升工作效率和优化生产的不可或缺的工具。从描述性分析到规范性分析,数据分析逐步揭示了设备运行和维护的深层信息,帮助企业更明智地做出决策。本文将以PreMaint设备数字化平台为例,探讨工业数据驱…

平面设计除了PS还有哪些工具推荐

平面设计在我们的日常生活中无处不在。无论是传统媒体还是网络媒体,我们每天都会沉浸在大量的平面设计作品中。因此,我们或多或少会对设计有自己的看法。其实,即使是非专业人士,市场上也有很多平面设计软件,本文盘点了…

docker 搭建私有仓库和制作镜像

目录 1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 1.1 启动mysql镜像 1.2 启动owncloud镜像 1.3 浏览器访问 1.4 总结 2、安装搭建私有仓库 Harbor 2.1 下载docker-compose并赋予执行权限 2.2 磁盘挂载,保存harbor 2.3 修改配置文件…

最新的单机Lustre文件系统的安装

1.单机Lustre的搭建: 主机名IP地址内存添加的共享磁盘大小Centos7.9-test机192.168.10.30/241G20G 1.安装E2fsprogs包 下载OSS服务器所需要的包:E2fsprogs包只是在Ext4的原版RPM包基础上增加了对Lustre⽀持 mkdir ~/e2fsprogs && cd ~/e2fspro…

day-29 代码随想录算法训练营 回溯part5

491.递增子序列 分析:存在重复元素,求递增子序列思路:1.树层去重2.当 i>0 时当前位大于上一位 思路: 去重逻辑在每一层都需要重新创建(每一层遍历),且不能影响到下一层递归 class Soluti…

认识SpringIOC容器

目录 一、SpringFrameWork 二、SpringIOC容器 三、SpringIoc的核心功能 一、SpringFrameWork 1.SpringFrameWork与Spring之间的关系 SpringFrameWork是SpringCould、SpringMVC等等技术的基础实现的,而所有的SpringCloud、SpringFrameWork、SpringMVC等等技术组…

spring之深入理解Spring框架的核心模块与功能

深入理解Spring框架的核心模块与功能 标题: 深入理解Spring框架的核心模块与功能摘要:引言:词汇解释:详细介绍:详细介绍Spring的核心模块:Spring Core、Beans、ContextSpring Core:Beans:Context: 注意事项:Spring数据访问模块:JDBC、ORM、事务管理JDBC&…

【LVS集群】

目录 一、集群概述 1.负载均衡技术类型 2.负载均衡实现方式 二、LVS结构 1.三层结构 2.架构对象 三、LVS工作模式 四、LVS负载均衡算法 1.静态负载均衡 2.动态负载均衡 五、ipvsadm命令详解 1. -A 2. -D 3. -L 4. -a 5. -d 6. -l 7. -t 8. -s 9. -r 10. -…

【IDEA配置创建类注释模板和方法模板教程】

IDEA配置创建类注释模板和方法模板教程 废话不多说直接上干货 废话不多说直接上干货 先看效果: 类: 方法: IDEA类注释模板 ,配置步骤; 直接用模板: /*** description: ${description}* author: Lynn.OuYang* create: ${YEAR}-${MONTH}-${DAY} ${HOU…

实验六 u-boot-2013.01移植

【实验目的】 了解u-boot 的代码结构及移植的基本方法 【实验环境】 ubuntu 14.04发行版FS4412实验平台交叉编译工具arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 一、建立自己的平台 下载uboot源码 在uboo…

怎么检测UI卡顿?(线上及线下)

什么是UI卡顿? 在Android系统中,我们知道UI线程负责我们所有视图的布局,渲染工作,UI在更新期间,如果UI线程的执行时间超过16ms,则会产生丢帧的现象,而大量的丢帧就会造成卡顿,影响用…

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案

为满足当下对数字化文档校对的精准需求,我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试,该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性: 1.全面性校对:工具支持…

尚硅谷大数据项目《在线教育之离线数仓》笔记003

视频地址:尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第8章 数仓开发之DIM层 P039 P040 P041 P042 P043 P044 P045 P046 P047 P048 第8章 数仓开发之DIM层 P039 第8章 数仓开发之DIM层 DIM层设计要点: (1&a…