BEVFormer论文速读
这是一篇在自动驾驶领域具有里程碑意义的论文,它提出了一个强大且优雅的框架,用于从多摄像头图像中学习统一的鸟瞰图(Bird’s-Eye-View, BEV)表征,从而赋能3D目标检测和地图分割等多种下游任务。
研究背景
-
研究背景:自动驾驶感知系统需要精确地理解车辆周围的3D环境,其中,3D目标检测(识别车辆、行人等的位置和大小)和可行驶区域/车道线分割(生成高精地图)是两大核心任务。
-
研究现状:
- 基于LiDAR的方案:通过激光雷达点云直接获取3D信息,精度高,是当前的主流方案之一。但其成本高昂,且对恶劣天气敏感,对颜色等视觉信息的识别能力较弱。
- 基于摄像头的方案:成本低,可大规模部署,并且能识别交通灯、标线等富含纹理和色彩信息的元素。早期的摄像头方案通常是“单目(Monocular)”的,即独立处理每个摄像头的图像,然后通过后处理进行融合,这种方式效率低下且无法有效利用跨摄像头的信息。
- BEV方案的兴起:为了更好地融合多摄像头信息,学术界和工业界逐渐转向在鸟瞰图(BEV)空间下进行感知。BEV是一种将3D世界投影到2D俯视平面上的统一表示,它能直观地展示物体的位置和大小,非常适合自动驾驶的规划与控制。
-
核心问题与挑战:
- 2D到BEV的转换是“病态问题” (ill-posed Problem):从 2D的透视视角图像 推断出3D空间的结构和深度信息本身就存在不确定性,这是一个根本性难题。
- 依赖显式深度估计:当时的许多方法(如Lift-Splat-Shoot)通过先预测图像中每个像素的深度,再将其“投影”到BEV空间中。这种方式严重依赖深度预测的精度,误差会逐级累积,导致最终的BEV特征质量不高。
- 缺乏对时间信息的有效利用:绝大多数当时最先进的多摄像头3D检测方法都只处理静态图像,忽略了视频流中的时序信息。而时间信息对于判断物体运动速度、处理遮挡(一个物体在前一帧可见,当前帧被遮挡)至关重要。
- 简单的时序融合方式效率低下:一些工作尝试通过直接堆叠(stack)过去几帧的BEV特征来引入时间信息,但这不仅会带来巨大的计算开销,还可能引入无用的干扰信息。
“透视视角”(Perspective View)指的就是我们人眼或者普通相机通常观察世界的方式。它模拟了三维空间中的物体被投影到一个二维平面(比如你的视网膜或者相机传感器)上的效果。
它最核心的特点包括:
- 近大远小:距离观察者(相机)近的物体在图像上看起来更大,距离远的物体看起来更小。
- 平行线汇聚:在三维空间中平行的线(比如笔直的马路两条边、铁轨),在透视视角的图像中会向远处延伸并最终汇聚于一点,这个点被称为“消失点”(Vanishing Point)。
- 遮挡关系:近处的物体会遮挡住远处的物体。
简单来说,您现在看到的车载摄像头拍摄出的、带有“近大远小”效果的、模拟驾驶员视野的图像,就是透视视角图像。
我们可以把它和论文中提到的鸟瞰图(Bird’s-Eye-View, BEV) 做个对比:
| 特征 | 透视视角 (Perspective View) | 鸟瞰图 (Bird’s-Eye-View, BEV) |
| :— | :— | :— |
| 观察角度 | 从相机的位置(比如车头、后视镜)向前、后、侧方看出去。 | 从正上方垂直向下看,像无人机或卫星地图。 |
| 视觉效果 | 有 “近大远小”的透视畸变。 | 没有 透视畸变,物体的大小不随距离变化。 |
| 空间关系 | 难以准确判断物体的实际距离和相对位置。 | 物体间的真实距离和空间布局一目了然。 |
| 举例 | 驾驶员开车时看到的景象。 | 查看手机地图导航时的俯视图。 |
BEVFormer这类工作的核心挑战之一,就是如何准确地将多个不同方向的、带有畸变的“透视视角”图像,转换成一个统一的、没有畸变的“鸟瞰图”,从而让自动驾驶系统能够像看地图一样清晰地理解周围环境。
这里的“畸变”指的不是相机镜头本身的光学畸变(比如鱼眼效果),而是 由“透视”这一成像原理本身带来的几何形状、尺寸和距离的失真。
你用手机斜着给桌面上的一张方形纸拍照。在照片里,这张方形纸会变成一个梯形。这就是“带有畸变”的透视视角。
现在,你把手机举到这张纸的正上方,确保手机和纸平行,然后拍照。在照片里,这张纸依然是一个正方形。这就是“没有畸变”的鸟瞰图视角。
1. 透视视角的“带有畸变”
这里的“畸变”主要体现在以下三个方面,它们都是“近大远小”这一核心原则的直接产物:
-
形状失真 (Shape Distortion)
现实世界中的正方形(如地上的停车位、路口的斑马线区域)在透视视角图像中会显示为梯形。现实中平行的车道线在图像中会向远方汇聚。物体的真实几何形状被改变了。 -
尺寸/尺度失真 (Scale Distortion)
同一个物体,放在近处和远处,在图像里的大小完全不同。一辆5米长的车,在近处可能占了图像宽度的三分之一,在远处可能只是几个像素点。这意味着,图像上的尺寸不等于物理世界中的真实尺寸,图像的“尺度”不是统一的。 -
距离失真 (Distance Distortion)
在透视图像中,你无法直接根据像素距离来判断真实距离。比如,图像下方区域移动10个像素,可能对应真实世界移动了1米;而图像中远方地平线附近移动10个像素,可能对应真实世界移动了50米。距离的度量衡在整个图像上是不均匀的。
2. 鸟瞰图(BEV)的“没有畸变”
BEV的目标就是消除上述所有由透视引起的失真,建立一个物理世界2D平面的“真实”映射。
-
形状保持 (Shape Preservation)
在BEV中,地上的方形停车位被画出来就是一个正方形,平行的车道线画出来就是平行的。它保持了物体在俯视角度下的真实几何形状。 -
尺寸/尺度统一 (Uniform Scale)
在BEV中,一辆5米长的车,无论它在车辆前方5米处还是50米处,它在BEV图上的长度都是固定的。这是因为BEV图的每一个像素都对应一个固定的真实物理尺寸,比如BEVFormer论文中设置的,BEV网格的分辨率是0.512米 。这意味着,BEV图上的尺寸可以直接换算成物理世界的真实尺寸。 -
距离真实 (True-to-Scale Distance)
BEV图是均匀的。图上任意两点之间的像素距离,都可以通过固定的比例尺(比如每像素0.512米)直接换算成它们在真实世界中的水平距离。
| 特性 | 透视视角(带有畸变) | 鸟瞰图(没有畸变) |
| :— | :— | :— |
| 形状 | 失真(正方形 → 梯形) | 保持(正方形 → 正方形) |
| 尺寸 | 不统一(近大远小) | 统一(物体的图上尺寸与距离无关) |
| 距离 | 不均匀(无法直接测量) | 均匀(图上距离可直接换算为真实距离) |
| 对机器的意义 | 难以做精确的几何判断和规划 | 类似2D地图,易于测量、定位、规划路径 |
因此,BEVFormer这类工作的核心挑战,本质上就是设计一个足够聪明的算法,能够“脑补”出所有被透视原理所“扭曲”掉的真实世界几何信息,从而将一个不均匀、失真的感知空间,重建为一个均匀、真实的决策空间,这对于自动驾驶系统的安全性和可靠性至关重要。
核心研究动机与目标
-
核心动机:摆脱对显式深度估计的依赖,设计一种能直接、自适应地从多视图2D图像特征中“查询”并生成高质量BEV特征的方法。同时,高效地融入时序信息,以解决静态模型无法处理的速度估计和遮挡问题。
-
核心目标:提出一个名为 BEVFormer 的统一框架,该框架通过时空Transformer(Spatiotemporal Transformer)聚合多摄像头在空间和时间上的信息,生成一个强大且通用的BEV特征表示,以端到端的方式同时支持3D目标检测和地图分割等多种任务。
-
要解决的核心问题:如何有效且高效地将在 空间上分散的多个2D相机视图信息和在时间上连续的多帧信息,聚合到统一的BEV表示中。
-
难点:
- 空间聚合:如何在没有精确深度的情况下,建立BEV空间中的每个位置与多视图相机图像特征之间的准确关联。
- 时间聚合:如何以一种低成本、高效率的方式,对齐并融合历史BEV特征,以捕捉场景的动态变化。
-
实际意义:该研究具有重大的实际意义。一个 高性能的纯视觉感知方案可以大幅降低自动驾驶系统的硬件成本,加速其商业化落地。BEVFormer生成的统一BEV特征可以作为后续规划、控制模块的标准输入,是实现端到端自动驾驶的关键一环。
核心研究内容、技术路线与创新点
BEVFormer的核心可以拆解为两大创新模块:空间交叉注意力(Spatial Cross-Attention) 和 时序自注意力(Temporal Self-Attention)。
研究内容一:通过空间交叉注意力实现空间特征聚合
- 动机:解决2D到BEV转换的难题,避免传统方法中对深度估计的依赖和高昂的计算成本(如全局注意力)。
- 核心内容:设计一组可学习的、网格状的BEV查询(BEV Queries)。让这些查询作为“探针”,主动地去多摄像头视图中“查找”和“采集”自己所需要的信息,而不是被动地等待2D特征投影过来。
- 技术路线:
- 初始化BEV查询 (BEV Queries, Q):定义一组尺寸为 H×W×CH \times W \times CH×W×C 的可学习参数作为BEV平面的初始表示。其中每个查询 QpQ_pQp 对应BEV地图上的一个网格位置 p=(x,y)p=(x,y)p=(x,y)。
- 3D参考点生成:对于BEV地图上的每个查询 QpQ_pQp,在垂直方向上(Z轴)采样 NrefN_{ref}Nref 个不同高度的3D参考点,形成一个“柱状”的查询区域(Pillar-like query)。
- 3D到2D投影:利用已知的相机内外参矩阵,将这些3D参考点投影到所有 NviewN_{view}Nview 个相机的2D图像平面上。
- 执行注意力:将这些投影后的2D点作为Deformable Attention机制中的“参考点”,BEV查询 QpQ_pQp 只与这些参考点周围的局部图像特征进行交互(即注意力计算),从而聚合多视图信息,更新自身。这个过程就是 空间交叉注意力 (Spatial Cross-Attention, SCA)。
- 创新点:
- 变被动为主动:颠覆了以往“Lift-Splat”等方法中将2D特征“推送”到3D空间的思路,创新性地采用BEV查询从3D空间主动“拉取”2D特征信息。
- 效率与性能的平衡:巧妙地将Deformable Attention机制应用于3D到2D的查询过程,每个BEV查询只关注图像中的少数关键区域,极大地降低了计算复杂度,使其成为可能。
研究内容二:通过时序自注意力实现时间特征融合
- 动机:高效地利用时序信息来提升对动态物体(如速度估计)和被遮挡物体的感知能力,同时避免简单堆叠BEV特征带来的高计算成本和信息冗余。
- 核心内容:采用一种类似循环神经网络(RNN)的机制,将前一时刻的BEV特征作为“记忆”,与当前时刻的BEV查询进行融合,以一种循环迭代的方式传递和更新时序信息。
- 技术路线:
- 保存历史BEV:保留前一时刻 t−1t-1t−1 生成的最终BEV特征 Bt−1B_{t-1}Bt−1。
- 对齐历史BEV:根据车辆自身的运动(Ego-motion),对历史BEV特征 Bt−1B_{t-1}Bt−1 进行坐标变换,使其与当前时刻 ttt 的坐标系对齐,得到 Bt−1′B'_{t-1}Bt−1′。
- 执行注意力:将当前时刻的BEV查询 QQQ 和对齐后的历史BEV特征 Bt−1′B'_{t-1}Bt−1′ 拼接在一起。然后,每个BEV查询 QpQ_pQp 在这个拼接的特征上执行Deformable Attention,学习从历史信息中提取有用的动态线索来增强自身。这个过程就是 时序自注意力 (Temporal Self-Attention, TSA)。
- 创新点:
- 循环式时序融合:提出了一种高效的循环式时序信息融合机制。相比于堆叠多帧特征,这种方式计算成本不随时间窗口的增长而增加,并且能更有效地建模长时序依赖。
- 动态关联学习:通过注意力机制,模型可以自适应地学习不同物体在不同时刻之间的关联,而不是依赖于手工设计的跟踪或匹配算法。
四、实验设计与验证
-
数据集:
- nuScenes:自动驾驶领域最常用、最全面的多模态数据集之一,包含6个摄像头、LiDAR和RADAR数据,提供360°环视视角,有详细的3D边界框和语义地图标注。
- Waymo Open Dataset:另一个大规模自动驾驶数据集,数据质量高,场景复杂。
-
评价指标:
- 3D检测:NDS(nuScenes Detection Score,综合指标)、mAP(平均精度)以及mATE(平移误差)、mAVE(速度误差)等多种误差度量。
- 地图分割:IoU(交并比)。
-
Setting和Baseline:
- Backbone:采用ResNet-101和VoVNet-99作为图像特征提取网络,以便与之前的工作公平对比。
- 对比的Baseline:
- SOTA方法:与当时最先进的纯视觉3D检测方法(如FCOS3D, DETR3D)进行性能对比。
- BEV生成器:为了单独验证BEVFormer编码器的有效性,作者将编码器部分替换为其他BEV生成方法(如VPN, Lift-Splat),而保持其他部分(Backbone, Head)不变,进行公平比较。
- BEVFormer-S:这是一个关键的消融版本,它移除了时序自注意力模块(TSA),即一个纯空间、无时间信息的静态版本。通过对比BEVFormer和BEVFormer-S,可以直接验证时序模块的有效性。
-
实验验证设计:
- 验证空间交叉注意力 (SCA):在Table 5中,作者设计了对比实验。他们将SCA的实现方式分别替换为Global Attention(全局注意力)和Points Only(只与参考点交互,不考虑周围区域),结果表明,BEVFormer采用的基于Deformable Attention的局部区域交互方式(Local)在性能和资源消耗上取得了最佳平衡。
- 验证时序自注意力 (TSA):在几乎所有的结果表(Table 1, 2, 4)中,BEVFormer的性能都显著优于BEVFormer-S。尤其是在 速度估计误差(mAVE) 指标上,BEVFormer取得了巨大提升,直接证明了TSA的有效性。此外,Figure 3展示了在低可见度(严重遮挡)的物体上,BEVFormer的召回率远高于BEVFormer-S,再次验证了时序信息对于处理遮挡的重要性。
- 消融实验设计:
- 核心模块消融:BEVFormer vs. BEVFormer-S(消融TSA);Table 5中的不同Attention类型(消融SCA的设计)。
- 超参数/设计选择消融:Table 7研究了训练时序长度的影响 ;Table 8研究了自车运动对齐、随机采样策略等设计的重要性。
- 鲁棒性分析:Figure 6中,作者对相机外参(位置和姿态)添加不同程度的噪声,测试了模型的鲁棒性,进一步展示了其设计的优越性。
-
核心总结:
论文提出了 BEVFormer,一个基于Transformer的纯视觉感知框架。它通过创新的空间交叉注意力机制,让BEV查询主动地从多视图2D图像中聚合空间信息,摆脱了对深度估计的依赖;同时,通过 时序自注意力 机制,以一种循环高效的方式融合历史信息,极大地提升了动态场景感知能力。最终生成的统一BEV特征强大且通用,在3D目标检测和地图分割任务上均达到了当时最先进的水平。 -
主要贡献:
- 提出BEVFormer框架:建立了一个优雅且强大的时空Transformer编码器,为BEV下的多任务感知设定了新的标杆。
- 设计空间交叉注意力 (SCA):提出了一种高效的、从3D BEV空间查询2D图像特征的注意力机制,是该框架的核心创新之一。
- 设计时序自注意力 (TSA):提出了一种新颖的、循环式的时序信息融合方法,显著提升了模型的动态感知能力。
- SOTA性能:在nuScenes等权威数据集上大幅超越了以往的纯视觉方法,性能甚至开始接近部分LiDAR方案,展示了纯视觉方案的巨大潜力。
BEVFormer无疑是自动驾驶纯视觉感知领域的一篇开创性作品。它的核心思想——“BEV Queries as an agent”(将BEV查询视为主体去主动探索)——非常巧妙,为解决跨视角特征融合这一难题提供了全新的、高效的范式。其对时序信息的处理方式也兼顾了性能和效率,对后续研究产生了深远影响。
尽管论文承认纯视觉方案与LiDAR方案在精度上仍有差距,且模型的主干网络计算开销较大 ,但它清晰地指明了一条极具潜力的技术路径。BEVFormer不仅仅是一个模型,更是一个灵活、可扩展的框架,它为后续的BEV感知研究奠定了坚实的基础,并引领了该领域之后多年的发展方向。
nuScenes 数据集
nuScenes 是由 Motional(前身为 nuTonomy)团队发布的一个大规模、多模态的自动驾驶数据集,以其传感器配置的完整性和标注的丰富性而闻名,旨在全面推动自动驾驶感知系统的研究。
1. 传感器套件 (Sensor Suite)
nuScenes 的采集车辆配备了完整的 360° 全覆盖传感器系统,这是其最显著的特点之一:
- 相机 (Camera):6 个摄像头,共同构成 360° 环视视野。
- 激光雷达 (LiDAR):1 个 32 线的旋转激光雷达,位于车顶中央,每秒旋转 20 次,提供 360° 的点云数据。
- 雷达 (RADAR):5 个毫米波雷达,分布在车辆四周,用于探测物体的距离和速度,在恶劣天气下尤其有用。
- IMU 和 GPS:惯性测量单元(IMU)和全球定位系统(GPS)用于精确定位车辆的姿态和位置。
2. 数据规模与构成
- 场景 (Scenes):包含 1000 个驾驶场景,每个场景时长为 20 秒。这些场景采集于波士顿和新加坡,涵盖了不同的天气、光照条件和复杂的交通状况(如环岛、十字路口、无保护左转等)。
- 关键帧 (Keyframes):数据以 2Hz 的频率进行标注,总计约 4 万个带标注的关键帧。
- 数据量:总共包含约 140 万张相机图像、39 万帧激光雷达扫描数据以及 140 万个带有 3D 边界框的物体标注。
3. 标注类型与丰富性
nuScenes 的标注非常详细,不仅告诉模型“是什么”,还提供了丰富的上下文信息:
- 3D 边界框:为 23 个物体类别(后合并为 10 个用于检测任务)提供了精确的 3D 边界框,包括位置、尺寸和朝向。
- 语义地图:提供了 11 层的 HD 高精地图信息,如可行驶区域、人行道、车道线、交通标志等。
- 物体属性:标注了物体的活动状态(如车辆是否在行驶、停放,行人是否在行走、站立)和可见度等级(如物体被遮挡的程度)。
- 速度信息:为动态物体标注了速度。
- 跨帧跟踪 ID:为每个物体实例提供了跟踪 ID,方便进行多目标跟踪任务的研究。
4. 实例说明
一个来自 nuScenes 的新加坡夜间场景:
- 场景描述:车辆正在一个繁忙的十字路口等待左转。此时下着小雨,路面湿滑反光。
- 数据呈现:
- 你会得到 6 张分别朝向前方、前左、前右、后方、后左、后右的摄像头图像,图像中可以看到湿漉漉的柏油路、对面车辆的车灯光晕以及路边的行人。
- 一个 360° 的激光雷达点云,可以清晰地勾勒出周围建筑、车辆和行人的轮廓。
- 毫米波雷达数据会以点的形式显示出对面直行车辆的距离和相对速度。
- 标注信息:一辆正在对面等待的公交车会被标注一个 3D 边界框,其属性为“车辆.公交车”,活动状态为“静止”;一个正在撑伞过马路的行人会被标注,其活动状态为“行走中”;同时,你还可以获取该路口的车道线、停止线和人行横道线的高精地图信息。
Waymo Open Dataset
Waymo Open Dataset (WOD) 是由 Google 旗下的自动驾驶公司 Waymo 发布的,以其超大的数据规模和高质量、高密度的传感器数据著称,是目前世界上最大的自动驾驶数据集之一。
1. 传感器套件 (Sensor Suite)
Waymo 的采集车辆使用了更先进、更高分辨率的传感器:
- 相机 (Camera):5 个高分辨率摄像头,覆盖车辆前方和侧方约 252° 的视野。
- 激光雷达 (LiDAR):5 个激光雷达,包括 1 个位于车顶的中距离雷达(Mid-range LiDAR)和 4 个位于车辆四周的短距离雷达(Short-range LiDAR)。这些雷达共同提供了高密度、高精度的 360° 点云数据。
- IMU 和 GPS:同样配备,用于精确定位。
- 注意:Waymo 数据集中不包含毫米波雷达数据。
2. 数据规模与构成
- 场景 (Scenes):最初版本包含 1150 个场景,后续不断扩充。每个场景时长 20 秒,数据采集频率更高(10Hz)。
- 数据量:包含数百万帧的相机和激光雷达数据,以及数千万个带标注的 3D 物体边界框。其数据总量远超 nuScenes。
- 多样性:数据采集自多种地点(如旧金山、凤凰城)和时间(白天、黄昏、夜晚),涵盖了丰富的城市场景和高速公路场景。
3. 标注类型与高质量
Waymo 的数据标注质量非常高,这得益于其强大的手动标注工具和流程。
- 高质量 3D 边界框:为 4 个核心类别(车辆、行人、骑行者、交通标志)提供了极为精确的 3D 边界框。由于激光雷达质量高,这些边界框非常贴合真实物体。
- 2D 边界框:也提供了相机图像上的 2D 边界框。
- 激光雷达语义分割:为激光雷达点云提供了逐点的语义标签(如车辆、行人等)。
- 跨帧跟踪 ID:同样为每个物体实例提供了跟踪 ID。
4. 实例说明
一个来自 Waymo 的旧金山白天场景:
- 场景描述:车辆正在一个有坡度的街道上行驶,街道两旁停满了车,前方有行人和骑行者穿行。
- 数据呈现:
- 你会得到 5 张非常清晰的高分辨率相机图像,可以看清远处车辆的车牌和行人的衣着细节。
- 一个极其密集的激光雷达点云,不仅能精确捕捉到前方骑行者的轮廓,甚至能分辨出其自行车的大致结构。由于有多个 LiDAR,路边停放车辆的侧面和后部也能被很好地扫描到,点云的盲区非常小。
- 标注信息:一个从路边车辆之间走出的行人,会被一个非常紧密的 3D 边界框包裹,并且这个边界框会随着行人的移动在连续的帧(以 10Hz 的高频率)中被精确跟踪。路边所有停放的车辆也会被逐一精细标注。
特性 | nuScenes 数据集 | Waymo Open Dataset |
---|---|---|
核心优势 | 传感器配置全面(含雷达),标注维度丰富(含属性、地图) | 数据规模巨大,传感器(尤其LiDAR)质量和密度极高 |
摄像头 | 6 个,360° 覆盖 | 5 个,约 252° 覆盖 |
激光雷达 | 1 个 32 线 LiDAR | 5 个 LiDAR(1中距+4短距),点云密度更高 |
雷达 | 包含 (5个) | 不包含 |
数据规模 | 1000 个场景 | 1150+ 个场景,总体量远大于 nuScenes |
标注频率 | 2 Hz | 10 Hz |
标注特点 | 类别多,含物体属性、可见度、速度、高清地图 | 类别精简,3D框标注极其精准,含点云语义分割 |
适用研究 | 多模态融合、复杂场景理解、鲁棒性研究、行为预测 | 高精度3D检测与跟踪、点云处理算法、大规模模型训练 |
nuScenes 数据样本实例
nuScenes 的数据组织方式是 “松散” 的,即传感器数据(图像、点云)和标注数据(JSON文件)是分开存储的,通过唯一的 令牌(token) 相互关联。
假设我们正在分析场景 scene-0061
中的一个关键帧,其 sample_token
为 10f0e012c8894d3e89a2c3e41344c802
。
文件目录结构(模拟)
nuscenes/
├── maps/
│ ├── basemap/
│ └── expansion/
├── samples/
│ ├── CAM_FRONT/
│ │ └── n008-2018-08-01-15-16-36-0400__CAM_FRONT__1533151603512404.jpg
│ ├── CAM_FRONT_LEFT/
│ │ └── ...
│ ├── LIDAR_TOP/
│ │ └── n008-2018-08-01-15-16-36-0400__LIDAR_TOP__1533151603509889.pcd.bin
│ └── ... (其他5个相机、5个雷达的数据)
├── sweeps/
│ └── ... (非关键帧的传感器数据)
└── v1.0-trainval/├── attribute.json├── calibrated_sensor.json├── category.json├── ego_pose.json├── instance.json├── log.json├── map.json├── sample.json├── sample_annotation.json├── sample_data.json├── scene.json└── visibility.json
数据文件详解
-
图像数据
- 文件名:
n008-2018-08-01-15-16-36-0400__CAM_FRONT__1533151603512404.jpg
- 格式:
.jpg
,标准的JPEG图像文件。 - 内容: 就是一张普通的照片,记录了前置摄像头在该时刻捕捉到的画面。
- 文件名:
-
激光雷达数据
- 文件名:
n008-2018-08-01-15-16-36-0400__LIDAR_TOP__1533151603509889.pcd.bin
- 格式:
.pcd.bin
(Point Cloud Data, Binary) - 内容: 这是一个二进制文件,内部存储了大量的点。每个点通常由多个维度的浮点数表示,例如
[x, y, z, intensity, ring_index]
,分别代表该点在三维空间中的坐标、激光反射强度和来自激光雷达的哪条线束。
- 文件名:
-
元数据与标注 (JSON文件)
这是 nuScenes 的核心。所有的数据都通过这些JSON文件组织起来。-
sample.json
: 定义了每一个关键帧(sample)。// 这是一个简化的示例 [{"token": "10f0e012c8894d3e89a2c3e41344c802","timestamp": 1533151603523782,"prev": "...","next": "...","scene_token": "scene-0061"} ]
-
sample_data.json
: 描述了每个传感器在特定关键帧产生的数据文件。// 简化示例,关联了sample_token和具体的数据文件 [{"token": "e9bVOa88a08g4e9b8c12a08f0a0d0a0b","sample_token": "10f0e012c8894d3e89a2c3e41344c802","ego_pose_token": "...","calibrated_sensor_token": "...","filename": "samples/CAM_FRONT/n008-2018-08-01-15-16-36-0400__CAM_FRONT__1533151603512404.jpg","fileformat": "jpg","is_key_frame": true,// ... 还有宽高、时间戳等信息} ]
-
sample_annotation.json
: 最重要的标注文件,描述了该关键帧中每一个被标注的物体。// 简化示例,描述了一辆正在行驶的汽车 [{"token": "a0a0f0a0d0a04e9b8c12a08f0a0d0a0b","sample_token": "10f0e012c8894d3e89a2c3e41344c802","instance_token": "b0b1g1b1e1b14e9b8c12a08f0a0d0a0b", // 跨帧跟踪ID"visibility_token": "4", // 可见度"attribute_tokens": ["cb5ed310eab344e99a5e89557416e492" // "vehicle.moving"],"translation": [699.21, 1079.28, 1.48], // [x, y, z] in meters"size": [1.8, 4.5, 1.6], // [width, length, height] in meters"rotation": [0.707, 0, 0, 0.707], // 四元数 [w, x, y, z]"velocity": [5.2, 0.1], // [vx, vy] in m/s"num_lidar_pts": 125,"num_radar_pts": 8,"category_name": "vehicle.car"} ]
-
Waymo Open Dataset (WOD) 样本实例
Waymo 的数据组织方式是 “整合” 的,它使用 Google 的 TFRecord 格式。一个 .tfrecord
文件通常包含一个 20 秒场景片段(segment)中 所有 的传感器数据和标注。
文件目录结构(模拟)
Waymo 的文件结构相对简单,通常是大量的 .tfrecord
文件。
waymo_open_dataset/
├── training/
│ ├── segment-10225273555995134140_1160_000_1180_000_with_camera_labels.tfrecord
│ ├── segment-10231929575937593700_5080_000_5100_000_with_camera_labels.tfrecord
│ └── ...
├── validation/
│ └── ...
└── testing/└── ...
数据文件详解
- 文件名:
segment-10225273555995134140_1160_000_1180_000_with_camera_labels.tfrecord
- 格式:
.tfrecord
- 内容: 这是一个二进制文件,需要使用 TensorFlow 的库来解析。解析后,你会得到一系列的
Frame
对象,每个Frame
对应一个时间戳(Waymo是10Hz,所以20秒的片段有大约200个Frame)。
下面我们来看一个 解析后的 Frame
对象 内部的数据结构(以类似JSON的格式展示):
// 这是一个简化的、解析后的Frame对象结构
{"context": {"name": "10225273555995134140_1160_000_1180_000","camera_calibrations": [...],"laser_calibrations": [...]},"timestamp_micros": 1542132335199843,"pose": { /* 车辆的位姿矩阵 */ },"images": [{"name": "FRONT","image": " ... JPEG a byte stream ... ", // 图像数据直接内嵌"pose": "...","velocity": "..."},// ... 其他4个摄像头的图像],"lasers": [{"name": "TOP","ri_return1": {"range_image_compressed": " ... binary data ... ", // 激光雷达数据也内嵌// ...}},// ... 其他4个激光雷达的数据],"laser_labels": [ // 3D边界框标注{"box": {"center_x": 10.5,"center_y": 5.2,"center_z": 0.75,"width": 2.1,"length": 4.8,"height": 1.7,"heading": -1.57 // 航向角 in radians},"metadata": {"speed_x": 8.1,"speed_y": -0.2,"accel_x": 0.5,"accel_y": 0.0},"type": "TYPE_VEHICLE","id": "segment-10225273555995134140_1160_000_1180_000_-1_Vehicle_23" // 跟踪ID},// ... 其他物体的标注]
}
核心差异总结
- 组织方式:
- nuScenes: 分散式。图像、点云是独立文件,通过 JSON 元数据关联。优点是灵活,可以只加载需要的传感器数据。
- Waymo: 整合式。所有数据都在一个
.tfrecord
文件中。优点是数据管理简单,IO效率高,但文件体积巨大。
- 数据访问:
- nuScenes: 需要读取多个 JSON 文件来构建场景,然后根据文件名加载对应的图像和点云。
- Waymo: 只需读取一个
.tfrecord
文件并按帧(Frame)迭代解析即可获取所有信息。
为什么说“最简单”的BEV搞不定高度?(The Core Problem)
你站在一栋非常高的楼顶上,垂直向下看地面。这就是鸟瞰图(Bird’s-Eye-View)的视角。
核心操作:
最简单的BEV生成方法,就是把三维空间里的所有点云,“拍扁”到一个二维的地面网格上。它只关心每个点在地面上的 (X, Y)
位置,而直接忽略或合并了它的高度 (Z)
信息。
举一个具体的例子:立交桥场景
-
真实世界:
- 一辆红色的小轿车正在立交桥上行驶(比如高度是5米)。
- 一辆蓝色的卡车正在桥下的道路上行驶(高度是0米)。
- 从正上方看,它们在地面上的
(X, Y)
位置是完全重叠的。
-
“拍扁”操作(生成简单的BEV):
- 系统收集到红色小轿车的点云,记录下它们的
(X, Y, Z)
坐标。 - 系统收集到蓝色卡车的点云,也记录下它们的
(X, Y, Z)
坐标。 - 在生成BEV网格时,系统说:“我只关心
(X, Y)
坐标。” - 于是,红色小轿车的点和蓝色卡车的点,因为
(X, Y)
坐标相同,被扔进了同一个BEV网格单元里。
- 系统收集到红色小轿车的点云,记录下它们的
-
产生的问题:
- 问题一:物体混淆。 在最终生成的BEV图上,模型只看到一堆点,它无法区分哪些点属于桥上的红车,哪些属于桥下的蓝车。它们变成了一团无法分割的“像素”。这就是 “垂直堆叠的物体很难区分”。
- 问题二:语言理解失效。 如果给系统一个指令:“找到桥上的车”。系统会很困惑,因为它手里的BEV地图已经没有“桥上”和“桥下”这个高度概念了。描述高度的词语(如“上方”、“下方”、“顶上”)失去了几何意义。这就是 “无法理解与高度相关的语言描述”。
现代自动驾驶系统如何解决这个问题? (The Smart Solutions)
工程师们当然知道这个缺陷,所以发展出了很多更先进的方法来保留或重建高度信息。下面我们用通俗的方式解释其中最主流的三种:
方案一:多层蛋糕法 (Multi-Height Slicing)
- 核心思想: 与其做一张“大饼”,不如做一块“千层蛋糕”。
- 解释: 你不再是把整栋楼拍扁成一张总平面图,而是为每一层楼都画一张独立的平面图。一楼一张,二楼一张,三楼一张……
- 具体做法: 系统将整个3D空间沿高度方向“切”成很多层(比如每层0.5米高)。然后,为每一层都生成一个独立的BEV图。这样,你就得到了一系列堆叠起来的BEV图。
- 如何解决问题:
- 在立交桥的例子中,桥下的蓝色卡车(高度0米)会出现在底层的BEV图上。
- 桥上的红色小轿车(高度5米)会出现在 高层(比如第10层)的BEV图上。
- 这样一来,两个物体在不同的“图层”上,被完美分开了。系统不仅知道它们在哪里,还知道哪个在哪个上面。
方案二:乐高积木法 (Voxelization)
- 核心思想: 在“拍扁”之前,先用3D的方式理解世界。
- 解释: 用乐高积木来搭建整个世界。整个空间被划分成一个个小的3D立方块,这些小方块就叫体素(Voxel)。
- 具体做法:
- 系统首先将所有点云填充到这些3D的“乐高格子”里。
- 然后,它不是直接拍扁,而是先在这些3D格子里进行计算和特征提取。模型在这一步就已经学习到了空间的3D结构和高度信息。
- 最后,再将这些已经包含了丰富3D信息的“智能格子”投影到BEV平面上。此时,每个BEV网格单元的特征,实际上是它上方所有3D格子特征的浓缩摘要。
- 如何解决问题: 因为模型的第一步就是在3D空间中进行理解,所以它从未真正“忘记”高度。即使最后输出的是一张BEV图,这张图的每个“像素”内部都编码了原始的高度信息。
方案三:多视角“脑补”法 (Multi-Modal Fusion)
- 核心思想: 单靠激光雷达(LiDAR)像个“盲人摸象”,我们给它配上“眼睛”(摄像头)。
- 解释: 激光雷达能精确测量距离和形状(几何),但不知道颜色和纹理(语义)。摄像头正好相反。把它们结合起来,就能得到一个更完整的世界认知。像 Lift-Splat-Shoot、BEVFormer 这类方法就是干这个的。
- 具体做法(简化版):
- 拍照: 车上的多个摄像头拍下周围环境的2D图像。
- 估算距离: 模型看着2D图像,会“脑补”出图像里每个像素点大概离车有多远(这叫深度估计)。
- “扔”进3D空间: 模型将每个像素点,根据估算出的距离,从2D图像“扔”回它在3D空间中应该在的位置。这就像把一张张照片撕碎,然后按远近重新拼成一个3D场景。
- 融合: 现在,3D空间里既有来自激光雷达的精确点云,也有来自摄像头的、带有颜色和语义信息的点。
- 生成BEV: 最后,从这个信息极其丰富的融合后3D空间里,再生成BEV图。
- 如何解决问题:
- 对于“卡车上方的交通标志”这个指令,摄像头可以轻易识别出哪个是“交通标志”,哪个是“卡车”。通过深度估计和3D投影,系统知道交通标志在3D空间中的位置确实高于卡车。这个“上方”关系就在融合过程中被牢牢记住了。
方法 | 核心思想 | 解释 | 如何解决高度问题 |
---|---|---|---|
简单BEV (问题所在) | 把3D世界暴力“拍扁”成2D地图 | 从飞机上拍一张地面的黑白影子照片 | 无法解决,完全丢失了高度信息。 |
多高度切片 | 把空间分层,每层一张2D地图 | 做一块“千层蛋糕”或画“分层建筑图” | 将不同高度的物体分离到不同的图层上。 |
体素化 | 先在3D空间中理解,再投影到2D | 用“乐高积木”搭建3D世界 | 在投影到BEV前,特征已经包含了3D结构和高度信息。 |
多模态融合 | 结合摄像头(眼睛)和激光雷达(触觉) | 给“盲杖”装上“眼睛”,进行“脑补” | 利用图像语义和深度估计,在3D空间中重建物体及其关系。 |