什么是BEV?——(/s/1-xew1fcaFq0OZNbuj4tK7g 提取码: ntq3)
鸟瞰视角(Bird's Eye View,简称BEV)是一种从上方观看对象或场景的视角,就像鸟在空中俯视地面一样。在自动驾驶和机器人领域,通过传感器(如LiDAR和摄像头)获取的数据通常会被转换成BEV表示,以便更好地进行物体检测、路径规划等任务。BEV能够将复杂的三维环境简化为二维图像,这对于在实时系统中进行高效的计算尤其重要。
BEV的优势
简化的视角: BEV将三维空间简化为二维,这样可以在计算和存储上节省大量资源。
视觉效果: BEV提供了一种独特的视觉效果,使得场景中的物体和空间关系更加清晰可见。
方便处理: 在BEV中处理物体检测、跟踪和分类等任务相较于直接在原始3D数据中处理要简单得多。
便于融合和下游任务处理:与lidar融合更为方便,对下游路径规划控制等任务也更友好。通用坐标系
尺度一致:相机检测会出现近大远小的情况,BEV同类目标尺度差异几乎没有,更容易学习特征尺度一致性
图像分割主要在两个方面帮助单眼3D目标检测。首先,在一些作品中,物体分割蒙版对于形状重建至关重要[319,9]。其次,分割表明从透视视图来看图像像素是否在3D物体的内部,并且在[39,99]中已经利用该信息来帮助定位3D物体。
分析:在单眼3D检测中利用先验知识边缘的潜力和挑战。通过形状重建,我们可以从图像中获得更详细的物体形状信息,这有利于3D物体检测。我们还可以通过投影或渲染比较损失获得更准确的检测结果。然而,形状重建在单眼3D物体检测中的应用存在两个挑战。首先,形状重建通常需要额外的预训练重建网络的步骤,这阻碍了单眼检测管道的端到端训练。其次,物体形状通常是从CAD模型中学习的,而不是从现实世界的实例中学习,这就给将重建的物体推广到现实世界场景带来了挑战。
深层特征如果不记得浅层特征怎么办,我们把浅层的特征重新再加上去,通过上图中的一个残差结构,跳接的一个结构,这个时候我们再求偏导会发现除了原本的梯度之外还有额外的梯度保留,所以从一定程度上就避免了梯度消失的问题,那我们为什么要提 ResNet 网络呢,它其实是一个非常重要的网络,是现在很多 BEV 算法图像处理模块的核心,所以这里我们单独给大家引入一下这样的网络一个主要处理方法,其实就是一个残差结构,有选择性的把原本的特征保留住
那对于图像处理网络这块很通俗的讲输入图像通过这个 Backbone 网络,那这个 Backbone 可以是 VGG 也可以是 ResNet,我们比较推荐 ResNet,那大家比较通用的也是 ResNet,可以得到这个图像特征,无论是 ResNet 也好,还是 VGG 也好,它其实实现的全部都是图像数据的一个处理功能,那在 BEV 算法中存在环视图像,环视图像也是一样,那无非就是环视的输入可能存在一个多视角的图像,把这个多视角图像送入 Backbone 网络我们就可以得到环视的图像特征,那这里其实是一个比较简单的图像处理流程
图像视图编码器(Image-view Encoder):
图像编码器用于将输入图像数据编码为高级特征,该模块包括一个主干网络和一个颈部网络分别用于多分辨率图像特征提取和特征融合,主干网络采用经典的ResNet和SwinTransformer(也可以替换为DenseNet、HRNet等其他网络),颈部网络采用经典的FPN和FPN-LSS,没有采用其他更复杂的特征融合网络(PAFPN、NAS-FPN等)。
视图变换器(View Transformer):
视图变换器用于把特征从图像空间转换到基于车身坐标系的BEV空间,采用LSS提出的方法通过分类的方式去密集预测深度,深度分类的置信度和派生的图像视图特征用于渲染预定义的点云,这些图像空间的点云会根据相机的内外参把坐标转换到车身坐标系下。最后,通过沿Z方向进行池化操作,就可以生成 BEV特征。在实践中,作者将深度预测的默认范围扩展到 [1,60] 米,间隔为1.25 × r,其中r表示输出特征的分辨率。
网络特征提取
网络特征提取的目的是为了从每一帧对应的六张环视图像中提取特征,以便于后续将其转换为 BEV 特征空间,并生成 BEV 特征。
BEV 特征产生
生成 BEV 特征的过程中,最核心的部分是论文中提出的 Encoder 模块,其中包括 Spatial Cross-Attention 和 Temporal Self-Attention。在这两个模块中,都使用了一个非常关键的组件:多尺度可变形注意力模块。
这个模块将 Transformer 的全局注意力变为局部注意力,以减少训练时间并提高 Transformer 的收敛速度。
Temporal Self-Attention的作用是将时序信息(如插图中的历史 BEV)与当前时刻的 BEV Query 进行融合,以提高 BEV Query 的建模能力。
代码实战:
"""
输入参数的shape与含义
1.value (2, 40000, 8, 32) #2表示前一时刻的bev特征和当前时刻的bev特征,40000表示bev上的每个位置,8是多头注意力机制的头数,32是每个头的维度。
2.sample_shape (200,200)方便将归一化的偏移位置反归一化。
3.level_start_index 0,表示不同分辨率特征图的起点,这里只有一个200*200所以只有一个0
4.sample_locations (2, 40000, 8, 1, 4, 2) 2,40000,8对应value的含义,1表示一个尺度,4表示与四个点做注意力操作,2表示每个点的偏移量
"""
output = MultiScaleDeformableAttnFunction.apply(value,
spatial_shapes,
level_start_index,
sampling_locations,
attention_weights,
self.im2col_step)
#最终输出的output维度为(2,40000,8,32)在第一维度做一个平均,送到SCA
同TSA一样,根据queries_rebatch生成偏移和权重。将参数送入多尺度可变形注意力模块中。
"""
1.value (cam_num, sum(H*w) = 30825, head = 8, dim = 32)
2.spatial_shape ([116, 200], [58, 100], [29, 50], [15, 25])
3. level_start_index [0, 23200, 29000, 30450]
4.sampling_locations (6, max_len, 8 = 多头, 4 = 四个尺度, 8 = 8个点,Z上4个,一个z找两个偏移点, 2)
5.attention (6, max_len, 8, 4, 8)
"""
output = MultiScaleDeformableAttnFunction.apply(value, spatial_shapes, level_start_index, sampling_locations, attention_weights, self.im2col_step)
#output (6, max_len, 8, 32)
#将一个BEV上的3维点得到的特征求一个平均,比如有些点得到的3张图的特征,有些得到1张图的特征。
有疑问加站长微信联系(非本文作者)