跳过正文
  1. Notes/

具身智能中的语义感知(Semantic-aware)——入门篇

· loading · loading · ·
AI Embodied AI
目录
具身智能中的语义感知(Semantic-aware)——入门篇

0. 前言
#

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

本文旨在记录自己在入门了解过程中的一些概念和小知识,或许没有什么条理,等到理解的差不多了再回过头来整理,

1. 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 图像集合。

2. 3D场景的表示
#

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

1. 基于体素的方法:
#

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

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

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

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

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

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

4. 3D 语义高斯表示方法:
#

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

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

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

最后,设计一个高斯到体素的转化模块(Gaussian Splatting,GS),通过聚合相邻的高斯生成特定位置的语义占用,最终可以预测各个位置的 3D 语义占用。

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

在 2.4 中的 3D 语义高斯表示方法中就使用了 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 通过引入增量静态 3D 高斯(Incremental Static 3D Gaussians)来增强 3DGS,如图所示:

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

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

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

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

参考文献
#

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

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

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

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

5.3D Gaussian Splatting简明教程 - 知乎

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