前言 本文介绍了3D Deformable Attention (DFA3D),一种全新的将2D特征拉升到3D空间的基础算子。和现有的基于Lift-Splat的方法以及基于2D注意力机制的方法相比,我们的方法即能受益于Transformer的多层优化能力来解决Lift-Splat中的one-pass问题又可以保持对深度感知来解决2D注意力机制中深度模糊(Depth Ambiguity)问题。我们在数学的角度对DFA3D进行了工程上的优化,并提供了CUDA实现。我们在多个使用基于2D注意力机制进行特征拉升的多视角3D目标检测方法上验证了其有效性。

Pytorch训练营,花两个星期彻底掌握代码实现

CV各大方向专栏与各个部署框架最全教程整理

CV全栈指导班、基础入门班、论文指导班 全面上线!!

论文:https://ttps://arxiv.org/abs/2307.129722

代码:https://github.com/IDEA-Research/3D-deformable-attentionh/3D-deformable-attention

1、简介

在现有的多视角3D目标检测方法中,通常包含三个主要的模块:
  1. 1. 2D主干网络,用来对输入的多视角图片进行编码,得到2D图像特征;
  2. 2. 2D到3D的特征拉升,用来将上一步中获取到的2D图像特征拉升到3D空间中预定义的一些锚点上,得到拉升后的3D特征;
  3. 3. 基于拉升后的3D特征做3D目标检测。
在这其中第二步是现有的端到端的多视角3D目标检测方法的核心,起到了承上启下的关键作用。现有的方法主要基于两种特征拉升方法:
  • 1. 由Lift-Splat-Shoot提出的基于Lift-Splat的特征拉升方法(如下图a),虽然具有对深度的感知能力,但是由于该方法中3D锚点和2D图像特征之间的关系是由确定的几何关系固定了的,无法进行调整,因此,该拉升方法在整个3D目标检测流程中只能进行一次,一旦有任何误差便无法纠正回来。除此之外该方法还有一个小缺点,由于在拉升过程中需要显式地根据2D特征构建3D特征,2D特征的分辨率就不能太大,否则显存占用会急速膨胀。
  • 2. 基于2D注意力机制的特征拉升方法,例如由PETR提出的基于dense attention的、由BEVFormer提出的基于deformable attention的、由DETR3D提出的基于point attention(deformable attention的一种退化形式,只有一个采样点)的等等。在这类方法中,3D锚点与2D图像特征之间的关系是由学习到的采样点确定的,是可调整的,因此该拉升方法在整个检测流程中可以多次进行,从而进行优化。但,由于这类拉升方法直接将深度方向给忽略掉了,因此存在深度模糊问题。更具体的,如下图(b,c)所示,多个3D锚点投影到某个视图的时候,会落到十分相近的位置,导致他们采样到的特征耦合的十分严重,最终引起误检。
由此可见,目前主流的这些特征拉升方法都不尽如人意。为此,我们提出了一个基础算子:3D Deformable Attention,并基于此基础算子将2D图像特征更加合理地拉升到3D空间中(如下图d所示):即有对深度的感知能力,又有进行多层优化的能力。我们借助一些简单的数学推导极大地减少了执行该基础算子所需的资源,并通过CUDA实现来对其进行了进一步的优化。为了验证其有效性,我们将DFA3D适配到了多个方法上,带来了平均1.41% mAP的提升

多种特征拉升方法的比较

2、方法

2.1 3D Deformable Attention及基于其的特征拉升

当使用我们的DFA3D来进行特征拉升并最终实现多视角3D目标检测时,其具体流程图如下所示。和我们在上文中讲的一致,1)在多视角2D图片经过2D主干网络提取各个视角的2D特征(通常为多尺度特征,multi-scale)后,2)这些2D特征图便会被送入到特征拉升模块中进行处理,并得到用于3)进行3D检测的拉升后的3D特征。接下来,我们会对第二步进行详细的讲解从而说明DFA3D的具体细节以及其如何实现特征拉升的。
为了方便讲解,在下述步骤1和2中,我们将假设2D特征只有一个尺度:
  1. 首先,和BEVDet这类方法类似,我们将该2D图像特征图   送入到一个深度估计子网络中来为每个2D特征估计深度,并将该深度通过深度分布的形式    将深度表示出来,其中,V表示视角数(比如在nuScenes数据集上为V=6),H和W表示特征图的大小,C表示2D特征的维度,D表示深度方向被量化后的类别数量。而后,将每个2D图像特征与其对应的深度分布做外积来将2D图像特征图沿着深度轴延展成一个3D特征图(expanded 3D feature map)   ,    。和Lift-Splat这类方法不同的是,我们并没有将延展后的3D特征图    通过相机内外参转换到自车坐标系从而生成伪雷达特征,而是将他们留在图像坐标系不动。除此之外,在内存空间维持这个3D特征图会消耗大量的显存资源,这就使得Lift-Splat这类方法无法使用大尺度的2D特征图,限制了其对小和远距离物体的感知能力。在下一部分中我们将会解释我们如何通过数学上的优化来使得我们无需真正地执行这个外积,也无需维持这么巨大的特征在内存空间。
  2. 将自车坐标系下的3D锚点看作是3D查询(query),而步骤1中得到的3D特征图  看作是3D键值对(key,value)。每一个3D查询根据自身的3D坐标以及当前视角相机的内外参数投影到当前视角的图像坐标系下。该3D查询进一步根据自身的语义特征(content feature,该特征是随机初始化的)来估计该查询具体应该在哪些位置(sampling locations)对3D键值对进行采样(trilinear sampling),以及采样到的特征应该被赋予多少的注意力(attention)。对于每一个3D查询,将它采样到的特征以及他们所对应的注意力值做加权求和便得到了该视角在该3D查询所在的3D坐标的拉升结果。这一步骤实际上也就是3D Deformable Attention这一算子内部机制的具体内容
  3. 对于每一个3D查询,将在多个视角多个尺度下的到的拉升结果聚合在一起,这样之后,一次特征拉升过程便结束了。但,聚合得到的特征可以用于更新该3D查询的语义特征,并可以再次进入到步骤2进行再一次的特征拉升。由于此时3D查询的语义特征更加有意义,再一次的特征拉升所得到的结果也将更好。

使用DFA3D来进行特征拉升并最终实现多视角3D目标检测

2.2 3D Deformable Attention的优化

在讲述如何优化之前,我们先来看看在Sec 2.2的步骤1中我的得到的3D特征图    具体是什么样子的。如下图可以看到,由于  是由    做外积得到的,因此,    中的每个元素(一个特征向量)实际上都是由一个2D图像特征(  的一个元素,向量)和从一个深度分布上采样到的一个数值(  中的一个元素,scalar)相乘得到的。并且,当uv坐标相同时,他们将共享相同的2D图像特征,以及相同的深度分布。

3D特征图
充分利用这样的规律,如下图所示,3D Deformable Attention中的核心运算:trilinear采样 便可以被简化为一个加权了的bilinear采样。3D Deformable Attention也就随之被简化为了一个加权了的2D Deformable Attention(depth score-weighted DFA2D)。(限于篇幅,更详细的推导请参考原文)
这样一来,我们便无需真的去计算  之间的外积,也无需去维持巨大的3D特征图  在内存空间,3D Deformable Attention将会被实时地以加权了的2D Deformable Attention来实现,节省了大量的资源。

DFA3D可以被简化为depth score-weighted DFA2D

3、实验

在介绍实验之前,值得注意的是,由于在Sec 2.2中我们对DFA3D的优化,DFA3D与2D Deformable Attention(DFA2D)在接口上差异很小,因此,如下图所示,我们可以很方便地将一个基于DFA2D做特征拉升的方法改造为基于DFA3D做特征拉升。

使用DFA3D和DFA2D做特征拉升时在代码上的对比
我们在多个基于DFA2D做特征拉升的方法上进行了实验,其结果如下表所示。可以看到,DFA3D在多个方法、多个模型大小上均体现出了优势。(我们在github上提供了更加高的结果,具体请参考我们的repo)

在多个方法、多个模型大小上均有提升
尤其的,如下表所示,我们发现,随着depth质量的提升,我们的结果提升十分明显。当我们使用ground truth的depth时(将LiDAR投影到图像上得到的稀疏的深度图),提升能达到15.1% mAP。(我们在github上提供了+16% mAP的结果,具体请参考我们的repo)

深度估计模块本身以及深度估计的质量对结果的影响

4、总结与展望

在本文中,我们提出了一个基础算子,并将其运用在特征拉升中,并在多视角3D目标检测任务上对其有效性进行了验证。值得注意的是,在所有的实验中,我们用的都是简单的单目深度估计,但最近的很多工作(例如,StreamPETR、SOLOFusion、Sparse4Dv2以及BEVStereo等)都验证了依赖时序以及多视角可以信息帮助深度估计得到更好的结果。如果能将这样高质量的深度估计利用起来,那么如我们在实验部分的观察所示,DFA3D所能提供的性能提升还会进一步增加。

若觉得还不错的话,请点个 “赞” 或 “在看” 吧

全栈指导班

全栈指导班面向的是真正想从事CV的、想培养自己的能力和知识面的、具备算法工程师思维的朋友
有很多朋友仅仅了解自己的科研方向、仅仅了解YOLO怎么用,做过几个简单的项目,但从没系统地学过CV,也没有重视培养自己的学习能力和思维能力。也有很多朋友想找目标检测的岗位、医学图像的岗位,但实际上哪个企业招聘上写目标检测工程师呢?写的都是算法工程师,一个合格的算法工程师需要能快速上手任意一个新的方向,这意味着需要广泛大知识面、扎实的基础、很强的自学能力。知识面太少,谈何设计模型?不会看论文,谈何学习能力?
因此,对于全栈班而言,如何培养上面这三点是非常重要的。这也意味着它与基础入门班不同之处在于全栈班更注重培养方法、能力以及知识面
内容范围:全栈。包括基础、代码能力、模型设计分析、目标检测、数字图像处理、部署等全流程
说明:虽然看起来跟基础入门班内容没什么区别,但实际每个内容涉及更深、范围更广、要求更高,且包含部署方面的学习和能力培养比如同样的模型设计,基础班只要求掌握十几个模型的设计思路,全栈班会要额外推荐一些重要的论文去学、要求效率更高,且基础班是老师直接讲,而全栈班是学员先自主学再指导,前者是入门、后者是深入学习。
如果你本身是一个基础很好的,仅仅想学习部署方面的内容,也可以报名,我们会针对你的个人情况,单独设计部署方面的学习计划,安排有六年部署工作经验的大佬给你指导。
课程形式:50%学员自主学习+50%的方法、能力的指导培养。可以理解为报了一个全栈班,就是找了两个大佬对你进行二对一指导,但仍然是你自己自学。

报名请扫描下方二维码,备注:“全栈班报名”


内容中包含的图片若涉及版权问题,请及时与我们联系删除