【论文解读】BEVFormer: Learning Bird‘s-Eye-View Representation from Multi-Camera Images via Spatiotemporal

BEVFormer提出了一种新的框架,通过时空变换器处理多摄像头图像,实现统一的鸟瞰视图表示,提升3D物体检测和地图分割性能。实验结果显示,BEVFormer在nuScenes测试集上达到56.9%的NDS,优于先前技术。
摘要由CSDN通过智能技术生成

摘要

3D视觉感知任务,包括基于多摄像头图像的3D检测和地图分割,对自动驾驶系统至关重要。在这项工作中,我们提出了一个称为BEVFormer的新框架,该框架通过时空变换器学习统一的BEV表示,以支持多个自动驾驶感知任务。简而言之,BEVFormer通过预定义的网格状BEV查询与空间和时间空间交互,利用空间和时间信息。为了聚合空间信息,我们设计了空间交叉注意力,即每个BEV查询从相机视图的感兴趣区域提取空间特征。对于时间信息,我们提出了时间自注意来递归地融合历史BEV信息。在nuScenes测试集上,我们的方法在NDS指标方面达到了最先进的56.9%,比以前的最佳技术高出9.0点,与基于激光雷达的基线性能不相上下。我们进一步证明,BEVFormer显著提高了低能见度条件下物体的速度估计和回忆的准确性。代码位于https://github.com/zhiqi-li/BEVFormer

引言

我们提出了一种基于转换器的鸟瞰(BEV)编码器,称为BEVFormer,它可以有效地聚合来自多视图相机的时空特征和历史BEV特征。由BEVFormer生成的BEV特征可以同时支持多种3D感知任务,如3D物体检测和地图分割,这对自动驾驶系统具有重要价值。如图1所示,我们的BEVFormer包含三个关键设计:(1)网格状BEV查询,通过注意机制灵活融合时空特征;(2)空间交叉注意模块,聚合多相机图像的空间特征;(3)时间自注意模块,从历史BEV特征中提取时间信息,有利于运动目标的速度估计和严重遮挡目标的检测。同时带来可忽略不计的计算开销。借助BEVFormer生成的统一特征,该模型可以与不同的任务头(如Deformable DETR[56]和mask decoder[22])协作,进行端到端的3D物体检测和地图分割。

  • 我们提出BEVFormer,一个时空转换编码器,将多摄像机和/或时间戳输入投影到BEV表示。通过统一的BEV特征,我们的模型可以同时支持多个自动驾驶感知任务,包括3D检测和地图分割。
  • 我们设计了可学习的BEV查询以及空间交叉注意层和时间自注意层,分别从交叉摄像机和历史BEV中查找空间特征和时间特征,然后将它们聚合成统一的BEV特征。
  • 我们在多个具有挑战性的基准上评估了拟议的BEVFormer,包括nuScenes[4]和Waymo[40]。与现有技术相比,我们的BEVFormer始终实现更好的性能。例如,在参数和计算开销相当的情况下,BEVFormer在nuScenes测试集上达到56.9%的NDS,比之前的最佳检测方法DETR3D[47]高出9.0分(56.9% vs. 47.9%)。对于地图分割任务,我们也实现了最先进的性能,在最具挑战性的车道分割上,我们比Lift-Splat[32]高出5.0分以上。我们希望这个简单而强大的框架可以作为后续3D感知任务的新基线。

方法

将多摄像头图像特征转换为鸟瞰(BEV)特征可以为各种自动驾驶感知任务提供统一的周围环境表示。在这项工作中,我们提出了一个新的基于变压器的BEV生成框架,该框架可以有效地聚合来自多视图摄像机的时空特征,并通过注意机制记录BEV特征。
在这里插入图片描述
BEVFormer的整体架构。(a) BEVFormer的编码器层包含网格状BEV查询、时间自注意和空间交叉注意。(b)在空间交叉注意中,每个BEV查询只与感兴趣区域的图像特征交互。©在时间自注意中,每个BEV查询与两个特征交互:当前时间戳的BEV查询和前时间戳的BEV特征。

BEVFormer有6层编码器,除了BEV查询、空间交叉注意和时间自注意三种定制设计外,每一层都遵循变压器的常规结构[42]。具体来说,BEV查询是网格状的可学习参数,旨在通过注意机制从多摄像头视图中查询BEV空间中的特征。空间交叉注意和时间自注意是与BEV查询一起工作的注意层,用于根据BEV查询查找和聚合来自多相机图像的空间特征以及来自历史BEV的时间特征。

BEV queries

我们预定义一组网格形可学习参数Q∈RH×W×C作为BEVFormer的查询,其中H, W为BEV平面的空间形状。其中,位于Q的p = (x, y)处的查询Qp∈R1×C负责BEV平面中相应的网格单元区域。BEV平面中的每个网格单元对应于实际尺寸为5米。在默认情况下,BEV特征的中心对应于ego汽车的位置。按照惯例[14],我们在将BEV查询Q输入到BEVFormer之前,为其添加了可学习的位置嵌入。

Spatial Cross-Attention

由于多摄像头3D感知的输入规模较大(包含Nview摄像头视图),香草多头注意力[42]的计算成本极高。因此,我们开发了基于可变形注意力的空间交叉注意力[56],这是一个资源高效的注意力层,其中每个BEV查询Qp只与其在相机视图中的兴趣区域交互。然而,可变形注意力最初是为2D感知而设计的,因此需要对3D场景进行一些调整。
如图2 (b)所示,我们首先将BEV平面上的每个查询提升为柱状查询[20],从柱状查询中采样Nref个 3D参考点,然后将这些点投影到2D视图中。对于一个BEV查询,投影的2D点只能落在一些视图上,而其他视图不会被击中。这里,我们称hit视图为Vhit。之后,我们将这些2D点作为queryQp的参考点,并从这些参考点周围的hit视图Vhit中采样特征。最后,我们对采样特征进行加权求和,作为空间交叉注意的输出。空间交叉注意(SCA)的过程可以表述为
在这里插入图片描述
其中i为摄像机视图索引,j为参考点索引,Nref为每个BEV查询的总参考点。F它是第i个摄像机视图的特征。对于每个BEV查询Qp,我们使用项目函数P(P, i, j)来获得第i个视图图像上的第j个参考点。
接下来,我们介绍如何从投影函数P中获得视图图像上的参考点。我们首先计算与查询Qp对应的真实世界位置(x′,y′),该查询位于Q的atp=(x,y),如等式3所示。
在这里插入图片描述
其中,H,W是BEV查询的空间形状,s是BEV网格的分辨率大小,(x′,y′)是ego汽车位置为原点的坐标。在三维空间中,位于(x′,y′)的对象将出现在z轴上z′的高度。因此,我们预先定义了一组锚高度{z′j}Nrefj=1,以确保我们能够捕捉到出现在不同高度的线索。以这种方式,对于每个查询Qp,我们获得一个3D参考点柱(x′,y′,z′j)Nrefj=1。最后,我们通过相机的投影矩阵将3D参考点投影到不同的图像视图,可以写成:
在这里插入图片描述
这里,P(P,i,j)是从第j个3D点(x′,y′,z′j)投影的第i个视图上的2D点,Ti∈R3×4是第i个相机的已知投影矩阵。

Temporal Self-Attention

除了空间信息外,时间信息对于视觉系统理解周围环境也很重要[27]。例如,在没有时间线索的情况下,从静态图像中推断出运动物体的速度或从静态图像中检测高度遮挡的物体是具有挑战性的。为了解决这个问题,我们设计了时间自注意力,它可以通过合并历史 BEV 特征来表示当前环境。
给定当前时间戳 t 的 BEV 查询 Q 和时间戳 t-1 保留的历史 BEV 特征 Bt-1,我们首先根据自我运动将 Bt-1 与 Q 对齐,以使同一网格上的特征对应于相同的现实世界位置。在这里,我们将对齐的历史BEV特征bt−1表示为B 't−1。然而,从时间t−1到t,可移动的物体在现实世界中以不同的偏移量行驶。构建不同时间的BEV特征之间的相同对象的精确关联是具有挑战性的。因此,我们通过时间自注意力 (TSA) 层对特征之间的这种时间连接进行建模,可以写成如下:
在这里插入图片描述
其中 Qp 表示位于 p = (x, y) 的 BEV 查询。此外,与普通的可变形注意力不同,时间自注意力中的偏移量 Δp 由 Q 和 B’t-1 的串联预测。特别是,对于每个序列的第一个样本,时间自注意力将退化为没有时间信息的自注意力,我们将 BEV 特征 {Q, B′t−1} 替换为重复的 BEV 查询 {Q, Q}。与简单地在[18,38,6]中堆叠BEV相比,我们的时间自我注意可以更有效地建模长时间依赖性。BEVFormer从以前的BEV特征中提取时间信息,而不是多个堆叠的BEV特征,因此需要较少的计算成本,并遭受较少的干扰信息。

实验

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

结论

在这项工作中,我们提出了BEVFormer来从多摄像头输入生成鸟瞰特征。BEVFormer可以有效地聚合空间和时间信息,生成强大的BEV特征,同时支持3D检测和地图分割任务。
限制:目前,基于相机的方法在效果和效率方面仍然与基于激光雷达的方法有特别的差距。从 2D 信息中准确推断 3D 位置仍然是基于相机的方法的一个长期挑战。
更广泛的影响:BEVFormer 表明,使用来自多摄像头输入的时空信息可以显着提高视觉感知模型的性能。BEVFormer 展示的优势,例如更准确的速度估计和对低可见对象的更高召回率,对于构建更好、更安全的自动驾驶系统等至关重要。我们相信BEVFormer只是以下更强大的视觉感知方法的基线,基于视觉的感知系统仍然有很大的潜力有待探索。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Structure-Aware Transformer for Graph Representation Learning"是一篇使用Transformer模型进行图表示学习的论文。这篇论文提出了一种名为SAT(Structure-Aware Transformer)的模型,它利用了图中节点之间的结构信息,以及节点自身的特征信息。SAT模型在多个图数据集上都取得了非常好的结果。 以下是SAT模型的dgl实现代码,代码中使用了Cora数据集进行示例: ``` import dgl import numpy as np import torch import torch.nn as nn import torch.nn.functional as F class GraphAttentionLayer(nn.Module): def __init__(self, in_dim, out_dim, num_heads): super(GraphAttentionLayer, self).__init__() self.num_heads = num_heads self.out_dim = out_dim self.W = nn.Linear(in_dim, out_dim*num_heads, bias=False) nn.init.xavier_uniform_(self.W.weight) self.a = nn.Parameter(torch.zeros(size=(2*out_dim, 1))) nn.init.xavier_uniform_(self.a.data) def forward(self, g, h): h = self.W(h).view(-1, self.num_heads, self.out_dim) # Compute attention scores with g.local_scope(): g.ndata['h'] = h g.apply_edges(fn.u_dot_v('h', 'h', 'e')) e = F.leaky_relu(g.edata.pop('e'), negative_slope=0.2) g.edata['a'] = torch.cat([e, e], dim=1) g.edata['a'] = torch.matmul(g.edata['a'], self.a).squeeze() g.edata['a'] = F.leaky_relu(g.edata['a'], negative_slope=0.2) g.apply_edges(fn.e_softmax('a', 'w')) # Compute output features g.ndata['h'] = h g.update_all(fn.u_mul_e('h', 'w', 'm'), fn.sum('m', 'h')) h = g.ndata['h'] return h.view(-1, self.num_heads*self.out_dim) class SATLayer(nn.Module): def __init__(self, in_dim, out_dim, num_heads): super(SATLayer, self).__init__() self.attention = GraphAttentionLayer(in_dim, out_dim, num_heads) self.dropout = nn.Dropout(0.5) self.norm = nn.LayerNorm(out_dim*num_heads) def forward(self, g, h): h = self.attention(g, h) h = self.norm(h) h = F.relu(h) h = self.dropout(h) return h class SAT(nn.Module): def __init__(self, in_dim, hidden_dim, out_dim, num_heads): super(SAT, self).__init__() self.layer1 = SATLayer(in_dim, hidden_dim, num_heads) self.layer2 = SATLayer(hidden_dim*num_heads, out_dim, 1) def forward(self, g, h): h = self.layer1(g, h) h = self.layer2(g, h) return h.mean(0) # Load Cora dataset from dgl.data import citation_graph as citegrh data = citegrh.load_cora() g = data.graph features = torch.FloatTensor(data.features) labels = torch.LongTensor(data.labels) train_mask = torch.BoolTensor(data.train_mask) val_mask = torch.BoolTensor(data.val_mask) test_mask = torch.BoolTensor(data.test_mask) # Add self loop g = dgl.remove_self_loop(g) g = dgl.add_self_loop(g) # Define model and optimizer model = SAT(features.shape[1], 64, data.num_classes, 8) optimizer = torch.optim.Adam(model.parameters(), lr=0.005, weight_decay=5e-4) # Train model for epoch in range(200): model.train() logits = model(g, features) loss = F.cross_entropy(logits[train_mask], labels[train_mask]) optimizer.zero_grad() loss.backward() optimizer.step() acc = (logits[val_mask].argmax(1) == labels[val_mask]).float().mean() if epoch % 10 == 0: print('Epoch {:03d} | Loss {:.4f} | Accuracy {:.4f}'.format(epoch, loss.item(), acc.item())) # Test model model.eval() logits = model(g, features) acc = (logits[test_mask].argmax(1) == labels[test_mask]).float().mean() print('Test accuracy {:.4f}'.format(acc.item())) ``` 在这个示例中,我们首先加载了Cora数据集,并将其转换为一个DGL图。然后,我们定义了一个包含两个SAT层的模型,以及Adam优化器。在训练过程中,我们使用交叉熵损失函数和验证集上的准确率来监控模型的性能。在测试阶段,我们计算测试集上的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值