4、Occupancy Network 基础架构:编码器-解码器结构、隐式函数学习、连续空间表示

好,咱们进入正题。这一节要聊的,是 Occupancy Network 最核心的骨架——编码器-解码器结构、隐式函数学习,还有连续空间表示。说白了,就是搞清楚这个网络到底是怎么“看”懂三维世界的。

我记得刚接触这个方向时,有个问题困扰了我很久:传统的体素方法,分辨率一高,显存就炸。后来看到 Occupancy Network 的思路,才恍然大悟——原来可以这样玩。

4.1 编码器-解码器结构:从离散到隐空间

Occupancy Network 的架构,本质上是一个“压缩-重建”的过程。我习惯把它拆成三块来看:

  • 输入编码器:把点云、多视图图像或者体素,压缩成一个紧凑的特征向量。
  • 隐式解码器:接收这个特征向量,再加上一个三维坐标 (x, y, z),输出该点被占用的概率。
  • 查询机制:你想知道空间里哪个位置有物体,就拿着坐标去问解码器。

你想想看,这和传统方法最大的区别在哪?传统方法是在离散的网格上做分类,而 Occupancy Network 是在连续的隐空间里做函数拟合。

核心思想:用一个神经网络来隐式地表示三维形状。网络学习的是一个函数 f(p, z) → [0, 1],其中 p 是三维点坐标,z 是编码器提取的全局特征。

我在项目中遇到过一个问题:直接用点云作为输入时,如果点云密度不均匀,编码器提取的特征会偏向密集区域。后来我加了一个体素化预处理,把点云先转成稀疏体素网格,再用 3D 卷积提取特征,效果稳定多了。

4.2 隐式函数学习:为什么是“隐式”?

“隐式”这个词,听起来有点玄乎。其实说白了,就是我们不直接存储物体的表面顶点,而是学习一个判断规则:给定任意一个点,告诉我它在物体内部还是外部。

数学上,这个函数可以写成:

f(p; θ) = σ(MLP(concat(z, p)))

其中:

  • p = (x, y, z) 是查询点的坐标
  • z 是编码器输出的全局特征向量
  • MLP 是多层感知机
  • σ 是 Sigmoid 函数,把输出映射到 0~1 之间

嗯,这里要注意:训练时,我们是在已知的网格点上做监督。比如一个物体内部点标为 1,外部点标为 0。网络学会的就是这个二分类的决策边界。

我的经验:训练时采样点的策略很重要。我曾经只采样物体表面附近的点,结果网络对远离表面的区域判断很差。后来我采用“表面附近密集采样 + 空间均匀采样”的混合策略,收敛速度快了不少。

为什么会这样?因为隐式函数本质上是在学习一个距离场或者 occupancy 场。如果训练样本只集中在表面附近,网络对空旷区域的“空”就没有概念,推理时容易产生假阳性。

4.3 连续空间表示:突破分辨率限制

这是 Occupancy Network 最让我兴奋的地方。传统体素方法,比如 256³ 的网格,需要 1600 万个格子。每个格子存一个值,显存直接爆炸。

但 Occupancy Network 不一样。它只存一个神经网络(几 MB 的参数),然后你想查多细就查多细。这就是连续空间表示的魅力——理论上无限分辨率

方法 存储方式 分辨率限制 显存占用(256³)
体素网格 离散数组 受显存限制 ~256 MB
Occupancy Network 神经网络参数 无限制(连续) ~5 MB

你看这个对比,差距是数量级的。而且在实际推理时,我们可以根据需求动态调整采样密度。比如远处用粗粒度,近处用细粒度,非常灵活。

避坑指南:我曾经以为连续表示就是完美的,结果发现推理速度是个大问题。因为你要对每个查询点都做一次前向传播,如果场景很大、采样点很多,速度会非常慢。后来我用了“粗筛+细查”的策略:先用低分辨率快速扫描,找到可能有物体的区域,再在这些区域高分辨率采样。

4.4 三者如何协同工作?

我画个简单的流程,你就明白了:

  1. 输入阶段:传感器数据(点云/图像)进入编码器,压缩成特征向量 z。
  2. 查询阶段:你指定一个三维坐标 (x, y, z),和特征向量 z 拼接在一起。
  3. 解码阶段:MLP 网络处理这个拼接向量,输出 occupancy 概率。
  4. 重建阶段:对空间中的大量点重复步骤 2-3,用 Marching Cubes 等算法提取等值面,得到最终的三维网格。

说白了,编码器负责“理解”输入,解码器负责“回答”任意位置的占用情况。而连续空间表示,让这个回答可以无限精细。

关键点总结:Occupancy Network 用编码器-解码器结构,把三维重建问题转化成了一个二分类问题。分类的对象不是离散的体素,而是连续空间中的任意点。这种隐式表示,让模型在保持低存储的同时,具备了高精度的潜力。

我个人觉得,理解这三者的关系,是掌握 Occupancy Network 的第一步。编码器决定了“看没看懂”,解码器决定了“能不能说清楚”,连续表示决定了“能说多细”。三者缺一不可。

下一节,我们会深入具体的网络设计细节,包括怎么选编码器、MLP 的层数怎么定、激活函数用什么好。到时候再聊。