MonoOcc 论文学习

代码链接:https://github.com/ucaszyp/MonoOcc

论文链接:https://arxiv.org/abs/2403.08766

简介

单目语义占用预测的目标是从 2D 图像中推理出一个场景的完整的 3D 几何和语义信息。由于能增强自动驾驶车辆的 3D 感知能力,它受到了越来越多的关注。但是现有的方法具有以下几点缺陷:

  • 框架复杂:依赖复杂的级联框架。
  • 信息有限:用于重建 3D 场景的信息不足,体现在三点:
    • 监督信号弱:只在最终网络输出端进行监督,中间过程缺乏指导。
    • 输入单一:只使用了单帧图像,没有利用时间序列信息。
    • 主干网络小:使用的图像特征提取器能力有限。

于是,导致框架优化困难,预测效果不佳,尤其是针对小物体和不常见的物体的识别效果差。为了解决这些问题,本文提出了 MonoOcc,主要改进有两点:

  • 改进单目占据预测框架本身:
    • 辅助语义损失:在网络浅层(靠近输入部分)增加了一个额外的监督信号,帮助网络更早、更好地学习特征。
    • 图像条件化交叉注意力模块:设计一个新模块,利用图像中的视觉线索来精修 3D 体素特征,加强2D图像和3D空间的特征融合。
  • 引入知识蒸馏模块,以较低的成本,将更丰富的知识迁移到当前框架中,
    • 知识来源:
      • 时间信息:从一个能处理多帧时序数据的教师网络中蒸馏。
      • 更强大的图像特征:从一个更大的图像主干网络中蒸馏。

综合这些优势,MonoOcc 在权威的基于相机的 SemanticKITTI 场景补全基准测试中,取得了最先进的性能。

3D 场景理解在自动驾驶中至关重要,是自动驾驶系统的基础,直接决定下游任务的性能。过去几年,基于激光雷达的 3D 感知算法发展迅速,是室外3D理解的成熟方案,但是硬件成本昂贵,限制了大规模商用。当前的技术热点是单目 3D 场景理解,仅需普通摄像头,硬件成本极低,能提供详细的纹理、颜色等视觉信息,已获得机器人/自动驾驶社区的大量关注。该领域中一个热门课题就是语义占据预测(或语义场景补全),仅依靠单目观测,预测整个场景的每一个体素的语义占据情况。核心挑战就是,不仅要预测可见区域,还必须推断出被遮挡区域的内容。也就是说,要从一张2D图片,"脑补"出完整3D空间的几何和语义信息。

当前前沿的方法如 VoxFormer,提出了一个"稀疏到稠密"的框架来解决单目语义占据预测任务,通过基于深度的 queries 在体素空间聚合 3D 特征,然后基于 queries 的特征来补全整个场景。它主要存在三个关键缺陷,这些缺陷阻碍了性能的进一步提升。

  • 对深度估计误差敏感,深度一旦估不准,这些初始查询的位置和特征就会出错。错误的查询会污染后续所有步骤,极大地增加了后续"场景补全"和"语义解析"网络的难度。
  • 监督信号单一且滞后,网络优化困难。所有现有方法(包括VoxFormer)都只依赖最终输出的3D真值来进行监督训练。这些方法通常是一个深的、级联的异构架构,含有2D图像主干网络、2D到3D的视图变换模块、3D场景补全网络。仅用最终损失来反向训练这个复杂的、由不同性质模块组成的"长链条",会导致梯度传递困难、优化效率低下。浅层模块(如图像主干)难以得到有效、直接的指导。
  • 信息利用不充分,忽略时序上下文。只使用单帧输入,缺乏多帧提供的运动视差、时间一致性等丰富信息,对于小物体、长尾物体的预测失败率较高,因为单帧图像提供的线索非常有限。

本文提出了两个核心创新。

  • 改进单目占据预测框架本身,针对深度估计不准、监督信号单一的问题,作者在基础框架内做了两项改进,
    • 图像条件化交叉注意力模块:纠正因深度估计不准而产生的不准确体素特征,引入一个注意力机制,让3D体素特征能够不断地、有选择地从2D图像特征中"查询"和"提取"有用的视觉线索,用更可靠的图像信息来精修和校准3D体素特征。这减少了模型对初始深度估计的绝对依赖。
    • 辅助语义损失:解决了监督信号单一滞后、浅层难优化的问题。在框架的浅层(例如,2D主干网络或2D-3D变换后)额外增加一个语义预测任务和监督信号。这为网络的早期部分提供了直接的、中间层的指导,使得整个级联框架的训练更高效、更稳定。
  • 利用大模型与时空信息进行知识蒸馏,针对 "信息源单一(只用单帧)" 和 "主干网络小" 的问题,作者引入了外部知识:
    • 理念升级:作者指出,当前方法只用小型主干网络。然而,大型预训练的2D图像主干网络(如一些视觉基础模型)已被证明在2D任务上具有强大的泛化能力,但尚未在SSC任务中被有效利用。
    • 解决方案:特权分支蒸馏,设计了一个特权分支(教师模型),这个分支被赋予了特权,它的输入更丰富,接收多帧时序图像作为输入,利用时间信息来减少遮挡区域的不确定性。并且,它使用了更大的预训练图像主干网络。不是为了直接使用这个又大又慢的"特权分支",而是通过知识蒸馏,将其学到的关于时空和语义的"丰富知识",迁移到最终使用的、轻量级的单帧单目模型(学生模型)中。最终部署的模型依然保持高效、紧凑,适合实际应用,但却拥有了从大模型和时空中学到的强大推理能力。

这两大创新分别从框架内部优化和外部知识注入两个角度,系统性地解决了前文指出的所有三个缺陷。在SemanticKITTI测试集上的结果(如下图所示)证明,他们的方法在整体性能、小物体识别、长尾物体识别上都比现有最佳方法有显著提升。

相关工作

基于相机的 3D 感知

近年来,基于相机的3D感知技术受到日益增长的关注。相比于激光雷达,相机图像能提供纹理、颜色等视觉信息,传感器更易安装和维护,价格低廉。当前研究主要集中于构建鸟瞰图特征表示,然后在BEV空间中进行各种下游任务(如检测、分割、预测)。主要有两大技术流派:

  • 前向投影法,典型的是 LSS,将图像特征"提升"到3D空间(通过预测每个像素的深度分布),然后"泼洒"并聚合到BEV平面,明确建模了深度不确定性。
  • 后向投影法,典型的是 BEVFormer,在BEV空间中定义一组可学习的查询,利用可变形注意力的时空Transformer,从多帧图像中自适应地"采集"相关的2D特征来构建BEV特征。它利用了时序信息,注意力机制更灵活。

作者指出,3D占据表示比BEV表示包含了更丰富的空间信息。BEV 丢失了垂直方向的细节,而 3D 占据是完整的体素网格,能刻画更精细的 3D 结构。这种丰富的3D信息对自动驾驶的感知和规划能力至关重要。

基于相机的 3D 语义占据预测

SemanticKITTI数据集的发布,为该任务提供了基准,从而催生了一系列室外单目 3D 语义占据的研究工作。这里按照发展顺序和逻辑介绍了四种代表性的工作:

  • MonoScene:开创性的工作,沿着相机视线方向,将2D图像特征投影到3D空间,生成体素特征,然后使用经典的3D UNet来处理这些体素数据,完成场景补全和语义预测。它为单目3D语义占据预测任务建立了基础的框架范式。
  • TPVFormer:高效表示法,提出了一种三视角表示,作为BEV表示的替代方案。该方法从三个正交平面(俯视、前视、侧视)来表征3D空间,是一种既简单又高效的方法,能够更好地捕捉3D结构的细节。
  • OccFormer:高效计算法,设计了一种双路径Transformer模块,包含局部Transformer和全局Transformer。通过将3D空间的联合处理"分解"为局部和全局两个路径,来降低直接处理整个3D体素网格所带来的巨大计算负担。
  • VoxFormer:稀疏到稠密法,查询设计使用基于深度估计的提议查询来代替BEV查询,从图像中聚合特征。这相当于先用深度估计生成一些稀疏的、可能被占据的位置作为"种子"。补全机制则引入了一个类似 MAE 的设计,利用这些稀疏的查询,通过Transformer来预测和补全整个稠密的占据网格。这是目前最佳的方法。

方法

整体架构如下图所示。

稀疏到稠密的单目 3D 语义占据预测

图像特征提取器

为了从 RGB 图像 I t I_t It 提取 2D 特征图 F t 2 D ∈ R d × h × w F_t^{2D} \in \mathbb{R}^{d\times h\times w} Ft2D∈Rd×h×w,本文使用了一个图像特征提取器 Φ f \Phi_f Φf,它包含 ResNet-50 主干网络和 FPN, d d d和 ( h , w ) (h,w) (h,w) 分别表示图像特征的维度和分辨率。稍后,作者也利用了一个在多样化的自动驾驶数据集上预训练的更强大的图像特征提取器。

基于深度的查询

延续了 VoxFormer,基于预训练深度网络预测的深度图,生成一组稀疏的、基于深度的初始 3D 查询 Q d Q_d Qd,一共有 N d N_d Nd个。具体步骤就是,

  • 输入单张 RGB 图像,使用一个预训练好的深度估计网络,预测一个深度图,每个像素都有一个深度值。
  • 从2D到3D点云,通过反投影做到,利用预测的逐像素深度,结合相机内参,将这些2D图像像素"反投影"到3D空间中,形成一个稀疏的3D点云。这些点代表了图像中可见物体表面的可能位置。
  • 体素化:将上一步生成的3D点云,离散化到一个规则的3D体素网格中。如果一个体素内包含反投影进来的点,就认为这个体素是初始被占据的。这样就得到了一个初始的、稀疏的3D占据栅格。
  • 精炼与生成最终查询:
    • 校正:初始占据栅格直接来自深度图,深度误差会导致其中有很多噪声(错误占据或错误空置)。
    • 校正网络:使用一个占据预测网络 LMSCNet 对这个初始的、有噪声的占据栅格进行处理,目的是"去噪"和校正,得到一个更可靠的、稀疏的占据概率分布。
    • 从校正后的占据网格内,选取最有可能被占据的 N d N_d Nd 个体素位置,以这些体素的位置(3D坐标)作为索引,从图像特征中提取或聚合对应的特征,共同构成了最终的初始查询集 Q d Q_d Qd。这里, N d N_d Nd 是一个预设的、较小的数值,以保证计算效率。

体素特征提取器

延续了 VoxFormer,生成体素特征 F ^ S 3 D ∈ R x × y × z × d \hat{F}_S^{3D} \in \mathbb{R}^{x\times y\times z\times d} F^S3D∈Rx×y×z×d 的过程可以分为两步,

  • 获取可见区域的特征 O S 3 D ∈ R N d × d O_S^{3D} \in \mathbb{R}^{N_d\times d} OS3D∈RNd×d,利用 Q d Q_d Qd 通过可变形交叉注意力机制将 2D 特征 F t 2 D F_t^{2D} Ft2D 聚合到 3D 空间,

O S 3 D = D C A ( Q d , F t 2 D ) O_S^{3D} = DCA(Q_d, F_t^{2D}) OS3D=DCA(Qd,Ft2D)

对于一组时域特征 F { t , t − 1 , . . . } 2 D ∈ R N × d × h × w F^{2D}_{\{t,t-1,...\}}\in \mathbb{R}^{N\times d\times h\times w} F{t,t−1,...}2D∈RN×d×h×w,个数为 N N N,通过聚合特征的均值得到 O T 3 D O_T^{3D} OT3D,

O T 3 D = 1 N D C A ( Q d , F { t , t − 1 , . . . } 2 D ) O_T^{3D}=\frac{1}{N}DCA(Q_d, F^{2D}_{\{t,t-1,...\}}) OT3D=N1DCA(Qd,F{t,t−1,...}2D)

  • 用 mask tokens M ∈ R d M\in \mathbb{R}^{d} M∈Rd 填补遮挡的区域,获得整个场景的初始体素特征 F S 3 D ∈ R x × y × w × h F_S^{3D}\in \mathbb{R}^{x\times y\times w\times h} FS3D∈Rx×y×w×h,然后用可变形自注意力机制来更新 F S 3 D F_S^{3D} FS3D,得到 F ^ S 3 D \hat{F}_S^{3D} F^S3D。

F ^ S 3 D = D S A ( F S 3 D , F S 3 D ) \hat{F}_S^{3D}=DSA(F_S^{3D}, F_S^{3D}) F^S3D=DSA(FS3D,FS3D)

语义体素图

对 F ^ S 3 D \hat{F}_S^{3D} F^S3D进行上采样和线性映射,即可预测出语义体素地图 Y t ∈ R X × Y × Z × C Y_t\in\mathbb{R}^{X\times Y\times Z\times C} Yt∈RX×Y×Z×C,其中 ( X , Y , Z ) (X,Y,Z) (X,Y,Z)表示3D体的分辨率, C C C是类别个数,包括没被占据的。

单目语义占据预测的改进架构

基于图像的交叉注意力

VoxFormer 将语义占据预测看作为一个生成任务,类似于 MAE 的 transformer 基于可见的场景脑补出遮挡场景。数学上,给定可见区域 O S 3 D O_S^{3D} OS3D 和初始体素特征 F S 3 D F_S^{3D} FS3D,可以通过下面式子得到整个场景优化后的特征 F ^ S 3 D \hat{F}_S^{3D} F^S3D,

F ^ S 3 D = C o m p l e t e ( F S 3 D ∣ O S 3 D ) \hat{F}_S^{3D}=Complete(F_S^{3D} | O_S^{3D}) F^S3D=Complete(FS3D∣OS3D)

其中 C o m p l e t e ( ∣ ˙ ) ˙ Complete(\dot|\dot) Complete(∣˙)˙ 表示基于后者补充前者。在 O S 3 D O_S^{3D} OS3D 的生成过程中,深度估计不准确会引入错误的几何信息,给整个场景的补全带来不确定性。作者相信输入图像的特征能帮助纠正错误,因为它们提供了语义线索。因此,作者基于 O S 3 D O_S^{3D} OS3D 和 F t 2 D F_t^{2D} Ft2D 来补全场景:

F ~ S 3 D = C o m p l e t e ( F S 3 D ∣ O S 3 D , F t 2 D ) \tilde{F}_S^{3D}=Complete(F_S^{3D}|O_S^{3D}, F_t^{2D}) F~S3D=Complete(FS3D∣OS3D,Ft2D)

这可以通过可变形交叉注意力机制实现。本文将 F ^ S 3 D \hat{F}_S^{3D} F^S3D 看作为查询, F t 2 D F_t^{2D} Ft2D 看作为 key 和 value,利用可变形交叉注意力机制来获得纠正后的体素特征,

F ~ S 3 D = D C A ( F ^ S 3 D , F t 2 D ) \tilde{F}_S^{3D} = DCA(\hat{F}_S^{3D}, F_t^{2D}) F~S3D=DCA(F^S3D,Ft2D)

2D 语义辅助损失

占据预测网络是一个长级联架构,包含了不同领域的模型,如 2D 特征提取器、2D-3D 交叉注意力、3D补全自注意力和占据头,这增加了优化的难度。于是作者提出了一个 2D 辅助语义损失,为特征提取器提供深度监督信号。它在反向传播中为特征提取器提供了较短的路径,使特征提取器能被更好地优化。

关于 2D 语义损失的实现,首先使用一个由卷积层和全连接层组成的语义解码器 Φ s \Phi_s Φs,从图像特征 F t 2 D F_t^{2D} Ft2D 来预测语义图 S e m t 2 D Sem_t^{2D} Semt2D,

S e m t 2 D = Φ s ( F t 2 D ) Sem_t^{2D} = \Phi_s(F_t^{2D}) Semt2D=Φs(Ft2D)

然后将带有语义标签的点云投影到对应的图像上,生成稀疏的真值。最后,使用交叉熵损失 L s e m \mathcal{L}_{sem} Lsem,比较真值和 S e m t 2 D Sem_t^{2D} Semt2D 来直接优化特征提取器。

特权分支

预训练扩大规模的特征提取器

本文指出了在SemanticKITTI数据集上直接使用更大图像主干网络面临的两个根本性难题,

  • 数据量太少,导致过拟合,SemanticKITTI数据集仅包含约1.2万张图像。大型神经网络(拥有数百万甚至数十亿参数)需要海量数据才能充分训练,学到泛化能力强的特征。在如此小的数据集上直接训练大模型,会迅速过拟合------即模型只是记住了训练数据的细节和噪声,而无法泛化到新场景,导致实际性能下降。
  • 标注质量不足,难以有效学习,
    • 数据集提供的3D语义标签是稀疏的(仅来自激光雷达扫描点),而非稠密的3D体素标签。这意味着大量的3D空间没有监督信号,对于需要学习丰富空间表征的大模型来说,这是"吃不饱"。
    • 数据集中存在许多长尾类别(如 other-vehicle, truck, other-ground),这些类别的样本点数量极少(占比仅0.2%、0.16%、0.56%)。

在数据量小、标注稀疏且分布极不均衡的情况下,直接训练大模型不仅是低效的,甚至是有害的。模型会严重偏向于样本多的类别,几乎不可能学会识别这些稀有的长尾物体。

为了解决上述两个问题,采用了两步走迁移学习策略,

  • 在更大规模的驾驶场景数据上进行预训练:让大模型先在与任务相关的、更丰富的数据上学习驾驶场景的通用视觉特征,从而获得强大的初始表征能力。这可以缓解直接在SemanticKITTI上训练导致的数据饥饿和过拟合问题。
  • 选用强大的预训练模型作为主干:作者选用 InternImage-XL 模型作为特权分支的视觉主干网络 Φ p \Phi_p Φp。这是一个参数量巨大、性能强大的现代图像主干网络。

F ^ { t , t − 1 , . . . } 2 D = Φ p ( I { t , t − 1 , . . . } 2 D ) \hat{F}{\{t,t-1,...\}}^{2D} = \Phi_p(I{\{t, t-1,...\}}^{2D}) F^{t,t−1,...}2D=Φp(I{t,t−1,...}2D)

其中 t t t表示第 t t t帧图像。

跨视图的 Transformer

已有工作证明,时序信息能提升3D场景感知。单帧固有的缺陷:

  • 在将2D特征聚合到3D体素时,通常只将体素的中心点投影到图像上作为参考点。
  • 由于体素分辨率有限,体素中心与物体在3D空间中的真实位置存在偏差。这个几何偏差会影响单帧的占据预测精度。
  • 解决方案: 引入更多视角(即多帧图像)可以缓解此问题。不同帧提供了对同一物体的略微不同的观测,多视角信息可以相互校正,更准确地定位物体在3D空间中的真实位置。

为了充分利用多帧信息,作者设计了一个两阶段特征增强流程:

  • 跨视图特征融合(核心创新):引入了跨视图的 Transformer,在将各帧特征提升到3D空间之前,先在2D特征层面对它们进行深度融合和增强。

    • 先用强大的图像主干网络(InternImage-XL)独立地提取每一帧图像的2D特征。
    • 为每帧特征添加位置编码,让模型知道这些特征来自不同时间点。
    • 将按时间顺序相邻的帧特征配对,输入CVT模块。CVT会让相邻帧的特征之间进行注意力交互,从而融合时空信息,增强特征的表达力。例如,当前帧中一个模糊的物体,可以通过参考前一帧中更清晰的特征来得到增强。
  • 特征提升到 3D 空间:使用可变形交叉注意力,将上一步CVT增强后的、富含时空信息的2D特征,通过DCA机制,"提升"并聚合到3D体素空间中,形成最终的3D场景表示。

蒸馏模块

上一节构建了一个强大的"特权分支",它通过多帧输入和超大图像主干,获得了极其丰富的视觉线索。但这种设计计算成本巨大(要处理多帧、大模型),严重影响在自动驾驶系统中的实际部署。这违背了使用低成本相机的初衷。为了解决"既想性能好,又要跑得快"的矛盾,作者提出了蒸馏模块,让"学生模型"从拥有额外信息(特权)的"教师模型"中学习。

模块构成:

  • 特权教师分支: 即前文所述的、拥有"特权"(多帧输入、大主干网络)的强大但笨重的模型。
  • 单目学生分支: 即最终要部署的、目标模型(MonoOcc本身),它只有单帧输入和较小的主干,追求高效。
  • 核心目标: 将教师分支所拥有的丰富知识(来自时序信息的线索 + 来自大主干的先验知识),迁移到学生分支中。从而让学生分支在不增加推理时计算负担的情况下,获得性能提升。

损失函数采用了 KL 散度,用于衡量学生模型的输出分布与教师模型的输出分布之间的差异。通过最小化这个差异,迫使学生的预测向教师的"更明智、更准确"的预测看齐。

L d i s t i l l = K L ( F ~ T 3 D ∣ ∣ F ~ S 3 D ) \mathcal{L}{distill} = KL(\tilde{F}{T}^{3D} || \tilde{F}_S^{3D}) Ldistill=KL(F~T3D∣∣F~S3D)

训练损失

回顾整个训练过程,利用了多个损失函数来监督网络的不同组件,

  • 对于特征提取器,采用了损失 L s e m \mathcal{L}_{sem} Lsem。
  • 对于补全网络,提出了时域蒸馏损失 L d i s t i l l \mathcal{L}_{distill} Ldistill。
  • 对于最终输出的语义网格图,使用了 MonoScene 里面的损失函数 KaTeX parse error: Expected 'EOF', got '}' at position 18: ...athcal{L}{ssc}}̲、 L s c a l s e m \mathcal{L}{scal}^{sem} Lscalsem和 L s c a l g e o \mathcal{L}_{scal}^{geo} Lscalgeo。

最终的损失函数表述为:

L = λ 1 L s e m + λ 2 L d i s t i l l + λ 3 L s s c + λ 4 L s c a l s e m + λ 5 L s c a l g e o \mathcal{L}=\lambda_1 \mathcal{L}{sem} + \lambda_2 \mathcal{L}{distill} + \lambda_3 \mathcal{L}{ssc} + \lambda_4 \mathcal{L}{scal}^{sem} + \lambda_5 \mathcal{L}_{scal}^{geo} L=λ1Lsem+λ2Ldistill+λ3Lssc+λ4Lscalsem+λ5Lscalgeo

其中 λ 1 \lambda_1 λ1 等都是超参数。

相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J3 天前
从“Hello World“ 开始 C++
c语言·c++·学习