前言
本文分享“占用网络”方案中,来自ICCV 2023的SurroundOcc,它基于环视相机实现3D语义占用预测。
使用空间交叉注意力将多相机图像信息提升到3D体素特征,即3D体素Query到2D图像中查询融合特征的思想。
然后使用3D卷积逐步对体素特征进行上采样,并在多个层次特征图上进行损失监督。
论文地址:SurroundOcc: Multi-Camera 3D Occupancy Prediction for Autonomous Driving
代码地址:https://github.com/weiyithu/SurroundOcc
同时,SurroundOcc介绍了如何通过多帧点云,构建稠密的3D语义占用栅格数据集,这部分也是挺重要的。
数据集地址:清华大学云盘
一、模型框架
SurroundOcc 通过环视相机,也就是多视角图像数据,实现3D语义占用预测。
- 输入多视角图像数据,比如6个环视相机,6组图像数据。
- 经过主干网络RestNet101,对于输入图像进行特征提取;然后经过FPN特征金字塔结构,生成多尺寸特征图。特征图分辨率大的,保留更多细节信息;特征图分辨率小的,经过更多的下采样,具有更多的上下文信息,特征更为抽象和有概括性。
- 初始体素查询,通过“可变形交叉注意力”,Deformable Attention,融合图像信息,即:3D体素Query到2D图像中查询融合特征思想。
- 然后经过前馈网络和3D卷积操作,生成3D体积特征,即3D体素特征。
- 得到的3D体积特征,进行3D语义占用预测。
- 同时较小分辨率的3D体积特征,通过3D卷积操作上采样,生成大分辨率的3D体积特征,供下一层阶特征使用。(3D卷积用来处理相邻3D体素之间的特征交互)
- 最终通过多尺寸的3D体素特征(包括当前层和上一层特征;上一层特征通过3D卷积上采样,得到和当前层相同大小;两者拼接起来,再做特征提取,得到当前层3D语义占用预测),生成多个不同分辨率大小的3D语义占用预测输出。
注意:作者在多个不同分辨率大小的3D语义占用预测输出,分别进行了训练损失监督。
其中SurroundOcc的方法思路比较简单易理解,简单概括为:
- 输入图像数据,提取图像特征。
- 初始体素查询,通过交叉注意力,体素查询在图像特征中融合对应信息,得到3D体素特征。
- 通过FPN特征金字塔结构,生成多个3D语义占用预测输出。
这些3D特征被用来预测空间中每个体积元素(voxel)是否被物体占用。这是通过监督学习完成的,其中模型被训练以预测3D网格中的每个元素是否为空或被物体占用。
下面梳理一下模型的输入输出。
- 输入:多视角图像数据,比如6个环视相机,6组图像数据。
- 中间层: 3D体素特征,多尺寸中每一层中各自输出一个3D特征张量V,其形状为HxWxZ,代表预测的3D占用空间。3D张量的值在0和1之间,表示网格占用的概率。
- 输出:3D语义占用,将3D体素特征提升到一个(L, H, W, Z)形状的张量,其中L是类别数量,可以得到3D语义占用网格,类别0表示非占用网格。
二、核心内容——生成3D体素特征
SurroundOcc是直接从2D图像信息,提升为3D体素特征,而不是BEV特征,下面分析一下其中的细节。
现有方法的局限性:
- 许多3D场景重建方法将多视图2D特征集成到3D空间中,通常是通过将2D特征重新投影到已知姿态的3D体积中。
- 这些方法简单地通过对同一网格中的所有2D特征取平均来计算网格特征。
- 然而,这种方法假设不同视图对3D体素查询的贡献是相等的,这并不总是成立的,尤其是当某些视图被遮挡或模糊时。
提出的方法:
- 为了解决这个问题,作者采用了交叉视图注意力来融合多摄像头特征。
- 通过投影3D参考点到2D视图,并使用可变形注意力来对3D参考点周围的2D视图特征进行查询。
- 与二维“BEV查询”不同,他们构建了“3D体素查询”以保留更多的3D空间信息。(因为BEV查询融合图像特征后,会在高度方向进行压缩的)
- 通过这种方法,可以定义特定的3D体素查询,为每个查询将其对应的3D点投影到2D视图,并使用3D参考点命中的视图来采样2D特征。
可变形注意力机制(Deformable Attention):
- 通过可变形注意力机制,权重和采样位置可以调整,从而使网络能够根据每个特定情况更有效地融合来自不同视图的信息。
- 输出的是交叉视图注意力层的加权特征和,是根据可变形注意力机制采样的特征的加权和。
F是输出特征的元素,它是通过可变形注意力计算得出的命中视图的平均值。
Qp是3D体素查询,P是从3D到2D的投影函数,Vhit是命中视图的集合。
这种方法通过在多视图融合过程中使用更加复杂的权重分配策略来提高3D重建的精度。
可变形注意力机制允许网络在将2D特征转换为3D表示时,根据每个特征点的具体情况进行更加灵活的调整。(对3D参考点周围的2D视图特征进行查询)
这种方法的优势在于它可以更好地处理视图遮挡和模糊,为3D场景重建提供了更准确的3D空间信息。
三、重要设计——多尺度占用预测
多尺度方法的必要性:
- 与3D检测任务不同,3D场景重建需要捕捉更多的低层次特征来学习细粒度的细节。
- 从不同尺度(大小、分辨率)的2D图像中提取特征,每个尺度捕获不同的信息。较小的尺度可以捕获精细的细节,而较大的尺度则捕获更广泛的结构。
- 这是因为场景重建涉及到理解和复现一个场景的所有细节,而不仅仅是识别场景中的物体。
2D-3D U-Net架构:
- 为了解决细节捕捉的问题,采用了2D-3D U-Net架构。U-Net是一种常见的深度学习架构,它特别擅长在图像分割任务中捕获多尺度的空间特征。
- 多尺度2D特征被输入到不同数量的2D-3D空间注意力层以提取多尺度3D体素特征。
特征上采样与融合:
- 下面公式描述了如何将一个尺度的特征上采样,并与下一尺度的特征融合。
- 这通过3D反卷积层(Deconvolution layer)完成,它通常用于上采样,即增加数据的分辨率。
不同分辨率的占用预测:
- 网络在每个级别输出具有不同分辨率的占用预测结果,这允许网络在不同的尺度上捕捉和预测空间占用情况。
- 这种多分辨率的输出有助于获取精细的细节同时也保留了全局结构的信息。
高层和低层特征的融合:
- 为了获得强大的高层次和低层次3D特征,网络在每个尺度上都进行监督学习。
- 这意味着每个尺度的输出都通过特定的损失函数进行训练,以确保网络能够在不同级别捕捉到有用的特征。
损失函数:
- 对于3D语义占用预测:使用多类别交叉熵损失。
- 对于3D场景重建:使用二分类形式的损失函数。
A、在3D语义占用预测中,通常需要区分多个类别(例如不同类型的物体或空间区域),因此使用多类别交叉熵损失是合适的。
网络试图对每个体素的类别进行分类,这可能包括多种物体类别以及空闲空间。
B、3D场景重建的任务,如果目标是简单地区分空间是否被占用(不关心占用的是什么类型的物体),那么二分类损失函数就足够了。
在这种情况下,网络的目标是判断每个体素是否为空(例如,没有被物体占用)或非空(被某种物体占用)。这是一个典型的二分类问题。
四、重要参考——生成稠密的3D语义占用数据
SurroundOcc介绍了如何通过多帧点云,构建稠密的3D语义占用栅格数据集,这部分也是挺重要的。
背景:
- 实验发现,仅使用稀疏的LiDAR(激光雷达)点云数据进行监督的网络无法预测足够密集的占用信息。
- 这是因为稀疏的数据不足以覆盖场景中所有可能的占用区域,尤其是在远距离或者遮挡较多的场合。
稠密的占用标签的重要性:
- 为了提高预测的密集度,需要生成密集的占用标签。
- 这里所谓的“稠密占用”指的是场景中每个体素(三维空间中的像素)是否被占用的详细信息。
挑战:
- 如SemanticKITTI 中提到的,为一个包含数百万体素的3D场景,手动标注密集占用信息是非常复杂且劳动密集的。
自动生成标签方法:
- 为了解决这一问题,作者设计了一个自动生成密集占用标签,这个方法利用现有的3D检测和3D语义分割标签,而不需要额外的人工注释。
- 一个直观的方法是直接将多帧LiDAR点云序列变换到统一的坐标系中,并将这些点云体素化(转换为体素网格)。但这种简单的方法只适用于完全静态的场景,忽略了移动物体,并且可能因为点云的稀疏性而产生错误的占用标签。
- 为了解决这些问题,提出了将动态物体和静态场景的多帧LiDAR点云分别缝合的方法。
- 还采用了Poisson Reconstruction方法来填补点云中的空洞,并将获得的网格体素化,以得到密集的体积占用信息。
关键步骤1——多帧点云拼接
用于处理和合成多帧LiDAR(激光雷达)点云数据的方法,特别是在处理动态(可移动)和静态(不动的)对象时。
这个过程是为了创建一个统一的场景表示,该表示可以用于后续的体素化和占用空间的预测。
动态与静态数据的分离:
- 对于每一帧LiDAR数据,首先根据3D边界框标签从点云中剪切出可移动的对象,这样就可以分别得到静态场景和可移动对象的3D点。
多帧数据集成:
- 然后,将收集到的静态场景段和移动对象段集成到各自的集合中。
- 这意味着动态对象与背景环境的数据被分开处理和储存。
坐标变换:
- 将多帧段的坐标转换到世界坐标系统中,这涉及使用校准矩阵和自我位置(ego-pose)信息来校正每一帧数据的位置和方向。
最终场景构建:
- 根据对象的位置和当前帧的自我位置,可以通过合并静态场景和移动对象的3D点来得到该帧的3D点 P。
- 使用变换矩阵将静态场景和对象的点,从世界坐标系转换到当前帧的坐标系。
这个方法的关键在于能够区分和独立处理动态对象和静态场景的数据,从而能够在动态环境中准确地进行点云重建。
通过合适的坐标变换和数据集成,可以为后续的体素化过程提供更丰富的信息。
关键步骤2——通过Poisson重建来提高点云数据的密度
通过步骤1的多帧点云缝合方法提高了点云的密度,由于LiDAR束的限制,点云中仍然存在许多间隙,且点的分布不均匀。
法向量计算:
- 为了解决这个问题,首先需要计算点云中点的法向量。
- 法向量是垂直于点云表面的一个重要属性,能够指示表面的方向。
- 后续的Poisson重建方法需要每个点的法向量,这些法向量通常通过分析点云的局部结构计算得出。
Poisson重建:
- Poisson重建是一种流行的算法,它使用点云及其法向量作为输入,并输出一个连续的、封闭的三角网格模型,这个模型填补了原始点云中的空隙。
- 输入:点云和法向量,利用这些信息推断出一个三维表面。
- 输出:是一个三角网格,这是一种由三角形组成的多边形网格,用于在计算机中表示3D形状。该网格紧密地拟合原始点云数据,并填补由点云稀疏部分导致的空隙。
获得的网格和体素化:
- 一旦得到连续的三角网格,就可以将其转换为体素表示。体素化是将连续几何体转换为离散的网格体积元素的过程,类似于在三维空间中填充小立方体来近似形状。
- 得到的三角网格由顶点和边组成。这个网格提供了一个更加连续和均匀的表面表示,它可以用来填补点云的空洞。
- 进一步将这个网格转换成密集的体素 。
通过这种方法,可以有效地从稀疏或不均匀的点云数据中生成一个高质量的、密集的3D模型。
五、模型效果
SurroundOcc在nuScenes 验证集上的 3D 语义占用预测结果,如下图所示。(说实话没有太大提升,但是呢,这篇论文的思路很经典,而且提出了3D语义占用数据集,还是值得学习和致敬的)
具有挑战性的场景的示例,尽管 RGB 图像的质量在雨天和夜晚会下降,但然可以预测详细的占用情况。
下面是一些可视化效果:
分享完成~