占用网络:在函数空间中学习三维重建
Mescheder L, Oechsle M, Niemeyer M, et al. Occupancy networks: Learning 3d reconstruction in function space[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2019: 4460-4470.
摘要
随着深度神经网络的问世,基于学习的三维重建方法越来越受欢迎。然而,与图像不同的是,在三维问题中没有一种规范的表示,使得我们既可以得到良好的计算和存储效率,还能够表示任意拓扑结构的高分辨率几何图形。因此,现有的许多基于学习的三维重建方法,要不只能表示非常粗糙的三维几何形状,要不运用在有限的领域内。本文提出了一种新的基于学习的三维重建方法——占位网络(Occupancy networks),它隐式地将三维表面表示为深度神经网络分类器的连续决策边界。与现有方法相比,我们的表示可以采用无限分辨率对三维输出的描述进行编码,而且没有过多的内存占用。本文验证了我们的表示可以有效地编码三维结构,并且可以从各种类型的输入中推断出来。本文的实验基于单个图像、噪声点云和粗糙的离散体素网格三种类型,从定性和定量两个方面展示了具有竞争力的结果。我们相信占位网络将会成为各种基于学习的三维任务中的有效工具。
关键词
占位网络,三维重建,三维表示,隐式函数,神经网络,深度学习,
Sec01 背景介绍
最近,基于学习的三维重建得到更多的关注[^4][^9][^23][^58][^75][^77]。相比传统的多视图立体视镜算法,基于学习的模型可以编码关于三维形状空间的丰富的先验信息,这种行为有助于解决输入中的歧义。
虽然生成模型最近在生成真实的高分辨率图像方面取得了显著的成功[^36][^47][^72],但是这个成绩并没有反映在三维领域中。相比二维领域,大家还未能就一种既节省内存,又可以从数据中有效推理的三维输出的表示方式达成一致。现有的表示方式可以大致分为三类:基于体素的表示[^4][^19][^43][^58][^64][^69][^75],基于点的表示[^1][^17],和网格表示[^34][^57][^70],描述见图1。
图1:概述:现有的三维表示以不同的方式离散化输出空间:(a) 空间上的体素表示;(b) 基于预测点的表示;(c) 基于顶点的网格表示。作为对比,(d) 我们建议的以分类器 $f_\theta$ (如:深度神经网络)的连续决策边界作为以任意分辨率提取的三维网格的三维表面
体素表示是像素对三维情况的直接泛化。然而,体素表示的内存占用随着分辨率的增加而呈立方增长,因此限制了原始的实现向 $32^3$ 或者 $64^3$ 的推广。虽然通过使用数据自适应表示(如:八叉树[^61][^67])可以减少内存的占用,但是这种方法会导致复杂的实现,并且现有的数据自适应算法仍然局限于相对较小的 $256^3$ 的体素栅格。点云[^1[^17]和网格[^34][^57][^70]也被当作一种替代表示,使用合适的损失函数引入到深度学习中。然而,点云缺少基础网格的连接结构,因此需要额外的后处理步骤从模型中提取三维几何关系。现有的网格表示通常是基于模板网格的变形实现,因此不允许表示任意的拓扑关系。此外,这两种方法都受限于标准前馈网络能够可靠预测的点或顶点的数量。
在本文中,我们提出了一种新颖的三维重建方法,这种方法基于直接学习连续三维占位函数(图1d)实现。通过预测完整的占位函数代替了在固定分辨率下预测体素的表示,占位函数使用的是神经网络$f_\theta$来评估任意的分辨率。这大大减少了训练过程中的内存占用。在推理阶段,我们使用简单的多分辨率等值面提取算法从学习得到的模型中提取网格,这个算法在三维位置上并行化。
总的来说,我们的贡献如下:
- 引入了新的表示,是基于学习连续的三维映射实现的三维几何表示方法
- 展示了这种表示如何用于从各种输入类型中重建三维几何形状
- 通过实验验证了我们的方法能够生成高质量的网格,并且证明其优于当前最先进的方法
Sec02 相关工作
现有的基于学习的三维重建工作可以根据模型产生的输出表示大致分为:基于体素的、基于点的和基于网格的。
体素表示
由于其简单性,体素表示被大量地应用于三维任务中:判别[^45][^55][^63]和生成[^9][^23][^58][^64][^75][^77]。
早期的工作已经考虑了基于体素栅格[^9][^68][^77]使用三维卷积神经网络从单张图像重建三维几何图形的问题。然而,由于内存的需要,这些方法仅限于相对较小的 $32^3$ 体素栅格。而最近的工作[^74][^76][^79]已经将应用三维卷积神经网络的分辨率提升到 $128^3$,这个仅对浅的网络结构和小的批大小有效,并且导致训练速度很慢。
从多个输入视图重建三维几何图形的问题已经在[^31][^35][^52]中给予了考虑。Ji 等[^31]和 Kar 等[^35] 将相机参数与输入图像一起编码在三维体素表示中,并且应用三维卷积从多个视图中重建三维场景。Paschalidou 等[^52] 引入了一种利用多视图几何约束从多幅图像预测体素占用率的架构[^69]。
其他工作应用体素表示来学习三维形状的生成模型。这些方法中的大多数,或者基于变分自动编码器(Variational Auto-Encoder)[^39][^59],或者基于生成对抗网络(Generative Adversarial Network)。这两种方法分别在[^4][^58]和[^75]中应用。
由于体素表示的高存储需求,最近的工作都提出了以多分辨率方式重建三维对象[^28][^67]。然而,最终方法经常是实现过程越来很复杂,并且需要通过多次传递输入以生成最终的三维模型。此外,它们仍然受限于相对较小的 $256^3$ 体素栅格。为了实现亚体素精度,部分工作[^12][^42][^60]提出了预测截断的有符号的距离场(Truncated Signed Distance Field,TSDF)[^11],即在三维栅格中存储了每个点到最近的三维表面点的截断的有符号的距离。然而,这个表示与占用表示相比更难学习,因为网络必须推理三维空间中的距离函数,而不是仅仅将体素分类为被占用或未占用。而且,这种表示仍然受限于底层的三维栅格的分辨率。
点表示
三维几何图形的一个有趣的替代表示是由三维点云给出的,点云广泛应用在机器人和计算机图形社区。Qi 等[^54][^56] 率先将点云作为判别类的深度学习任务的表示。他们通过对每个点独立地应用全连接的神经网络,然后再进行全局池化操作,实现了转换的不变性。Fan 等[^17]引入点云作为三维重建的输出表示。然而,与其他表示不同,这个方法需要额外的不平凡的后处理步骤[^3][^6][^37][^38]生成最终的三维网格。
网格表示
网格表示首先被应用在判别类的三维分类或者分割任务,在网格的顶点和边所展开的图上应用卷积网络[^5][^27][^71]。
最近,网格也被应用于三维重建的输出表示[^26][^33][^41][^70]。不幸的是,这些方法中的大多数容易产生自相交网格。而且,它们只能生成具有简单拓扑的网格[^70],或者需要来自同一对象类的参考模板[^33][^41][^57],或者不能保证封闭的曲面[^26]。Liao 等[^43]提出了端到端可以学习的移动立方体算法[^44]。然而,他们的方法仍然受限于底层三维网格的存储需求,也受限于$32^3$的分辨率。
与前面提到的方法相比,我们的方法可以生成没有自相交的高分辨率的封闭曲面,并且不需要来自相同对象类的模板网格作为输入。这个想法与经典的水平集[^10][^14][^50]到多视图三维重建[^18][^24][^32][^40][^53][^78]相关。然而,相比求解一个可微的公式,我们的方式使用深度学习获得更具表现力的表示,这种表示可以自然地集成到端到端的学习管线中。
Sec03 具体方法
在本节中,我们首先引入占位网络(Occupancy Networks)作为三维几何的表示工具。然后,我们将描述如何学习一个模型,使之可以从各种形式的输入(如:点云、单个图像和低分辨率体素表示)中推断出表示。最后,我们描述的是如何在测试阶段从模型中提取出高质量的三维网格。
Sec0301 占位网格
理想情况下,我们希望关于占位的推理,不仅能够在固定的离散三维位置(如在体素表示中),还可以在每一个可能的三维点$p\in\mathbb{R}^3$。我们称这个结果函数:
$$
o:\mathbb{R}^3\rightarrow{0,1}
$$
为三维对象的占位函数。我们的重要理论贡献是可以使用神经网络逼近这个三维函数,神经网络对于每个位置$p\in\mathbb{R}^3$分配一个0到1之间的占位概率。请注意,这个网络等价于一个二分类问题的神经网络,除了得到我们感兴趣的决策边界,还隐匿地表示了物体的表面。
当基于对象(如:图像、点云等)的观察使用这种网络实现对象的三维重建时,我们必须以输入为条件。幸运的是,我们可以利用后续的简单的函数关系来等价表示:函数使用观察$x\in\mathcal{X}$作为输入,得到一个从$p\in\mathbb{R}^3$到$\mathbb{R}$的函数作为输出,这个关系可以等价地用一个函数来描述,这个函数的输入是二元组$(p,x)\in\mathbb{R}^3\times\mathcal{X}$,输出是一个实数值。后续的表示可以通过一个神经网络$f_\theta$被简单地参数化,神经网络使用二元组$(p,x)$作为输入,输出是一个实数值,用于表示占位概率:
$$
f_\theta:\mathbb{R}^3\times\mathcal{X}\rightarrow[0,1]
$$
我们称之为占位网络。
Sec0302 模型训练
为了学习神经网络$f_\theta(p,x)$的参数$\theta$,我们在所考虑的对象的三维包围盒(bounding volume)内随机地采样点:对于训练批次的第$i$个样本,我们采样$K$个点$p_{ij}\in\mathbb{R},j=1,\cdots,K$,然后在这些位置上估计最小批处理损失函数$\mathcal{L_B}$:
$$
\mathcal{L_B}=\frac1{|\mathcal{B}|}\sum_{i=1}^{|\mathcal{B}|}\sum_{j=1}^K\mathcal{L}(f_\theta(p_{ij},x_i),o_{ij})
$$
这里,$x_i$是批处理$\mathcal{B}$的第$i$个观测,$o_{ij}\equiv o(p_{ij})$是点$p_{ij}$的真正的占位概率,$\mathcal{L}(\cdot,\cdot)$是交叉熵分类损失函数。
我们方法的性能依赖于采样的方案,方案主要用于抽取训练时使用的位置$p_{ij}$。在Sec0406中,我们进行了详细的消融研究,比较了不同的采样方案。在实践中,我们发现在对象的包围盒中实行均匀采样,并且配合小的填充,网络能够得到最佳的结果。
我们的三维表示还可以用于学习概率的隐变量模型。为了这个目标,我们引入了编码网络$g_\psi(\cdot)$,使用位置$p_{ij}$和占位概率$o_{ij}$作为输入,在隐变量$z\in\mathbb{R}^L$上预测高斯分布$q_\psi(z|(p_{ij},o_{ij}){j=1:K})$的均值$\mu_\psi$和标准差$\sigma_\psi$作为输出。我们优化生成模型$p((o{ij}){j=1:K}|(p{ij}){j=1:K})$的负对数的下界[^21],[^39],[^59]:
$$
\mathcal{L_B}^{gen}(\theta,\psi)=\frac1{|\mathcal{B}|}\sum{i=1}^{|\mathcal{B}|}
[\sum_{j=1}^K\mathcal{L}(f_\theta(p_{ij},z_i),o_{ij})
+KL(q_\psi(z|(p_{ij},o_{ij}){j=1:K})|p_0(z))]
$$
其中,$KL$表示$KL$散度,$p_0(z)$表示隐变量$z_i$(通常为高斯分布)上的先验分布,$z_i$是基于$q_\psi(z|(p{ij},o_{ij})_{j=1:K})$的采样。
Sec0303 模型推理
为了基于给定的训练好的占位网络中得到的新观测值上提取等值面,我们引入了多分辨率等值面提取算法(Multiresolution IsoSurface Extraction,MISE),一个分层次的等值面提取算法(参见图2)。通过渐进地构建八叉树[^30][^46][^66][^73],MISE使得从占位网络中提取高分辨率的网格成为可能,并且无需稠密地评估高维占用网格的所有点。
图2:多分辨率等值面抽取算法:在给定分辨率下,首先标记所有的点,包括被评估为已占用(红色圆圈)或者未占用(青色菱形)的那些点。然后,确定包括了已占用角和未占用角的所有的体素,并且标记它们为活动的(浅红色) ,然后再将每个体素细分成8个子体素。接下来,我们评估所有通过细分引入的新栅格点(空圆圈)。重复前面两个步骤,直到满足输出需要的分辨率。最终,我们使用移动立方体算法(Marching Cubes Algorithm, MCA)算法[^44]完成网格提取工作,使用一阶和二阶梯度信息精简和细化输出的体素。
首先,我们在初始分辨率下对体积空间执行离散化,并且评估栅格中所有点$p$的占位网络$f_\theta(p,x)$。对于所有栅格点$p$当其$f_\theta(p,x)$大于或者等于某个阈值$\tau$时标记为占位点。接下来,只要某个体素满足两个相邻的网格点拥有不同的占用预测概率则这个体素标记为活动的。如果在当前分辨率下应用移动立方体算法,这些体素将与网格相交。我们将所有的活动体素细分为8个子体素,并且评估这些通过细分引入到占位栅格中的新的栅格点。我们重复这些步骤直到满足最终的分辨率目标。在这个最终分辨率下,我们应用移动立方体算法[^44]提取近似的等值面:
$$
{p\in\mathbb{R}^3|f_\theta(p,x)=\tau}
$$
在初始分辨率下,我们的算法能否收敛到正确的网格上,取决于条件:占用栅格是否包含了来自网格内部和外部的每个连通分量的点。因此,算法的关键是采用的初始分辨率必须满足这个条件。在实践中,我们发现初始分辨率$32^3$几乎能够满足所有情况的需要。
通过移动立方体算法提取的网格可以进一步细化。第一步,我们使用快速二次网格简化算法(Fast-Quadric-Mesh-Simplification Algorithm)[^20]来简化网格;第二步,我们使用一阶和二阶(梯度)信息来细化输出的网格。为此,我们从输出网格的每个面随机采样点$p_k$,并且最小化损失函数:
$$
\sum_{k=1}^K(f_\theta(p_k,x)-\tau)^2
+\lambda|\frac{\nabla_p f_\theta(p_k,x)}{|\nabla_p f_\theta(p_k,x)|}-n(p_k)|^2
$$
其中,$n(p_k)$表示了网格在$p_k$处的法向量。在实践中,我们设置$\lambda=0.01$。使用二阶梯度信息最小化等式(6)中的第二项,其有效实现可以使用双重反向传播[^15]。
请注意,这个第二步消除了移动立方体近似时带来的离散伪影,如果直接预测基于体素的表示也可能无效。此外,我们的方法还允许通过占位网络中简单的反向传播来有效地提取输出网格的所有顶点的法线。因此,我们算法对于每个网格的推理时间总计为3秒。
Sec0304 实施细节
我们使用具有5个ResNet块[^29]的全边接神经网络实现占位网络,并且使用条件批处理[^13][^16]作为输入的条件。我们根据输入的类型使用不同的编码器结构。对于单视图三维重建,我们使用 ResNet18 架构[^29]。对于点云,我们使用 PointNet 编码器[^54]。对于体素化输入,我们使用三维卷积神经网络[^45]。对于无条件网格生成,我们使用 PointNet[^54]作为编码器网络$g_\psi$。更多的细节请参考补充材料。
Sec04 实验
我们进行了三种类型的实验来验证所提出的占位网络。首先,我们分析了占位网络的表现能力,主要是通过检验网络从学习到的隐嵌入中重建复杂三维形状的能力。这给了我们一个结果,当我们使用额外的输入来调节我们的表现时,这个结果是我们可以达到的上限。其次,以图像、有噪声的点云和低分辨率体素表示为占位网络的输入条件,我们的方法与几个最先进的基线进行了性能比较。最后,通过在我们的模型中添加一个编码器,并且众这个模型中生成无条件的样本,我们检验了占位网络的生成能力。
基线
数据集
测度
Sec0401 表示能力
Sec0402 单图像三维重建
ShapeNet
真实数据
Sec0403 点云补全
作为第二个条件任务,我们的方法应用于从噪声点云中重建网格的问题。为了这个目标,我们从每个(水密)ShapeNet模型的表面子采样 300 个点,并且使用零均值和标准方差 $0.05$ 的高斯分布对点云增加噪声。
表2:点云的三维重建。基于 ShapeNet 数据集上的点云进行三维重建,表中展示了我们的方法与其他基线方法的数值比较。我们测量了关于基准网格的 $IoU$ 、 $\text{倒角-}L_1$ 距离和$法向的一致性$。
我们再次测量关于基准网络的 $IoU$ 和$\text{倒角-}L_1$距离,结果请参见表2。通过观察发现我们的方法达到了最高的 $IoU$ 和 $法向一致性$,以及最低的 $\text{倒解-}L_1$ 距离。
Sec0404 体素超分辨率
Sec0405 无条件网格生成
Sec0406 消融研究
在本节中,我们测试了模型的各种组件如何影响其在单图像三维重建任务中的性能。
采样策略的有效性
结构的有效性
Sec05 结论
本文介绍了一种新的三维几何表示方法——占位网络。与现有的表示相比,占位网络不受三维空间离散化的限制,因此可以用于表示真实的高分辨率网格。
实验表明占位网络表现能力强,可以有效地应用于有监督和无监督学习。因此,我们认为占位网络是一个有用的工具,可以广泛地应用于各种各样的三维任务中。