跳过正文
  1. Notes/

具身智能中的语义感知(Semantic-aware)——占用表示与鸟瞰表示

· loading · loading · ·
AI Embodied AI
目录
具身智能中的语义感知(Semantic-aware)——占用表示(Occupancy)与鸟瞰表示(BEV),介绍了几种方法:3DGS、DrivingGaussian、GaussianFormer、NeRF

0. 前言
#

具身智能中,语义感知是个十分重要的问题。所谓语义感知,简单来说就是通过获取 RGBD 图像、视频、点云等等信息,对环境中物体进行识别、分析以及重构成机器人和网络能够识别的信息。

由于我们只能获取诸如图片和传感器等数据,想要还原 3D 场景就需要建模,这种建模的方式就是占用表示(Occupancy)。在占用表示出现前,比较流行的方式是鸟瞰表示(Bird-Eye-View,BEV),这种方法将 3D 场景压缩成 2D,通过增加 2D 的语义来表示 3D 信息。

1. 3D场景的表示
#

以视觉为中心的系统具有经济优势,但它们无法捕捉任意形状的障碍物,因此如何高效、有效地表达 3D 场景就变得十分重要。

1. 基于体素的方法:
#

为每个体素分配一个特征向量,以获得密集的表示来描述 3D 场景的细粒度结构。考虑到3D空间的稀疏性,它们采用从粗到细的上采样或体素滤波来提高效率。

2. 鸟瞰图(Bird’s Eye View,BEV)方法:
#

由于大多数体素空间未被占用,即 3D 稀疏,因此基于 BEV 的方法通过压缩高度维度作为场景表示,但它们通常需要后处理,如多尺度融合,以捕捉更精细的细节。

BEV 算法是一种将来自不同传感器(摄像头、激光雷达、毫米波雷达等)的数据转换为机器人(主要是车辆)正上方俯瞰视角网格的统一表示方法。它使得机器人有一个直观且多视角空间一致的环境感知,如图:

BEV 方法的一般步骤为:
  • 特征提取:使用 2D/3D Backbone 网络对多视角图像或点云进行特征提取
  • 视角转换:2D 转 3D 再转 BEV 视角、体素拍平(Voxel Splat)等
  • 特征编码:在 BEV 空间中对特征进一步编码(多模态融合、时序融合等),来获取更丰富的 3D 特征表示
  • 下游任务:将编码后的 BEV 特征送入特定的检测头进行目标检测,或送入其他任务头执行其他任务

BEV 方法根据视角转换方式分为两类:LLS(Lift, Splat, Shoot)方式和 Transformer 方式。

  • LLS 方式是自底向上的方法,代表算法有 BEVDet、BEVDepth 等。核心是:Lift——对各相机的图像显式地估计图像平面下采样后特征点的深度分布,得到包含图像特征的视锥(点云);Splat——结合相机内外参把所有相机的视锥(点云)分配到BEV网格中,对每个栅格中的多个视锥点进行 sum-pooling 计算,形成BEV特征图;Shoot——用 task head 处理 BEV 特征图,输出感知结果。
  • Transformer 方式是自顶向下的方法,代表算法有 BEVFormer 等。核心是:先预定义待生成的 BEV 特征图,利用 Transformer 全局感知能力在多个视角图像的特征中多次查询相应信息,并把信息融合更新到BEV特征图中。

BEV 表示方法有一定的局限性:2D 特征表示缺少高度信息;未知物体可能无法识别。

3. 三视图(Tri-Perspective View,TPV)方法:
#

TPVFormer 将 BEV 推广到两个额外的平面,并与 TPV 实现了更好的性能-复杂性权衡。

然而,上述三种方法都是基于网格的方法,不可避免的由于空网格的冗余而具有稀疏性,从而导致下游任务更加复杂;同时,这些方法构建场景动力学也更困难,因为在三维世界中移动的是物体而不是网格。于是,3D Occupancy 应运而生。

2. 3D 数据的占用表示(3D Occupancy)
#

具身智能的作用环境是三维现实世界,因此数据都是 3D 数据,光靠二维的图像是无法表示完整的三维环境的,这里记录几个常见的 3D 数据表示方法。

1. 点云(Point clouds)
#

如图(a)所示,物体被表示为一系列的坐标点,这些坐标点的集合就是点云。可以想象的到,点云表示法对物体的精细程度比较高,但计算量会很大。

2. 体素网格(Voxel grids)
#

如图(b)所示,体素就是 3D 空间的像素,是量化的、大小固定的点云。每个单元都是固定大小和离散坐标。这里的每个单元可以理解为 Minecraft 中的方块,有固定的大小(不一定是立方体)。根据细粒度的不同,能够表示物体的精细程度也不同。

体素网格也可以说是三维空间的一种占用网格(Occupancy Grid),占用网格就是如果一个网格中存在点云,那么就将其设为占用(1),否则就是非占用(0),最后形成一个三维矩阵的形式。

体素网格一般来说是固定分辨率的,与之对应的可变分辨率的网格叫八叉树地图(Octomap),如图所示:

3. 多边形网格(Polygon meshes)
#

如图(c)所示,物体被类似建模一般的多边形包裹住轮廓,这些多边形的集合就是多边形网格(Mesh)。

4. 多视图表示(Multi-view representations)
#

如图(d)所示,多视图表示是从不同模拟视点渲染的 2D 图像集合。

3. 高斯泼溅(Gaussian Splatting,GS)
#

高斯泼溅方法主要是在三维空间中建立三维高斯函数,将物体进行表示,之后再用光栅化技术,将其投影到二维平面上渲染。

3DGS 的原论文为《3D Gaussian Splatting for Real-Time Radiance Field Rendering

0. 3D 表示
#

想要表示一个三维空间中的物体,我们能想到最直接的方法就是将其形状直接描述出来,例如用一些平面将其包围起来。而最简单的建模方式就是使用空间三角形来构建(Mesh),如图:

但我们希望用立体的元素来表示三维物体,椭球就是一个很好的元素。但如果只使用实椭球来表示,有许多形状是不好表示的。因此考虑将椭球虚化,变成一种概率模型,从而将三维空间中的物体用概率表示,如图可知,椭球的交界处可以形成各种形状:

因此,椭球形的 3D 高斯分布就被用来构建这种模型。

1. 3D Gaussian 构建
#

用 3D 高斯分布构建基础的元素有四个属性:中心位置(\(\mu\))、不透明度(\(\alpha\))、三维协方差矩阵(\(\Sigma\))、颜色(\(c\))。这种分布是可微的,因此在神经网络中是可学习的。

2. Splatting 渲染
#

Splatting 又叫抛雪球法,意思是将一个雪球(高斯球)砸到一个平面上,雪球散开后,在撞击中心的雪量最大,而离撞击中心越远的位置雪量越少,可以理解为二维高斯的密度函数。而把椭球投影到平面后得到的 2D 图形,就是 Splatting 渲染。

3. 3DGS 流程
#

3DGS 的目标是实现高质量的实时新视角合成(Real-time Novel View Synthesis)。

首先,输入为一组多视角的静态彩色图片:

通过 SfM(Structure from Motion) 技术计算相机参数并重建稀疏点云,如图所示:

将点云的位置作为 3D 高斯的初始位置,生成一系列 3D 高斯;之后使用 GS 方法将 3D 高斯光栅化投影到 2D 平面。得到的投影图片与原输入图片投入到最小化损失函数中训练,训练后的结果如图:

训练好后,输入静态多视角图片后,由于能够构建整个 3D 高斯重建表示,因此调整投影平面角度,即可渲染从未被输入过的拍摄视角的图像,并且能够实时进行光栅化投影渲染。视频演示可以访问 3DGS 官网 观看。

4. DrivingGaussian
#

在自动驾驶中,处理的数据都是动态的,3DGS 对于静态环境的处理效果不错,但对于自动驾驶的动态场景就有些不足。DrivingGaussian 并未采用 SfM 方法来初始化高斯,而是借助 LiDAR 获取场景的完整点云,目标是使用激光雷达图像多模态数据最小化多相机配准误差,并获得准确的点位置和几何先验。

原论文为:《DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes

由于车辆行驶时,周围环境会产生时间上的变化,有重叠的场景,也有新增的场景,同时相机视角也会变化,近大远小等现象可能会导致尺度混乱,产生伪影和模糊。DrivingGaussian 通过引入增量静态 3D 高斯(Incremental Static 3D Gaussians)来增强 3DGS,如图所示:

首先将静态场景均匀划分成 N 个区块(bin),这些区块按时间顺序排列,每个区块都是一个或多个时间步的多视角图像。对于第一个区块的场景,使用 LiDAR 先验初始化高斯;对于随后的区块,我们使用前一个区块的高斯作为位置先验,将重叠区域进行对齐;不断重复,从而构建一个完整的高斯。

然而,除了基本静态的环境,还有高速动态变化的小型目标,例如车辆、行人等。因此,DrivingGaussian 引入了复合动态高斯(Composite Dynamic Gaussian Graph),可以在大规模和长时序的驾驶场景中构建多个动态目标。

首先从静态背景中分解动态前景目标,使用数据集提供的边界框来构建动态高斯图,通过目标 ID 和出现时间戳来识别。

最后,将动态目标和静态背景相结合,根据边界框的位置和方向,按时间顺序将每个节点的高斯分布连接到静态高斯场中。

5. GaussianFormer
#

GaussianFormer 使用一组 3D 语义高斯来稀疏地描述 3D 场景,每个高斯表示一个灵活的感兴趣区域,由均值、协方差及其语义类别组成。GaussianFormer 的目的简单来说就是,通过输入多视角图像(如自动驾驶车辆的环视摄像头或单目序列),构建一个包含物体精确位置和语义信息的 3D 环境表示。

原论文为:《GaussianFormer: Scene as Gaussians for Vision-Based 3D Semantic Occupancy Prediction

首先输入多视角图像,将其用 SfM 方法得到点云,并设为高斯的位置,随机初始化高斯的各个属性(包含语义,语义就是 3DGS 中的颜色)和高斯查询向量,通过体素网格将其分割成一个一个的体素块,接着进行稀疏3D卷积,更新高斯查询向量。

之后对每个高斯生成 3D 参考点,反映高斯形状,并投影到多视角图像上。通过多尺度特征提取和交叉注意力机制,对查询向量进行更新,迭代细化 3D 高斯的属性。

最后,使用 3DGS 方法实现高斯到体素的转化,通过聚合相邻的高斯生成特定位置的语义占用,最终可以预测各个位置的 3D 语义占用。

6. NeRF(Neural Radiance Fields)
#

NeRF 叫做神经辐射场,简单来说就是用一个多层感知机(MLP)去隐式的学习一个静态 3D 场景,实现复杂场景的新视角合成。

这是一个比较早的方法,因此网络结构比较简单,功能也比较单一,每次只能训练一个 3D 场景,不同场景网络是不通用的。

原论文为:《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

1. 总体框架
#

如图,NeRF 方法的核心就是 MLP 网络,即 \(F_ \Theta\) 。它的输入是相机位置和方向 \((x,y,z,\theta,\phi)\);而输出为对应像素点的颜色和密度 \((R,G,B,\sigma)\)。

在训练过程中,每个相机位置和方向对应一条射线,这条射线穿过一个 2D 像素点并在 3D 环境中做多个采样,将这些采样进行某种加权积分来拟合这个 2D 像素点,最终即可通过多视角的图像还原 3D 场景。

2. 体素渲染算法
#

体素密度 \(\sigma(x)\) 可以理解为是一条穿过空间的射线在 \(x\) 处被终止的概率,即在 \(x\) 处被阻碍,如图中红线所示:

而将此密度函数积分,就可以得到该体素射线的颜色。

在连续的辐射场中,针对任意视角进行渲染,就需要对穿过目标虚拟相机的每个像素的射线求取上述颜色积分。从而得到每个像素的颜色,再渲染出该视角下的完整的成像图片。

实际应用中,难以获取连续的密度函数,因此对该函数进行采样,将积分区域均匀分份,在每个小区域内随机采样。将连续的积分问题变成离散的求和问题,最后加权求和即可,如上图中左图所示。

NeRF 中,对该方法又进一步改进。由于大量对渲染没有贡献的区域(如空区域和被遮挡区域)仍要采样计算,会浪费计算资源,因此将均匀采样变为在可见区域获取更多的采样点,如上图中右图所示。

3. NeRF 网络架构
#

如图,MLP 的网络架构很简单,前期输入为相机位置,后期再输入相机方向,分阶段的训练;中间部分为了防止梯度爆炸或消失,加入了残差结构。

由于 MLP 难以学习到高频信息(参数少但信息多),若直接将位置和视角作为输入,渲染分辨率低,因此使用了位置编码,将输入的采样映射到位置编码中(参数多,每个参数携带的信息降低),即可有效学习。

对于相同的相机位置,不同相机方向,密度值是相同的;而相同的相机方向,不同的相机位置,密度值是不同的;因此可以知道,密度仅与相机位置有关。所以在训练时,在输入相机方向前就输出密度值,避免相机方向的干扰,提升学习效果。

4. 实验
#

代码和实验部分可以参考:yenchenlin/nerf-pytorch: A PyTorch implementation of NeRF

7. 参考文献
#

1.什么是体素(Voxel)? - 知乎

2.3D Gaussian杀入Occ!GaussianFormer:突破Occ瓶颈,显存开销直降五倍(清华&鉴智)…-CSDN博客

3.论小白对GaussianFormer的看法(未出code版) - 知乎

4.一文带你入门 3D Gaussian Splatting - 知乎

5.3D Gaussian Splatting简明教程 - 知乎

6.数据闭环!DrivingGaussian:逼真环视数据,驾驶场景重建SOTA - 知乎

7.3D占用预测(Occupancy Prediction)算法学习_3d occupancy-CSDN博客

8.Vision-RADAR fusion for Robotics BEV Detections: A Survey

9.一文读懂BEV自底向上方法:LSS 和 BEVDepth - 知乎

10.【三维重建】NeRF原理+代码讲解_nerf三维重建-CSDN博客

11.十分钟带你快速入门NeRF原理_哔哩哔哩_bilibili