跳到主要内容

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:

fθ(p,c)[0,1]f_\theta(\mathbf{p}, \mathbf{c}) \rightarrow [0,1]

这种方式适合单个物体,但扩展到复杂场景时会遇到问题:

  • 全局 code 很难承载大场景的所有局部细节。
  • MLP 缺少卷积的 translation equivariance。
  • 对局部观测的利用不够充分,容易生成过平滑表面。
  • 大规模 indoor scene 重建困难。

Convolutional Occupancy Networks,简称 ConvONet,核心目标是:

保留隐式表示的连续查询能力,同时引入卷积特征网格,让每个空间位置都能访问局部和全局上下文。

ONet 与 ConvONet 的核心区别重绘示意图

图源说明:根据 Peng et al., Convolutional Occupancy Networks 的核心结构概念重绘,非论文原图。

和普通 Occupancy Network 的区别

普通 Occupancy Network 通常可以理解为:

fθ(p,c)f_\theta(\mathbf{p}, \mathbf{c})

其中:

  • pR3\mathbf{p}\in\mathbb{R}^3 是查询点。
  • c\mathbf{c} 是整个输入的全局编码。

也就是说,所有查询位置共享同一个全局 feature。

ConvONet 改成:

fθ(p,ψ(p,x))f_\theta(\mathbf{p}, \psi(\mathbf{p}, \mathbf{x}))

其中:

  • x\mathbf{x} 是输入,例如 noisy point cloud 或 coarse voxel grid。
  • ψ(p,x)\psi(\mathbf{p},\mathbf{x}) 是在查询位置 p\mathbf{p} 附近取到的卷积特征。

关键差别是:

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

最终输出是:

o^p=fθ(p,ψ(p,x))\hat{o}_{\mathbf{p}} = f_\theta(\mathbf{p}, \psi(\mathbf{p},\mathbf{x}))

其中:

o^p[0,1]\hat{o}_{\mathbf{p}}\in[0,1]

表示点 p\mathbf{p} 在物体或场景内部的概率。

表面可以看成 occupancy 的等值面,例如:

fθ(p,ψ(p,x))=0.5f_\theta(\mathbf{p},\psi(\mathbf{p},\mathbf{x}))=0.5

模型架构:输入与输出

ConvONet 可以分成两个部分看:前面的 encoder 把输入观测转成空间特征网格,后面的 occupancy decoder 对任意查询点预测占据概率。

整体输入

输入数据记为:

x\mathbf{x}

它可以是:

  • noisy sparse point cloud:带噪稀疏点云。
  • low-resolution occupancy grid:低分辨率占据体素。

除此之外,模型还需要一个查询点:

pR3\mathbf{p}\in\mathbb{R}^3

所以从最终预测角度看,ConvONet 的输入是:

(x,p)(\mathbf{x},\mathbf{p})

encoder 的输入与输出

encoder 输入原始观测 x\mathbf{x},输出离散的卷积特征表示。

如果使用 plane encoder,输出是一个或多个 2D feature planes:

Fxy,Fxz,Fyz\mathbf{F}_{xy},\mathbf{F}_{xz},\mathbf{F}_{yz}

如果使用 volume encoder,输出是 3D feature volume:

FRR×R×R×C\mathbf{F}\in\mathbb{R}^{R\times R\times R\times C}

其中 RR 是空间分辨率,CC 是每个格点的特征维度。

query feature 的输入与输出

给定查询点 p\mathbf{p},模型会在 feature plane 或 feature volume 中插值得到局部特征:

ψ(p,x)\psi(\mathbf{p},\mathbf{x})

输入:

p+feature plane / volume\mathbf{p}+\text{feature plane / volume}

输出:

ψ(p,x)RC\psi(\mathbf{p},\mathbf{x})\in\mathbb{R}^{C}

如果是 2D plane,用 bilinear interpolation;如果是 3D volume,用 trilinear interpolation。

occupancy decoder 的输入与输出

decoder 输入查询点坐标和该点对应的局部特征:

(p,ψ(p,x))(\mathbf{p},\psi(\mathbf{p},\mathbf{x}))

输出是一个占据概率:

o^p=fθ(p,ψ(p,x))[0,1]\hat{o}_{\mathbf{p}} = f_\theta(\mathbf{p},\psi(\mathbf{p},\mathbf{x})) \in[0,1]

含义是:

  • o^p1\hat{o}_{\mathbf{p}}\approx 1:点 p\mathbf{p} 在物体或场景内部。
  • o^p0\hat{o}_{\mathbf{p}}\approx 0:点 p\mathbf{p} 在空空间中。
  • o^p=0.5\hat{o}_{\mathbf{p}}=0.5 附近:可作为重建表面。

训练和推理时的输出

阶段输入输出
训练观测 x\mathbf{x},查询点 p\mathbf{p},真实 occupancy opo_{\mathbf{p}}预测 occupancy o^p\hat{o}_{\mathbf{p}},用 BCE 和真值比较
单点推理观测 x\mathbf{x},一个查询点 p\mathbf{p}该点 occupancy probability
形状/场景重建观测 x\mathbf{x},大量空间查询点连续 occupancy field,再提取 0.50.5 等值面

因此 ConvONet 的网络直接输出不是 mesh,而是任意点的 occupancy probability。mesh 是在大量点上查询后,用等值面提取得到的。

输出可以用来干什么

ConvONet 的核心输出是查询点的 occupancy probability:

o^p[0,1]\hat{o}_{\mathbf{p}}\in[0,1]

它可以支持以下任务。

输出可以用来做什么具体做法
单点 occupancy o^p\hat{o}_{\mathbf{p}}判断空间点是否被占据o^p\hat{o}_{\mathbf{p}} 接近 1 表示内部,接近 0 表示外部
连续 occupancy field提取 3D 表面对大量 3D 点查询 occupancy,提取 o^=0.5\hat{o}=0.5 等值面
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,表面来自 s=0s=0;ConvONet 输出 occupancy probability,表面通常来自 o^=0.5\hat{o}=0.5

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 上。

plane encoder 和 volume encoder 重绘示意图

图源说明:根据 Peng et al., Convolutional Occupancy Networks 的 plane/volume encoder 概念重绘,非论文原图。

Plane Encoder

Plane encoder 会把 3D 点投影到一个或多个 canonical planes。

常见选择是:

  • 单个 ground plane。
  • 三个 canonical planes:xyxyxzxzyzyz

如果多个点落到同一个 plane cell,就用 average pooling 聚合:

fcell=1PcellpiPcellfi\mathbf{f}_{cell} = \frac{1}{|\mathcal{P}_{cell}|} \sum_{\mathbf{p}_i\in \mathcal{P}_{cell}} \mathbf{f}_i

得到的是二维特征图:

H×W×dH\times W\times d

优点:

  • 分辨率可以做得比较高,例如 1282128^2
  • 显存比 3D volume 低。
  • 三平面能以较低成本覆盖三维结构。

缺点:

  • 单平面对高度方向信息表达不足。
  • 多平面仍然不是完整 3D volume,存在信息压缩。

Volume Encoder

Volume encoder 把点或 voxel 特征放进 3D feature volume:

H×W×D×dH\times W\times D\times d

如果多个点落进同一个 voxel cell,也用 average pooling。

优点:

  • 真正保留 3D 局部结构。
  • 对真实扫描数据和噪声更鲁棒。

缺点:

  • 显存和计算量高。
  • 分辨率通常受限,例如论文实验常用 32332^364364^3

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 点:

pR3\mathbf{p}\in\mathbb{R}^3

但它不会只把 p\mathbf{p} 和一个全局 code 输入 MLP,而是先从 feature grid 中取出位置相关特征:

ψ(p,x)\psi(\mathbf{p},\mathbf{x})

查询点插值局部特征再预测 occupancy 的重绘示意图

图源说明:根据 Peng et al., Convolutional Occupancy Networks 的 feature interpolation 与 occupancy prediction 概念重绘,非论文原图。

不同表示的取特征方式:

  • single-plane:把 p\mathbf{p} 正交投影到 ground plane,用 bilinear interpolation 取特征。
  • multi-plane:分别在三个 canonical planes 取特征,再把特征相加。
  • volume:在 3D feature volume 中用 trilinear interpolation 取特征。

最后用一个小 MLP 预测 occupancy:

fθ(p,ψ(p,x))[0,1]f_\theta(\mathbf{p},\psi(\mathbf{p},\mathbf{x})) \rightarrow [0,1]
bilinear interpolation 和 trilinear interpolation 具体怎么做?

先看公式里的几个对象

这里的核心预测形式是:

fθ(p,ψ(p,x))[0,1]f_\theta(\mathbf{p},\psi(\mathbf{p},\mathbf{x})) \rightarrow [0,1]

可以把它拆成四个部分理解。

输入数据 x\mathbf{x}

x\mathbf{x} 是模型接收到的原始线索。在 3D 重建任务中,它通常是传感器扫描得到的点云、带噪观测,或者低分辨率 voxel grid。

它代表模型对物体或场景的初步认知:信息可能不完整,也可能有噪声。

查询点 p\mathbf{p}

p\mathbf{p} 是连续 3D 空间中的某个具体位置:

p=(x,y,z)\mathbf{p}=(x,y,z)

隐式 3D 重建要回答的问题是:

空间里的这个具体点,是空的,还是被物体占据的?

所以模型不是一次只输出一个固定网格,而是可以对任意连续坐标 p\mathbf{p} 进行查询。

特征向量 ψ(p,x)\psi(\mathbf{p},\mathbf{x})

ψ(p,x)\psi(\mathbf{p},\mathbf{x}) 是专门为查询点 p\mathbf{p} 提取出来的位置相关特征。

它不只是点 p\mathbf{p} 的坐标信息,还融合了从输入 x\mathbf{x} 中提取出的局部细节和全局结构。例如:这个点附近是否有点云聚集、局部形状像不像边缘、整体结构是否像椅子腿或桌面的一部分。

可以把它理解成一份关于 p\mathbf{p} 周围环境的浓缩报告,后面的 occupancy network 根据这份报告做最终判断。

小型全连接占据网络与占据概率

fθf_\theta 是最终的判别网络,通常是一个较小的 MLP 或 ResNet block。它接收查询点坐标 p\mathbf{p} 和局部特征 ψ(p,x)\psi(\mathbf{p},\mathbf{x}),输出一个 0011 之间的 occupancy probability:

fθ(p,ψ(p,x))P(occupiedp,x)f_\theta(\mathbf{p},\psi(\mathbf{p},\mathbf{x})) \approx P(\text{occupied}\mid \mathbf{p},\mathbf{x})

如果输出接近 11,表示模型认为 p\mathbf{p} 在物体内部,空间被占据;如果输出接近 00,表示模型认为 p\mathbf{p} 在物体外部,是空的。

通常可以把输出为 0.50.5 的位置看成物体表面边界:

fθ(p,ψ(p,x))=0.5f_\theta(\mathbf{p},\psi(\mathbf{p},\mathbf{x}))=0.5

直觉上,插值要解决的问题就是:既然 p\mathbf{p} 是连续坐标,而 encoder 得到的 feature plane 或 feature volume 是离散格子,那么如何为任意 p\mathbf{p} 取到合理的 ψ(p,x)\psi(\mathbf{p},\mathbf{x})

如果直接使用 nearest neighbor,那么查询点 p\mathbf{p} 只会取最近格子的特征。这会导致特征随位置变化不连续:查询点稍微移动一下,可能突然跳到另一个 cell,输出发生突变。

插值的想法是:不要只看最近的一个格点,而是看查询点周围的几个格点,并按“离谁更近,谁权重更大”的原则做加权平均。

bilinear interpolation:二维平面上的 4 点插值

假设查询点投影到 feature plane 后,落在一个二维网格单元内部。这个单元四个角的特征分别是:

f00,f10,f01,f11\mathbf{f}_{00},\mathbf{f}_{10},\mathbf{f}_{01},\mathbf{f}_{11}

其中下标可以理解为:

  • f00\mathbf{f}_{00}:左下角。
  • f10\mathbf{f}_{10}:右下角。
  • f01\mathbf{f}_{01}:左上角。
  • f11\mathbf{f}_{11}:右上角。

把查询点在这个 cell 内的局部坐标记为:

(u,v),0u1,0v1(u,v),\quad 0\le u\le 1,\quad 0\le v\le 1

uu 表示它在水平方向上从左到右走了多少比例,vv 表示它在竖直方向上从下到上走了多少比例。

先沿 xx 方向插值:

f0v=(1u)f00+uf10\mathbf{f}_{0v} = (1-u)\mathbf{f}_{00} +u\mathbf{f}_{10}f1v=(1u)f01+uf11\mathbf{f}_{1v} = (1-u)\mathbf{f}_{01} +u\mathbf{f}_{11}

再沿 yy 方向插值:

ψ(p)=(1v)f0v+vf1v\psi(\mathbf{p}) = (1-v)\mathbf{f}_{0v} +v\mathbf{f}_{1v}

合并后就是:

ψ(p)=(1u)(1v)f00+u(1v)f10+(1u)vf01+uvf11\psi(\mathbf{p}) = (1-u)(1-v)\mathbf{f}_{00} +u(1-v)\mathbf{f}_{10} +(1-u)v\mathbf{f}_{01} +uv\mathbf{f}_{11}

这四个权重分别是:

(1u)(1v),u(1v),(1u)v,uv(1-u)(1-v),\quad u(1-v),\quad (1-u)v,\quad uv

它们的和一定是 1。

举一个标量特征例子。假设:

f00=10,f10=20,f01=30,f11=50f_{00}=10,\quad f_{10}=20,\quad f_{01}=30,\quad f_{11}=50

查询点在 cell 内的位置是:

u=0.25,v=0.6u=0.25,\quad v=0.6

权重为:

(1u)(1v)=0.75×0.4=0.3(1-u)(1-v)=0.75\times 0.4=0.3u(1v)=0.25×0.4=0.1u(1-v)=0.25\times 0.4=0.1(1u)v=0.75×0.6=0.45(1-u)v=0.75\times 0.6=0.45uv=0.25×0.6=0.15uv=0.25\times 0.6=0.15

所以插值结果是:

ψ=0.3×10+0.1×20+0.45×30+0.15×50=26\psi = 0.3\times10 +0.1\times20 +0.45\times30 +0.15\times50 =26

如果每个格点存的是向量特征,例如 32 维 feature,那么上面的乘法和加法逐维进行。

trilinear interpolation:三维体素里的 8 点插值

trilinear interpolation 是 bilinear interpolation 的三维版本。查询点 p\mathbf{p} 落在一个 voxel cell 里,周围有 8 个角点特征:

f000,f100,f010,f110,f001,f101,f011,f111\mathbf{f}_{000},\mathbf{f}_{100},\mathbf{f}_{010},\mathbf{f}_{110}, \mathbf{f}_{001},\mathbf{f}_{101},\mathbf{f}_{011},\mathbf{f}_{111}

把查询点在该 voxel 内的局部坐标记为:

(u,v,w),0u,v,w1(u,v,w),\quad 0\le u,v,w\le 1

其中 u,v,wu,v,w 分别表示查询点沿 x,y,zx,y,z 三个方向走过的比例。

它的完整加权形式是:

ψ(p)=a{0,1}b{0,1}c{0,1}ωabcfabc\psi(\mathbf{p}) = \sum_{a\in\{0,1\}} \sum_{b\in\{0,1\}} \sum_{c\in\{0,1\}} \omega_{abc}\mathbf{f}_{abc}

其中权重为:

ωabc=(au+(1a)(1u))(bv+(1b)(1v))(cw+(1c)(1w))\omega_{abc} = \big(a u+(1-a)(1-u)\big) \big(b v+(1-b)(1-v)\big) \big(c w+(1-c)(1-w)\big)

这个公式看起来紧凑,但意思很简单:

  • 如果角点在 xx 方向是 0,就取 (1u)(1-u);如果是 1,就取 uu
  • 如果角点在 yy 方向是 0,就取 (1v)(1-v);如果是 1,就取 vv
  • 如果角点在 zz 方向是 0,就取 (1w)(1-w);如果是 1,就取 ww
  • 三个方向的比例相乘,就是该角点的权重。

例如 f101\mathbf{f}_{101} 的权重是:

ω101=u(1v)w\omega_{101}=u(1-v)w

再举一个标量例子。假设查询点局部坐标为:

u=0.2,v=0.5,w=0.75u=0.2,\quad v=0.5,\quad w=0.75

那么角点 f101f_{101} 的权重是:

ω101=0.2×(10.5)×0.75=0.075\omega_{101} = 0.2\times(1-0.5)\times0.75 =0.075

角点 f000f_{000} 的权重是:

ω000=(10.2)(10.5)(10.75)=0.8×0.5×0.25=0.1\omega_{000} = (1-0.2)(1-0.5)(1-0.75) =0.8\times0.5\times0.25 =0.1

对 8 个角点都这样算权重,再乘以各自的特征并相加,就得到查询点的局部特征:

ψ(p)=ω000f000+ω100f100++ω111f111\psi(\mathbf{p}) = \omega_{000}\mathbf{f}_{000} +\omega_{100}\mathbf{f}_{100} +\cdots +\omega_{111}\mathbf{f}_{111}

在 ConvONet 里的意义

ConvONet 的 decoder 需要的是查询点 p\mathbf{p} 对应的局部特征 ψ(p,x)\psi(\mathbf{p},\mathbf{x})。但 feature plane 或 feature volume 是离散格子,p\mathbf{p} 是连续坐标,所以必须把离散格点特征变成连续位置特征。

bilinear interpolation 用于 2D feature plane,trilinear interpolation 用于 3D feature volume。这样 p\mathbf{p} 在空间中平滑移动时,取到的特征也会平滑变化,最后 occupancy prediction 更稳定。

论文 ablation 也显示,bilinear interpolation 比 nearest neighbor 效果更好。

训练和推理

训练时,在感兴趣的 3D 空间中采样 query points:

pR3\mathbf{p}\in\mathbb{R}^3

每个 query point 都有真实 occupancy:

op{0,1}o_{\mathbf{p}}\in\{0,1\}

模型预测:

o^p=fθ(p,ψ(p,x))\hat{o}_{\mathbf{p}} = f_\theta(\mathbf{p},\psi(\mathbf{p},\mathbf{x}))

训练损失是 binary cross entropy:

L(o^p,op)=[oplog(o^p)+(1op)log(1o^p)]L(\hat{o}_{\mathbf{p}},o_{\mathbf{p}}) = - \left[ o_{\mathbf{p}}\log(\hat{o}_{\mathbf{p}}) + (1-o_{\mathbf{p}})\log(1-\hat{o}_{\mathbf{p}}) \right]

ConvONet 训练和推理流程重绘示意图

图源说明:根据 Peng et al., Convolutional Occupancy Networks 的 training/inference 流程概念重绘,非论文原图。

推理时,给定输入 x\mathbf{x},模型可以在很多 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点集特征不直接输出连续场局部建模较弱
DeepSDFSDF 隐式场latent code + query point主要靠 MLP,全局 code
ONetoccupancy 隐式场global feature + query point主要靠 MLP,全局 feature
ConvONetoccupancy 隐式场 + 卷积特征网格local feature at query point + query point强,来自 2D/3D CNN

可以说:

ConvONet 把 PointNet/卷积网络的空间特征编码能力,接到了 Occupancy Network 的连续隐式查询能力上。

我的理解

ConvONet 的核心思想很工程化,也很重要:

不要让一个全局向量记住整个复杂场景,而是在空间中铺一个特征场,让查询点自己去读附近的特征。

这样做后,隐式函数仍然是连续的,但它不再是“盲目地只看全局 code”。

对一个查询点 p\mathbf{p},模型真正看到的是:

(p,ψ(p,x))(\mathbf{p}, \psi(\mathbf{p},\mathbf{x}))

这让它同时知道:

  • 我在空间中的哪里。
  • 我附近的输入观测是什么。
  • 卷积网络已经整合过哪些局部和全局信息。

这就是它能从单物体扩展到大场景的关键。

阅读时要抓住的主线

  1. 早期隐式方法连续但过于全局,难以处理大场景。
  2. ConvONet 把输入编码成 plane/volume feature grid。
  3. U-Net 用卷积聚合局部和全局信息。
  4. 查询点通过插值读取 ψ(p,x)\psi(\mathbf{p},\mathbf{x})
  5. MLP 根据 p\mathbf{p} 和局部特征预测 occupancy。
  6. 训练用 binary cross entropy。
  7. 推理用 MISE 或滑窗提取大场景 mesh。

后续问题

读完这篇后,可以继续追问:

  1. ConvONet 和 Local Implicit Grid Representations 的区别是什么?
  2. tri-plane 表示和后来的 EG3D、NeRF tri-plane 有什么联系?
  3. occupancy field 和 SDF field 哪个更适合表面法向?
  4. ConvONet 如何扩展到动态 4D reconstruction?
  5. 如果加入 transformer,能否替代 U-Net 做全局上下文聚合?