BEVFormer论文解析

news2024/10/2 14:31:59

背景

跟基于雷达的相比,纯视觉的方案成本低,而且具有RGB和纹理信息,可以用于检测像交通信号灯、车道线等道路要素。

自动驾驶的感知本意是要从多个摄像头给出的2D信息来预测3D bbox(检测)或者semantic map(分割),最直接的方案是基于单目的框架或者加入跨相机的后处理,这种方案的缺点是单独去处理不同的视图,而且不能捕获那些跨视图的信息,因此效果差。

相比于单目框架,更加统一的方案是从多相机图像中提取整体的表示,BEV是一种通用的表示,因为BEV可以清楚地显示物体的位置和尺寸,适用于各种自动驾驶的任务,不仅是感知还有规划。这种方案的缺点是精确的3D目标检测结果对BEV特征的质量要求高,但是目前从2D平面来生成BEV很不稳定。目前主流的生成BEV特征的框架是基于深度信息的,对深度值或者深度分布的准确程度很敏感,这样一来就导致了基于BEV的检测方法受到复合误差影响大,导致后续的检测结果也很差。

因此作者想提出一种不依赖深度信息,能够自适应的融合有价值的特征而不强依赖于3D先验(深度信息)来生成BEV特征的方法,因此想到了Transformer。

BEV的第二个优点是BEV可以用于连接时间和空间信息。对自动驾驶而言,时间信息也是很重要的(用于判断运动状态和遮挡),不是单单定位物体然后分类进行检测就完事了。

本文三个贡献:

1.提出了BEVFormer,一个时空transformer编码器。也就是又利用时间信息,又利用空间信息的一个基于transformer的编码器,注意只是编码器没有解码器。可以将多相机的图像和时间戳信息投影到BEV表示,然后借助这种统一的BEV表示,可以在(BEV特征)上面进行3D检测和语义分割等各种自动驾驶的感知任务。
2.设置了可学习的BEV query以及空间交叉注意力层和时间自注意力层,实现了从跨摄像机(对应空间)和历史BEV(对应时间)中查询(transformer中query的抽象操作)空间特征和时间特征,然后把他们统一聚合成BEV特征
3.实验结果balabala……具体来说,在自动驾驶3D检测和地图分割任务都达到了SOTA(证明了生成的bev feature真的很厉害)

相关工作

1 基于Transformer的2D感知

近年一个新的趋势是利用Transformer来制定新的检测和分割任务处理范式,比如detr。但是detr训练太慢了。Deformable DETR通过可变形的注意力改善了这个缺点,在BEVFormer中,作者把Deformable DETR扩展到3D感知任务中,来有效地聚合空间和时间信息。

2 基于相机的3D感知

早期的3D检测方案一般类似2D的检测,直接基于2D的bbox来预测3D的bbox。另一种方案是把2D的图像特征转化为BEV feature然后在BEV中预测3D bbox。这种方案的核心是2D到BEV的转化方法,一般是利用深度估计或深度分布来实现。

在地图分割任务里,2D到BEV的转化研究工作更多。比如用逆透视映射(IPM)将透视图转换为BEV,还有著名的LSS基于深度分布生成BEV特征,还有用MLP来学习从透视图到BEV的变换。也有用transformer将前视单目图转化为BEV,但是这种方法用全局注意力,不适合拓展到多摄像机的情况,计算成本太高。此外,也有考虑空间信息的,但是之前的工作固定地堆叠多个时间戳的BEV特征,计算成本太高。本文BEVFormer综合考虑时间和空间信息生成当前时间的BEV,并且通过RNN的方法从之前的BEV中获取

BEVFormer算法解析

1 整体框架

在这里插入图片描述
整个pipeline为:

首先把6个摄像机的图片全都经过backbone+neck进行2D特征提取,这个没什么好说的,重点是中间部分,也就是真正的BEVFormer部分:

这是一个编码器encoder,总共有6层,这个6遵循vanilla transformer,跟摄像机个数无关。结构也完全遵循原本的transformer,除了三块内容有变动,一个是新设计的BEV queries,一个是spatial cross-attention, 一个是temporal self-attention。

首先BEV queries是网格形状的可学习参数,目的是用来通过注意力机制去从不同相机视图里查询BEV特征;spatial cross-attention也就是空间交叉注意力层用于根据BEV query来查找多相机图像里的空间信息;temporal self-attention也就是时间自注意力层用于根据BEV query聚合历史BEV的时间特征。

在infer stage中,首先把当前帧的多摄像机图像送入backbone进行特征提取,然后网络实际上会保留前一阵的BEV特征,在每个encoder layer(total=6),会先用BEV queries通过时间自注意力查询时间信息,然后再用BEV queries通过空间交叉注意力从多相机特征中查询空间信息,最后经过ffn输出细化的BEV feature送入下一层encoder layer,堆叠6层最后生成当前帧的统一BEV feature,送入下游任务头(检测头/分割头)

2 BEV query

这个BEV query有点类似feature map,实际上是一个[H, W, C]的tensor,但是划分成了[H, W]大小的一个网格,那么网格上坐标为(x, y)的每一块[1, C],实际上就对应着BEV平面中的一块区域。
在这里插入图片描述
BEV平面的每一块区域实际含义就是真实场景鸟瞰图下s平米的一块区域。注意BEV的中心一般都是车辆自身的区域。

跟常规的transformer一样,这个BEV query里也有可学习的位置嵌入(positional embedding)

3 Spatial Cross-Attention

因为多摄像机输入规模大(图多,size一般也大),因此用基于可变形注意力的空间交叉注意力而不是普通的多头注意力。为了适配3D感知,把原本BEV平面上的每个query都lift到柱状的一个query(多了z),然后从这个柱状的query里采样N个点,再把这N个点投影到2D视图上,每个点对应可能只能投影到部分视图,而在其他摄像机里没有拍到这个点的内容,因此这就是一种空间注意力操作,最后把能投影到的2D点从对应所在的视图里进行特征的采样,然后加权求和最终成为空间交叉注意力的输出。
在这里插入图片描述
在这里插入图片描述
SCA代表spatial cross-attention

那么具体怎么进行3D query采样的点投影到2D视图上的呢?

首先对于BEV平面上(x,y)位置的一个query,我们可以计算出它在真实世界中的(x’,y’)二维坐标:
在这里插入图片描述
W,H是BEV queries的尺寸,s就是BEV网格的分辨率。(x’,y’)的实际含义就是以车本身为原点的3D坐标系里的位置,因为3D坐标系里的每个位置还应该有z’,因此预定义一系列离散的z’点,那么每个点都有自己的z’_i,即自己的一个高度。最后利用相机投影矩阵(内外参)T(3*4矩阵)把3D参考点j(x’, y’, z’_j)投影成第i张图里的点P(x,y)

在这里插入图片描述
注:作者在附录中提到,这里原本是可以用全局注意力,即让每个bev query都跟所有相机的feature 进行交互,但是这样做的计算成本实在是太高了,所以才转而考虑利用每个相机的内外参,使用可变形注意力来得到每个BEV query对应的某些“值得”做交互的相机视图,而不是所有相机视图。这样做的缺点就是导致精度跟内外参也就是相机标定有关联,用全局的鲁棒性肯定是更高的,因为无视相机内外参,但是实在是没办法承受全局注意力的计算成本。

4 Temporal Self-Attention

在这里插入图片描述
Q_p代表着位置为(x,y)的BEV query,这个Q_p会跟当前帧的BEV query Q concat 历史的BEV feature B’_t-1的结果进行“自注意力操作”,通过这种变式,相当于从B’_t-1中带入了时间信息。其中t跟t-1的差值△t是由TSA预测的,因此能实现自适应的注意力操作,而不是无脑堆叠多个BEV特征来融合。

作者通过实验证明,4帧的组合是最优的,大于4帧后计算成本提高,但是精度没啥提升。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PlantUML——类图(持续更新)

前言 在分析代码流程中,我们常常会使用到各种UML图,例如用例图、时序图和类图等,以往使用ProcessOn或亿图图示等工具,但是这些工具难以规范化,有没有一种用代码来生成图形的工具呢? 刚好在出差的晨会中机缘…

神策分析 2.5 上线「经营分析」:可视化分析能力重磅升级!

近日,神策数据发布了全新的神策分析 2.5 版本,该版本以经营分析为主题,支持分析模型与外部数据的融合性接入,构建全域数据融合模型,并提供统一、便捷的指标及可视化能力,实现从用户到经营的全链路、全场景分…

【公网远程手机Android服务器】安卓Termux搭建Web服务器

目录 概述 1.搭建apache 2.安装cpolar内网穿透 3.公网访问配置 4.固定公网地址 5.添加站点 概述 Termux是一个Android终端仿真应用程序,用于在 Android 手机上搭建一个完整的Linux 环境,能够实现Linux下的许多基本操作,不需要root权限…

归并排序 Merge Sort

归并排序的基本思想是什么? 采用分治法(Divide and Conquer),递归将待排序的数组平均分成两个子数组,直到子数组长度为 0 或 1,这是 分 Divider。再将排序好的两个子数组合并为一个有序数组,这…

AD学习笔记

1快捷键 A 各种对齐 L 切换顶层底层 右键联合 元器件的锁定 N 连线控制是否显示 2原理图和pcb交叉选择 封装重叠警告 在规则中修改

Tcp协议特点

目录 确认应答(ACK) 超时重传 建立连接-三次握手 断开连接-四次挥手 Tcp特点主要是分为四点:有连接,可靠传输,面向字节流,全双工。 这里我们主要介绍可靠传输 确认应答(ACK) …

EasyFalsh移植使用方法

参考:https://blog.csdn.net/Mculover666/article/details/105510837 注意: 这里说的修改默认环境变量后修改环境变量版本号就自动重新写入到flash这句话是有问题的,要开启上面【#define EF_ENV_AUTO_UODATE】宏定义后才会实现该功能&#…

Maven 必备技能:MAC 系统下 JDK和Maven 安装及环境变量配置详细讲解

开发中难免因系统问题或者版本变更反复折腾JDK和Maven环境变量,干脆写个笔记备忘个,也方便小伙伴们节省时间。 JDK安装与环境变量配置 1.官网下载jdk mac安装包: Java Downloads | Oracle " https://www.oracle.com/java/technologies/downloads…

携程网关的架构设计-日流量200亿

一、概述 类似于许多企业的做法,携程 API 网关是伴随着微服务架构一同引入的基础设施,其最初版本于 2014 年发布。随着服务化在公司内的迅速推进,网关逐步成为应用程序暴露在外网的标准解决方案。后续的“ALL IN 无线”、国际化、异地多活等…

【爬虫笔记】Python爬虫简单运用爬取代理IP

一、前言 近些年来,网络上的爬虫越来越多,很多网站都针对爬虫进行了限制,封禁了一些不规则的请求。为了实现正常的网络爬虫任务,爬虫常用代理IP来隐藏自己的真实IP,避免被服务器封禁。本文将介绍如何使用Python爬虫来…

day 1

使用cut截取出Ubuntu用户的家目录,要求:不能使用":"作为分割 grep ^ubuntu /etc/passwd|cut -d / -f 2,3 xmind

芒果app逆向分析 (二)

接着上文,我们发现请求后的结果是加密的状态,我们需要解密成明文看数据。 前面提到无法使用frida,直接上xposed. 直接就hook出来了?? key = "xkSHHy5DQzYwbZS32zJBDyrHCHWMDGDk" iv = "4yXhd2Ta4m6dif54"堆栈记录下,方便后续使用: 调用堆栈:at ja…

网络技术十七:IP路由原理

IP路由原理 引入 路由器负责将数据报文在逻辑网段间进行转发 路由是指导路由器如何进行数据报文发送的路径信息 每台路由器都有路由表,路由存储在路由表中 路由环路是由错误的路由导致的,它会造成IP报文在网络中循环转发,浪费网络带宽 路…

mac项目流程管理 OmniPlan Pro 4中文 for Mac

OmniPlan Pro 4是一款专业的项目管理软件,提供了强大的项目流程管理功能,帮助用户规划、执行和监控项目的各个阶段和任务。 以下是OmniPlan Pro 4中的项目流程管理功能: 1. 项目计划:用户可以使用OmniPlan Pro 4创建项目计划。软…

SAP MM学习笔记27- 购买依赖(采购申请)

前面已经努力的学习了 购买发注,入库,请求书照合 等功能,还是蛮多内容的哈。 剩下的功能,比如 右侧的 所要量决定,供给元决定,仕入先选择 还没学。 从这章开始,要开始学习它们了。 这一章先来…

【案例分享】H3C设备配置端口镜像

简介 本案例介绍本地端口镜像的配置方法。 组网需求 某公司内部各部门使用不同网段的IP地址,其中研发部使用10.1.1.0/24网段,市场部使用12.1.1.0/24网段。现要求通过配置本地端口镜像功能,使用数据监测设备对研发部和市场部访问Internet的流…

java对接webservice接口的四种方式

这两天一直在做外系统对接,对方的接口是webservice的形式,调用起来有些蛋疼,于是在这里记录一下我尝试过的调用WebService的三种方式。 方式一:以HttpURLConnection的方式调用 String url "http://127.0.0.1/cwbase/Service…

【LeetCode】297.二叉树的序列化与反序列化

题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化…

百度智能云千帆大模型丨未来人手必备的代码助手

文章目录 1. 前言2. 千帆大模型平台3. 十分友好的功能4. comate代码助手5. 总结 1. 前言 我之前给大家推荐过Poe这个网站,它用的人比较少,但一旦接触后会发现它其实挺强大的。 因为它是一个可以同时支持好几个大模型的在线聚合平台。常用的GPT4&#x…

idea:java: Compilation failed: internal java compiler error

java: Compilation failed: internal java compiler error错误 检查下面2个即可: