Convolutional Occupancy Networks:卷积占据网络
论文:Convolutional Occupancy Networks
作者:Songyou Peng, Michael Niemeyer, Lars Mescheder, Marc Pollefeys, Andreas Geiger
arXiv:2003.04618v2
本地文件:/root/other/paper/2003.04618v2.pdf
这篇论文解决什么问题
Occupancy Networks、DeepSDF 这类神经隐式表示有一个共同优点:它们可以把 3D 形状表示成连续函数,而不是固定分辨率的 voxel。
但早期隐式方法通常使用简单的 fully-connected decoder 和一个全局 feature code:
这种方式适合单个物体,但扩展到复杂场景时会遇到问题:
- 全局 code 很难承载大场景的所有局部细节。
- MLP 缺少卷积的 translation equivariance。
- 对局部观测的利用不够充分,容易生成过平滑表面。
- 大规模 indoor scene 重建困难。
Convolutional Occupancy Networks,简称 ConvONet,核心目标是:
保留隐式表示的连续查询能力,同时引入卷积特征网格,让每个空间位置都能访问局部和全局上下文。
图源说明:根据 Peng et al., Convolutional Occupancy Networks 的核心结构概念重绘,非论文原图。
和普通 Occupancy Network 的区别
普通 Occupancy Network 通常可以理解为:
其中:
- 是查询点。
- 是整个输入的全局编码。
也就是说,所有查询位置共享同一个全局 feature。
ConvONet 改成:
其中:
- 是输入,例如 noisy point cloud 或 coarse voxel grid。
- 是在查询位置 附近取到的卷积特征。
关键差别是:
ConvONet 的 feature 不只是依赖输入整体,还依赖查询位置本身。
因此不同空间位置会读到不同的 local feature,这让模型更适合重建大场景和细节结构。
整体流程
ConvONet 的整体流程可以写成:
input x
-> point / voxel encoder
-> 2D feature planes or 3D feature volume
-> 2D / 3D U-Net aggregate features
-> query point p samples local feature ψ(p, x)
-> MLP predicts occupancy probability
最终输出是:
其中:
表示点 在物体或场景内部的概率。
表面可以看成 occupancy 的等值面,例如:
模型架构:输入与输出
ConvONet 可以分成两个部分看:前面的 encoder 把输入观测转成空间特征网格,后面的 occupancy decoder 对任意查询点预测占据概率。
整体输入
输入数据记为:
它可以是:
- noisy sparse point cloud:带噪稀疏点云。
- low-resolution occupancy grid:低分辨率占据体素。
除此之外,模型还需要一个查询点:
所以从最终预测角度看,ConvONet 的输入是:
encoder 的输入与输出
encoder 输入原始观测 ,输出离散的卷积特征表示。
如果使用 plane encoder,输出是一个或多个 2D feature planes:
如果使用 volume encoder,输出是 3D feature volume:
其中 是空间分辨率, 是每个格点的特征维度。
query feature 的输入与输出
给定查询点 ,模型会在 feature plane 或 feature volume 中插值得到局部特征:
输入:
输出:
如果是 2D plane,用 bilinear interpolation;如果是 3D volume,用 trilinear interpolation。
occupancy decoder 的输入与输出
decoder 输入查询点坐标和该点对应的局部特征:
输出是一个占据概率:
含义是:
- :点 在物体或场景内部。
- :点 在空空间中。
- 附近:可作为重建表面。
训练和推理时的输出
| 阶段 | 输入 | 输出 |
|---|---|---|
| 训练 | 观测 ,查询点 ,真实 occupancy | 预测 occupancy ,用 BCE 和真值比较 |
| 单点推理 | 观测 ,一个查询点 | 该点 occupancy probability |
| 形状/场景重建 | 观测 ,大量空间查询点 | 连续 occupancy field,再提取 等值面 |
因此 ConvONet 的网络直接输出不是 mesh,而是任意点的 occupancy probability。mesh 是在大量点上查询后,用等值面提取得到的。
输出可以用来干什么
ConvONet 的核心输出是查询点的 occupancy probability:
它可以支持以下任务。
| 输出 | 可以用来做什么 | 具体做法 |
|---|---|---|
| 单点 occupancy | 判断空间点是否被占据 | 接近 1 表示内部,接近 0 表示外部 |
| 连续 occupancy field | 提取 3D 表面 | 对大量 3D 点查询 occupancy,提取 等值面 |
| feature plane / feature volume | 保留空间局部信息 | 让不同位置读取不同局部特征,适合大场景和细节重建 |
| 多尺度/滑窗输出 | 大场景重建 | 对房间或室内场景分块查询,再合并得到完整场景表面 |
| occupancy probability map | 可视化不确定性 | 概率接近 0.5 的区域通常是边界或模型不确定区域 |
最常见的重建流程是:
input point cloud / voxel grid
-> encoder gets feature plane or volume
-> query many 3D points
-> predict occupancy probability
-> extract 0.5 iso-surface
-> mesh
和 DeepSDF 的区别是:DeepSDF 输出 signed distance,表面来自 ;ConvONet 输出 occupancy probability,表面通常来自 。
ConvONet 的输出还可以用于 scene completion。即使输入点云是稀疏、不完整、有遮挡的,只要 encoder 得到的局部特征和上下文足够好,decoder 就可以在没有直接观测的位置预测 occupancy,从而补出缺失墙面、家具表面或物体背面。
Encoder:从输入到特征网格
论文强调模型本身不依赖固定输入类型,但实验主要使用两类输入:
- noisy sparse point cloud。
- low-resolution occupancy grid。
对于点云输入,论文使用带 local pooling 的 shallow PointNet 来得到点特征。
对于 voxel 输入,使用简单的 3D CNN 得到 voxel 特征。
然后把这些特征聚合到 plane 或 volume 上。
图源说明:根据 Peng et al., Convolutional Occupancy Networks 的 plane/volume encoder 概念重绘,非论文原图。
Plane Encoder
Plane encoder 会把 3D 点投影到一个或多个 canonical planes。
常见选择是:
- 单个 ground plane。
- 三个 canonical planes:、、。
如果多个点落到同一个 plane cell,就用 average pooling 聚合:
得到的是二维特征图:
优点:
- 分辨率可以做得比较高,例如 。
- 显存比 3D volume 低。
- 三平面能以较低成本覆盖三维结构。
缺点:
- 单平面对高度方向信息表达不足。
- 多平面仍然不是完整 3D volume,存在信息压缩。
Volume Encoder
Volume encoder 把点或 voxel 特征放进 3D feature volume:
如果多个点落进同一个 voxel cell,也用 average pooling。
优点:
- 真正保留 3D 局部结构。
- 对真实扫描数据和噪声更鲁棒。
缺点:
- 显存和计算量高。
- 分辨率通常受限,例如论文实验常用 或 。
Decoder:卷积特征 + 隐式查询
得到 feature plane 或 feature volume 后,ConvONet 使用 U-Net 进一步处理这些特征。
- plane feature 使用 2D U-Net。
- volume feature 使用 3D U-Net。
- multi-plane 时,每个 plane 分别通过 2D U-Net,权重共享。
U-Net 的作用是:
- 用卷积聚合局部信息。
- 通过下采样和上采样扩大感受野。
- 用 skip connection 同时保留细节和全局上下文。
- 在稀疏输入中补全缺失特征。
这一步让 ConvONet 具有 convolutional inductive bias。
Occupancy Prediction:如何查询任意点
ConvONet 仍然是隐式表示,因此可以查询任意连续 3D 点:
但它不会只把 和一个全局 code 输入 MLP,而是先从 feature grid 中取出位置相关特征:
图源说明:根据 Peng et al., Convolutional Occupancy Networks 的 feature interpolation 与 occupancy prediction 概念重绘,非论文原图。
不同表示的取特征方式:
- single-plane:把 正交投影到 ground plane,用 bilinear interpolation 取特征。
- multi-plane:分别在三个 canonical planes 取特征,再把特征相加。
- volume:在 3D feature volume 中用 trilinear interpolation 取特征。
最后用一个小 MLP 预测 occupancy:
bilinear interpolation 和 trilinear interpolation 具体怎么做?
先看公式里的几个对象
这里的核心预测形式是:
可以把它拆成四个部分理解。
输入数据
是模型接收到的原始线索。在 3D 重建任务中,它通常是传感器扫描得到的点云、带噪观测,或者低分辨率 voxel grid。
它代表模型对物体或场景的初步认知:信息可能不完整,也可能有噪声。
查询点
是连续 3D 空间中的某个具体位置:
隐式 3D 重建要回答的问题是:
空间里的这个具体点,是空的,还是被物体占据的?
所以模型不是一次只输出一个固定网格,而是可以对任意连续坐标 进行查询。
特征向量
是专门为查询点 提取出来的位置相关特征。
它不只是点 的坐标信息,还融合了从输入 中提取出的局部细节和全局结构。例如:这个点附近是否有点云聚集、局部形状像不像边缘、整体结构是否像椅子腿或桌面的一部分。
可以把它理解成一份关于 周围环境的浓缩报告,后面的 occupancy network 根据这份报告做最终判断。
小型全连接占据网络与占据概率
是最终的判别网络,通常是一个较小的 MLP 或 ResNet block。它接收查询点坐标 和局部特征 ,输出一个 到 之间的 occupancy probability:
如果输出接近 ,表示模型认为 在物体内部,空间被占据;如果输出接近 ,表示模型认为 在物体外部,是空的。
通常可以把输出为 的位置看成物体表面边界:
直觉上,插值要解决的问题就是:既然 是连续坐标,而 encoder 得到的 feature plane 或 feature volume 是离散格子,那么如何为任意 取到合理的 ?
如果直接使用 nearest neighbor,那么查询点 只会取最近格子的特征。这会导致特征随位置变化不连续:查询点稍微移动一下,可能突然跳到另一个 cell,输出发生突变。
插值的想法是:不要只看最近的一个格点,而是看查询点周围的几个格点,并按“离谁更近,谁权重更大”的原则做加权平均。
bilinear interpolation:二维平面上的 4 点插值
假设查询点投影到 feature plane 后,落在一个二维网格单元内部。这个单元四个角的特征分别是:
其中下标可以理解为:
- :左下角。
- :右下角。
- :左上角。
- :右上角。
把查询点在这个 cell 内的局部坐标记为:
表示它在水平方向上从左到右走了多少比例, 表示它在竖直方向上从下到上走了多少比例。
先沿 方向插值:
再沿 方向插值:
合并后就是:
这四个权重分别是:
它们的和一定是 1。
举一个标量特征例子。假设:
查询点在 cell 内的位置是:
权重为:
所以插值结果是:
如果每个格点存的是向量特征,例如 32 维 feature,那么上面的乘法和加法逐维进行。
trilinear interpolation:三维体素里的 8 点插值
trilinear interpolation 是 bilinear interpolation 的三维版本。查询点 落在一个 voxel cell 里,周围有 8 个角点特征:
把查询点在该 voxel 内的局部坐标记为:
其中 分别表示查询点沿 三个方向走过的比例。
它的完整加权形式是:
其中权重为:
这个公式看起来紧凑,但意思很简单:
- 如果角点在 方向是 0,就取 ;如果是 1,就取 。
- 如果角点在 方向是 0,就取 ;如果是 1,就取 。
- 如果角点在 方向是 0,就取 ;如果是 1,就取 。
- 三个方向的比例相乘,就是该角点的权重。
例如 的权重是:
再举一个标量例子。假设查询点局部坐标为:
那么角点 的权重是:
角点 的权重是:
对 8 个角点都这样算权重,再乘以各自的特征并相加,就得到查询点的局部特征:
在 ConvONet 里的意义
ConvONet 的 decoder 需要的是查询点 对应的局部特征 。但 feature plane 或 feature volume 是离散格子, 是连续坐标,所以必须把离散格点特征变成连续位置特征。
bilinear interpolation 用于 2D feature plane,trilinear interpolation 用于 3D feature volume。这样 在空间中平滑移动时,取到的特征也会平滑变化,最后 occupancy prediction 更稳定。
论文 ablation 也显示,bilinear interpolation 比 nearest neighbor 效果更好。
训练和推理
训练时,在感兴趣的 3D 空间中采样 query points:
每个 query point 都有真实 occupancy:
模型预测:
训练损失是 binary cross entropy:
图源说明:根据 Peng et al., Convolutional Occupancy Networks 的 training/inference 流程概念重绘,非论文原图。
推理时,给定输入 ,模型可以在很多 3D query points 上预测 occupancy。
论文使用 MISE,也就是 Multiresolution IsoSurface Extraction,来提取 mesh。
流程可以理解为:
输入点云或粗 voxel
-> encoder 得到 feature plane / volume
-> 对空间中的 query points 预测 occupancy
-> 自适应细化接近表面的区域
-> 提取 occupancy = 0.5 的等值面
-> 得到 triangle mesh
对于大场景,ConvONet 可以用 fully-convolutional sliding-window 方式处理:
把大场景切成重叠窗口
-> 每个窗口做 ConvONet 推理
-> 合并局部重建
这也是它能扩展到 Matterport3D 大场景的原因之一。
这一点和 DeepSDF 不同。DeepSDF 推理时通常要优化 latent code;ConvONet 给定输入后是 feed-forward prediction,不需要为每个测试场景再优化一个 latent code。
为什么卷积特征有帮助
ConvONet 的关键不是简单把 ONet 做大,而是给隐式函数引入空间结构。
普通 ONet 更像是:
one global feature explains all query points
ConvONet 更像是:
query point reads nearby convolutional features
卷积带来几个 inductive biases:
- translation equivariance:相似局部结构在不同位置可以共享处理方式。
- locality:局部几何由附近观测决定。
- hierarchy:U-Net 能融合局部细节和大范围上下文。
- scalability:大场景可滑窗处理。
这使得 ConvONet 特别适合 indoor scene reconstruction。
实验结果
论文做了三类实验。
1. Object-Level Reconstruction
在 ShapeNet 上,从 noisy point clouds 或 low-resolution voxels 重建单个物体。
结果显示:
- ConvONet 多种变体都优于 ONet 和 PointConv。
- 三平面模型效果好且显存更低。
- 3D volume 模型也表现强,但显存更高。
- 卷积特征让模型收敛更快。
2. Scene-Level Reconstruction
在合成室内场景上,从 noisy point clouds 重建大场景。
结论:
- ONet 和 PointConv 在复杂场景上精度明显不足。
- SPSR 传统方法能产生表面,但容易噪声和需要法向。
- ConvONet 能恢复更平滑、更细致的场景结构。
- 高分辨率 3D volume 表现最好。
- plane 和 volume 特征互补。
3. Real-World Generalization
模型在 synthetic indoor scenes 上训练,然后测试到 ScanNet 和 Matterport3D。
结果显示:
- 3D volume 变体在真实数据上更鲁棒。
- plane-based 方法更容易受 domain shift 影响。
- ConvONet 在真实 indoor scenes 上明显优于 ONet 和 PointConv。
- 通过 sliding-window 可以重建多房间、多楼层场景。
优点
ConvONet 的优点:
- 保留隐式表示的连续表面能力。
- 引入卷积特征,增强局部细节。
- 能从点云或 coarse voxel 输入恢复几何。
- 支持单物体和大规模场景。
- plane feature 显存友好。
- volume feature 对真实噪声更鲁棒。
- 推理是 feed-forward,不需要像 DeepSDF 一样优化 latent code。
局限
论文也指出了局限:
- 不是 rotation equivariant。
- translation equivariance 只在 voxel/feature grid 对齐的离散平移上严格成立。
- synthetic 到 real 仍有性能差距。
- 3D volume 特征显存消耗较高。
- plane representation 对高度方向或 domain shift 可能不够稳。
和前面笔记的关系
ConvONet 可以放在 PointNet、DeepSDF、Occupancy Network 之间理解。
| 方法 | 表示 | 查询方式 | 局部结构 |
|---|---|---|---|
| PointNet | 点集特征 | 不直接输出连续场 | 局部建模较弱 |
| DeepSDF | SDF 隐式场 | latent code + query point | 主要靠 MLP,全局 code |
| ONet | occupancy 隐式场 | global feature + query point | 主要靠 MLP,全局 feature |
| ConvONet | occupancy 隐式场 + 卷积特征网格 | local feature at query point + query point | 强,来自 2D/3D CNN |
可以说:
ConvONet 把 PointNet/卷积网络的空间特征编码能力,接到了 Occupancy Network 的连续隐式查询能力上。
我的理解
ConvONet 的核心思想很工程化,也很重要:
不要让一个全局向量记住整个复杂场景,而是在空间中铺一个特征场,让查询点自己去读附近的特征。
这样做后,隐式函数仍然是连续的,但它不再是“盲目地只看全局 code”。
对一个查询点 ,模型真正看到的是:
这让它同时知道:
- 我在空间中的哪里。
- 我附近的输入观测是什么。
- 卷积网络已经整合过哪些局部和全局信息。
这就是它能从单物体扩展到大场景的关键。
阅读时要抓住的主线
- 早期隐式方法连续但过于全局,难以处理大场景。
- ConvONet 把输入编码成 plane/volume feature grid。
- U-Net 用卷积聚合局部和全局信息。
- 查询点通过插值读取 。
- MLP 根据 和局部特征预测 occupancy。
- 训练用 binary cross entropy。
- 推理用 MISE 或滑窗提取大场景 mesh。
后续问题
读完这篇后,可以继续追问:
- ConvONet 和 Local Implicit Grid Representations 的区别是什么?
- tri-plane 表示和后来的 EG3D、NeRF tri-plane 有什么联系?
- occupancy field 和 SDF field 哪个更适合表面法向?
- ConvONet 如何扩展到动态 4D reconstruction?
- 如果加入 transformer,能否替代 U-Net 做全局上下文聚合?