【论文笔记】Occ3D: A Large-Scale 3D Occupancy Prediction Benchmark for Autonomous Driving

原文链接:https://arxiv.org/abs/2304.14365

1. 引言

目前最流行的视觉感知任务之一是3D目标检测,但3D边界框的估计会忽略物体的几何细节,且模型往往会忽略数据集未标注的物体类别。

3D占用预测可以解决上述问题。3D占用预测可以表达为联合预测3D体素的占用情况(被占用、空、未被观测到)和其对应的语义标签(仅为被占用体素分配)。对未在数据集中定义的类别,可归为“通常物体”(GOs)一类。

但目前,关于3D占用预测的数据集还很少。数据集构建困难的主要原因是稀疏、遮挡和3D-2D的不对齐。本文提出半自动标注流程,由三个步骤组成:体素密集化、遮挡推理和图像指导的体素细化。每个步骤都会通过3D-2D一致性指标进行验证,证明该方法能产生密集而可见性感知的标注。

本文基于Waymo Open数据集和nuScenes数据集建立Occ3D-Waymo和Occ3D-nuScenes数据集。

本文还提出CTF-Occ,一个基于Transformer的、从粗糙到精细的3D占用预测网络。该方法以由粗到细的方式,通过交叉注意力将2D图像特征聚合到3D空间,达到更好的性能。

3. Occ3D数据集

3.1 任务定义

给定传感器的输入序列,3D占用预测的目标是估计3D场景中每一个体素的状态。具体来说,输入为 T T T帧、含 N N N个环视图像的序列 { I i , t ∈ R H i × W i × 3 } ,    i = 1 , ⋯   , N ,    t = 1 , ⋯   , T \{\mathcal{I}_{i,t}\in\mathbb{R}^{H_i\times W_i\times 3}\},\ \ i=1,\cdots,N,\ \ t=1,\cdots,T {Ii,tRHi×Wi×3},  i=1,,N,  t=1,,T和各帧对应的内外参矩阵 { K i } , { [ R i ∣ t i ] } \{K_i\},\{[R_i|t_i]\} {Ki},{[Riti]}。真实标签为体素状态,包括占用状态(被占用、空、未被观测到)和语义标签(类别,或“未知”)。

3.3 数据集建立流程

由于图像无精确的深度信息,用于标注3D占用是不可能的。本文利用激光雷达点云和标注来建立高质量占用标签。但激光雷达点云的稀疏性导致无法获取密集体素。遮挡是指部分体素在图像视图中不可见(需要区分被遮挡的和未被遮挡的体素)。3D-2D的不对齐与3D体素到2D图像的投影有关,这通常由传感器噪声或姿态误差引起。
在这里插入图片描述
上图为本文的标签生成流程。体素密集化步骤中,对静态和动态物体分别进行多帧积累以增加点云密度。然后,使用K近邻算法进行标签分配,并使用网孔重建填补空洞。遮挡推理在激光雷达和相机视图中进行,使用射线投射来标注体素的占用状态。最后,通过图像指导的体素细化来处理不对齐的体素。

3.3.1 体素密集化

动态和静态物体的分割:将静态物体和动态物体分开进行积累,因为为动态物体使用平凡的时间聚合会导致运动模糊。

多帧聚合:对于动态物体,提取各帧边界框内的点并转换到边界框坐标系下,组合得到动态物体的密集点云。对于静态场景,在全局坐标系下进行时间聚合。最后将静态场景与动态物体组合得到密集化的点云。

KNN用于标签分配:为利用未标注的非关键帧,本文使用KNN算法为未标注的点分配标签(标注为最近的 K K K个关键帧的点中,占比最大的语义标签)。

网孔重建:即使进行了多帧聚合,点云的密度也不足以生成高质量密集体素。本文基于VDBFusion(一种基于截断有符号距离函数的体积表面重建方法)进行非地面物体的网孔重建。对于地面,建立均匀的虚拟网格点,并使用小区域内的点拟合局部表面网孔。重建网孔后,进行密集点采样,并使用KNN为样本点分配标签。

3.3.2 用于可见性掩膜的遮挡推理

聚合的激光雷达可见性掩膜:本文使用射线投射操作决定每个体素的可见性。如下图所示,从激光雷达原点投射射线到激光雷达点,若一个体素被射线穿过或包含激光雷达点,则视为“可见的”,否则被分类为“未被观测到”。
在这里插入图片描述
相机可见性掩膜:连接相机原点与被占用体素的中心形成射线,沿射线的第一个被占用体素被视为“被观测到”,其余设置为“未被观测到”。未被相机射线扫描到的体素也被视为“未被观测到”。

3.3.3 图像指导的体素细化

由于激光雷达噪声和姿态偏移,本文使用图像的语义分割掩膜建立3D体素与2D像素的关系。类似上一步中的射线投射方法连接图像原点与占用体素,找到与图像像素语义标签相同的第一个体素,并设置射线穿过的之前所有体素为“空”。
在这里插入图片描述

4. 质量检查

4.1 3D-2D一致性

计算步骤如下:过滤当前帧内与3D-2D一致性相关的2D像素区域,确定其对应的3D体素,并计算语义一致性。
2D ROI:由于2D图像包含激光雷达扫描范围外的区域,本文计算单帧激光雷达的最大覆盖范围作为2D RoI。具体来说,本文将激光雷达点云投影到图像上,然后对于图像的每一列,选择最大的垂直坐标作为该列的高度,该高度下的所有像素组成计算一致性的2D有效区域。
在这里插入图片描述
3D标签查询:确定图像的RoI后,对每个像素进行射线投射,选择最近的3D体素。

4.2 定量结果

相比单帧点云,多帧积累能极大增加召回率,但精度有所降低;体素化能提高精度与召回率,且越大的体素能得到越大的召回率,但精度也会降低。这是因为大体素会导致几何的过度平滑,而小体素会导致出现孔洞。引入网孔重建后,能减小小体素带来的影响。最后,图像指导的细化能促进3D-2D一致性。

5. 从粗到细的占用网络

在这里插入图片描述
如上图所示,本文的CTF-Occ网络首先使用图像主干提取图像特征,然后3D体素查询会通过交叉注意力聚合2D特征。本文的方法使用金字塔体素编码器,通过由粗到细的增量token选择和空间交叉注意力逐步提高体素特征表达,以加强空间分辨率并细化物体的几何细节。

增量token选择:如果将所有体素与多视图图像进行交互,会引入很大的计算量和存储消耗。由于3D场景中的大多数点均为空的,本文提出增量token选择策略,选择性地取出前景和不确定的体素进行交叉注意力的计算。该策略能在不牺牲精度的情况下实现自适应高效计算。具体来说,对每个金字塔层,每个体素会被输入二元分类器,预测改体素是否为空。该分类器使用真实占用图作为监督。然后选择前 K K K个不确定的体素进行后续的特征细化。

空间交叉注意力:使用3D空间交叉注意力,将选择的体素与图像特征交互,细化体素特征。

卷积特征提取器:更新前景体素特征后,使用卷积增强3D体素特征图的特征交互,并在最后使用三线性插值进行上采样。

占用解码器:CFT体素编码器生成体素化输出 V o u t ∈ R W × H × L × C V_{out}\in\mathbb{R}^{W\times H\times L\times C} VoutRW×H×L×C,输入到MLP中获取最终的占用预测 O ∈ R W × H × L × C ′ O\in\mathbb{R}^{W\times H\times L\times C'} ORW×H×L×C,其中 C ′ C' C为语义类别数。此外,还引入隐式占用解码器,使用隐式神经表达提供任意分辨率下的输出。该隐式解码器为MLP,输入为单个体素的特征向量和3D坐标,输出该体素的语义标签。

6. 实验

6.2 与过去的方法比较

Occ3D-Waymo:本文的CTF-Occ能大幅超过过去的方法,特别是对于小物体。这是因为本文的方法在不压缩高度的情况下捕捉了3D体素特征,保留了几何细节。

附录

F. 基准方案的细节

CTF-Occ使用可学习的体素嵌入。体素嵌入首先会在不进行token选择的情况下输入编码层。增量token选择时的 K K K为体素数的固定比例。

使用OHEM损失 L o c c = ∑ k W k L ( g k , p k ) \mathcal{L}_{occ}=\sum_kW_k\mathcal{L}(g_k,p_k) Locc=kWkL(gk,pk)其中 W k , g k , p k W_k,g_k,p_k Wk,gk,pk为第 k k k类的损失权重、标签和预测。金字塔层的二元预测损失为 L b i n = ∑ i L ( f ( g , s i ) , p i ) \mathcal{L}_{bin}=\sum_i\mathcal{L}(f(g,s_i),p_i) Lbin=iL(f(g,si),pi),其中 f ( g , s i ) f(g,s_i) f(g,si)为用语义占用标签生成的第 i i i层的二元体素掩膜(分辨率为 s i s_i si), p i p_i pi为二元分类头的预测结果。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据您提供的引用内容,LNK1104错误通常是由于无法找到指定的库文件而导致的。具体地说,这个错误是由于编译器无法找到名为"vtkCommonCore.lib"的库文件所致。这个库文件可能是您的项目依赖的一个外部库文件。 要解决这个问题,您可以采取以下几个步骤: 1. 确保库文件路径正确:首先,请检查您的项目设置,确保库文件的路径被正确地添加到项目配置中。根据您提供的引用内容,可以尝试添加"C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86"和"c:\ffmpeg-4.0.3\vs2017_build\lib"这两个路径。 2. 在预处理器中定义宏:根据引用内容,您可能需要在预处理器中定义宏"_AFXDLL"。可以通过以下步骤进行设置:在Visual Studio中打开项目的属性页面,然后导航到"C/C++"选项卡,在"Preprocessor"选项中添加宏定义"_AFXDLL"。 3. 检查编译器选项:如果在设置过程中出现错误提示"fatal error C1189: #error: Please use the /MD switch for _AFXDLL builds",这可能是由于编译器选项配置不正确导致的。请确保在项目属性的"C/C++"选项卡中,在"Code Generation"选项下,将"Runtime Library"设置为"/MD"。 4. 检查库文件是否存在:最后,请确保名为"vtkCommonCore.lib"的库文件实际上存在于您指定的路径中。如果库文件不存在,您可能需要重新安装或重新配置相关的库文件。 通过执行上述步骤,您应该能够解决LNK1104错误,并成功编译您的项目。请注意,以上步骤是基于您提供的引用内容和问题描述给出的解决方案。如果您的具体情况有所不同,请根据实际情况进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [VS2008(VC9)基于OpencasCade发布软件 以及 sxstrace.exe 工具的使用](https://blog.csdn.net/coutsomebody/article/details/29805199)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [用vs2017编译ffmpeg 4.0.3详细过程,并可调试](https://blog.csdn.net/zdhsoft/article/details/86776283)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值