3. Occupancy Network核心概念:占用网格、体素表示、隐式神经场、连续占用函数
Occupancy Network(占用网络)是近年来在三维视觉与自动驾驶感知领域兴起的一类连续隐式表示方法。与传统的基于体素栅格或点云的离散表示不同,Occupancy Network 通过一个神经网络将空间中的任意连续坐标映射为占用概率,从而在理论上实现无限分辨率的几何建模。要深入理解这一技术,必须首先厘清四个核心概念:占用网格(Occupancy Grid)、体素表示(Voxel Representation)、隐式神经场(Implicit Neural Field)以及连续占用函数(Continuous Occupancy Function)。这四个概念并非彼此孤立,而是构成了从离散到连续、从显式到隐式的完整技术演进链条。
上图展示了四个核心概念之间的演进关系。从工程实现的角度看,占用网格和体素表示是传统离散方法的基石,而隐式神经场和连续占用函数则代表了基于深度学习的新范式。下面逐一深入剖析。
3.1 占用网格:从2D栅格到3D空间的基础离散化
核心原理:占用网格(Occupancy Grid)最早源于机器人学中的占据栅格地图(Occupancy Grid Map, OGM),其核心思想是将环境空间划分为规则的网格单元,每个单元存储一个概率值,表示该区域被障碍物占据的可能性。在2D场景中,网格单元通常为正方形;在3D场景中,则自然扩展为立方体单元。每个网格的占用概率通过贝叶斯滤波或对数几率(Log-Odds)更新机制进行递归估计,从而融合多帧传感器数据。
判断方法与操作流程:在实际工程中,构建占用网格通常遵循以下步骤:
- 空间划分:确定感知范围(如前方80m×40m×4m),设定分辨率(如0.1m×0.1m×0.2m),计算网格总数。
- 传感器数据投影:将激光雷达点云或毫米波雷达点云投影到网格坐标系,记录每个网格内的点云数量、高度分布、反射强度等统计特征。
- 概率更新:采用逆传感器模型(Inverse Sensor Model)计算每个网格的占用概率,并通过log-odds累加实现多帧融合。
- 阈值判定:设定占用阈值(如0.7),将概率高于阈值的网格标记为障碍物,低于阈值的标记为自由空间。
3.2 体素表示:3D栅格的稀疏化与特征编码
核心原理:体素(Voxel)是体积像素(Volume Pixel)的缩写,是3D空间中的最小单位。体素表示将三维空间划分为规则的立方体网格,每个体素可以存储占用状态、颜色、语义标签或高维特征向量。在自动驾驶障碍物检测中,体素表示通常与3D卷积神经网络结合,形成Voxel-based检测框架(如VoxelNet、SECOND等)。然而,稠密体素表示存在严重的内存瓶颈——随着分辨率提升,体素数量呈三次方增长,导致计算量急剧膨胀。
稀疏化策略:为了解决这一问题,工程实践中普遍采用稀疏体素表示(Sparse Voxel Representation),仅存储被占用的体素及其特征。具体方法包括:
- 体素筛选:仅保留包含至少一个点云的体素,剔除空体素,通常可减少90%以上的存储量。
- 哈希映射:使用哈希表存储体素索引到特征向量的映射,支持O(1)时间复杂度的随机访问。
- 稀疏卷积:采用稀疏卷积(Sparse Convolution)替代普通3D卷积,仅在非空体素上执行卷积操作,大幅降低计算量。
| 表示方法 | 内存复杂度 | 分辨率上限 | 典型应用 | 局限性 |
|---|---|---|---|---|
| 稠密体素 | O(N³) | 0.1m(80m范围) | 小场景重建 | 内存爆炸、计算量大 |
| 稀疏体素 | O(K),K为占用体素数 | 0.05m(80m范围) | 自动驾驶检测 | 数据结构复杂、索引开销 |
| 八叉树体素 | O(K log N) | 自适应分辨率 | 高精度地图 | 更新复杂、并行化困难 |
| 体素哈希 | O(K) | 0.02m(局部) | 实时重建 | 哈希冲突、缓存不友好 |
3.3 隐式神经场:用神经网络建模连续空间
核心原理:隐式神经场(Implicit Neural Field)是一种用神经网络参数化连续空间函数的方法。其基本形式为:给定空间坐标 p ∈ R³(以及可选的条件变量,如视角方向、时间戳),神经网络 F_θ 输出该位置的属性值(如占用概率、颜色、语义标签)。与显式体素存储不同,隐式神经场将几何信息编码在网络的权重中,查询时只需一次前向传播即可获得任意精度的结果。
关键设计维度:
- 坐标编码:直接输入原始坐标 (x,y,z) 会导致网络难以学习高频细节。工程中通常采用位置编码(Positional Encoding)或哈希编码(Hash Encoding),将坐标映射到高维特征空间。例如,NeRF中使用的频率编码:γ(p) = (sin(2^kπp), cos(2^kπp)),k=0,...,L-1。
- 网络结构:主流采用多层感知机(MLP),隐藏层宽度通常为128-512,深度为4-8层。部分方案引入跳跃连接(Skip Connection)或条件批量归一化(Conditional Batch Normalization)以增强表达能力。
- 训练方式:通过最小化预测值与真实占用标签之间的二值交叉熵损失进行训练。训练数据来自激光雷达点云、深度相机或CAD模型采样。
3.4 连续占用函数:从离散概率到可微分的连续映射
核心原理:连续占用函数(Continuous Occupancy Function, COF)是Occupancy Network的核心数学表达。它定义了一个从连续空间坐标到占用概率的映射:f: R³ → [0,1],其中 f(p) 表示位置 p 被障碍物占据的概率。该函数具有以下关键性质:
- 连续性:函数在空间上连续,任意两个相邻坐标的占用概率变化是平滑的,不存在体素边界处的突变。
- 可微性:函数对输入坐标可微,这使得我们可以通过梯度下降法优化几何形状,或从网络输出中提取等值面(Isosurface)。
- 隐式性:几何形状被隐式定义为 f(p) = τ 的等值面(τ 通常取0.5),无需显式存储网格或点云。
工程实现流程:
// 伪代码:连续占用函数查询
def query_occupancy(network, point_3d):
# 1. 坐标编码
encoded = positional_encode(point_3d, L=10)
# 2. 前向传播
logit = network(encoded) # MLP输出
# 3. 概率映射
prob = sigmoid(logit)
return prob
# 等值面提取(Marching Cubes)
mesh = marching_cubes(lambda p: query_occupancy(net, p),
bounds=[[-40,40],[-20,20],[-2,2]],
resolution=0.1, threshold=0.5)
案例拆解:以某自动驾驶公司使用Occupancy Network进行障碍物检测的实践为例。该方案采用6个环视摄像头+1个前向激光雷达作为输入,通过2D图像特征提取器(ResNet-50)和3D点云特征提取器(PointPillars)分别获得多模态特征,然后通过可微分的体素投影模块将2D特征反投影到3D空间,与点云特征融合后输入Occupancy Network。网络输出为连续占用概率场,分辨率等效于0.05m体素,但内存占用仅为稠密体素的1/20。在实车测试中,该系统对行人、骑行者等小目标的召回率比传统体素方法提升了12.3%,对远处(>50m)障碍物的检测精度提升了8.7%。
3.5 常见误区与总结复盘
误区一:将Occupancy Network等同于3D语义分割。虽然两者都输出逐点或逐体素的标签,但Occupancy Network的核心优势在于连续性和可微性,能够支持任意分辨率查询和几何优化,而语义分割通常受限于固定分辨率。
误区二:忽视位置编码的重要性。直接输入原始坐标会导致网络偏向学习低频信息,难以表达精细几何结构。实验表明,使用位置编码后,IoU指标可提升15-25%。
误区三:认为隐式表示完全取代显式表示。在实际工程中,Occupancy Network的输出通常需要转换为显式网格或点云才能用于下游规划控制模块。因此,等值面提取(如Marching Cubes)和网格简化是必不可少的后处理步骤。
误区四:忽略训练数据的分布偏差。Occupancy Network对训练数据的覆盖范围非常敏感。如果训练集主要包含城市道路场景,模型在高速匝道或地下停车场等场景的泛化能力会显著下降。建议在训练时加入域随机化(Domain Randomization)和场景增强策略。
| 维度 | 占用网格/体素 | Occupancy Network | 选择建议 |
|---|---|---|---|
| 分辨率 | 固定,受内存限制 | 连续,任意查询 | 需要高精度细节时选ON |
| 内存占用 | O(N³) 或 O(K) | O(网络参数) | 嵌入式平台选稀疏体素 |
| 推理速度 | 快(<10ms) | 慢(20-50ms) | 实时性要求高选体素 |
| 可微性 | 不可微 | 全可微 | 需要端到端训练选ON |
| 多模态融合 | 特征拼接 | 隐式特征对齐 | 多传感器融合选ON |
| 工程成熟度 | 高,量产验证 | 中,快速迭代 | 量产项目选体素 |