LSS(Lift, Splat, Shoot)算法解析

1.简介

LSS(Lift, Splat, Shoot) 是一个比较经典的自下而上的构建BEV特征的3D目标检测算法,通过将图像特征反投影到3D空间生成伪视锥点云,通过Efficientnet算法提取云点的深度特征和图像特征并对深度信息进行估计,最终将点云特征转换到BEV空间下进行特征融合和后续的语义分割任务。

本篇按照LSS代码的运行逻辑,结合论文对LSS算法进行解析。

参考链接:

LSS (Lift, Splat, Shoot) 论文+源码万字长文解析
LSS(Lift,Splat,Shoot)-实现BEV感知的最佳利器
LSS解读
LSS: Lift, Splat, Shoot】代码的复现与详细解读
一文读懂BEV自底向上方法:LSS 和 BEVDepth
自动驾驶BEV-LSS系列文章算法代码解析
BEV经典之作Lift, Splat, Shoot解析

2.算法流程

图像来自https://zhuanlan.zhihu.com/p/675034283
  1. 初始化视锥点云,并根据相机内外参将视锥中的点投影到ego坐标系;

  2. 对环视图像完成深度特征和图像特征的提取,并构建图像特征点云;

  3. 基于Voxel Pooling构建BEV特征;

  4. 对生成的BEV特征利用BEV Encoder做进一步的特征融合;

  5. 利用特征融合后的BEV特征完成语义分割任务;

2.1 初始化视锥点云

输出:shape为[B, N, 41, 8, 22, 3]的初始视锥点云

B:`batch_size`
N:相机数量
41:为每个像素生成离散的41个深度值
8*22:后面图像经backbone下采样后的特征图大小 
3:XYZ三个通道的坐标值

2.1.1 初始化视锥点云的shape


1.相机投影几何:
根据之前的相机投影知识可以了解到,2D图像像素点 p 2 d p_{2d} p2d是3D空间下某个点 P 3 d P_{3d} P3d的投影,二者一一对应,从相机光心出发连接图像中的像素点可以得到一条射线, P 3 d P_{3d} P3d一定在这条射线上。

但实际上对于单目相机中的某个像素点是无法得到具体的深度信息的,因此需要对深度进行估计,LSS采取的办法是对于图像中的每一个像素,在对应射线上每隔1m进行采样(算法中是41个),这样每个2D像素点都有41个3D点和他对应,这样就得到一组视锥点云(伪),然后通过提取深度特征并离散为深度概率信息估计像素深度
在这里插入图片描述


2.视锥点云的初始化过程:

定义距离图像特征平面4m到44m、间隔1m的多个平面,这样每个图像特征点有D=41个可能的离散深度值。每个点相对相机的描述的位置是[h, w, d],最终得到一个在图像坐标系下的数量为D*H*W的一组伪点云数据,H和W表示图像的高和宽,D表示离散深度的维度。

在这里插入图片描述

2.1.2 将视锥点云变换到自车坐标系(ego坐标系)

注意,这里转换的是上一步初始化的原始视锥点云,不包含深度特征和图像特征,只是一组云点。

整体的过程: 图像坐标系 -> 归一化相机坐标系 -> 相机坐标系 -> 车身坐标系
整个转换过程比较清晰简单,就是3D点投影到图像平面的逆过程

  • 生成的视锥点云每个点用(u,v,d)进行描述,即图像坐标系下的坐标和对应的深度值
  • 首先将图像坐标系下的坐标(u,v,d)通过内参K转换到归一化坐标(x,y,1),公式如下:
    [ x y 1 ] = 1 d K − 1 [ u v 1 ] \begin{bmatrix} x\\ y\\1\end{bmatrix}=\frac{1}{d} K^{-1} \begin{bmatrix} u\\ v\\1\end{bmatrix} xy1 =d1K1 uv1
  • 将归一化平面坐标转换为相机坐标系下的3D坐标:
    [ X c a m Y c a m Z c a m ] = d [ x y 1 ] \begin{bmatrix} X_{cam}\\ Y_{cam}\\Z_{cam}\end{bmatrix}=d\begin{bmatrix} x\\ y\\1\end{bmatrix} XcamYcamZcam =d xy1
  • 将3D点通过外参[R, t]由相机坐标系转换到自车坐标系;
    [ X e g o Y e g o Z e g o ] = R [ X c a m Y c a m Z c a m ] + t \begin{bmatrix} X_{ego}\\ Y_{ego}\\Z_{ego}\end{bmatrix}=R\begin{bmatrix} X_{cam}\\ Y_{cam}\\Z_{cam}\end{bmatrix}+t XegoYegoZego =R XcamYcamZcam +t

2.2 提取环视相机的深度特征和图像特征

输入:原始环视图像

shape=[bs, N, H, W, 3],bs表示batch_size,表示环视相机的数量,
在特征提取时将这两个维度合并一起进行特征提取

输出:深度和图像语义特征

shape=[bs * N, C, D, H, W]

图像在输入到LSS的图像特征编码器后,会使用Efficientnet网络对图像提取 D=41维的深度特征C=64维的语义特征,将深度特征和语义特征进行外积操作会进一步得到关于每个3D对应点更加准确的深度概率分布。

1.特征提取:
每一条射线表示某个像素点对应的一组3D点(共D=41维),在提取深度特征后会通过softmax函数将其转换为对应的概率信息,每个α表示对应点的深度概率。

每个feature c表示了每个像素点对应的特征向量(共C=64维)。

这样每个像素点会有一个D=41维的深度特征和C=64维的图像特征和其对应。

2.外积处理
对像素点的深度概率和图像特征进行外积,于是就为特征图的每一个点赋予了一个depth 概率,然后广播所有的 αc,就得到了不同的channel的语义特征在不同深度(channel)的特征图,经过训练,重要的特征颜色会越来越深(由于softmax概率高),反之就会越来越暗淡,趋近于0。

在这里插入图片描述

2.3 基于Voxel Pooling构建BEV特征

输入:视锥点云+特征点云

视锥点云:shape为(B, N, 41, 8, 22, 3),包含了每个点在自车坐标系中的位置
特征点云:shape为(B, N, 41, 8, 22, 64),包含了每个点的context特征(深度+语义)
  1. 将特征点云展平(flatten)。上一步将深度特征和图像语义特征作外积后得到一个B*N*D*H*W*C的张量,B表示batch的数量,N表示相机的个数,D表示深度通道,H*W表示高和宽,C表示语义通道,flatten后得到一个C个通道的一维张量,这个一维张量包含B*N*D*H*W个点
    在这里插入图片描述
  2. 将ego下的空间坐标转换到BEV网格坐标,排除掉落在BEV空间之外的点(BEV空间的大小固定,一般是以车体为中心的200*200的网格空间),然后将网格坐标展平,同样可以得到一个一维张量,该张量有4个通道(x,y,z,batch_id),这个一维张量包含B*N*D*H*W个点
  3. 将所有的feature基于坐标位置进行排序,给每一个点一个rank值,rank相等的点在同一个batch和同一个BEV pillar,这样就把属于相同BEV pillar的体素放在相邻位置,得到点云在体素中的索引
  4. 采用cumsum_trick完成Voxel Pooling运算,上一步将特征值进行了排序,将落在同一个pillar的特征累加,最终获得新的张量。
    在这里插入图片描述
    因为多个视角的相机形成的视锥点云会存在交叉现象,对于上图,已经知道一个特征向量1 3 2 1 2,每个特征的区间索引为0 1 1 2 3,区间索引表示每个特征所属的BEV网格,通过上述排序操作将属于同一batch同一BEV网格的特征放在了相邻位置,现在要做的是将属于同一BEV网格中的特征进行累加,根据区间索引得知第2位和第3位的特征属于同一个BEV pillar,因此在进行累计求和后的结果为1 5 1 2

2.4 BEV特征融合和语义分割

为了执行语义分割任务,最后还接个BevEncode对BEV特征进一步进行编码,BevEncode由一个2d Conv、resnet18的前三层、以及两个上采样层组成,最终输出的特征图shape为(4, 1, 200, 200)。

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

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

相关文章

Minio(官方docker版)容器部署时区问题研究记录

文章目录 感慨&概述补充:MINIO_REGION和容器时间的关系 问题一:minio容器和本地容器时间不一致问题说明原因探究解决方法结果验证 问题二:minio修改时间和本地查询结果不一致具体问题原因探究解决办法时间转化工具类调用测试和验证上传文…

计算机组成结构—虚拟存储器

目录 一、虚拟存储器的基本概念 二、页式虚拟存储器 1.页表 2.快表(TLB) 3.具有 TLB 和 Cache 的多级存储系统 三、段式虚拟存储器 四、段页式虚拟存储器 五、虚拟存储器和Cache比较 早期的计算机,CPU 是直接操作主存的,也就是运行程序时&#xf…

深度学习之基于Vgg16卷积神经网络书法字体风格识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 书法是中国传统文化的重要组成部分,具有深厚的历史底蕴和独特的艺术魅力。在数字化时代&…

第50期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

损失函数详解

1.损失函数 是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误,损失函数值越低则预测越接近真实值。对每个单独的观测(数据点)计算损失函数。将所有损失函数(loss function&#xf…

Baidu Comate:你的智能编码助手,编程效率倍增的秘密武器

Baidu Comate智能编码助手 Baidu Comate 智能编码助手简单介绍安装使用查看Comate插件功能智能代码提示使用飞浆和百度智能小程序进行智能问答使用AutoWork插件实现二次函数图像的生成引用Comate知识库存在的问题结束语 Baidu Comate 智能编码助手简单介绍 Baidu Comate&#x…

设计模式(十一):外观模式

设计模式(十一):外观模式 1. 外观模式的介绍2. 外观模式的类图3. 外观模式的实现3.1 创建一个接口3.2 创建接口的实现3.3 创建一个外观类3.4 测试 1. 外观模式的介绍 外观模式(Facade Pattern)属于结构型模式&#xf…

Jupyter Notebook输入python代码没智能提示

1、在Jupyter中打开控制台 2、再控制台中执行以下两个命令: pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user pip install jupyter_contrib_nbextensions命令需要下载文件,请耐心等待。 3、执行完成后&#xff0…

202003青少年软件编程(Python)等级考试试卷(二级)

第 1 题 【单选题】 运行下方代码段,输出的结果是(   )。 a=(1,2,3)print(type(a))A :<class ‘float’> B :<class ‘int’> C :<class ‘str’> D :<class ‘tuple’> 正确答案:D 试题解析: 第 2 题 【单选题】 content.txt中原来的内容…

第11篇:创建Nios II工程之控制多个七段数码管

Q&#xff1a;DE2-115开发板上有8个七段数码管&#xff0c;如何用PIO IP并设计Nios II工程控制呢&#xff1f; A&#xff1a;基本思路&#xff1a;DE2-115上有8个7位七段数码管&#xff0c;而一个PIO最多可配置为32位&#xff0c;如此就可以添加2个PIO都配置为28位output。 Ni…

《500 Lines or Less》(13)—— A 3D Modeller

原文 作者 原code 我用py3重写的code 3D 建模器 介绍 计算机辅助设计&#xff08;Computer-aided design, CAD&#xff09;工具允许我们在2D屏幕上查看和编辑3D对象。为此&#xff0c;CAD工具必须具有3个基本功能&#xff1a; 表示对象&#xff1a;使用一种数据结构保存和表示…

SpringBoot的@Async注解有什么坑?

前言 SpringBoot中&#xff0c;Async注解可以实现异步线程调用&#xff0c;用法简单&#xff0c;体验舒适。 但是你一定碰到过异步调用不生效的情况&#xff0c;今天这篇文章总结了Async注解的坑点&#xff0c;希望对你会有所帮助。 未启用异步支持 Spring Boot默认情况下不启…

2024年短剧小程序视频怎么下载

想在闲暇之余轻松追剧&#xff0c;但不想跳转复杂的网页或者安装多个APP吗&#xff1f;来试试2024年的短剧小程序视频下载器吧&#xff01;它是一款专门为短剧爱好者打造的视频下载工具&#xff0c;让你轻松下载任何短剧小程序视频&#xff0c;随时随地享受精彩的短剧内容&…

Python密码测试程序

下面是一个简单的 Python 密码测试程序&#xff0c;用于检查用户输入的密码是否符合一些基本的安全要求&#xff0c;如长度、包含字母和数字等。这个程序可以作为一个基本的密码验证器&#xff0c;你可以根据需要进行修改和扩展。 1、问题背景 我们正在编写一个程序&#xff0…

解决 git克隆拉取代码报SSL certificate problem错误

问题&#xff1a;拉取代码时报错&#xff0c;SSL证书问题:证书链中的自签名证书问题 解决&#xff1a;只需要关闭证书验证&#xff0c;执行下面代码即可&#xff1a; git config --global http.sslVerify "false" 再次拉取代码就可以了

ssh远程免密登录

ssh远程连接分为五个阶段 版本号协商阶段密钥和算法协商阶段认证阶段会话请求阶段交互会话阶段 而上图的SessionKey即是在阶段2&#xff1a;密钥和算法协商阶段&#xff0c;服务器端和客户端利用DH交换&#xff08;Diffie-Hellman Exchange&#xff09;算法、主机密钥对等参数…

零基础自学网络安全/Web安全(超详细入门到进阶)学完即可就业(含学习笔记)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

【前端】HTML实现个人简历信息填写页面

文章目录 前言一、综合案例&#xff1a;个人简历信息填写页面 前言 这篇博客仅仅是对HTML的基本结构进行了一些说明&#xff0c;关于HTML的更多讲解以及CSS、Javascript部分的讲解可以关注一下下面的专栏&#xff0c;会持续更新的。 链接&#xff1a; Web前端学习专栏 下面我对…

OpenNJet 应用引擎:在 NGINX 基础上的云原生增强

目录 一、初识OpenNJet二、系统架构三、动手实践1.CentOS 编译环境配置1.1配置yum源&#xff1a;1.2.yum安装软件包1.3.创建符号连接 2.编译代码编译 OpenNJet执行 make 四、基本使用说明1.目录结构概述:2.常用命令: 五、部署 Web 应用程序配置文件修改启动 NJet 六、总结 一、…

设计宝典与速查手册,设计师必备资料合集

一、资料描述 本套设计资料&#xff0c;大小194.34M&#xff0c;共有13个文件。 二、资料目录 01-《商业设计宝典》.pdf 02-《色彩速查宝典》.pdf 03-《配色宝典》.pdf 04-《解读色彩情感密码》.pdf 05-《行业色彩应用宝典》.pdf 06-《构图宝典》.pdf 07-《创意宝典》…