BEV感知系列文章总结

BEV感知系列文章总结

Introduction

BEV即Bird’s Eye View(鸟瞰图),意即从上方俯瞰地面的视图,将原本的三维世界给压扁成二维世界,相对于整个三维空间和二维图像,既可以节省计算和内存占用资源,也可以更好地将自动驾驶场景中物体之间的三维位置更好地表示出来(二维图像中目标之间存在近大远小的现象)。BEV坐标系以车体为中心,与雷达坐标系相同,因此可以更好地实现相机与激光雷达两者感知结果的融合。

附赠自动驾驶最全的学习资料和量产经验:链接

(纯视觉)多目BEV感知

密集BEV(基于深度分布)

密集BEV感知的含义就是对图像特征里每个位置每个像素都预测了一个深度值,目的是判断它们是在3D空间的哪个地方投影到图像平面的。

1、Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D

image

Lift的过程

image.png

2、BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View

image

BEVDet

image.png

image

密集BEV感知模型结构

2)作者提到训练网络时会有过拟合的现象:【1】LSS里面对图像作数据增强,只有BEV编码器不在才会起到正面的作用(反之甚至降低网络性能?);【2】图像编码器的bs是 � 倍于后面的模块(nuScenes数据集是6个相机输入的),导致后者的训练数据不足;【3】视角转换器采用像素级的映射方式把图像空间和BEV空间连接在一起,这导致了两者的数据增强策略是彼此割裂的(图像空间的图像增强策略没法对后边的模块,例如BEV编码器、检测头,有正面的影响);

image.png

解决方法:对BEV空间(视角转换器的输出结果和3D检测目标)同时施加数据增强(翻转、缩放、旋转)。

3)尺度NMS:传统NMS里定义了一个固定的IoU阈值(0.5),这是因为2D空间里两个物体的IoU都会小于这个阈值,可以以此区分TP和FP;但是BEV空间里两个个体之间的重叠几乎为0,而且特别是对于一些占用范围较小的物体(人体、雪糕筒等),网络会输出的冗余结果和实际目标值几乎没有重叠,这就没办法用传统NMS把这些FP和TP区分开来;因此原文对不同类别的输出都以不同程度进行尺度化(更多的是对小物体放大)。

image.png

image

辅助索引向量

image.png

图中的问题:1、BEVPool里体素索引向量维度和视锥体特征维度不一样,怎么根据每个体素索引去找每个视锥体特征;2、BEVPoolv2里面也是类似,视锥体索引向量维度和图像特征维度不一样,怎么根据每个视锥体索引去找每个图像特征;

image

BEVFusion里的BEVPool和BEVDet-dev2.0里的BEVPoolV2

补充材料:CBGS是为了解决自动驾驶场景中天然存在的严重类别不平衡问题(class-imbalance/长尾数据分布),而设计得一个类别平衡采样和增强策略,目的是生成一个更加平衡的数据分布。

3、BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection

image

BEVDet4D

和BEVDet唯一有所不同的是,BEVDet4D在网络中添加了时序上下文信息,极大地提高目标速度的预测准确率(nuScenes的mAVE从0.8降低到0.3),这是因为速度预测任务简化为预测两个相邻帧( � 和 �−1 )之间目标的平移量(也即两个BEV特征下的位置差值),与时间无关;

image

前后两帧BEV特征对齐过程

image.png

image

关于坐标系转换位置和不同分辨率下的消融实验

4、BEVDepth: Acquisition of Reliable Depth for Multi-view 3D Object Detection

image

BEVDepth

image.png

image

DepthNet结构

1)相机相关的深度估计模块:对于针孔相机模型,深度估计和相机内参相关,因此相机内参也作为深度估计模块输入的一部分,代码中深度估计模块是双分支的,结构如上图所示,MLP_input是相机内参、图像数据增强、BEV数据增强的联合向量,分别经过两个分支的多层感知机把维度拓展到与图像特征的一致,分别采用两个SE模块进行加权,最后两个卷积模块context_conv和depth_conv的输出拼接在一起,前者是一个普通的卷积层,后者是一个由resnet三个基础模块、ASPP模块、可变形卷积和普通卷积层组成的网络;

image.png

3)更高效的体素池化模块:就是BEVPool里,给每一个体素分配一个CUDA进程,从而加快速度;

image

多帧融合机制

4)多帧融合机制:先把不同帧下的视锥体特征的坐标对齐到当前的车体坐标系,然后对它们执行体素池化,池化后的多帧特征直接拼接在一起。

稀疏BEV(基于注意力机制)

稀疏BEV感知就是在三维空间里定义一些查询向量Query,然后用这些向量去和图像特征以注意力机制的方式进行交互。

1、DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries

image

DETR3D

image.png


回顾DETR:

image

DETR

image.png


2、BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers

image

BEVFormer

1)空间交叉注意力:传统的多头注意力的计算资源消耗较大,因此这里用了可变形注意力机制(无论输入特征尺寸多大,都只关注参考点周围的一小部分的采样点);

image.png

image.png


回顾可变形注意力机制:

image

可变形注意力模块(From Deformable DETR)

可变性注意力模块的公式: image.png


image

DETR3D和PETR两种不同的范式

DETR3D循环地把生成出来的3D参考点投影到图像2D平面,然后采样出对应位置的图像特征和查询向量在解码器进行交互;PETR则是通过把3D位置向量编码到2D图像特征得到和位置相关的3D特征,然后直接和查询向量进行交互;

3、PETR: Position Embedding Transformation for Multi-View 3D Object Detection

image

PETR

image.png

image

3D位置编码器

image.png

image

3D位置向量作用的分析

在前方视角左侧选取一个位置向量,左前方视角右侧的位置向量与前者的相似度较大、在前方视角右侧选取一个位置向量,右前方视角左侧的位置向量与前者的相似度较大,这说明3D位置向量可以隐式地构建起不同视角的位置关系;

3)查询向量的生成方式:在3D空间初始化一组遵循均匀分布(从0到1)的可学习锚点,输入到多层感知机得到初始目标查询向量 �0 (在3D空间生成锚点能保证模型拟合,而遵循DETR的做法或者在BEV空间生成锚点会导致模型性能的下降)。

4、PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

image

PETRv2

1)3D坐标系对齐实现时序建模(类似于BEVDet4D中的做法,把物体在不同时刻下的3D空间坐标给统一到当前时刻下的3D空间坐标系):

image.png

image

特征引导下的we

2)PETR里面直接“用3D位置 �3� 输入到多层感知机获得3D位置向量”,而PETRv2里面作者任务3D位置向量应该和2D特征相关(因为后者可以提供一些深度或者其他类型的语义信息)

image

三种感知任务的Query设置

2)多任务下不同形式的Query设置:【1】BEV分割:把BEV图谱分割成数量较小的图块,每个query对应一个人图块(25x25),在BEV空间初始化一些固定的锚点,锚点输入到两层MLP中得到分割query,最后输入到解码器和图像特征交互;【2】3D车道线:定义一些3D锚线,每个锚线由一组有序3D坐标组成,这些坐标是在Y轴上均匀采样而得,预测出车道线类别C、和锚线各点分别在X轴及Z轴的相对偏移量(Δx,Δz)、长度为n的可视向量(代表起始点和终点);

静态映射

静态映射就是把2D空间里每个像素的特征沿着光心射线方向投影到3D空间中的每个点,既没添加深度信息辅助,也没有在3D空间定义一些查询向量来与2D特征交互。

1、M^2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Representation

image

M^2BEV

image.png

2、Fast-BEV: A Fast and Strong Bird’s-Eye View Perception Baseline

image

FastBEV

1)FastBEV里面最核心的东西就是如何用射线的形式把2D图像转换到3D体素空间,思想和M2BEV的一样,只不过M2BEV是用矩阵转换的方式,FastBEV是离线地建立了一个表格,在每次推理时查询每个像素在这个表格里对应的体素索引信息;

image

建立LUT表格、统一多视角到单一体素空间的转换过程

image.png

总结

image

不同类型的视角转换方法

借助FastBEV里的一幅图,三种类型的BEV感知方法其核心都是如何把视角从2D图像转换到3D体素空间上。总的来说,密集BEV(基于深度)显示或隐式地预测深度,与2D特征相乘得到体素特征然后对其进行“体素池化”;稀疏BEV(基于Query)就是2D特征,3D位置和定义的一组查询向量一起在decoder里面交互;而静态映射方法就是沿着射线把2D特征“复制粘贴”到3D空间中该有的位置。

(视觉+激光雷达)多模态BEV感知

1、BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation

image

BEVFusion

[核心思想]:相机RGB画面和激光雷达点云不能以点-点的方式简单地融合起来,否则会有几何失真(激光雷达->相机)和语义失真(相机->激光雷达),而是以BEV为中间媒介,激光雷达点云和相机RGB分别转换到BEV视角,然后在BEV视角下拼接融合;

1)对于激光雷达->BEV,就是把稀疏点云在高度上展平(也可以说是压扁),而对于相机->BEV,原文采用了LSS和BEVDet的范式,显示预测关于深度的离散分布;

image

高效的BEVPooling

2)还是针对BEV池化层的讨论,(再复述一遍加强记忆)目的就是把视锥体特征里的每个点放到BEV网格里,因为视锥体特征的坐标都是固定的,作者第一步就是计算视锥体特征每个点的3D坐标和它们在BEV网格里的索引(属于哪一个体素),然后根据上面的索引把每个视锥体点进行排序,记录每个视锥体点的rank(这里我不太理解作者的意思);LSS里面的“前缀和”就是依次和前面的值累加,然后减去索引变化前的那个值,而BEVFusion的做法大致是给每个体素分配了一个CUDA线程,对于每个体素间隔里的所有视锥体点求和(仅局限于CUDA上的加速,对CPU设备不友好,因此可以采用FastBEV里的静态映射法进一步对BEVFusion改进);

3)由于视角转换阶段里深度信息不准确,激光雷达BEV和相机BEV之间始终会有一定程度上的没对齐,原文加入了一个基于卷积的BEV编码器来补偿局部没对齐的地方(作者也说更准确的深度估计可能会让模型性能更好,也就是用深度真值来监督视角转换阶段的学习,也就是BEVDepth的思想);

4)和3D目标检测领域论文一样,检测任务用一个中心热图模块用来预测所有目标的中心位置,以及一个回归头预测目标大小旋转和速度;对于(地图元素)分割任务,考虑到不同的地图元素类别会有重叠(人行道斑马线和可行驶区域),给每一种地图元素都分割一个二值图;

2、BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework

image

BEVFusion

image

激光雷达-相机融合方法比较

[核心思想]:针对以前的激光雷达-相机融合方法,无论是在点云上采样某些位置投影到2D图像空间,还是点云上某些特征作为查询向量和2D图像特征进行交互,只要一个模态出现了问题(数据传输、雾天雨天导致反射率低、硬件受限导致激光雷达点云无法360度无死角),模型全盘都会出错;

image

动态融合模块

在保留了基于相机RGB图像的BEV感知分支(LSS)和基于激光雷达点云的BEV感知分支(基于体素、基于柱状)的前提下,对两个分支的特征进行动态地融合,采用SE模块中的通道与空间融合思想,然后用3×3卷积把特征维度降低到和点云分支输出特征的一致,再使用全局平均池化和1×1卷积加上Sigmoid激活函数,最后和自身相乘;

3、EA-LSS: Edge-aware Lift-splat-shot Framework for 3D BEV Object Detection

image

EA-LSS

[核心思想]:(这篇论文还是围绕如果从2D图像中构建准确的深度是BEV感知的核心来讲)讲了几个问题【1】物体边缘的深度很重要,LSS系列的方法(密集BEV感知)没有重视这些地方,很可能把2D特征给“映射”到体素空间中错误的地方,造成“深度跳跃”的现象出现【2】尽管有用点云投影来的深度信息去监督深度估计网络的学习,但是这些投影来的深度是很稀疏的(BEVDepth里用转换矩阵,再用最小池化和one-hot),针对这些问题,论文提出了:

1)深度细化模块:点云映射的深度信息稀疏,如果基于此和预测出来的深度图计算损失,其中的连续零值会给模型的收敛带来困难,【1】上采样能让预测出来的深度图和点云映射的“真实”深度图尺寸保持一致(间接地让深度估计网络更仔细地学习整个场景每一个地方的深度分布)【2】损失函数里只计算两个深度图里非零部分的损失【3】焦点损失函数(focal loss)可以让网络只关注前景目标的部分;

image

D,G和G'的可视化例子

image.png

image

EA-LSS框架及其“即插即用”

image.png

总结

前两种多模态融合方法,模型结构都大同小异,也提供了一种思路就是把多目BEV感知里的一些有用的、能加速的模块或者trick都用上(LUT、时序特征融合等等),说不定最后的性能会很棒;第三篇文章就是弥补了纯视觉或者多模态BEV感知中对于深度信息的利用问题,要不就是没用上,要不就是用的不好;

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值