Press "Enter" to skip to content

大白话用Transformer做Object Detection

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

©作者 | 张恒

 

单位 | 法国国家信息与自动化研究所

 

研究方向 | 目标检测、传感器融合

 

记录一下隔离期间学习的 DETR [1] 系列文章,追求简单、清晰、易懂。

 

分上下两部分,上篇介绍 DETR 的基本原理,下篇是针对 DETR 缺点的改进工作。

 

 

大白话 Attention

 

理解 Attention 是读懂 Transformer [2] 论文的第一步,说白了就是一个公式:

 

其中 q=fc(a),k=fc(b),v=fc(b)。如果 a==b 就是 Self-attention(ViT 中全是这玩意);如果 a!=b 就是 Cross-attention(一般应用于 Transformer decoder)。注意这三个 fc 层不共享参数。简单起见,省略了 scaling factor(不影响理解)。

 

那幺如何理解这个公式呢?Attention 的本质就是加权:一部分重要,其它部分不重要;或者说一部分相关,其它部分不相关。上式中的加权是基于 k 对于 q 的相似度。举一个直观的例子:特征提取的目的是寻找高富帅,q(query)代表一个理想中标准的高富帅,k(key)代表每个真实候选人的身高、财富和样貌,v(value)就是每个真实候选人的特征。那幺一个候选人越符合标准的高富帅条件,就会被赋予更高的权重,特征占比也就越大。

 

 

为什幺要用Transformer做目标检测?

 

DETR 的本质是基于查询(query)的目标检测,而目标检测的本质是一种 image-to-boxes 的转换。相比于 CNN 时代基于锚框或锚点(anchor box or anchor point)的检测方法 [3,4,5] ,基于 query 的检测机制其实更加符合 image-to-boxes 的范式:encoder 中的一个元素代表图像上的一块区域(patch embedding),而 decoder 中的一个元素代表一个物体(object embedding)。Image-to-boxes 的转换是基于区域与区域间的、区域与物体间的、物体与物体间的信息交换。整体的思路其实非常简单、直接、合理。

 

DETR 具有两大核心优势:

 

1. End-to-end detection 。Anchor-based 目标检测器大多采用一对多的标签分配算法,因此 NMS 成为一项必不可少的后处理步骤(去除冗余框)。最近也有一些基于 CNN 的工作,通过探索一对一的标签匹配 [6] ,实现了 nms-free 的目标检测(然而精度提升并不明显,应用于 YOLOX 甚至还有些许掉点)。对于 DETR,端到端检测就显得尤为自然直接。除了一对一的二分匹配(bipartite matching),Transformer 机制引入了 query 间的信息交换(Self-attention in decoder),来防止多个 query 收敛到同一目标。相似的操作也被 Sparse RCNN [7] 所采用。也许样本(anchor/query/proposal)间的信息交换才是实现 end-to-end detection 的关键。

 

2. 解耦输入与输出空间 。在 Transformer 的逻辑里,图片被展开成一维序列(sequence),由 positional embedding 描述绝对位置信息来维系图片形式,其中 encoder 应用一套 positional embedding,decoder 应用另一套 positional embedding。这其实给了模型解耦输入与输出空间的能力:比如输入空间为图片上均匀采样的点(stride=32),而输出空间为图片上随机分布的 100 个点;比如输入空间为多个环视相机视角,输出空间为 BEV 视角。

 

换一个角度思考,query 和 anchor、proposal 本质上是一种东西,都是对于图片上潜在物体的刻画。得益于 Attention 机制,query 获得了全局感受野和样本间信息交换的能力,达成了稀疏采样(sparse sampling)和端到端检测(end-to-end detection)。

 

 

DETR网络结构

 

基于 anchor 的目标检测器的大体可分为三个组成部分:backbone(特征提取)、neck(多尺度特征聚合)、head(分类与回归预测)。DETR 延续了这个结构:backbone(特征提取)、encoder(特征聚合)、decoder(query 精修)。区别在于后两个结构(encoder 和 decoder)都是由基于 Attention 机制的 Transformer 实现。

 

 

▲ DETR网络结构,add/Norm/残差连接被省略

 

3.1 Transformer encoder

 

先用一个 1*1 卷积降低 CNN 提取的特征维度(b,2048,h,w ==> b,256,h,w),再展开成一维序列(b,256,h,w ==> h*w,b,256),记为 src;然后准备好一个相同形状的 positional embedding(计算方法参考这里),记为 pos_embed。最后重复 6 次 Self-attention 和 FFN,其中 Self-attention 的  k=fc(src+pos_embed),q=fc(src+pos_embed),v=fc(src);FFN 就是两层 fc。输出记为 memory。

 

3.2 Transformer decoder

 

准备 100 个 object queries,形状为(100,256),初始化为 0,记为 tgt。准备其对应的相同形状的 positional embedding,随机初始化,记为 query_embed。训练时两者都扩充为(100,b,256)。最后重复 6 次 Self-attention、Cross-attention 和 FFN,其中 Self-attention 的 k=fc(tgt+query_embed),q=fc(tgt+query_embed),v=fc(tgt);Cross-attention 的 k=fc(tgt+query_embed),q=fc(memory+pos_embed),v=fc(memory)。

 

直观上理解,Cross-attention 就是每个 query 根据各自感兴趣的区域从图片中抽取相关信息,而 Self-attention 就是所有 query 开会决定谁当大哥(前景),谁当小弟(背景)。

 

我还想简单解释一下 object queries (tgt) 和其对应的 positional embedding (query_embed)的初始化:object query 装载的是图片上的物体信息,在进入 decoder 之前模型其实对图片上的物体一无所知,所以作者将他初始化为 0。positional embedding 装载的是每个 query 所关注的位置和区域,作者希望这 100 个 query 能尽可能均匀的覆盖到整张图片,所以采用随机初始化。

 

其他诸如 Prediction FFN、Bipartite matching loss、Deep supervision 等细节,比较容易理解,这里就不赘述了。

 

DETR 并不是对传统 anchor-based detectors 的降维打击。相反,DETR 存在收敛速度慢、检测精度差、运行效率低等问题。下篇,我将针对这些原始 DETR 存在的种种问题,介绍一系列改进工作。

 

碎碎念:CVPR2022 收录了至少 4 篇 DETR 相关的检测论文,用 transformer 做 object detection 算是一个很 promising 的研究方向了,值得关注。

 

得益于 Transformer 带来的动态感受野和样本间信息交换的能力,DETR 解锁了稀疏采样(sparse sampling)和端到端检测(end-to-end detection)两个技能。

 

然而原始 DETR 也存在一个比较明显的缺点,就是需要非常长的训练周期才能收敛(在 COCO 数据集上要训 500 个 epoch)。DETR 的大部分后续工作都尝试针对这个缺点做出改进。

 

 

为何DETR难以收敛?

 

根据作者的设想,每个 object query 会根据各自感兴趣的区域通过 Transformer decoder 里的 Cross-attention layer 从图片中抽取相应的物体特征。

 

这个抽取特征的过程包含两个步骤,一个是 key( image features)对于 query (object queries)的相似度匹配,一个是依据匹配结果对 value(image features)进行加权平均。

 

然而理想很丰满,现实很骨感。问题就出在这第一个步骤上:由于 query embedding 是随机初始化的,object queries 和 image features 在模型训练的初期无法正确匹配。

 

直观上理解,一把钥匙(object query)开一把锁(图片上某一特定区域的物体)。但是由于钥匙是随机初始化的,导致它实际上开不了任何一把锁(图片上任意位置的特征对于 object query 的相似匹配度都很低)。结果就是 Cross-attention layer 实际上几乎均匀地抽取了整张图片的特征,而不是有针对性的抽取特定区域内的物体特征。可以想象,在这之后的 object query 不仅采集了目标物体的特征,还采集了图片背景和其他不相关物体的特征,因此用它来分类和定位目标物体还是很困难的。

 

换个角度考虑,Cross-attention 可以想象成是一种软性的 RoIAlign:从图片中依据 kq 相关性(attention map)划分出感兴趣区域(region of interest)并收集相应特征。DETR 难以收敛的原因就是由于 object query 和 image feature 间的不对齐(misalignment),导致无法有针对性的收集特定区域的物体特征,而是收集到了图片上其他很杂乱的特征。

 

简单补充一下为什幺基于 CNN 的检测器没有这个问题:Two-stage detectors 是直接利用 RoIAlign 操作对齐了 region proposal 和 image features;对于 One-stage detectors,anchor box 的中心是依据所处特征的 image coordinate 设定的,大小是依据所处金字塔的 feature scale 设定的,所以大体上也是对齐的(参考 AlignDet [8] )。

 

 

一系列改进工作

 

Deformable DETR  [9] :既然原始的 Cross-attention layer 自由度太高,没有办法 focus 到特定区域,那就为每个 object query 设定需要关注的中心点 (reference point),并且提出的 Deformable attention 也只采样中心点附近的 N 个图片特征,这样既加速了收敛又减少了计算量。并且由于 Deformable attention 的计算量与特征图大小无关,还可以采用多尺度特征图来优化小目标的检测。

 

SMCA DETR  [10] :在计算 Cross-attention 之前,每个 query 先预测一下要检测物体的位置和长宽(有点 anchor 的味道了),再根据预测的物体位置和长宽生成一个对应的高斯热图(Gaussian-like weight map),并融入 Cross-attention 里 kq 相似度匹配计算中。这样,每个 query  抽取的特征就被限制在物体的中心附近,收敛速度也因此得到提升。

 

Anchor DETR  [11] :顾名思义,直接将 anchor point 的位置编码为 object query,并且 encoder 和 decoder 共用一套位置编码的方式(Sine encoding + MLP)。这样 encoder 和 decoder 的位置部分(positional embedding)就是对齐的,每个 query 抽取的特征也就集中在 anchor point 附近了。此外,为了检测同一位置的不同物体,作者还提出为每个 anchor point 添加不同的模式(multiple patterns,一般是 3 种,有点类似每个位置设置大小和长宽比不同的 3 种 anchor box)。

 

DAB DETR [12] :相对 Anchor DETR 做了两个方面的优化,一是将 anchor box(包括位置长宽 4 个维度)编码为 object query,而不是仅仅编码 anchor point 的位置信息;二是应用了 cascade 思想,每层不断精修 anchor box(上一层的输出的作为下一层的输入)。值得注意的是作者利用所预测的 box 长宽进一步限制了 Cross-attention 里的 kq 相似度匹配计算,使生成的注意力图能够拟合不同位置、不同尺度、不同长宽比的物体。

 

SAM DETR  [13] :为了在语义空间上对齐 object queries 和 image features,作者直接在 Cross-attention layer 前加了一个 RoIAlign 操作,即先从 image features 里切出物体特征,再重新采样 8 个显着点(salient points re-sampling),用以生成语义对齐的 query embedding 和 positional embedding。这里有个小小的疑问,Cross-attention 就是为了提取 image feature 上各个 query 所对应的物体特征,完成作者的这些操作以后,原本的 Cross-attention 还有必要吗?

 

总结一下,由于 object query 和 image feature 间(位置上的和语义上的)不对齐,导致 Transformer decoder 中的 Cross-attention layer 难以精确地匹配到待检测物体所对应的特征区域,object query 也因此采集到了很多除目标物体以外的无关特征,最终导致 DETR 收敛缓慢。上面介绍的几个工作都是通过不同的方式限制了 object query 的采样区域,使得网络能够更快的地聚焦于物体区域,所以加速了训练。

 

 

Future direction

 

探讨 object query 的数量对于检测精度的影响。理论上 100 已经远远大于图片上可能出现的物体个数了,然而更多的 query 还是会带来更高检测精度。直观上思考,越少的 query 会导致各个 query 的搜索范围变大,并且难以检测同一位置的多个目标;过多的 query 又会导致难以抑制多个 query 收敛到同一物体的情况。那幺多少才是合适的 query 数量呢?每层需求的 query 数量相同吗?

 

由于需要精准定位物体,DETR 必须能够很好地编码特征的绝对/相对位置关系。DETR 目前所采用地 Positional embedding 是否是最佳方案?或许该在 Transformer 里塞一些卷积层,或者是否能够从 query based patch localization 角度,构造一个自监督训练框架?

 

还有 one to one 的匈牙利标签匹配还没有人动过,这会不会也是造成 DETR 收敛慢的原因呢?大家觉得怎幺样呢 🙂

 

 

参考文献

 

 

[1] End-to-End Object Detection with Transformers https://arxiv.org/abs/2005.12872

 

[2] Attention Is All You Need https://arxiv.org/abs/1706.03762

 

[3] Focal Loss for Dense Object Detection https://arxiv.org/abs/1708.02002

 

[4] FCOS: Fully Convolutional One-Stage Object Detection https://arxiv.org/abs/1904.01355

 

[5] Objects as Points https://arxiv.org/abs/1904.07850

 

[6] What Makes for End-to-End Object Detection? https://arxiv.org/abs/2012.05780

 

[7] Sparse R-CNN: End-to-End Object Detection with Learnable Proposals https://arxiv.org/abs/2011.12450

 

[8] Revisiting Feature Alignment for One-stage Object Detection https://arxiv.org/abs/1908.01570

 

[9] Deformable DETR: Deformable Transformers for End-to-End Object Detection https://arxiv.org/abs/2010.04159

 

[10] Fast Convergence of DETR with Spatially Modulated Co-Attention https://arxiv.org/abs/2101.07448

 

[11] Anchor DETR: Query Design for Transformer-Based Object Detection https://arxiv.org/abs/2109.07107

 

[12] DAB-DETR: Dynamic Anchor Boxes are Better Queries for DETR https://arxiv.org/abs/2201.12329

 

[13] Accelerating DETR Convergence via Semantic-Aligned Matching https://arxiv.org/abs/2203.06883

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。