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

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那边完美兼容)

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

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

相关文章

金蝶云星空对接打通管易云分布式调入单查询接口与其他入库单新增完结接口接口

金蝶云星空对接打通管易云分布式调入单查询接口与其他入库单新增完结接口接口 对接系统金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验…

深度学习12:胶囊神经网络

目录 研究动机 CNN的缺陷 逆图形法 胶囊网络优点 胶囊网络缺点 研究内容 胶囊是什么 囊间动态路由算法 整体框架 编码器 损失函数 解码器 传统CNN存在着缺陷(下面会详细说明),如何解决CNN的不足,Hinton提出了一种对于图…

Blender给一个对象添加多个动画

最近在做一个类似元宇宙的项目,需要使用3D建模软件来给3D模型添加动画,3D建模软件选择Blender(因为开源免费…),版本: V3.5 遇到的需求是同一个对象要添加多个动画,然后在代码里根据需要调取动画来执行。本…

Excel 打开文件提示内存或磁盘不足

Excel表格打开文件时,提示内存或磁盘空间不足,Microsoft Excel 无法再次打开或保存任何文档,这是很多人都会遇到的问题,该如何解决这个问题呢?如果你是用Excel表格打开某个文件时遇到提示内存或磁盘空间不足&#xff0…

java八股文面试[JVM]——垃圾回收器

jvm结构总结 常见的垃圾回收器有哪些? CMS(Concurrent Mark Sweep) 整堆收集器: G1 由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,…

求生之路2社区服务器sourcemod安装配置搭建教程centos

求生之路2社区服务器sourcemod安装配置搭建教程centos 大家好我是艾西,通过上文我们已经成功搭建了求生之路2的服务端。但是这个服务端是纯净的服务端,就是那种最纯粹的原版。如果想要实现插件、sm开头的命令等功能,需要安装这个sourcemod。…

机器人制作开源方案 | 桌面级机械臂--本体说明+驱动及控制

一、本体说明 1. 机械臂整体描述 该桌面级机械臂为模块化设计,包含主机模块1个、转台模块1个、二级摆动模块1个、可编程示教盒1个、2种末端执行器、高清摄像头,以及适配器、组装工具、备用零件等。可将模块快速组合为一个带被动关节的串联3自由度机械臂…

vue 简单实验 v-model 变量和htm值双向绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"two-way-binding"><p>{{ message }}</p><input v-model"message" /> </div> <script>…

GPT---1234

GPT:《Improving Language Understanding by Generative Pre-Training》 下载地址:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdfhttps://cdn.openai.com/research-covers/language-unsupervised/language_understa…

初识【类和对象】

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的…

软件测试技术分享丨使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限&#xff0c;校验过用户的用户名和密码后&#xff0c;会向用户响应一段经过加密的token&#xff0c;在这段token中可能储存了数据权限等&#xff0c;在后期的访问中&#xff0c;需要携带这段token&#xff0c;后台解析这段token才…

css background实现四角边框

2023.8.27今天我学习了如何使用css制作一个四角边框&#xff0c;效果如下&#xff1a; .style{background: linear-gradient(#33cdfa, #33cdfa) left top,linear-gradient(#33cdfa, #33cdfa) left top,linear-gradient(#33cdfa, #33cdfa) right top,linear-gradient(#33cdfa, #…

网络安全(自学黑客)一文全解

目录 特别声明&#xff1a;&#xff08;文末附资料笔记工具&#xff09; 一、前言 二、定义 三、分类 1.白帽黑客&#xff08;White Hat Hacker&#xff09; 2.黑帽黑客&#xff08;Black Hat Hacker&#xff09; 3.灰帽黑客&#xff08;Gray Hat Hacker&#xff09; 四…

RT-Thread 时钟管理

时钟节拍 任何操作系统都需要提供一个时钟节拍&#xff0c;以供系统处理所有和时间有关的事件&#xff0c;如线程的延时、时间片的轮转调度以及定时器超时等。 RTT中&#xff0c;时钟节拍的长度可以根据RT_TICK_PER_SECOND的定义来调整。rtconfig.h配置文件中定义&#xff1a…

Android 11/12 app-lint 系统Update-API时Lint检查问题

有以下两种解决方法 1. 加SupressLint注解 这种方式你可以其他博客也有 但是要每个类和方法都加上SuppressLint 太麻烦了 我才不要这样呢 2. 添加 --api-lint-ignore-prefix 参数直接跳过代码检查 1. 打开 frameworks/base/Android.bp 文件 2. 搜索找到这个字段 metalava…

windows可视化界面管理服务器上的env文件

需求&#xff1a;在 Windows 环境中通过可视化界面编辑位于 Linux 主机上的 env 文件的情况&#xff0c;我现在环境是windows环境&#xff0c;我的env文件在linux的192.168.20.124上&#xff0c;用户是op&#xff0c;密码是op&#xff0c;文件绝对路径是/home/op/compose/env …

nginx生成自定义证书

1、创建key文件夹 [rootlocalhost centos]# mkdir key 进入key文件夹 [rootlocalhost centos]# cd key/ 2、生成私钥文件 [rootlocalhost key]# openssl genrsa -des3 -out ssl.key 4096 输入这个key文件的密码。不推荐输入&#xff0c;因为以后要给nginx使用。每次reload ngin…

WPF中的数据转换-StringFormat

WPF中的数据转换-StringFormat 前言 字符串格式化。使用该功能可以通过设置Binding.StringFormat属性对文本形式的数据进行转换——例如包含日期和数字的字符串。对于至少一半的格式化任务&#xff0c;字符串格式化是一种便捷的技术。 使用 当设置Binding.StringFormat属性…

机器学习基础之《分类算法(4)—案例:预测facebook签到位置》

一、背景 1、说明 2、数据集 row_id&#xff1a;签到行为的编码 x y&#xff1a;坐标系&#xff0c;人所在的位置 accuracy&#xff1a;定位的准确率 time&#xff1a;时间戳 place_id&#xff1a;预测用户将要签到的位置 3、数据集下载 https://www.kaggle.com/navoshta/gr…

Android沉浸式实现(记录)

沉浸式先看效果 直接上代码 Android manifest文件 android:theme"style/Theme.AppCompat.NoActionBar"布局文件 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"ht…