【论文阅读笔记】End-to-End Object Detection with Transformers

代码地址:https://github.com/facebookresearch/detr

论文小结

  本文是Transformer结构应用于目标检测(OD)任务的开山之作。方法名DETE,取自Detection Transformer。
  作为2020年的论文,其表现精度在当时也不算高的,但为后面的DETE-based方法提供了基础。

  DETR的模型架构设计,使用的是混合Transformer结构,即CNN+Transformer的结构,

  与YOLO系列基于grid的预测对比,DETR经过transformer的decoder输出的是序列集。由于OD任务不需要自回归处理,所以decoder的输出可以并行处理,同时输出多个检测框

  transformer输出的是序列集,而OD任务所需要的最终结果也是一个边框集合,所以DETR是直接对结果进行的预测,即OD任务在此直接为集合预测问题
  集合预测问题,在匹配损失的时候,具有唯一性。所以DETR的预测结果在合理的Loss作用下,是不需要NMS后处理的。且在没有anchor grid和anchor box的偏差预测过程的情况下,DETR算法管道实现端到端训练和预测,丢弃了YOLO系列所需的融入先验知识的需求(anchor & nms)。

  文中DETR对比的算法是Faster RCNN,是2015年的一篇论文,精度差不多,运行时间也差不多。小目标不如Faster RCNN,大目标好不少,最后mAP基本持平。
  后续也有论文改进了transformer在小目标检测上精度不足的问题。

论文简介

  现有大多数检测算法,都依赖于一些初始猜测。不管是基于proposal的二阶目标检测算法,还是anchor-based、anchor-free的一阶目标检测算法,都是没有直接去预测集合预测的,而是设计了一个替代的任务(回归和类别概率)来解决目标检测问题。
  现代目标检测器的检测性能很受后处理步骤的影响,比如(1)密集预测边界框的消除;(2)anchor集合的额设计;(3)将目标分配给anchor的启发性方法;
  DETR通过直接预测集合的方法来绕过这些“代理”任务,无需任何人工先验知识,实现端到端预测

  DETR的结构图如图1所示。其组件transformer-encoder将序列元素两两交互,其全局的交流有利于一些特别限制的集合预测,比如移除重复的预测结果。
  DETR使用二分图匹配来计算端到端的几何损失,匹配的唯一性,也进一步限制了重复的预测结果。
  和其他的集合集合预测方法对比,DETR的主要区别就在于使用了二分图匹配损失以及平行解码的transformer结构。之前的集合预测方法一般使用RNNs模型做自回归预测。

论文方法

  由于transformer的decoder结构其输入输出维度保持不变,故当输入序列长度为 N N N,我们也能得到序列长度为 N N N的固定长度输出。本文DETR的输入序列命名为 object quires,是一组基于学习得来的参数,可视化如下 7 7 7所示。

损失计算

  集合预测的训练难点在于如何结合GT来给预测目标打分。本文的损失计算策略先用二分图匹配方法,再对有目标(匹配成功)的bboxes计算损失

  将目标集合 y y y扩展到长度 N N N,不足长度的部分用 ∅ \varnothing 表示,意为无目标。预测集合 y ^ \hat{y} y^和GT集合 y y y的匹配,是寻找两个集合匹配的最低消耗,如公式 ( 1 ) (1) (1),其中 σ ( i ) \sigma(i) σ(i)是预测集合第 i i i个。
σ ^ = arg min σ ∈ G N ∑ i N L match ( y i , y ^ i ) (1) \hat{\sigma}=\mathop{\text{arg min}} \limits_{\sigma\in\mathscr{G}_N}\sum_i^N\mathcal{L}_{\text{match}}(y_i, \hat{y}_i)\tag{1} σ^=σGNarg miniNLmatch(yi,y^i)(1)

  匈牙利算法(Hungarian algorithm)是这个最佳匹配的一个较优解法。匹配消耗考虑类别预测和边框预测的综合损失。考虑第 i i i个预测的类别 c i c_i ci的预测概率为 p ^ σ ( i ) ( c i ) \hat{p}_{\sigma(i)}(c_i) p^σ(i)(ci),则对应的匹配损失为: L match ( y i , y ^ i ) = − I { c ≠ ∅ } p ^ σ ( i ) ( c i ) + I { c ≠ ∅ } L box ( b i , b ^ σ ( i ) ) \mathcal{L}_{\text{match}(y_i,\hat{y}_i)}=-\mathbb{I}_{\{c\neq \varnothing\}}\hat{p}_{\sigma(i)}(c_i)+\mathbb{I}_{\{c\neq\varnothing\}}\mathcal{L}_{\text{box}}(b_i,\hat{b}_{\sigma(i)}) Lmatch(yi,y^i)=I{c=}p^σ(i)(ci)+I{c=}Lbox(bi,b^σ(i))

  在使用匈牙利算法寻找到最佳匹配之后,我们定义的匈牙利损失如公式 ( 2 ) (2) (2)所示:其中 σ ^ \hat{\sigma} σ^在计算优化损失的第一步已经有了确定赋值;为类别平衡,当 c i = ∅ c_i=\varnothing ci=时,类别权重下降 10 10 10
L Hungarian ( y , y ^ ) = ∑ i = 1 N [ − log  p ^ σ ( i ) ( c i ) + I { c ≠ ∅ } L box ( b i , b ^ σ ^ ( i ) ) ] (3) \mathcal{L}_\text{Hungarian}(y,\hat{y})=\sum \limits_{i=1}^N[-\text{log }\hat{p}_{\sigma(i)}(c_i)+\mathbb{I}_{\{c\neq\varnothing\}} \mathcal{L}_\text{box}(b_i,\hat{b}_{\hat{\sigma}}(i))]\tag{3} LHungarian(y,y^)=i=1N[log p^σ(i)(ci)+I{c=}Lbox(bi,b^σ^(i))](3)

  一般类别损失会使用log空间。但作者发现不用log空间时,分类损失和定位损失的值域相近,训练结果会更好一点。故后面使用 p ^ σ ( i ) ( c i ) \hat{p}_{\sigma(i)}(c_i) p^σ(i)(ci),而不是log概率。

  当预测的集合和GT的空集 ∅ \varnothing 进行匹配时,其匹配消耗不依赖于预测,消耗为一个常数。

  对于边框定位损失,在当时使用的是 L 1 \mathcal{L}1 L1损失,后面采用IoU损失。作者选择了 L 1 \mathcal{L}1 L1损失和IoU损失的结合。

模型架构

  DETR的架构整体如下图2所示:经过decoder的处理后,使用FFN(feed forward network)做最终预测(类别和边框)。

  DETR的CNN backbone,下采样倍数为 32 32 32倍,输出channel为 2048 2048 2048。对于应用于实时目标检测的transformer来说,这个channel还是比较大的,作者选择使用 Conv 1 × 1 \text{Conv}1\times1 Conv1×1压缩channel到 d d d,默认为256。将特征图 H 32 × W 32 × d \frac H{32}\times \frac W{32} \times d 32H×32W×d展开后( d × H W d\times HW d×HW)放入encoder中。位置编码是基于学习的。
  文中默认配置为encoder有 6 6 6个,decoder有 6 6 6个,multi-attention的head有 8 8 8个,hidden dim为 256 256 256

  encoder和decoder是标准的transformer结构,不同的地方在于decoder是并行解码 N N N个目标,而《Attention is all you need》中的transformer-decoder是自回归结构,同一时间只能预测输出序列的一个元素。
  decoder的input embeddings必须不同来产生不同结果。这个input embeddings在DETR是学习来的,本文叫做object queires。COCO中学习到的object queries如下图7所示,每个输入都检测一部分框。

  FFNs,本文采用的是 3 3 3层感知机 + ReLU激活函数 + 线性映射层。预测定位的结果是正则化的中心坐标以及框的宽高。分类的预测是使用Softmax函数处理,其中加一个特殊类 ∅ \varnothing 来表示无目标。

  在训练中,DETR中每个transformer-decoder都添加一个辅助监督,所有预测分支的FFNs共享权重。添加一个额外的layer-norm,在每个decoder层FFNs的输入上应用。

  DETR的pytorch实现如下图所示;

论文实验

训练相关参数和策略

  训练数据集为COCO2017,训练集中平均每张图 7 7 7个实例,最多一张图为 63 63 63个实例。所以,在COCO上,DETR使用的 N = 100 N=100 N=100是完全足够的。

  DETR使用AdamW优化器,transformer的初始 l r lr lr 1 0 − 4 10^{-4} 104,backbone的初始 l r lr lr 1 0 − 5 10^{-5} 105,这是因为backbone是使用ImageNet预训练的。transformer权重使用Xavier初始化。
  DETR使用的两个backbone为ResNet-50和ResNet-101,对应的检测器模型为DETRDETR-101。像《Fully convolutional instance-aware semantic segmentation》一样,在backbone的最后一个stge上增加dilation作用。同时在该stage的第一个Conv上移除stride的作用,以增加分辨率。以此策略对应的模型为DETR-DC5DETR-DC5-R101Dilated C5 stage。该参数让分辨率扩大 2 2 2倍,因此改善了小目标的性能。推理消耗为 16 16 16倍的encoder(self-attention),整体消耗为 2 2 2倍计算消耗。

  增强策略上,使用尺度增强(短边最少 480 480 480最多 800 800 800,长边最高 1333 1333 1333)。为帮助transformer-encoder的self-attention学习全局关系,作者使用随机裁剪增强,这带来了将近 1 1 1AP的提升。使用dropout增强策略,概率为0.1

  在推理时,有的slots会预测空类 ∅ \varnothing 。为了优化AP,这些slots用第二高的类别及其分数。这种操作带来了2个AP的改善。

  消融实验,训练 300 300 300个epoch,在 200 200 200epoch时学习率下降 10 10 10倍。baseline模型在 16 16 16个V100 GPUs上训练 300 300 300个epoch,耗时 3 3 3天,每个GPU 4 4 4张图,故batchSize为 64 64 64
  与Faster RCNN相比,更长训练策略为 500 500 500个epoch, 400 400 400个epoch后下降学习率。 500 500 500个epcoh相比 300 300 300个epoch,能带来 1.5 1.5 1.5AP的提升。

  其他参数: λ L 1 = 5 \lambda_{L1}=5 λL1=5 λ i o u = 2 \lambda_{iou}=2 λiou=2。Faster-RCNN+的边框回归损失使用GioU loss和L1的结合。

对比实验

  DTER和Faster RCNN的对比实验如下表所示:

  DETR中transformer-encoder层数的消融实验:encoder层数越高,AP越高。作者选择了 6 6 6。如果没有encoder,会降低 3.9 3.9 3.9AP,大目标降低 6.0 6.0 6.0AP,说明encoder还是重要的。

  encoder的可视化(encoder最后一层的attention maps)看图像中的一些点。可以看出其中貌似已经完成实例分割了,可以在decoder简单地进行目标提取和定位。

  在decoder中每层增加FFN来预测,见下图:每加一层decoder,AP和AP50都会上升。只有一个decoder层的解码能力比较多,容易产生多余的输出。随着decoder层数上升,NMS的作用下降。

  decoder的attention可视化如下图所示,不同颜色表示不同预测目标的attention maps。可看出,decoder的注意力是比较局部的,它主要关注的是物体的四肢、头脚等。作者假设,encoder使用全局attention分离实例,而decoder仅需要关注端点以提取类和对象边界

  DETR有两种pos embeddings:(1)空间位置编码;(2)输出位置编码(object queries)。下表实验了一些组合:固定编码和可学习编码。输出位置编码是必要的,且不可移除的。

  边框定位损失的消融实验: λ L 1 = 5 \lambda_{L1}=5 λL1=5 λ i o u = 2 \lambda_{iou}=2 λiou=2的组合下,GIoU损失和L1损失的结合是最佳的。

  每个边框预测是其中的一个点。绿色是小框,蓝色是大的竖向的框,红色是大的横向的框。可以发现20个slots都有一条红的竖线在中间,应该是COCO数据集的实例表现问题。

  训练集中同一张图像没有那么多实例的类别,在预测时也能有比较好的泛化。比如长劲鹿的图像,在COCO中最多一张图像13个实例,作者生成了个24实例的图像,也能准确预测。

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

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

相关文章

pytorch导入数据集

1、概念: Dataset:一种数据结构,存储数据及其标签 Dataloader:一种工具,可以将Dataset里的数据分批、打乱、批量加载并进行迭代等 (方便模型训练和验证) Dataset就像一个大书架,存…

mongodb GUI工具(NoSQLBooster)

介绍 跨平台的MongoDB GUI工具,支持Windows、macOS和Linux。自带服务器监控工具、Visual Explain Plan、查询构建器、SQL查询等功能。提供免费版本,但功能相比付费版本有所限制。 免费版可供个人/商业使用,但功能有限。 安装成功后&#x…

大疆M2006+C610 pid参数调优

官方给的示例代码里给的是1.5, 0.1, 0 但试了下空转时显然不太行. 自己摸索出0.8, 0.03, 0 表现如图中的蓝色线 期望速度先两秒的1000,然后一秒的2000,一秒的3000, 0 2000 表现还不错,可以看到0.5秒后与期望值的差距控制在大概10%之内,但还是感觉有些过调 对了先说一下基础知识…

有什么方法可以保护ppt文件不被随意修改呢?

在工作或学习中,我们常常需要制作powerpoint演示文稿,担心自己不小心改动了或者不想他人随意更改,我们可以如何保护PPT呢?下面小编就来分享两个常用的方法。 方法一:为PPT设置打开密码 为PPT设置打开密码是最直接有效…

活动预告|博睿数据将受邀出席GOPS全球运维大会上海站!

第二十四届 GOPS 全球运维大会暨研运数智化技术峰会上海站将于2024年10月18日-19日在上海中庚聚龙酒店召开。大会将为期2天,侧重大模型、DevOps、SRE、AIOps、BizDevOps、云原生及安全等热门技术领域。特设了如大模型 运维/研发测试、银行/证券数字化转型、平台工程…

九寨沟,智慧旅游新名片

九寨沟属于自然类景区,以优美的自然风光取胜,景区文化内涵相对缺失。智慧化和文旅融合是智慧文旅景区的两个必备条件,九寨沟在智慧文旅景区建设过程中,经历了两个阶段,先是从传统景区迈向智慧景区,然后是充…

设计模式:单例

一.什么是单例模式 单例模式是一种设计模式,指在整个程序生命周期中有且仅有一个实例的类。可以分为懒汉式以及饿汉式。 懒汉式:只有在类的实例被使用时才生成唯一实例。但是存在线程安全以及内存泄露的问题。可以节省系统资源。 饿汉式:程序…

10万+收藏!10万转发!AI绘画如何助力育儿赛道引爆短视频平台?

在自媒体领域,内容创作的竞争日益激烈,但育儿自媒体一直是一块热门且持久的“金矿”,吸引了无数创作者投身其中。然而,如何在这片红海中脱颖而出,成为了许多创作者面临的难题。而AI绘画的出现,无疑解决了创…

这种好看的航线图怎么绘制?超简单~~

今天这篇推文小编给大家介绍一个我一直想绘制的可视化作品-航线地图,网上有很多类似的教程,但在小编看来,都或多或少有些不完美,小编这次就对其进行完善和美化,主要内容如下: 航线地图所需数据处理 航线地…

Linux实践|设置静态 IP 地址

引言 如果您是 Linux 系统管理员,那么您将需要在系统上配置网络。与可以使用动态 IP 地址的台式机不同,在服务器基础设施上,您需要设置静态 IP 地址(至少在大多数情况下)。 本文[1]旨在向您展示如何在最常用的 Linux 发…

The 2024 ICPC Kunming Invitational Contest K. Permutation(交互 期望)

在知乎内查看 题目 思路来源 题解 首先特判n1的情况,其实也不用问 分治,假设当前解决到[l,r],要递归的vector是x, 维护两个vector L、R,代表下一步要在[l,mid]和[mid1,r]分治的vector 每次将x random_shuffle后&a…

UE4 材质学习笔记01(什么是着色器/PBR基础)

1.什么是shader 着色器是控制屏幕上每个像素颜色的代码,这些代码通常在图形处理器上运行。 现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。 因此我们创建着色器可以控制颜色,法线,粗糙度,…

C++竞赛初阶—— 石头剪子布

题目内容 石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比…

Qt实现Halcon窗口显示当前图片坐标

一、前言 Halcon加载图片的窗口,不仅能放大和缩小图片,还可以按住Ctrl键显示鼠标下的灰度值,这种方式很方便我们分析缺陷的灰度和对比度。 二、实现方式 ① 创建显示坐标和灰度的widget窗口 下图的是widget部件,使用了4个label控…

使用正则表达式删除文本的奇数行或者偶数行

用智谱清言和kimi搜出来的结果都没法在notepad生效,后面在overflow上找到的答案比较靠谱。 查找:^[^\n]*\n([^\n]*) 替换:\1 删除偶数行 查找:^([^\n]*)\n[^\n]* 替换:\1 代码解释 ^:这个符号代表字符…

【Linux】认识Linux内核中进程级别的文件结构体【files_struct】&文件IO模型初步演示

前言 大家好吖,欢迎来到 YY 滴 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Linux》…

输电线路悬垂线夹检测无人机航拍图像数据集,总共1600左右图片,悬垂线夹识别,标注为voc格式

输电线路悬垂线夹检测无人机航拍图像数据集,总共1600左右图片,悬垂线夹识别,标注为voc格式 输电线路悬垂线夹检测无人机航拍图像数据集介绍 数据集名称 输电线路悬垂线夹检测数据集 (Transmission Line Fittings Detection Dataset) 数据集…

centos7.9升级rockylinux8.8

前言 查看centos的版本 ,我这台服务器是虚拟机,下面都是模拟实验 升级前一定要把服务器上配置文件,数据等进行备份 [rootlocalhost ~]#cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]#uname -a Linux jenkins_ser…

75.【C语言】文件操作(3)

目录 6.文件的顺序读写 1.几个顺序读写函数 1.fgetc函数 代码示例 代码改进 2.fputc函数 3.fputs函数 如果需要换行,应该写入换行符(\n) 4.fgets函数 1.读取单行字符串 2.读取多行字符串 6.文件的顺序读写 1.几个顺序读写函数 分组:(fgetc,fputc),(fgets,fputs),(f…

【数据结构-栈】【位运算优化】力扣3170. 删除星号以后字典序最小的字符串

给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘*’ 字符时,你可以执行以下操作: 删除最左边的 ‘’ 字符,同时删除该星号字符左边一个字典序 最小 的字符。如果有多个字典…