LSS算法核心原理详细解读,一看就懂,不懂请打我!

核心

  • 将2D图像特征转换到BEV feature特征

  • 该算法是BEV领域中的一大基石

整体流程

  • 流程步骤

    • (1)利用backbone获得环视图像(6张图片)的特征;

    • (2)利用几何关系创建每张图片的视锥;

    • (3)利用相机的内外参,将视锥点云投影到ego坐标系下;

    • (4)利用voxel pooling 将环视图像特征转换为BEV特征;

    • (5)BEV encoder 对特征进一步融合,添加network head获得任务结果

  • 整体流程的示意图如下所示

在这里插入图片描述

分步阐述

backbone

  • 使用EfficientNet网络作为backbone,提取每张图片中的深度特征D=41,语义特征C=61

  • 特征图获取流程

    • 使用EfficientNet-b0获得特征图:24 x 512 x 8 x 22

      • 24:B x N -> B=4,N=6 -> 考虑前面3帧和当前帧图像;6张图片(从该部分看相机的数量只能为6,除非重新训练)

      • fH:8;fW:22

    • 利用1 x 1卷积将特征图的通道数变为512->105(64+41),24 x 105 x 8 x 22

      • 105个特征通道中前64个通道为语义通道,后41个通道为深度通道

      • 该部分网络进行了深度估计,通过训练所得

    • 取出后41个特征通道(深度通道),进行softmax概率估计

    • 利用广播机制,将语义通道24 x 64 x 1 x 8 x 22 与深度通道24 x 1 x 41 x 8 x 22进行外积最终获得24 x 64 x 41 x 8 x 22特征图

      • 取出上述某一帧中一张图片的特征图:64 x 41 x 8 x 22,其中的每个特征点的维度为 64 x 41

        • 如果该特征点的表征为3m距离的狗,则64个语义通道内,表示狗的语义通道的值最大;3m对应的深度通道距离最大。两个通道利用广播的机制相乘,最大的通道即可表示为3m距离的狗

        • 广播机制如下所示,c x a 获得Matirx_(c x a),可以通过该方式获得最大的通道
          在这里插入图片描述

几何关系(创建视锥)和视锥投影到ego

  • 总体流程:像素视锥点->剔除图像增强矩阵的影响->生成camera坐标系下的三维视锥点->将视锥点投影到ego坐标系下

  • 像素视锥点(u,v,d)的选择:

    • 由于最终的特征图尺寸为:8 x 22,则在原始图像上将图片分为8 x 22个图片块(patch)

    • 将每个图像块的顶点 + 预设深度(4~45m),即可完成视锥点的构建,形状为D x fH x fW x 3

    • 下图所示,第一列为x坐标、第二列为y坐标,第三列为预设深度值
      在这里插入图片描述

    • 代码如下所示:

在这里插入图片描述

  • 剔除增强矩阵的影响

    • 目的:例如,可消除图片旋转的影响

    • 利用下列公式消除图像增强的像素视锥的影响
      p i m g ′ = A − 1 p i m g p^{'}_{img}=A^{-1}p_{img} pimg=A1pimg

  • 获得camera坐标系下视锥点的坐标:

    • 利用下列公式,最终才能获得三维坐标系下的视锥点(形状如视锥
      p c a m = I − 1 ( p i m g ∗ d ) p_{cam} = I^{-1}(p_{img}*d) pcam=I1(pimgd)
      在这里插入图片描述
  • 将camera坐标系下的视锥点转换到ego坐标系

    • 利用camera->ego的TF变换关系能够直接获得,略

    • 最终获得的视锥点形状为:B x N x D x H x W x 3

Voxel Pooling

  • 目的:将环视图像特征转换为BEV特征

  • 已有图像特征:B x N x D x H x W x C;视锥点:B x N x D x H x W x 3

    • 将图像特征铺开,变为(B x N x D x H x W) x C;将视锥点铺开,变为(B x N x D x H x W) x 3。此时,视锥点与图像特征一一对应,可通过训练获得该内在联系

    • 将视锥点分配到预设的BEV网格内,获得栅格坐标。如下公式所示,其中bx:第一个网格的中心点;dx:每个网格的宽度;gemoFeats为视锥点。

      • 由于计算栅格坐标时,是取整操作(int),所以存在某几个视锥点位于一个栅格网格内
      • 由于预设的xyz范围为[-50, 50]、[-50, 50]、[-10, 10],所以可剔除超出该范围的视锥点。同时,也剔除对应的图像特征点

g e m o F e a t = g e m o F e a t − ( b x − d x / 2 ) / d x gemoFeat = gemoFeat - (bx - dx / 2) / dx gemoFeat=gemoFeat(bxdx/2)/dx

  • 将一个栅格内多个视锥点对应的特征点进行sum pooling,也就是将落在同一个栅格内的多个特征点进行相加操作

    • 由于特征点的shape大小不一,无法进行批量操作,需要使用如下代码部分进行操作,但实现的效果如上所示。

    • 论文中,经过sum pooling后,图像特征的shape为:17375 x 64

在这里插入图片描述

  • 将图像特征按照对应视锥点的位置(即BEV栅格的位置)填入BEV特征图中,获得最终的BEV特征图

    • BEV栅格的索引位置远大于图像特征数量

在这里插入图片描述

Head

  • 依据不同的任务添加不同的Head即可,略

总结

  • LSS算法通过相机内外参显式的获取图像深度。其中,生成视锥点、图像特征转换到BEV特征的思想值得深究

  • 不足

    • 没有考虑相邻环视图像的特征,图像特征分散获取

    • 图像特征重叠时,使用sum pooling的方式,太过简单、粗暴

### LSS算法原理与实现 LSS(Lift-Splat-Shoot)是种基于自底向上方法构建鸟瞰图(Bird's Eye View, BEV)表示的框架,其核心思想是从二维图像出发,经过系列处理步骤生成可用于自动驾驶场景中的BEV特征地图[^1]。 #### 原理概述 LSS的主要目标是通过端到端的方式将摄像头捕捉的二维图像转化为适合下游任务(如路径规划、障碍物检测等)使用的BEV特征。该算法分为三个主要阶段: - **Lift**: 将输入的二维图像特征映射至三维空间,形成稀疏的3D点云表示。这过程利用了相机内外参以及深度分布假设完成从像素坐标到世界坐标的转换[^4]。 - **Splat**: 对 Lift 阶段产生的3D点云进行聚合操作,将其投影到预定义的参考平面上,从而得到密集的BEV特征表示。此过程中采用了高效的 Voxel Pooling 技巧以加速计算并减少内存消耗[^3]。 - **Shoot**: 利用生成的BEV特征执行具体的下游任务,例如预测代价地图(Cost Map)。在实际应用中,“Shoot”部分会输出多个可能的行驶轨迹,并通过对每条轨迹的成本评估选出最优方案指导车辆行动[^2]。 #### 实现细节 以下是关于LSS算法的具体实现流程: ##### 1. 整体步骤 整个前向传播可以概括为以下几个连续的操作: - 输入组由不同视角拍摄的道路环境图片; - 提取这些图片的空间语义特征; - 使用几何关系把提取出来的特征投射回真实世界的三维位置上; - 经过降维处理最终获得统尺度下的俯视角度数据结构作为模型输出[^3]。 ##### 2. 创建视锥 (Frustum Construction) 为了能够有效地连接2D视觉信息和3D物理空间,LSS设计了个特殊的卷积层用来模拟摄像机成像时形成的金字塔形视野区域(Frustum),它包含了丰富的局部纹理模式同时保留远近物体间相对距离的信息[^4]。 ##### 3. 坐标变换 当已知某点位于图像上的具体位置及其对应的深度值之后,可以通过标准针孔相机模型公式反算出它的精确三维座标\(X_w,Y_w,Z_w\)。这步骤对于确保后续所有运算都在同个标准化的世界坐标系下至关重要[^4]。 ##### 4. 视锥点云特征 旦完成了从像素级描述到立体几何实体之间的桥梁搭建,则意味着我们可以进步挖掘隐藏在这背后更加深层次的知识点了——比如如何区分道路上的不同材质表面?又或者怎样判断前方是否有行人闯入等等复杂情况都需要依赖于此阶段所建立起来的基础之上继续深入研究下去。 ##### 5. VoxelPooling 由于直接处理大量离散化的个体颗粒状单元效率低下而且容易造成资源浪费现象发生;因此有必要采取适当措施对其进行简化压缩处理—即所谓的“池化(pooling)”技术就是专门针对这种情况而提出的解决方案之。其中种特别有效的做法叫做cumsum trick,在不损失太多精度的前提下极大地提高了运行速度同时还降低了硬件需求门槛。 #### 应用领域 得益于其强大的泛化能力和高度自动化特性,LSS已经被广泛应用于现代高级辅助驾驶系统(ADAS)当中去解决诸如车道线识别、交通信号灯状态解析等问题之外还能协助完成更高层次的任务像是动态避障策略制定或是自主泊车功能实现等方面都展现出了非凡潜力[^1]。 ```python import torch from lss_model import LSSModel def lift_splat_shoot(image_tensor, model_weights_path): device = 'cuda' if torch.cuda.is_available() else 'cpu' # 加载预先训练好的LSS模型权重 model = LSSModel().to(device) checkpoint = torch.load(model_weights_path, map_location=device) model.load_state_dict(checkpoint['model_state_dict']) with torch.no_grad(): image_tensor = image_tensor.to(device) # 执行LSS pipeline bev_features = model.lift(image_tensor) pooled_bev = model.splat(bev_features) trajectories_cost_map = model.shoot(pooled_bev) return trajectories_cost_map ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值