LSS 论文及代码详解:Lift, Splat, Shoot:

文章目录

    • 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。
在这里插入图片描述

图3 相机成像原理,三位空间某点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,dR3)dD}},其中D是一系列的离散深度。这样就为图像特征平面(HxW)生成了一个巨大的点云(含HxWxD个点)。实际上这个点云所表示的3D物理空间是一个以相机为顶点的视锥体,如下图4所示,下文中把它们称作视锥点云。

2.1.1 视锥点云的空间位置

官方代码中生成视锥点云的实现方式是:如下图4所示,定义距离图像特征平面4m到44m、间隔1m的多个平面,这样每个图像特征点有D=41个可能的离散深度值。每个点相对相机的描述的位置是[h, w, d],利用相机内、外参,可以把这个位置转换成用车辆坐标系下的空间位置来表示,其维度也是HxWxDx3,即HxWxD[x, y, z]
在这里插入图片描述

图4 相机视锥模型,由深度范围在4m~44m、间隔1m的41个平面组成

有了视锥点云,以及每个点所对应的空间位置,那么如何获得每个点的有效特征信息呢?这就由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
在这里插入图片描述

图5:Lift操作可视化原理

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

在这里插入图片描述

图5. Lift-Splat-Shoot 完整过程概览

2.3 Shoot: Motion Planning

Li

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418794.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LINUX基础培训二十七之shell标准输入、输出、错误

一、Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出&#xff…

数电学习笔记——逻辑代数的基本定理

目录 一、带入定理 二、反演定理 三、对偶定理 一、带入定理 在任何一个包含变量A的逻辑等式中,若以另外一个逻辑式代入式中所有A的位置,则等式仍然成立。 例1:(AB)AB 将(BC)带入等式中所…

Jlink Segger工具软件的应用(如何连接)

一、Jlink Commander的如何连接 1、点击打开“Jlink Commander” 2、输入“connect” 3、根据提示输入“?”。 此处是选择MCU 内核类型 4、此时jink commander 会提示选择对应的内核,如“图F5.1”。根据内核类型进行选择。 SWM1xx系列、SWM2xx系列…

做活动和会议直播,为什么要多个媒体平台同步直播?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 多个媒体平台同步直播活动和会议的原因主要有以下几点: 扩大观众覆盖面:不同的媒体平台拥有各自独特的用户群体,通过在多个媒体平台同步直播&#xff…

2024年3月阿里云服务器价格下调折扣表(附优惠价格表)

阿里云服务器ECS等核心产品价格全线下调,最高幅度达55%,2024年3月1日生效,针对ECS部分在售产品的官网折扣价、ECS计算型节省计划进行调整,生效后,基于官网折扣价的新购和续费,将按照新的价格进行计费。阿里…

IDEA-DeBug理论与实践

文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 在软件开发中,IDEA&#xff0…

物联网技术助力智慧城市安全建设:构建全方位、智能化的安全防护体系

一、引言 随着城市化进程的加速和信息技术的迅猛发展,智慧城市已成为现代城市发展的重要方向。在智慧城市建设中,安全是不可或缺的一环。物联网技术的快速发展为智慧城市安全建设提供了有力支持,通过构建全方位、智能化的安全防护体系&#…

SpringMVC01、回顾MVC

1、回顾MVC 1.1、什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。…

Qt槽函数不响应的原因总结

Qt专栏:http://t.csdnimg.cn/LE2Lx 目录 1.问题 2.原因 2.1.没有继承QObject,声明Q_OBJECT宏 2.2.信号槽参数不匹配 2.3.信号函数未声明为 signals 2.4.访问权限 2.5.注意connect的位置,信号在创建信号槽连接前使用,则无法…

前端 JS 经典:Content-type 详解

1. 什么是 Content-Type Content-Type 是 HTTP 协议中的一个请求头或响应头字段,用于指示发送或接收的实体的媒体类型,告诉服务器或客户端如何解析和处理请求或响应的主体部分。 2. Content-Type 的构成 Content-Type 由两部分组成:媒体类型…

(python)多线程

前言 Python 多线程的应用场景通常是在需要同时执行多个 I/O 密集型任务时,以提高程序的效率和性能。 多线程应用场景 网络爬虫:当需要从多个网站获取数据时,使用多线程可以同时发起多个 HTTP 请求,以加快数据获取速度。 数据库操…

新闻稿软文投放推广发布需要注意什么

在全球化的背景下,各国之间的联系与互动变得越来越频繁。无论是经济、文化还是科技领域,各国之间的交流和合作都在不断加深。而在这个信息爆炸的互联网时代,人们获取信息的主要途径也逐渐转向了网络。 在这种情况下,软文推广成为…

Python+neo4j构建豆瓣电影知识图谱

文章目录 数据来源数据整理导入节点和关系导入使用Subgraph批量导入节点和关系 多标签实体和实体去重 数据来源 http://www.openkg.cn/dataset/douban-movie-kg 该网址拥有丰富的中文知识图谱数据集,OpenKG(Open Knowledge Graph),可供研究人员使用研究…

数据库-第二/三章 关系数据库和标准语言SQL【期末复习|考研复习】

前言 总结整理不易,希望大家点赞收藏。 给大家整理了一下计数据库系统概论中的重点概念,以供大家期末复习和考研复习的时候使用。 参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。 文章目录 前言第二、三章 关系数据库和标准语言SQL2.1 关系2…

如何使用Portainer创建Nginx容器并搭建web网站发布至公网可访问【内网穿透】

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

STM32自学☞AD单通道

程序的最终运行成果: 当转动电位器时,数值和电压值发生变化 ad.c文件 #include "stm32f10x.h" #include "stm32f10x_adc.h" #include "ad.h" #include "stdint.h" void ad_Init(void) { /* 初始化步骤:…

Python爬虫——Urllib库-中

编解码 问题引入 例如: https://www.baidu.com/s?wd章若楠 https://www.baidu.com/s?wd%E7%AB%A0%E8%8B%A5%E6%A5%A0 第二部分的一串乱码就是章若楠 如果这里是写的章若楠就会 产生这样的错误 所以我们就可以使用get请求方式的quote方法了 get请求方式的q…

thefour--Love is like a tide

最后一部分了,要开始进行我们的训练了。 先上代码: import os import numpy as np from tqdm import tqdm import tensorflow as tf from thetwo import NeuralStyleTransferModel import theone import thethree #创建模型 modelNeuralStyleTransferM…

从零开始写 Docker(三)---基于 cgroups 实现资源限制

本文为从零开始写 Docker 系列第三篇,在mydocker run 基础上基于 cgroups 实现容器的资源限制。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注…

C# Post数据或文件到指定的服务器进行接收

目录 应用场景 实现原理 实现代码 PostAnyWhere类 ashx文件部署 小结 应用场景 不同的接口服务器处理不同的应用,我们会在实际应用中将A服务器的数据提交给B服务器进行数据接收并处理业务。 比如我们想要处理一个OFFICE文件,由用户上传到A服务器…