文章目录
-
- 1. 相关概念
-
- 1.1 什么叫做BEV自底向上方法
- 1.2 BEV网格
- 2. 自底向上方法框架-LSS
-
- 2.1 视锥点云和Lift操作
-
- 2.1.1 视锥点云的空间位置
- 2.1.2 视锥点云的特征(Context)
- 2.2 BEV Pillar和Splat操作
- 2.3 Shoot: Motion Planning
- 2.4 完整的pipeline
- 2.5 cumsum_trick(): 池化累积求和技巧
- 3. 算法实现过程梳理
-
- 3.1 相关参数设置
- 3.2 模型相关参数
- 3.3 算法前向过程
- 3.4 对生成的BEV特征利用BEV Encoder做进一步的特征融合 + 语义分割结果预测
- 4 总结
- 5 参考
- paper - Lift,Splat,Shoot:Encoding Image From Arbitrary Rigs by Implicitly Unprojecting to 3D
- github: https://github.com/nv-tlabs/lift-splat-shoot
自从BEV下的感知在Tesla AI Day 被提出后,业内很多公司开始进行BEV工程化的探索。bev视角下可以
实现端到端
的目标检测、语义分割、轨迹预测等各项任务。由于这种方法pipline更加简单直接
,且能够更好地被下游规控所使用(在同一个坐标系),近期相关研究工作达到井喷趋势,霸占各大SOTA榜单。
基于采集到的环视图像信息,去构建BEV视角下的特征
完成自动驾驶感知的相关任务。因此如何准确的完成从相机视角向BEV视角下的转变就变得由为重要,其中准确的深度估计
是其中的关键
。目前比较主流的方法可以大体分为两种: 一类是以Transformer
为主体的隐式深度(Depth)
信息进行转换的架构, 也被称为自上而下的构建方(Top to Down)式;另一类则是基于显示的深度
估计投影到BEV下的方法,也被称为自下而上(down to Top)的构建方式。
LSS这篇论文的核心则是通过显式估计图像的深度信息,对采集到的环视图像进行特征提取,并根据估计出来的离散深度信息,实现图像特征向BEV特征的转换
,进而完成自动驾驶中的语义分割任务。
LSS发表于ECCV2020
的文章在BEV探索的道路上成为了一把利剑,有不少SOTA的论文是在此基础上改进得出,例如CaDDN、BEVDet等文章均是在此基础上改进得到。当前,这套由NVIDIA提出的LSS仍然是目前业内实现BEV感知的最佳利器之一。
1. 相关概念
1.1 什么叫做BEV自底向上方法
当前BEV的研究大都基于深度学习的方法,从组织BEV特征信息的方式来看,主流方法分属两类:自底向上方法和自顶向下
方法。
-
自底向上
方法比较早的代表工作是LSS
,后来BEVDet、BEVDepth等也是基于LSS的框架来进行优化。自底向上方法核心是:Lift——对各相机的图像显性地估计像平面下采样后特征点的深度分布,得到包含图像特征的视锥(点云);Splat——结合相机内外参把所有相机的视锥(点云)分配到BEV网格中,对每个栅格中的多个视锥点进行sum-pooling计算,形成BEV特征图;Shoot——用task head处理BEV特征图,输出感知结果。本文就是通过解读LSS和BEVDepth两篇论文,来深度剖析自底向上构建BEV方法。 -
自顶向下
方法的典型代表是Tesla用Transformer构建BEV,2020年10月发布的FSD Beta软件视觉感知模块已开始应用此方法,在2021年Tesla AI-Day上Andrej Karparthy披露了更多技术思想,核心是:先预定义待生成的BEV特征图,利用Transformer全局感知能力在多个视角图像的特征中多次查询相应信息
,并把信息融合更新到BEV特征图中。上海AILab团队做了类似的技术实现,并以BEVFormer公布了相关工作。
1.2 BEV网格
在自车周围俯视平面x-y方向划分n个网格,每个网格表示特定物理距离d米。如200200的BEV网格,每格代表0.5米,这个网格就表示100米100米的平面范围。如果恰好自车中心(自动驾驶的的车辆中心一般指后轴中心)在网格中心位置,那么网格就表示自车前、后和左、右各50米的范围。注意这里强调用网格划分平面空间,并不涉及网格内放什么内容。
2. 自底向上方法框架-LSS
2.1 视锥点云和Lift操作
用单目相机进行距离、尺寸类的感知,关键是如何恢复图像中的深度信息
2D图像
中每个像素点
可以理解成世界空间中某点到相机中心的一条射线
,仅利用图像不能确定此像素具体来自射线上哪个位置(也就是不知道该像素的深度值),如下图3中的P,投影到 P ′ P^{'} P′,丢失了深度信息Z。
-
LSS的第一步
操作Lift就是为了恢复图像的深度信息
。采用的方法包括两个小步骤:Lift_1
,为每个像素生成具有所有可能深度的一系列点;Lift_2
,给每个点生成特征值(contex)。 -
实际上
并不是用原图像素进行Lift_1操作
,而是用经过backbone提取特征且下采样的特征点
(其中,backbone的输入是原图resize、crop预处理后的图像)。论文中为了让读者容易想象,形象地把它称为像素,下文中我们试图更严谨一些,把它们称作图像特征点
。沿着这个定义名词的思路,那就把特征点所在的下采样后平面称作图像特征平面。 -
相比于给特征点赋予单一深度值,采用所有可能深度的好处在于可以提高鲁棒性,在一些深度值具有歧义性的像素点上表现更好。
下面先介绍Lift_1“为每个像素生成具有所有可能深度的一系列点”的具体实现:为每个图像特征点分配D个点 { { ( h , w , d ∈ R 3 ) ∣ d ∈ D } } \{\{(h,w,d \in R^3)|d \in D\}\} { {(h,w,d∈R3)∣d∈D}},其中D是一系列的离散深度。这样就为图像特征平面(HxW)生成了一个巨大的点云(含HxWxD个点)。实际上这个点云所表示的3D物理空间是一个以相机为顶点的视锥体,如下图4所示,下文中把它们称作视锥点云。
2.1.1 视锥点云的空间位置
官方代码中生成视锥点云的实现方式是:如下图4所示,定义距离图像特征平面4m到44m、间隔1m
的多个平面,这样每个图像特征点有D=41
个可能的离散深度值。每个点相对相机的描述的位置是[h, w, d],利用相机内、外参,可以把这个位置转换成用车辆坐标系下的空间位置来表示,其维度也是HxWxDx3
,即HxWxD
个[x, y, z]
。
有了视锥点云
,以及每个点所对应的空间位置,那么如何获得每个点的有效特征信息呢
?这就由Lift-2“给每个点生成特征值(contex)”来实现。
2.1.2 视锥点云的特征(Context)
Lift完整操作过程如图5所示,模型对每个图像特征点预测C维语义特征c以及D维深度分布概率α(41个深度的分布概率),然后将α与c做外积,得到HxWxDxC维的特征图,可以理解为HxWxD个视锥点的C维语义特征,它编码了自适应深度下的逐个图像特征点的语义信息。图中第三个深度,即深度为 α 2 \alpha_2 α2的视锥点的深度分布概率比较高,那么在图中右侧,相比于此图像特征点的其它视锥点, α 2 c \alpha_2 c α2c的语义特征最“显著”,也可以理解为这个图像特征点的信息更多地被编码到了视锥点 a 2 a_2 a2
2.2 BEV Pillar和Splat操作
有了视锥点云
(包含空间位置和特征),就可以根据视锥点的空间位置把每个视锥点的特征
(contex)放到BEV网格中
的合适位置,组成BEV特征图
。
BEV网格由200x200个
格子(BEV Pillar
)组成,每个格子对应物理尺寸为0.5米x0.5米。即BEV网格对应车辆前、后和左、右各50m,且高度不限的3维空间。
上面通过相机的内外参,已经把视锥点云转换到车辆坐标系下的空间位置。排除掉BEV网格所表示空间范围(以自车为中心100mx100m范围)以外的点,就可以把剩余有效的视锥点云分配到每个BEV Pillar里。
注意,这里存在同一个BEV Pillar可能分配多个视锥点的情况,这是由两个原因引起:
- 单张2D图像不同的像素点可能投影在俯视图中的同一个位置,例如垂直于地面的电线杆,它成像的多个像素点可能投到同一个BEV Pillar。
- 相邻两相机有部分成像区域重叠,相机图像中的不同像素点投影在同一个BEV Pillar。例如不同相机画面中的同一个目标。
对于一个BEV Pillar分配多个视锥点
,作者使用了sum-pooling
的方法,把视锥点的特征
相加,最后得到了200x200xC
的BEV特征图
,源码中C取64
。
2.3 Shoot: Motion Planning
Li