0. 简介

已经好久不写深度学习相关的博客了。但是我觉得DETR值得我重新拾起来进行详细介绍。Deformable DETR作为这两年来最有名的DETR变种之一,当然代码量也是比较多的。这里我们从论文到代码来详细分析Deformable DETR的精华之处。最近两年时间从Attention到NAS再到Transformer,视觉检测行业被Transformer拉到了一个新的高度。而DETR作为Transformer中近两年备受关注的方法,也吸引了很多人争相的去改动。其中比较有名的就是Deformable DETR。DETR 提出在目标检测方法中去除人为组件,也可保持优异性能。但由于 Transformer 注意力模块只能有限地处理图像特征图,它的收敛速度就比较慢,特征空间分辨率有限。为了缓解这些问题,作者提出了 Deformable DETR,其注意力模块只会关注目标框周围少量的关键采样点。Deformable DETR 能够取得比 DETR 更优异的性能(尤其在小物体上)。在 COCO 基准上大量的实验证明了该方法的有效性。

1. 文章贡献

目前的目标检测都使用了很多人为组件,比如 anchor 生成、基于规则的训练目标分配机制、NMS 后处理等。而 Carion 等人提出了 DETR 来去除人为组件,第一次构建了一个完全端到端的目标检测器。利用一个简单的结构,将 CNN 和 Transformer 编码器-解码器结合起来使用。但是DETR也有几个问题:(1) 需要更长的训练时间来收敛。例如,在 COCO 基准上,DETR 需要500个 epochs 才能收敛,要比 Faster R-CNN 慢了10-20倍。(2) DETR 对小目标检测表现相对较差。当前的目标检测器通常使用多尺度特征,从高分辨率特征图上可以检测小目标。而对 DETR 来说,高分辨率特征图意味着高复杂度。这些问题主要可以归结为 Transformer 缺乏处理图像特征图的组件。Transformer 编码器的注意力权重的计算,相对于像素个数来说是平方计算的。因此,要处理高分辨率特征图,其计算量是非常高的,内存复杂度也是非常高的。 而Deformable DETR,通过下述的方法加快了 DETR 的收敛速度,并降低高复杂度问题。

  1. 它将 deformable 卷积的最佳稀疏空间采样方法和 Transformer 的关系建模能力结合起来。作者使用了(多尺度)deformable 注意力模块替换 Transformer 注意力模块,来处理特征图。
  2. Deformable DETR 开启了探索端到端目标检测器的机会,因为它收敛很快,内存消耗和计算量都较低。

2. Transformer

在讲Deformable DETR之前,我们需要先了解一下Transformer和DETR。这一节我们主要通过self-attention来介绍Transformer中最主要的Q、K、V三个参数,分别对应查询向量(Query)、键向量(Key)、值向量(Value)。


X1X_1X1WQW^QWQ权重矩阵相乘得到q1q_1q1, 就是与这个单词相关的查询向量。最终使得输入序列的每个单词的创建一个查询向量q1q_1q1、一个键向量k1k_1k1和一个值向量v1v_1v1

具体步骤为:

  1. 生成三个向量QKV:对于每个输入XiX_iXi,通过词嵌入与三个权重矩阵相乘创建三个向量:一个查询向量、一个键向量和一个值向量。

  2. 计算得分:为每个输入XiX_iXi计算自注意力向量,利用其它输入XXX对当前XiX_iXi打分,这些分数决定了在编码XiX_iXi的过程中有多重视输入的其它部分。

  3. 稳定梯度:将分数除以8(默认值),8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定,也可以使用其它值。

  4. 归一化:通过softmax传递结果,其作用是使所有XXX的分数归一化,得到的分数都是正值且和为1。这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词相关的单词也会有帮助。

  5. 每个值向量乘以softmax分数:为之后将它们求和做准备,达到关注语义上的相关,并弱化其不相关(乘以非常小的小数)。

  6. 对加权值向量求和:含义:在编码某个XiX_iXi时,将所有其它XXX的表示(值向量)进行加权求和 ,其权重是通过XiX_iXi的表示(键向量)与被编码XiX_iXi表示(查询向量)的点积并通过softmax得到。即得到自注意力层在该位置的输出。然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。

2.1 将张量引入图景

我们已经了解了模型的主要部分,接下来我们看一下各种向量或张量(译注:张量概念是矢量概念的推广,可以简单理解矢量是一阶张量、矩阵是二阶张量。)是怎样在模型的不同部分中,将输入转化为输出的。

像大部分NLP应用一样,我们首先将每个输入单词通过词嵌入算法转换为词向量。每个单词都被嵌入为512维的向量,我们用这些简单的方框来表示这些向量。

如上述已经提到的,一个编码器接收向量列表作为输入,接着将向量列表中的向量传递到自注意力层进行处理,然后传递到前馈神经网络层中,将输出结果传递到下一个编码器中。

输入序列的每个单词都经过自编码过程。然后,他们各自通过前向传播神经网络——完全相同的网络,而每个向量都分别通过它。

2.2 什么是查询向量、键向量和值向量向量?

它们都是有助于计算和理解注意力机制的抽象概念。请继续阅读下文的内容,你就会知道每个向量在计算注意力机制中到底扮演什么样的角色。

计算自注意力的第二步是计算得分。假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。

这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1和k1的点积,第二个分数是q1和k2的点积。

最后,由于我们处理的是矩阵,我们可以将步骤2到步骤6合并为一个公式来计算自注意力层的输出。

3. Multi-head Transformer

这一节主要围绕Transformer 的 Multi-head 注意力。通过增加一种叫做“多头”注意力(“multi-headed” attention)的机制,论文进一步完善了自注意力层,并在两方面提高了注意力层的性能:

Transformer中Self-Attention以及Multi-Head Attention详解

1.它扩展了模型专注于不同位置的能力。在上面的例子中,虽然每个编码都在z1z_1z1中有或多或少的体现,但是它可能被实际的单词本身所支配。如果我们翻译一个句子,比如“The animal didn’t cross the street because it was too tired”,我们会想知道“it”指的是哪个词,这时模型的“多头”注意机制会起到作用。

2.它给出了注意力层的多个“表示子空间”(representation subspaces)。接下来我们将看到,对于“多头”注意机制,我们有多个查询/键/值权重矩阵集(Transformer使用八个注意力头,因此我们对于每个编码器/解码器有八个矩阵集合)。这些集合中的每一个都是随机初始化的,在训练之后,每个集合都被用来将输入词嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。

在“多头”注意机制下,我们为每个头保持独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。和之前一样,我们拿X乘以WQ、WK、WVW^Q、W^K、W^VWQWKWV矩阵来产生查询/键/值矩阵。如果我们做与上述相同的自注意力计算,只需八次不同的权重矩阵运算,我们就会得到八个不同的Z矩阵。

但是,前馈层不需要8个矩阵,它只需要一个矩阵(由每一个单词的表示向量组成)。所以需要把这八个矩阵压缩成一个矩阵,可以直接把这些矩阵拼接在一起,然后用一个附加的权重矩阵WOW^OWO与它们相乘

这几乎就是多头自注意力的全部。这确实有好多矩阵,我们试着把它们集中在一个图片中,这样可以一眼看清。这也可以说明我们在多头输入后可以得到相关联的部位对该位置的影响。

3.1 使用位置编码表示序列的顺序

到目前为止,我们对模型的描述缺少了一种理解输入单词顺序的方法。

为了解决这个问题,Transformer为每个输入的词嵌入添加了一个向量。这些向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。这里的直觉是,将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。(这一点在Vision Transfomer中也很重要)


为了让模型理解单词的顺序,我们添加了位置编码向量,这些向量的值遵循特定的模式。如果我们假设词嵌入的维数为4,则实际的位置编码如下:

在下图中,每一行对应一个词向量的位置编码,所以第一行对应着输入序列的第一个词。每行包含512个值,每个值介于1和-1之间。我们已经对它们进行了颜色编码,所以图案是可见的。

那如何将位置编码和词嵌入整合到一起,这里设置了20字(行)的位置编码实例,词嵌入大小为512(列)。你可以看到它从中间分裂成两半。这是因为左半部分的值由一个函数(使用正弦)生成,而右半部分由另一个函数(使用余弦)生成。然后将它们拼在一起而得到每一个位置编码向量。

原始论文里描述了位置编码的公式(第3.5节)。你可以在 get_timing_signal_1d()函数中看到生成位置编码的代码。这不是唯一可能的位置编码方法。然而,它的优点是能够扩展到未知的序列长度(例如,当我们训练出的模型需要翻译远比训练集里的句子更长的句子时,或者检测到更多的目标时)。

4. DETR

DETR 构建于 Transformer 编码器-解码器之上,结合使用了匈牙利损失,该损失通过二分匹配为每个 ground-truth 边框分配唯一的预测框。李沐的B站账号中也对DETR进行了详细的学习和讲述。

DETR 论文精读【论文精读】

DEtection TRansformer,其大大简化了目标检测的框架,更直观。其将目标检测任务视为一个图像到集合(image-to-set)的问题,即给定一张图像,模型的预测结果是一个包含了所有目标的无序集合

…详情请参照古月居

经典文献阅读之--Deformable DETR相关推荐

  1. 经典文献阅读之--Swin Transformer

    0. 简介 Transfomer最近几年已经霸榜了各个领域,之前我们在<经典文献阅读之–Deformable DETR>这篇博客中对DETR这个系列进行了梳理,但是想着既然写了图像处理领域 ...

  2. 经典文献阅读之--NICE-SLAM(SLAM的神经隐含可扩展编码)

    0. 简介 对于深度学习而言,NeRF一定是最近两年最火的工作之一了,**NeRF(Neural Radiance Fields)**是最早在2020年ECCV会议上的Best Paper,其将隐式表 ...

  3. 货运服务网络设计:经典文献阅读笔记(3)复现Netplan

    **货运服务网络设计:经典文献阅读笔记(2)**提到说要把Crainic T G(1984年)文献使用的模型复现一下,但是文章给出的通用框架还是太笼统,在尝试后决定使用Jacques Roy & ...

  4. 论文阅读:DEFORMABLE DETR:DEFORMABLE DETR: DEFORMABLE TRANSFORMERSFOR END-TO-END OBJECT DETECTION

    题目:DEFORMABLE DETR:DEFORMABLE DETR: DEFORMABLE TRANSFORMERSFOR END-TO-END OBJECT DETECTION 来源:ICLA 是 ...

  5. 经典文献阅读之--PL-SLAM(点线SLAM)

    0. 简介 之前作者基本都在围绕着特征点提取的路径在学习,最近看到了最近点云PCL推送的<Structure PLP-SLAM: Efficient Sparse Mapping and Loc ...

  6. 经典文献阅读之--PON

    0. 简介 作为Transformer在机器视觉领域的爆火,在自动驾驶领域目前很多工作都集中在前视转鸟瞰图的方法中,这里我们来讲2020年一篇经典的论文<Predicting Semantic ...

  7. 经典文献阅读之--SuMa++

    0. 简介 作为一名技术博主,最主要的还是需要不断地学习新的知识,而最好的学习就是不断地阅读新的文章,并不断地学习和总结前人的思路和方法.所以博主打算开一个新的系列来介绍.这里主要来介绍一下<S ...

  8. 经典文献阅读之--OV2SLAM(高速视觉slam)

    0. 简介 视觉里程计最近几年越来越受到学术界以及工业界的认可,以ORB和VINS为代表的视觉SLAM已经可以满足绝大多数场景,而OV2SLAM在其他VSLAM中脱颖而出,其实时性以及具体的回环性能在 ...

  9. 货运服务网络设计:经典文献阅读笔记(1)

    服务网络设计 --(1984,Crainic,Multicommodity, Multimode Freight Transportation: A General Modeling and Algo ...

最新文章

  1. 牛客--追债之旅 两种解法
  2. ngnix编译遇到的问题.
  3. 网络设备转发数据包的整个流程_网络工程师(33):路由转发工作原理
  4. 透彻影像王书浩:三易其辙与功不唐捐
  5. cas协议,以及tomcat搭建cas服务器
  6. swap关于指针的使用
  7. Spark踩坑记——数据库(Hbase+Mysql)转
  8. 女生最想让男生知道的58件事[[急转]]
  9. Java提高篇——Java中的异常处理
  10. SoapUI、Jmeter、Postman三种接口测试工具的比较分析
  11. php权限无需验证的控制器,Thinkphp6用中间件实现多个控制器判断用户登录权限
  12. Android 开机logo支持的格式
  13. vs2010操作excel 需要安装office2010
  14. python题目练习——jmu-python-分段函数数学函数
  15. Docker端口映射后外部无法访问现象排查
  16. SwiftUI vs 故事板
  17. (一)Activiti 数据库25张表——流程历史记录表25(ACT_EVT_LOG)
  18. AMBER分子动力学模拟之结果分析(构象分析)-- HIV蛋白酶-抑制剂复合物(6)
  19. ArcGIS提取面状道路中心线
  20. 二阶惯性环节的快速跟踪性能实现

热门文章

  1. 用Unity实现简单的绳子模拟(一)
  2. 【CSS】6-css阴影样式
  3. java列出所有组合_关于Java中列出一组数据的所有组合算法
  4. css3实现图片一直旋转
  5. 家用环境下Cisco vWLC配置
  6. Unity学习过程(一)——认识Unity游戏引擎
  7. 物联网时代25大开源IoT框架
  8. arm64-v8a编译
  9. 空间重叠计算机,第2章-地理空间现象计算机表达(6-9学时).doc
  10. 2023年中国海洋大学计算机及电子信息考研分析