大白话用Transformer做BEV 3D目标检测

前言

如何利用车载环视相机采集到的多张图像实现精准的 3D 目标检测,是自动驾驶感知领域的重要课题之一。针对这个问题,传统的检测方案可以概括为:先利用一个 2D 模型在各自的相机视角获取 3D 检测结果,再通过后处理算法将各个视角的 3D 检测框投影到 ego frame 再组合在一起。这样的做法简单有效,但是由于将多视角融合的步骤排除在模型学习之外,导致其难以检测相邻环视相机重叠部分中被截断的物体,也难以实现与 3D 点云传感器 (LiDAR) 的数据级/特征级融合。
在这里插入图片描述

Perspective view VS BEV view 3D object detection

随着 Attention 机制在 Vision 领域的成功应用,大家开始关注如何将多个 Perspective view 的图片表征 (image representation) 转化为一个统一的BEV view (Bird’s Eye View, 鸟瞰图) 的场景表征 (scene representation),从而实现完整统一的 3D 目标检测。具体而言,传统的 2D 网络包含 Backbone 和 Head 两个模块,分别用于特征提取和目标检测。BEV 网络则在二者之间增加一个 BEV Neck,用于 2D 到 3D 的 BEV 投影以及 BEV 视角下的特征提取。本文尝试盘点一下目前市面上几种主流的 Transformer-based BEV 3D object detection 的方法,重点着眼于如何高效的从环视相机视角提取 BEV 特征。

Feature point sampling

DETR3D [2] 将原本的 DETR 模型拓展到 3D 空间。具体而言:在 2D Image feature extraction 部分,利用共享权重的 ResNet+FPN (output stride = 1/8, 1/16, 1/32, 1/64) 提取环视相机所采集到的 6 张图片的特征。在 3D Transformer decoder 部分,每个 object query 先通过一个子网络预测所查询物体在真实世界的 3D 坐标 (reference point),再利用由相机的内参外参所构造的坐标变换矩阵 (camera transformation matrices, 3x4) 将真实世界的 3D 坐标投影至环视相机的 2D 像素坐标,并应用双线性插值采样各个相机视角、各个 PFN 层级同一位置的特征点(投影在图像外的特征点用 0 填充),最后利用所采样到的 6x4=24 个特征点的均值作为物体特征更新 object query。 Feature point sampling有很多优点:1)计算量小(毕竟只采样 24 个特征点);2)兼容 FPN(应该对检测不同距离的物体有帮助);3)避免了 dense depth prediction(只需要预测 sparse object query 的 3D 坐标,不需要预测每张图片、每个像素的深度信息)。

Global cross-attention

无法直接用 3D object query 在 2D spatial features 上实现查询匹配的原因之一,是二者空间上的不一致:在 2D 图片上两个点之间的坐标距离难以表述 3D 世界中这两个点的实际距离。为了将 2D 的图像特征扩展到 3D 检测空间(以方便 3D object query 查询匹配),PETR [3] 选择在 Positional embedding 方面做改进:为 2D 特征图上的每个像素生成一个对应真实世界中的 3D 坐标列表(2D 图片上的一个点对应 3D 真实世界中以相机镜头为起始点的一条射线 (camera ray),列表即是在这条射线上采样的 N 个点的 3D 坐标集合),再通过 MLP 将这个坐标列表转化为 3D Positional embedding。下图展示了前视相机的左中右三个点与其他所有相机视角的 3D Positional embedding 的相似度比较,可以发现与这三个点所对应真实世界的三条射线夹角较小的区域相似度较高,证明这种 2D 到 3D 的转换是有效的。
在这里插入图片描述

图片来自PETR

有了 3D Positional embedding 的修饰,原本的 2D 图像特征便可以升级成 3D 空间特征,直接与 3D object query 做查询匹配。PETR [3] 最大程度上保留了 Anchor DETR [4] 的网络结构和检测逻辑,在 Transformer decoder 阶段使用了原本的 Global cross-attention,即每个 3D object query 要和 6 张环视图片的所有特征点做一遍相似度匹配。值得注意的是:1)可能是出于计算量考虑,PETR [3] 并没有采用多尺度 FPN,而是仅仅使用固定大小(stride=16)的特征图;2)根据作者的实验,BEV query(3D anchor points)需要在高度上(z 轴)做出细分,这与目前许多 pillar-based 检测方法有所不同。

deformable cross-attention

BEVFormer [5] 继承自 Deformable DETR [6],与上述两个工作的主要区别在于:1)显式得构建 BEV features(200x200 分辨率,覆盖以车为中心边长 102.4 米的正方形区域);2)利用 Deformable cross-attention 从 image space aggregate spatial information 到 BEV query 中;3)引入多帧时序信息。
在这里插入图片描述

图片来自BEVFormer

其具体做法是:为 BEV space 的每个 feature point 定义一组 anchor heights(pillar-like query, four 3D reference points from -5 meters to 3 meters),将这 4 个点投影回 2D image space 进行特征点采样(sampling 4 points around this reference point),再用采样得到的特征点与 BEV query 做 deformable attention。相比于前两种方法,Deformable cross-attention 更加灵活:它并不只采样一个点,也不是跟 6 张图片的所有位置挨个匹配,而是查询 reference point 周围的感兴趣区域(RoI, region of interest)。细算一下,一个 pillar-like BEV query 对应 4 个不同高度的 reference points,每个 reference point 采样 4 个特征点,deformable attention 还涉及 8 个 heads,再加上 3 层 FPN(output stride=1/16, 1/32, 1/64)的特征输出,最终一个 BEV query 实际上考察了 4x4x8x3=384 个特征点。

Lift-Splat

严格来说 Lift-Splat [7] 并不是基于 Attention 实现的,而是根据(预测的)深度信息加权来实现特征从 perspective view 到 BEV 的转换(值得注意的是,每张图片的每个特征点都需要预测其深度信息)。
在这里插入图片描述

图片来自Lift, Splat, Shoot

具体来说,在 Lift 步骤:与 PETR [3] 类似,考虑 2D 图片上的一个点对应 3D 世界的一条射线,故可以在这条直线上采样 N 个点(例图用了 10 个,实际用了 41 个);之后网络需要预测这个特征点的深度信息 (distribution over depth,参考直线上的直方图),利用深度信息加权 (scale) 同一位置的图像特征 C(参考例图右侧,由于网络预测的深度在第三个 bin 较高,所以当深度 D=3 时特征与图片特征 C 最接近,而其余深度处特征较弱)。对一张图片每个 2D 特征点做相同的操作,就可以生成一个形状类似平头金字塔 (frustum) 的点云。在 Splat 步骤:首先构建一个 pillar-based BEV 视角的特征图(200x200 分辨率,覆盖以车为中心边长 100 米的正方形区域),然后将上一步骤得到的 6 个平头金字塔点云中的每个点匹配 (assign) 给距离最近的 pillar,最终 BEV space 上每个 pillar 的特征就是所有匹配到的特征点的和 (sum pooling)。基于此方法的后续改进包括:1. 通过添加显式的深度预测监督 (explicit depth estimation supervision) 实现更精确的 camera to BEV 特征转换 [8];2. 通过添加坐标转换预计算 (precomputation) 与 GPU 多线程并行池化 (specialized GPU kernel that parallelizes directly over BEV grids) 实现更快速的 camera to BEV 特征转换 [9];3. 由于 Splat 步骤所采用的 sum pooling 会粗暴地压缩一个BEV grid 的高度(Z轴)信息,故可以先将 Lift 步骤得到的点云渲染成立体特征 (pseudo voxel, feature shape = XYZC),再 reshape 成 XY(ZC),最后通过 3x3 卷积降低特征通道数至 C [10]。

Future directions

仿照 Sparse RCNN [11] 的思路,在 BEV space 通过 RoIAlign 的方式抽取环视相机 perspective view 的 2D 特征(每个视角一个 RoI,投影到图片外的 proposal 用 0 填充)是否可行?目前还没有读到类似的工作,有待进一步验证。 上面介绍的方法都是基于 query-based detection,出于计算量考虑 query 的数量一般比较少(大约 500-1500 左右),复杂场景下模型的 recall 表现还有待调研。 Transformer-based BEV 3D object detection 模型是否必须依赖 perspective view 的预训练模型 (e.g., FCOS3D [12])?能否设计一种时间+空间、2D 到 3D、单任务到多任务、单传感器到多传感器的大规模自监督预训练?能否利用大规模仿真产生的数据?

猜你喜欢

转载自blog.csdn.net/limingmin2020/article/details/132531977