3D Semantic Occupancy Prediction
3D 语义占用预测(3D Semantic Occupancy Prediction)旨在将真实世界环境划分为规则的三维体素(voxel)网格,并对每个体素同时预测:
- 占用状态(Occupancy):该体素是否被物体占据
- 语义类别(Semantic):若被占据,属于哪一种对象类别(如行人、车辆、建筑等)
此任务不仅重建空间几何,更补充了语义信息,使得每个体素都携带完整的环境感知信号
- 全场景高精度感知:相比传统的鸟瞰图(BEV)或 3D 边界框检测,语义占用预测可在体素级别恢复垂直结构和微小物体,实现更细粒度的场景重建
- 自主导航与规划:机器人或自动驾驶系统可基于完整的占用-语义图进行路径规划与避障决策,提高安全性与鲁棒性
- 下游任务融合:融合占用预测结果,可增强 3D 目标检测、路径预测、地图构建等任务的表现,形成统一感知框架
- 增强环境理解:比仅有 BEV(鸟瞰平面)或 3D 边界框更细致,垂直结构也被明确建模
技术架构流程
- 传感器输入:常见源包括单目/多目相机、LiDAR 点云,或两者的多模态融合。
- 特征提取:对图像采用卷积网络(CNN)或 Transformer,点云则利用稀疏卷积(SparseConv)等方法提取特征。
- 3D 表示构建:将 2D 特征“提升”(lifting)至 3D 体素空间,或直接在 3D 点云上构建体素化表示。
- 体素预测网络:基于 3D CNN、Transformer 或注意力机制,对每个体素进行占用与语义标签预测。
- 后处理与融合:可融合多帧、多传感器结果,或应用体渲染技术进一步细化预测。
典型方法分类
-
LiDAR 驱动方法 :直接在点云体素上应用稀疏卷积网络进行分类与分割,具有高精度但计算和存储开销较大。
-
Vision-Only 方法
- TPVFormer:提出三视图(Tri‑Perspective View, TPV)表示,将 BEV 平面扩展为三个正交平面,并使用 Transformer 进行特征聚合,实现仅用相机输入即可预测稠密语义占用
- OccFormer:Dual‑path Transformer 架构,将 3D 处理拆分为水平局部与全局两条路径,针对稀疏体素及类别不平衡问题提出专门的解码策略
-
多模态融合方法
- GaussianFormer3D:以 3D 高斯分布替代稠密体素,利用可变形注意力在点云与图像特征间进行跨模态融合,兼顾精度与内存效率
-
生成式与不确定性建模
- OccGen:基于扩散模型,通过逐步“去噪”生成更细致的 3D 占用图;
- α‑OCC:从不确定性量化角度出发,传播深度与语义不确定性以增强鲁棒性和可解释性
数据集
- SemanticKITTI:基于 KITTI,提供 360° LiDAR 序列的体素级语义标注,支持时序信息利用
- nuScenes:涵盖相机与 LiDAR 的多传感器数据集,可用于验证跨传感器方法的泛化性能
- Occ3D Benchmark:专门针对 3D 占用预测任务构建的大规模评测基准,提供标准化评价协议
评价指标
- IoU (Intersection over Union):针对二元占用预测
- mIoU (mean IoU):针对多类别语义预测的平均 IoU
- Frame Rate (FPS):衡量模型在嵌入式或实时场景下的推理速度
挑战与未来方向
- 稀疏标注与类不平衡:体素级标注成本高,常造成少数类欠拟合,需要半/弱监督或伪标签策略。
- 计算与存储成本:高分辨率体素网格带来指数级开销,需设计更高效的表示(如高斯、平面投影)与剪枝机制。
- 时间和历史先验利用:动态场景下融合短期与长期记忆可提升连续帧一致性,如 LMPOcc 等方法探索历史路径先验 ([ResearchGate][1])。
- 不确定性量化:增强系统对“预测可信度”的评估,可用于安全决策与多传感器动态加权。
- 生成式技术引入:扩散模型等新范式有望在细节重建与稠密预测上超越传统网络。
3D 语义占用预测通过体素化的占用+语义标签,实现对环境的细粒度重建与理解。随着 TPV、Gaussian、生成式模型与长期记忆先验的出现,该领域正朝着更高精度、更低开销和更强鲁棒性的方向发展,并在自动驾驶、机器人导航等场景中展现出广阔的应用前景。
《SDG-OCC: Semantic and Depth-Guided Bird’s-Eye View Transformation for 3D Multimodal Occupancy Prediction》
这张图展示了 SDG-OCC 模型的整体架构,其核心目标是融合多视角的图像(Multi-View Image)和激光雷达点云(LiDAR Sweeps)数据,来精确地预测三维空间的占据情况(Occupancy Prediction)。整个框架可以分为三个主要部分:LiDAR 分支、图像分支以及多模态融合与预测头。
1. LiDAR 分支 (LiDAR Branch)
LiDAR 分支位于图的上方,负责处理和提取激光雷达点云的特征。
- 输入 (Input):
LiDAR Sweeps
- 连续多个时刻(T-frame)的激光雷达扫描点云数据。 - 处理流程:
- Voxelization (体素化): 将稀疏、不规则的激光雷达点云转换成规则的三维网格(体素)。这是一种标准操作,便于后续使用 3D 卷积网络进行处理。
- 3D Encoder (3D 编码器): 使用 3D 卷积神经网络(如 Sparse Convolution)来处理体素化的点云,提取出丰富的几何和空间特征。输出的是一个三维的特征体(3D feature volume)。
- Flatten (扁平化): 将 3D 特征体沿着垂直方向(z-axis)进行压缩或展平,生成一个鸟瞰图(Bird’s-Eye View, BEV)视角的特征图。这个 BEV 特征图
LiDAR Feature
包含了场景的高度和空间布局信息。 - FOAD (Fusion+Distillation): 这是一个关键模块,全称可能是 Feature-Oriented Alignment and Distillation。这个模块一方面用于后续的特征融合,另一方面,在训练过程中,它利用强大的 LiDAR 特征作为“教师”信号,通过知识蒸馏(Distillation)的方式来指导图像分支的学习。图中虚线箭头表示其在训练时的指导作用。
2. 图像分支 (Image Branch)
图像分支位于图的左下方,是该框架的核心创新所在,负责从 2D 图像中提取特征并转换到 3D BEV 空间。
- 输入 (Input):
Multi-View Image
- 来自车辆周围多个摄像头的 T-frame 图像。 - 处理流程:
- 2D Encoder (2D 编码器): 使用一个标准的 2D 卷积网络(如 ResNet)作为主干网络(backbone),对每一张输入的多视角图像进行编码,提取出各自的 2D 特征图。
- Multi-Task Head (多任务头): 这是该论文的一个关键设计。从 2D 编码器输出的特征被送入一个多任务头,该任务头同时执行两个子任务:
- Semantic Mask (语义分割): 预测图像中每个像素的语义类别(如车辆、道路、行人等)。这为后续的特征转换提供了丰富的语义先验信息。
- Depth Distribution (深度分布): 预测每个像素的深度值。不同于直接预测一个单一的深度值,这里预测的是一个深度值的概率分布,这能更好地处理深度估计中的不确定性。
- SDG View Transformation (语义和深度引导的视图转换): 这是整个框架的核心创新模块。它的目标是将 2D 图像特征高效且准确地"提升"(lift)到 3D BEV 空间。该过程包含以下几个关键步骤:
- Co-point Depth & Context Feature: 结合多任务头输出的语义信息和深度分布信息,生成更可靠的特征。
- SDG-BEV Pooling: 这是实现视图转换的关键操作。它利用预测出的深度分布 (Depth Distribution) 和语义信息 (Semantic Mask) 作为引导,将 2D 图像上的特征点(pixels)“投射”(pool)到 3D 空间中的对应位置,最终形成一个 BEV 视角的特征图
Camera Feature
。语义信息在这里起到了关键的指导作用,例如,模型可以根据语义判断某个像素(比如属于“天空”)是否应该被投影到 3D 空间中,从而避免了无效或错误的投影。
3. 多模态融合与预测 (Fusion and Prediction)
2.5D地图(BEV,鸟瞰图)的含义
BEV(Bird’s Eye View,鸟瞰图)是什么?
BEV 是一种从垂直上方俯视的视角生成的地图或图像,类似于鸟类观察地面的视角。它通常包含地面上物体的平面位置信息(X、Y坐标),并可能叠加其他维度的数据(如高度、深度、语义信息等)。BEV 在自动驾驶、无人机导航、机器人定位等领域广泛应用,因为它能直观展示周围环境的全局空间关系。
为什么称为“2.5D”?
“2.5D”(二维半)的命名源于其介于2D平面与3D空间之间的特性,具体体现在以下方面:
(1)基础是二维平面
- BEV 本质上是一个二维投影平面(X-Y 平面),类似于传统地图的俯视图,仅描述物体在水平方向上的位置和分布。
(2)叠加部分三维信息
- 高度/深度信息:通过传感器(如激光雷达、摄像头)或算法估计,BEV 中每个点可能包含高度(Z轴)或距离地面的垂直高度差(例如,车辆、行人的高度)。
- 语义与属性:标注物体类别(如车道线、障碍物)、运动方向、速度等动态信息。
- 局部三维结构:对关键物体(如车辆、行人)使用边界框(Bounding Box)表示其三维尺寸(长、宽、高),但整体环境仍以二维布局为主。
(3)非完整的三维建模
- 与全3D点云或三维网格不同,2.5D 地图仅保留部分与垂直视角相关的三维特征,避免了全3D建模的高计算成本和复杂性。
2.5D BEV 的应用场景与优势
(1)自动驾驶中的核心作用
- 环境感知:通过多传感器融合(摄像头、雷达、激光雷达),BEV 提供车辆周围360°的环境模型,便于目标检测、路径规划。
- 决策与控制:BEV 的俯视视角直接对应车辆运动平面(如车道线、障碍物位置),简化了路径规划算法。
(2)计算效率与实用性
- 降低复杂度:相比全3D建模,2.5D 仅需处理二维平面+部分属性,计算资源消耗更低,适合实时系统。
- 数据融合友好:多视角摄像头或传感器数据可高效投影到统一BEV平面,减少视角畸变问题。
(3)游戏与虚拟仿真
- 在游戏中,2.5D BEV 可实现伪3D视觉效果(如斜视角地图),兼顾性能与沉浸感。
2.5D 与 3D 的核心区别
维度 | 2.5D BEV | 全3D |
---|---|---|
数据结构 | 2D平面 + 局部高度/属性 | 完整的3D空间(X、Y、Z全维度) |
应用场景 | 自动驾驶、机器人导航、游戏俯视图 | 三维建模、VR/AR、高精度仿真 |
计算成本 | 低(适合实时处理) | 高(需强大算力支持) |
- 2.5D BEV 的本质:通过二维平面承载部分三维信息,平衡了信息丰富度与计算效率。
- 命名逻辑:“2”代表基础的二维俯视平面,“0.5”表示叠加的有限三维属性,“D”(维度)体现其超越纯2D的能力。
- 核心价值:在自动驾驶等场景中,2.5D BEV 成为连接感知、决策与控制的“中间表示层”,是复杂环境感知的高效解决方案。
这部分位于图的右侧,负责融合来自两个分支的 BEV 特征,并最终生成占据栅格地图。
- 处理流程:
- 特征融合:
LiDAR Feature
和Camera Feature
都是 BEV 视角的特征图,因此可以很方便地进行融合。- 融合过程受到来自 LiDAR 分支的
FOAD
模块的引导。具体来说,FOAD
模块会识别出 LiDAR 认为重要的区域,然后指导模型更有选择性地将图像特征融合进来,增强这些区域的特征表达。图中从FOAD
指向Camera Feature
的箭头就代表了这个引导过程。
- BEV Encoder (BEV 编码器): 将融合后的多模态 BEV 特征送入一个 BEV 编码器(通常是 2D 卷积网络),进一步处理和提炼这些特征,捕捉更复杂的空间关系。
- Occupancy Head (占据头): 这是网络的最后一个部分。它接收 BEV 编码器输出的增强特征,并将其上采样(upsample)或解码回一个三维的体素空间,最终预测出每个体素被占据的概率。
- Occupancy Prediction (占据预测结果): 最终输出一个三维的占据栅格地图(Occupancy Map)。图中用一个立体的网格表示,不同的颜色代表不同的占据状态或语义类别。
- Loss (损失函数): 在训练过程中,将模型的预测结果
Occupancy Prediction
与真实的标签(Ground Truth)进行比较,计算损失函数,并通过反向传播来优化整个模型的参数。
- 特征融合:
SDG-OCC 框架通过一个精心设计的双分支结构来解决 3D 占据预测问题。
- LiDAR 分支提供精确但稀疏的 3D 几何信息。
- 图像分支是创新的核心,它不依赖于精确的外部相机参数进行 LSS (Lift-Splat-Shoot) 形式的转换,而是通过一个多任务头(预测语义和深度分布)来内部学习如何将 2D 图像特征转换到 3D BEV 空间。这种语义和深度引导 (SDG) 的方式使得视图转换更准确、更鲁棒,能够有效过滤掉无关信息(如天空),并更好地处理深度估计的不确定性。
- 最后,通过一个由 LiDAR 特征引导的智能融合机制 (FOAD),将两种模态的优势结合起来,并通过后续的 BEV 编码器和占据头生成高精度的三维占据地图。
SDG-OCC 的设计巧妙地利用了语义和深度信息来克服多模态 3D 感知中的核心挑战——即如何有效、准确地进行跨模态和跨视图的特征转换与融合
SDG 视图转换(SDG view transformation)核心在于解答一个问题:如何聪明地、高效地将 2D 图像信息“搬”到 3D 鸟瞰图(BEV)空间中去?
我们先理解传统方法(如 LSS)的痛点,再来看 SDG 是如何巧妙解决的
传统方法 (LSS) 的困境
你想把一张 2D 照片“立”起来,变成 3D 场景。LSS (Lift-Splat-Shoot) 的方法很直接:
- Lift (提升): 对图像中的每个像素点,暴力地在摄像头前方的一条射线上,猜测一系列可能的深度值(比如从 1 米到 80 米,每隔 1 米猜一次)。这样,一个像素点就变成了空间中的一长串“候选点”(虚拟点)。
- Splat (溅射): 把这些海量的候选点连同它们的图像特征,像泼墨一样“溅射”到一个统一的 3D BEV 网格里。
- Shoot (拍摄): 用一个网络来处理这个包含了巨量冗余信息的 BEV 网格,最终生成结果。
我们有一辆自动驾驶汽车,它通过车上的一个前置摄像头拍摄到了一张照片。我们的目标是利用这张 2D 照片,生成一个上帝视角的 2.5D 地图(BEV,鸟瞰图),并在这个地图上标出前方障碍物的位置。LSS 就是实现这个目标的一种非常经典的方法。
第一步:Lift (提升) - 将 2D 像素“提升”为 3D 射线上的“候选点云”
目标: 为图像中的每个像素点,在 3D 空间中创造出一系列可能的“候选点”,并为每个候选点赋予来自图像的特征。
具体操作:
-
输入:
- 一张 2D 图像 (例如,分辨率为
224 x 400
像素)。 - 这张图像对应的相机内外参数 (Intrinsics and Extrinsics)。内参告诉我们相机的焦距、成像中心等信息;外参告诉我们相机在车身坐标系中的精确位置和朝向。这些是进行 3D 几何转换所必需的。
- 一张 2D 图像 (例如,分辨率为
-
主干网络提特征: 首先,将这张 2D 图像输入到一个卷积神经网络 (CNN,例如 ResNet 或 EfficientNet) 中。这个网络会提取图像的深层特征。输出的结果是一个特征图 (Feature Map),它的分辨率可能比原图小 (例如,
14 x 25
),但通道数更多 (例如,256
个通道)。现在,特征图上的每一个“像素”都包含了一个丰富的上下文特征向量 (Context Vector)。这个向量“理解”了原始图像对应区域的内容(比如,“这里看起来像一辆车的车尾”)。 -
生成深度分布 (关键步骤): 这是 LSS 的核心思想。对于特征图上的每一个像素,模型不会只预测一个单一的深度值,而是预测一个概率分布。
- 预设深度“桶”: 我们会预先设定一系列离散的深度值,可以称之为“深度桶 (Depth Bins)”。例如,我们规定深度范围是
[4.0米, 45.0米]
,总共分为82
个桶,每个桶的间隔是0.5
米。所以我们的深度桶就是4.0, 4.5, 5.0, ..., 45.0
。 - 预测概率: 对于特征图上的某个像素,网络会输出
82
个概率值,每个概率值对应一个深度桶。这些概率值加起来等于 1。这就像在进行一个 82 分类的任务,判断这个像素的真实深度最有可能落在哪个桶里。
- 预设深度“桶”: 我们会预先设定一系列离散的深度值,可以称之为“深度桶 (Depth Bins)”。例如,我们规定深度范围是
-
创建带特征的 3D 候选点: 现在,我们将上述信息组合起来。
- 对于特征图上的一个像素
(u, v)
:- 我们知道它的上下文特征向量
C
(一个256
维的向量)。 - 我们知道它在
82
个深度桶d_i
上的概率p_i
。 - 利用相机内外参数,我们可以从像素
(u, v)
和每个深度桶d_i
计算出其在车身坐标系下的 3D 坐标(x, y, z)_i
。
- 我们知道它的上下文特征向量
- “提升”操作: 我们将特征向量
C
与其对应的深度概率p_i
相乘 (C' = p_i * C
),然后将这个加权后的特征C'
与其 3D 坐标(x, y, z)_i
关联起来。 - 我们对所有
82
个深度桶都执行这个操作。这样,图像上的一个像素,就被“提升”成了一条位于 3D 空间中的、由 82 个带特征的“候选点”组成的射线。
- 对于特征图上的一个像素
假设图像左前方有一个像素点,网络判断它很可能是一辆车的尾部,真实距离是 10 米。那么在 LSS 的 Lift 步骤后,这个像素点会生成一条由 82 个候选点组成的 3D 射线。其中,深度在 10.0
米附近的那个候选点,其被赋予的特征向量权重会非常高(因为深度概率 p
在这里最大),而距离很远或很近的点的特征权重则会非常低。
Lift 步骤:从相机出发,每个像素都生成了一条射线,射线上布满了离散的深度点
第二步:Splat (溅射 / 拍扁) - 将 3D 点云“拍扁”到 BEV 网格中
目标: 将来自所有摄像头、所有像素的海量 3D 候选点,高效地组织到一个统一的、鸟瞰图视角的 2D 网格中。
具体操作:
-
定义 BEV 网格: 首先,我们在车辆的
x-y
平面上定义一个网格。例如,一个200 x 200
的网格,每个格子代表真实世界中0.5m x 0.5m
的区域。这个网格的每个单元格都初始化为一个零向量(维度与特征向量C'
相同,即256
维)。 -
“溅射” / 累加: 现在,我们遍历在 Lift 步骤中生成的所有 3D 候选点(来自所有像素、所有深度桶)。
- 对于每一个 3D 候选点,我们查看它的
(x, y)
坐标,确定它落在了 BEV 网格的哪个单元格里。 - 然后,我们将这个候选点的加权特征向量
C'
,累加到对应 BEV 单元格的向量上。
- 对于每一个 3D 候选点,我们查看它的
这个过程就像是制作一张“数字沙画”:
- 你的手(相机)里握着不同颜色的沙子(特征)。
- Lift 步骤告诉你每种颜色的沙子(特征)应该撒向哪个 3D 位置,以及应该撒多少(深度概率)。
- Splat 步骤就是你把这些沙子按照指示撒到下方的一张画布(BEV 网格)上。同一个位置可能会被撒上好几次沙子(来自不同像素点、不同摄像头的贡献),它们的颜色会混合在一起(特征向量累加)。
关键点: 由于 Lift 步骤中,只有那些深度概率高的候选点才拥有权重显著的特征向量,所以只有它们才能对最终的 BEV 网格产生有意义的贡献。那些“猜错”了深度的点,因为其特征向量权重几乎为零,所以在累加时几乎没有影响。这就巧妙地过滤掉了大量无用信息。
例子小结: 之前那个 10 米远的车辆像素,它生成的 82 个候选点中,只有深度在 10 米附近的那个点(假设其 (x, y)
坐标落入 BEV 网格的第 (i, j)
个单元格),会把一个很强的特征向量累加到 BEV_Grid[i, j]
中。而其他 81 个深度猜错的点,贡献几乎为零。
Splat 步骤:将不同相机(图中为前后两个相机)生成的 3D 点云(Frustum Points)全部“拍扁”到一个统一的 BEV 网格上
第三步:Shoot (拍摄 / 处理) - 在 BEV 图上进行感知任务
目标: 对已经包含了丰富特征的 BEV 网格图进行分析,完成最终任务(如物体检测)。
具体操作:
- 输入: 第二步生成的
200 x 200 x 256
的 BEV 特征图。 - BEV 编码器: 这个 BEV 特征图本质上就是一张多通道的“伪图像”。我们可以直接把它喂给一个标准的 2D 卷积神经网络(也叫 BEV Encoder)。
- 任务头 (Task Head): 在这个 2D CNN 的最后,接上不同的任务头。
- 如果是物体检测任务: 接一个检测头 (如 CenterPoint 或 YOLO 的检测头),它会在这张 BEV 图上输出物体的 2D 边界框、朝向和类别。
- 如果是语义分割任务: 接一个分割头 (如 U-Net),它会为 BEV 图上的每个像素点分配一个语义标签(如道路、人行道、障碍物区域等)。
例子小结: 经过 Splat 后,我们得到了一张 BEV 特征图。在车辆前方 10 米左右对应的 (i, j)
格子附近,会有一个由强特征向量构成的“亮斑”。第三步的 2D CNN 看到这个“亮斑”后,就会识别出:“根据这个特征,这里应该是一辆车”,然后输出一个包围该区域的边界框。
- Lift: (2D 图像特征 + 深度分布) → 3D 候选点云 (带特征)。这是从 2D 到 3D 的过程,核心是学习性的深度分布。
- Splat: 3D 候选点云 → 2.5D BEV 特征图。这是一个“拍扁”和信息聚合的过程,将不同视角的信息统一到 BEV 视图。
- Shoot: 2.5D BEV 特征图 → 最终任务结果。这是一个标准的 2D 感知过程,在 BEV 空间完成检测或分割。
LSS 的革命性在于,它将过去需要多步、依赖复杂几何计算的流程,变成了一个端到端可训练的神经网络。整个过程(尤其是深度分布的预测)都是通过梯度下降来学习的,使得模型可以自己学会如何最好地将 2D 图像信息转换到 3D 空间,而不需要过多的人工规则
痛点很明显:
- 计算量巨大: 为每个像素猜测几十上百个深度点,会产生天文数字般的虚拟点,计算开销非常大。
- 深度不准: 凭空猜测的深度大部分是错的,导致大量的计算资源被浪费在处理无效的“鬼影”特征上,影响最终精度。BEV 特征也因此变得很稀疏,因为大部分空间位置其实没有有效的特征落入。
SDG 视图转换的智慧解决方案
SDG (Semantic and Depth-Guided) 的思路是:“我不需要暴力猜测,我可以用线索来做出更聪明的判断。” 它利用了两个核心线索:LiDAR 提供的稀疏但精确的深度 和 图像本身提供的丰富语义信息。
下面我们结合图中的流程,一步步看它是如何实现的。
图例解析
P
(Projection): 投影,指将 LiDAR 点云投影到图像上。G
(Gated-attention): 门控注意力机制,一种信息筛选和融合的方式。F
(Diffusion): 扩散,指将稀疏的深度信息进行扩展。L
(Bi-Linear Discretization): 双线性离散化,一种生成虚拟点的技术。⊗
(Outer Product): 外积,一种特征融合的方式。
详细步骤解析
第一步:准备“线索”——初始深度图和图像特征
- 左上输入 (
LiDAR Sweeps
): 首先,获取稀疏但准确的 LiDAR 点云。通过P
(投影) 操作,将这些 3D 点投影到 2D 图像平面上,形成一个稀疏的深度图 (Depth Map)。这个深度图上只有被 LiDAR 点打到的地方才有准确的深度值,其他地方都是空的。 - 左侧输入 (
1/4 Scale Image Feature
): 同时,一个标准的 2D 图像经过主干网络(如 ResNet)提取特征,得到一个1/4
分辨率的特征图。这个特征图被送入Depthnet
进行初步处理。
第二步:语义与深度特征的智能交互
这是 SDG 的一个精妙设计。它认为“语义”和“深度”是相辅相成的。比如,识别出这是“天空”,那它的深度就是无穷远;识别出这是“车辆”,那它的深度就应该在一个合理的范围内。
Depthnet
&Head
分离:Depthnet
的输出被送入两个并行的头:Semantic Head
(语义头) 和Depth Head
(深度头)。Gated-attention
(门控注意力):- 语义头先生成初步的语义特征,这些特征会通过一个门控机制去指导深度头。这好比告诉深度头:“注意,这块区域是车辆,你应该更关注车辆可能的深度范围。”
- 反过来,深度头生成的初步深度特征也会通过门控机制去反哺语义头。这好比告诉语义头:“我在这里检测到了一个很近的深度突变,这很可能是一个物体的边缘,请你更仔细地判断它的语义类别。”
- 通过这种双向的“商议” (
Gated-attention
),Semantic Head
和Depth Head
能够生成彼此增强、更加准确的语义和深度预测。
第三步:创造精确且高效的“虚拟点”
这是解决 LSS 痛点的核心步骤。我们不再盲目猜测深度,而是基于线索生成少量但高质量的虚拟点。
Semantic Mask
(语义掩码): 语义头最终输出一张语义分割图,准确地告诉我们图像中每个像素是什么(车、人、路、天空等)。Diffusion
(扩散F
): 将第一步得到的稀疏 LiDAR 深度图,与Semantic Mask
结合。在相同语义的区域内,将稀疏的深度值进行“扩散”或插值。例如,在一个被识别为“车辆侧面”的区域,即使 LiDAR 只打到了几个点,我们也可以合理地推断整个侧面的深度是相似的,从而填充这片区域的深度。这就得到了一个半稠密的深度图。Bi-Linear Discretization
(双线性离散化L
): 这是生成虚拟点的关键一步。它不再像 LSS 那样在整条射线(几十上百个点)上生成虚拟点。而是根据上一步得到的 半稠密深度图 ,在每个像素对应的 精确深度值附近 ,通过双线性插值的方式,只生成 极少数(例如 2-4 个) 高质量的虚拟点。因为我们的深度估计已经相当准了,所以只需要在真实深度附近小范围采样即可。同时,语义掩码会告诉我们哪些区域(如天空)根本不需要生成虚拟点。- 结果: 我们得到了一批数量可控、位置精准的“虚拟点云”。
第四步:特征融合与 BEV 特征生成
现在我们有了精确的虚拟点,需要给它们赋予对应的图像特征,然后汇集到 BEV 空间。
Context Feature
&Depth Head
Feature:Depthnet
中提取的上下文特征(Context Feature
)和Depth Head
输出的深度相关特征,共同构成了每个虚拟点要携带的丰富信息。⊗
(Outer Product): 通过外积操作,将虚拟点的位置信息和其对应的图像特征(Context Feature
+Depth Head
Feature)进行高效融合。BEV Pooling
: 最后,将所有携带了丰富特征的、精确的虚拟点,汇集(Pool)到一个统一的 BEV 网格中。由于我们的虚拟点数量少且位置准,这个过程就像是精准地“点描”,而不是 LSS 的“泼墨”。最终生成高质量、信息密集的图像 BEV 特征 (image BEV features
)。
SDG 如何解决 BEV 稀疏问题
- 告别盲猜: SDG 不再盲目猜测深度,而是利用 LiDAR 提供的“绝对真理”(稀疏深度)作为锚点。
- 语义引导: 它利用图像的语义信息(哪里是车、哪里是路)来指导深度的“扩散”和虚拟点的生成,避免了在天空、远景等无关区域浪费计算。
- 智能交互: 通过门控注意力机制,让语义和深度的预测互相帮助,提升彼此的精度。
- 精准打击: 最终只在最可能存在物体的位置生成少量、高质量的虚拟点,大大减少了计算量。
- 密集 BEV 特征: 因为虚拟点的位置和特征都更可靠,最终汇集成的 BEV 特征图自然就更密集、更有效,为下游的 3D 检测或分割任务提供了更高质量的输入,从而提升了最终的精度和速度。
LSS 是“广撒网,捞不上鱼”,而 SDG 则是“用声呐(LiDAR+语义)定位鱼群,再精准下网”,效率和效果自然不可同日而语
这张图展示的是 SDG-OCC 中最核心的两个“杀手锏”:如何优雅地融合特征以及如何聪明地进行知识蒸馏。
我们先抓住核心矛盾:
- 图像特征(Image Features)色彩纹理丰富,但不知道物体的精确远近和形状。
- LiDAR 特征(LiDAR Features)有精确的 3D 几何结构,但稀疏且没有颜色。
- 直接相加/拼接(Naive Fusion) 会出问题,因为由于微小的标定误差或物体运动,两种特征在 BEV 空间上可能无法完美对齐,就像两张没对齐的透明胶片,叠起来图像会模糊。
SDG-OCC 的融合与蒸馏模块就是为了解决这个“对不齐”和“让图像分支变聪明”的问题。
Part 1: 动态邻域特征融合 (解决“对不齐”的问题)
这部分对应图 (c)
的上半部分流程,最终目的是生成高质量的融合特征 F_bev^fuse
。它本质上是一个升级版的、更智能的“复制-粘贴”。
让我们跟着图 (c)
的上半部分走一遍:
-
输入 (Inputs):
Source Feature
(源特征): 来自图像分支的 BEV 特征图。我们把它想象成一张内容丰富但缺少 3D 信息的“底图”。Cross Feature
(交叉特征): 来自 LiDAR 分支的 BEV 特征图。我们把它想象成一张有精确轮廓但内容单一的“轮廓图”。
-
定义“查找范围” (Query, Key, Value):
- Query (查询): 从
Source Feature
(图像底图) 中取出一个像素点的特征。这个Query
就好像在问:“我这个像素点,对应到 LiDAR 轮廓图上,应该是什么样子?” - Key (键) & Value (值):
Cross Feature
(LiDAR 轮廓图) 同时充当Key
和Value
。Key
用于和Query
进行匹配,Value
则是匹配成功后要被“复制”过来的内容。这里,作者做了一个巧妙的设计,不是点对点匹配,而是让Query
与Cross Feature
中的一个邻域小方块 (patch) 进行匹配。这就解决了轻微的错位问题,因为即使中心点没对准,在周围的小范围内总能找到正确的对应关系。
- Query (查询): 从
-
计算相似度并加权 (Weight Calculation):
- 将
Query
(图像特征) 与Cross Feature
邻域小方块中的所有Key
(LiDAR 特征) 进行比较,计算相似度。 - 同时,加入一个
Positional Bias
(位置偏置)。这是一个很关键的修正项,它根据相对位置信息进行补偿,相当于告诉模型:“即使特征本身不太像,但如果它就在你应该在的位置,也请多给点关注”。 - 将计算出的相似度和位置偏置相加,得到一个权重图 (Weight)。这张权重图表明,LiDAR 邻域小方块中的哪些像素点与当前图像像素点最相关。
- 将
-
门控注意力机制 (Gated-attention, representada por
G
):- 这是一个“审核”环节。上一步得到的
Weight
会经过一个 Sigmoid 函数(σ
),生成一个 0 到 1 之间的“门控信号”。 - 这个信号就像一个阀门,它会去动态地调整(element-wise multiply)从
Cross Feature
中提取出的Value
。如果门控信号接近 1,说明 LiDAR 的信息非常可信、非常重要,就让它顺利通过;如果接近 0,说明 LiDAR 的信息可能没用甚至是干扰,就把它抑制掉。
- 这是一个“审核”环节。上一步得到的
-
生成融合特征 (Fusion Feature):
- 经过“审核”后的
Value
,再与原始的Source Feature
(图像特征) 进行相加(element-wise add)。 - 最终得到融合后的特征
F_bev^fuse
。这个特征既保留了图像丰富的纹理信息,又通过智能查找和动态审核,精确地融入了 LiDAR 的几何结构信息,而且还克服了错位问题。
- 经过“审核”后的
小结 (Part 1): 这个过程不是简单地把 LiDAR 特征 +
到图像特征上,而是图像特征作为“向导” (Query
),主动地去 LiDAR 特征的邻域中“搜寻” (Key
) 并“复制” (Value
) 最相关、最可信的几何信息,最后再补充到自己身上。
Part 2: 占用驱动的主动蒸馏 (让图像分支变聪明)
这部分对应图 (c)
的下半部分流程。它的核心思想是:融合特征 F_bev^fuse
虽然效果好,但它依赖 LiDAR,计算成本高。我们能不能在训练时用它来“教会”纯图像分支,让图像分支在推理时(没有 LiDAR 的情况下或为了追求极致速度)也能达到接近融合的效果?这就是知识蒸馏。
-
什么是“占用驱动 (Occupancy-driven)”?
- BEV 空间中,大部分区域是空地(非占用),只有少数区域有车、人等物体(占用)。在空地上,LiDAR 和图像的信息差别不大,没必要花大力气去学习。
- “占用驱动” 指的是,我们只在那些被物体占据的“活跃”区域,才进行知识的重点转移。这就像老师辅导学生,不会把整本书都划重点,只会把最重要的章节和最难的考点(被占用的区域)圈出来,让学生重点学习。
-
什么是“主动蒸馏 (Active Distillation)”?
- 这里的“主动”体现在方向性上。知识是单向地从“老师”(
F_bev^fuse
,融合特征)流向“学生”(F_bev^img
,纯图像特征)。 - 如图
(c)
所示,从F_bev^fuse
出发,经过一个名为Occupancy-driven active distillation
的模块,去指导F_bev^img
的更新。
- 这里的“主动”体现在方向性上。知识是单向地从“老师”(
-
如何实现 (结合图 (b) 理解)?
- 图
(b)
展示了SDG-KL
,这里的 KL 指的是 KL 散度 (Kullback-Leibler divergence),这是一种衡量两个概率分布差异的数学工具,在知识蒸馏中常被用作损失函数。 - 在训练时,模型会计算“老师”输出的特征分布 (
Fusion Feature
) 和“学生”输出的特征分布 (Image Feature
) 之间的 KL 散度。 - “占用驱动” 在这里体现为:这个 KL 散度损失只在被占用的“活跃”区域进行计算和反向传播。在非占用区域,这个损失的权重会很低甚至是零。
- 通过最小化这个“有重点的”KL 散度损失,模型被强迫去优化纯图像分支的网络参数,使其生成的
F_bev^img
在关键区域无限接近于融合后的F_bev^fuse
。
- 图
小结 (Part 2): 这是一个“教学”过程。“老师”(融合模块)把自己最精华的知识(在占用区域的、融合了 LiDAR 信息的特征),通过“划重点”(占用驱动)的方式,“传授”(主动蒸馏)给“学生”(图像分支)。经过反复训练,学生最终学到了老师的精髓,即便以后老师不在(推理时不使用 LiDAR),学生也能独立解决难题。 这极大地提升了模型的鲁棒性和实时性。
整体逻辑总结
- SDG-Fusion (图 a): 首先,通过图
(c)
上半部分的动态邻域融合机制,将图像和 LiDAR 特征智能地融合成一个高质量的F_bev^fuse
。 - SDG-KL (图 b): 然后,在训练阶段,利用图
(c)
下半部分的占用驱动主动蒸馏机制,将F_bev^fuse
的知识单向地、有重点地蒸馏给纯图像特征F_bev^img
。 - 最终结果: 我们得到了一个双重优势:
- 在部署时,如果计算资源充足且需要最高精度,我们可以使用完整的融合模型(SDG-Fusion)。
- 如果需要极致的实时性或在 LiDAR 失效的情况下,我们可以只使用被“教会”了的、性能强大的纯图像分支,因为它已经通过蒸馏学到了 LiDAR 的几何先验知识。
看懂MoCa:如何将“单向生成”的AI模型,调教成“双向理解”的检索大师
现在的AI模型,给它一张图,它能写出一段描述;你给它一段话,它能生成一幅画作。这些模型是出色的**“生成者”或“描述者”**。
但这里有个问题:当你让它们去做一些需要深度 “理解” 的任务时,比如“请在我的相册里,找出那张‘傍晚在海边,一只金毛犬追逐红色飞盘’的照片”,它们往往表现不佳。
为什么会这样?MoCa框架正是为了解决这个核心矛盾而生。
核心问题:为什么AI“看得懂”却“找不准”
目前的视觉-语言模型(VLM)存在三大“先天缺陷”,导致它们在图文检索这类理解任务上力不从心。
-
缺陷一:思维是“单行道”(单向注意力)
- 问题:这些模型处理信息的方式就像我们阅读一本书,从左到右,一路读下去,无法方便地回头看上下文。这种“因果注意力”机制,让它在生成文本时很流畅,但在需要反复比对图像和文本细节时,就显得笨拙。
- 比喻:它就像一个只能顺着路标开车的司机,无法随时掉头或查看地图全局,因此很容易错过最佳路线(最佳匹配)。在图文检索中,它要么偏重于看图,要么偏重于读文字,很难将两者完美地结合起来双向思考。
-
缺陷二:饮食太“单一”(训练数据单一)
- 问题:传统模型主要靠“一张图 + 一句短描述”这种简单的“图文对”进行训练。这就像一个学生只做选择题,虽然基础扎实,但一遇到需要长篇论述的复杂问题就束手无策。
- 比喻:这好比一个只吃“米饭+青菜”的人,虽然能活,但营养不均衡,不够强壮。单一的数据让模型无法学会处理真实世界中复杂的图文关系(如一篇带有多张插图的新闻报道)。
-
缺陷三:食材太“昂贵”(数据获取困难)
- 问题:制作高质量的“图文对”需要大量人工标注,成本极高。与此同时,互联网上存在海量的、没有配对的图片和文本(比如,一个图片库和一部小说),这些宝贵的数据资源都被浪费了。
MoCa的目标:就是要把这些“单行道”思维的生成模型,通过一种轻量级、低成本的方式,改造成一个能够“双向思考”、精于理解和检索的“全能选手”。
MoCa的“两步改造法”:从单向到双向,从理论到实战
MoCa的设计分为两个核心阶段,就像一个完整的“培训课程”。
阶段一:学会“双向思考” —— 联合重建预训练
这是最关键的一步,目的是打破模型的“单行道”思维模式。
- 核心思想:玩一个“填空拼图”游戏。
- 具体做法:研究者从海量无标注数据中,随意拿来一张图和一段文字。然后,随机“遮住”(Mask)图片的一部分区域和文字中的几个词。模型的任务就是,看着没被遮住的部分,同时“猜出”被遮住的图片和文字是什么。
- 猜文字(MLM):输入“一只[遮住]在草地上奔跑”,模型需要根据图片和上下文猜出“狗”。
- 猜图片(MAE):遮住图片中狗的头部,模型需要根据文字描述“一只金毛犬”和图片中身体的部分,把头部“画”回来。
- 具体做法:研究者从海量无标注数据中,随意拿来一张图和一段文字。然后,随机“遮住”(Mask)图片的一部分区域和文字中的几个词。模型的任务就是,看着没被遮住的部分,同时“猜出”被遮住的图片和文字是什么。
- 为什么有效?
- 这个“猜谜”任务强迫模型必须同时利用图像和文本的线索。想猜对词,必须看懂图;想补全图,必须读懂文字。一来二去,模型内部就自然而然地建立起了图像与文本之间的“双向立交桥”,学会了同时从两个方向进行理解和推理。
- 巨大优势:这一步几乎零成本,因为它使用的是海量、免费的无标注数据,解决了数据昂贵的问题。
解释:就像教一个孩子认字,你不仅给他看“苹果”这两个字,还指着真实的苹果。然后你遮住“果”字让他猜,再遮住苹果的一部分让他想象。通过这种互动,他才能真正建立“苹果”这个词和实体苹果之间的双向联系。
阶段二:适应“真实战场” —— 异构对比微调
模型学会了“双向思考”的基本功,但还需要针对“考试”(实际任务)进行强化训练。
- 核心思想:用多样化的“模拟题”进行实战演练。
- 传统方法的局限:只用“短图文对”进行微调,好比考生只刷一种题型,容易死记硬背,缺乏泛化能力。
- MoCa的创新:它把各种不同类型的数据混合在一起,进行“对比学习”。对比学习的目标是让模型拉近“正确配对”的距离,推远“错误配对”的距离。
- 长文档配图:训练模型处理复杂的逻辑和长篇内容,好比做“阅读理解大题”。
- 传统短图文对:巩固基础,好比做“看图说话选择题”。
- 纯文本对:增强模型对语言的理解能力,即使没有图片也能举一反三。
- 为什么有效?
- 这种“大杂烩”式的训练,模拟了真实世界中信息的多样性。模型见多识广,就不会在某个特定任务上“偏科”,其生成的向量表示(Embedding)既能捕捉宏观语义,又能识别微观细节,泛化能力和鲁棒性大大增强。
MoCa在各项测试中都取得了优异的成绩。
- “越级挑战”成功:一个经过MoCa改造的30亿参数(3B)的小模型,其性能竟然可以媲美甚至超越一个未经改造的70亿参数(7B)的大模型。这证明了MoCa框架的高效性和轻量化优势。
- 全面领先:在包含36个任务的MMEB和7个任务的ViDoRe-v2等多个权威基准测试中,MoCa都名列前茅,尤其是在需要深度理解和细节推理的复杂文档检索任务上,表现尤为突出。
- 每个环节都不可或缺:实验证明,如果去掉第一阶段的“填空拼图”游戏,或者在第二阶段只用单一数据训练,模型性能都会大幅下降。这验证了MoCa设计的科学性和完整性。
MoCa框架的成功之处在于:
- 技术创新:它首创性地通过“联合重建任务”(填空+拼图),巧妙地将VLM的“单行道”思维改造成了“双向立交桥”,解决了模型理解能力不足的根本问题。
- 方法高效:它充分利用了海量、廉价的无标注数据进行预训练,再通过多样化的数据进行精调,实现了低成本、高性能的完美结合。
- 现实意义:MoCa为如何利用现有的强大生成模型,并将它们的能力拓展到更深层次的“理解”领域,提供了一条清晰可行的道路。