Simplestory's Blog

LSS

Lift, Splat, Shoot

Word count: 1.1kReading time: 3 min
2023/06/24

LSS是早期一篇使用BEV来做自动驾驶感知的开山之作,后面的很多bev相关的算法都是基于LSS这一套框架做的改变。

BEV感知

BEV(Bird‘s’ Eye View)感知,顾名思义是用一种俯瞰的视角来解决自动驾驶感知的问题。这个视角下的目标检测、分割、跟踪等问题都会很直接,而且针对于自动驾驶场景,目标的高度信息其实并没有那么重要,下游的决策规划之类的任务大多数也是用的这种自上而下的视图来做的,多个相机信息的融合会变得方便很多,所以bev下的自动驾驶方案会更加的简单直接。

对于纯视觉的自动驾驶来说,BEV方案的关键在于如何将相机前向视角的数据给转换或者编码到俯瞰视角下。目前来说主要有四种方法:

  • IPM(Inverse Perspective Mapping)逆透视变换,即将相机透视空间反映射到bev空间。IPM会假设地面是完美的平面,没有任何的路面高度变化。这一假设与实际应用有很大的出入,所以IPM一般应用在车道线检测,这个场景下该假设一般是合理的。
  • Lift-Splat,大致意思是使用Lift操作将2D图像特征提升为3D的视锥体,之后用Splat在bev方向上拍扁。这个框架是由LSS提出的,对后续算法有很大的影响。
  • MLP(Multi-Layer Perceptron)多层感知机,即用mlp来对转换关系进行学习。可参考VPN了解更多。这一类方法对部署十分友善,但需要依靠大量的数据来学习这种映射关系。
  • Transformer,利用transformer来进行视图转换,它不会像CNN那样被感受野限制住视野。特斯拉之前分享的自动驾驶方案里用的便是transformer。这类方法训练和部署都有一些难度,但效果上可能会更优。

Lift-Splat-Shoot

LSS是一个端到端的框架,从一个或多个相机图像数据上提取特征并分别提升(lift)为一个对应相机的视锥体(frustum),之后将这些视锥体给拍扁(splat)到一个bev网格中。以上这套操作就是lift-splat的大致流程,后续的shoot可以理解为是下游任务,例如LSS中就是对路径的预测。

Lift

对于纯视觉来说,图片中每个像素对应的深度并不是确定的,所以LSS在每个像素的所有可能深度上都生成了表达。具体来讲,Lift操作就是对特征图上每个点都生成一个离散化的深度分布\(\alpha\)(一共有\(D\)个值),然后和对应点的特征\(\mathbf{c}\)(长度为\(C\))做外积并乘上相应的\(\alpha\)值。这样就可以得到相机的视锥体。过程图大致如下:

Splat

这一步的操作是将前面生成的视锥体投影到给定大小的BEV网格中。在LSS原文中,\(x\)\(y\)轴方向上的感知范围均为\(-50m\sim 50m\)\(z\)轴方向上则是\(-10m\sim 10m\),BEV的单元格大小为\(x\)\(y\)轴为\(0.5m\)\(z\)轴为\(20m\),所以最终生成的BEV网格大小为\(200\times 200\times 1\)

在投影过程中,会出现一个BEV单元格内有多个点,LSS采取的方法是用sum pooling来融合这些点。由于生成的视锥体中点数较多,模型效率并不高,所以LSS针对sum pooling进行了优化,利用cumsum trick来提升效率。

关于LSS细节上的处理建议阅读一下nvidia官方开源的代码,并不复杂,只有5,6个python文件,我简单整理了一下算法流程,大致如下:

网上也有一些优质的代码解析:

参考

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

自动驾驶感知新范式——BEV感知经典论文总结和对比