— order: 1 —1 SDF(DeepSDF)DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation时间:2019.11.1 引言DeepCNN 是基于图像的支柱方法,当直接推广到第三个空间维度时,在空间和时间复杂度上的快速增长,以及表示的不匹配问题,使得 3D 数据处理或产生 3D 推理等任务的质量、灵活性和保真度不高这项工作中提出了一种新的生成 3D 建模表示和方法,该方法高效、富有表现力且完全连续。该方法使用 SDF 的概念,但与将 SDF离散为规则网格以进行评估和测量去噪的常见表面重建技术不同,我们改为学习一个生成模型来产生这样一个连续的场尽管 SDF CV, CG 领域被熟知,但这篇文章应该是第一个用神经网络来直接拟合的工作,主要贡献在于:1.具有连续隐式曲面的、shape-conditioned 3D 模型的建模方法2.基于概率 auto-decoder 3D 形状的学习方法,以及3.该方法在形状重建和补全方面的演示和应用我们的模型产生了具有复杂拓扑结构的高质量连续表面,并在定量比较中取得了 SOTA一个例子,我们的模型仅使用 7.4 MB 内存来表示椅子这一类别,这还不到单个未压缩的51233D 位图的内存占用的一半(16.8 MB)但感觉拿未压缩的原图来比也有点耍流氓)1.2 相关工作1.2.1 Representations for 3D Shape Learning3D 物体形状的(显式)表示可以分成3类:基于点云, mesh voxel 的方法:1.Point-based: 点云的表达更接近 raw data不可否认PointNet 在提特征方面很合适(做分类分割检测的工作比较合适),但在物体形状的表达方面很受限,没有描述 topology不适合生成完美的表面2.Mesh-based可以对 3D 物体建模,但是拓扑结构固定3.Voxel-based最直接的想法就是使用 dense occupancy grid但是由于三次的复杂度所以代价高昂,即使有八叉树或者 voxelhash 的方法依旧精度不高所以体素的用法需要进一步的拓展,那就是 SDF(TSDF)了。比如 KinectFusion 作为经典工作,成功将 depth map 融合到了 3Dmodel 中。后续工作都是在离散空间开展的,重建的话一般就是 TSDF 之后做 marching cubes所以连续域的探索是很新颖的工作1.2.2 Representation Learning Techniques现代 Representation Learning 技术旨在自动学到描述数据的特征,主要有以下这些方法1.Generative Adversial Networks(GAN): 生成器和判别器对抗学习学到 deep embeddings of target data2.Auto-encoders: auto-encoder + decoder比如 VAE对比学习那一套里面的)因为 encoder decoder 之间的 bottleneck 的约束,auto-encoder 有望学到原始输入的表示3.Optimizing Latent Vectors: 或者说 decode-only使用 self-reconstruction loss 训练1.2.3 Shape Completion经典的表面重建方法通过拟合 RBF 来近似隐式表面函数,或者通过将定向点云的重建问题转换为泊松问题,从而得到密集表面。这些方法仅对单个形状而不是数据集进行建模最近的各种方法使用数据驱动的方法,大多采用 encoder-decoder 架构将 occupancy voxels离散 SDF voxels深度图、RGB 图像、点云 简化为 latent vector然后根据学习到的先验预测完整的体积形状(其实都是比较 old-fashioned 的方法,真现代肯定 NeRF, 3DGS 1.3 方法key idea 是使用 Deep Neural Networks 直接从点样本中回归连续的 SDF训练后的网络能够预测给定查询位置的 SDF 值,从中我们可以通过评估空间样本来提取零水平集曲面。可以直观地理解为二元分类器,决策边界是形状表面最简单的想法当然就是为每个形状学习一个网络(没有包含任何 shape 的信息)𝑓𝜃(𝑥)SDF(𝑥),𝑥Ω,训练时使用 L1 loss:(𝑓𝜃(𝑥),𝑠)=|clamp(𝑓𝜃(𝑥),𝑠)clamp(𝑠,𝛿)|,其中clamp(𝑥,𝛿))min(𝛿,max(𝛿,𝑥))(𝛿=0.1)我们当然希望一个模型可以表示各种各样的形状,发现它们的共同属性并嵌入到低维潜在空间中。为此,我们引入了一个潜在向量𝑧codebook 的思想,𝑧代表对某个 general 形状的描述,每一种形状都有一个对应的 code用某个 3D location𝑥 query 然后得到近似的 SDF 输出𝑓𝜃(𝑧𝑖,𝑥)SDF𝑖(𝑥)那么这个𝑧怎么来呢?不像 VAE 那样(类似上图左边 encoder + decoder encoder 是针对单个 shape 的,在 VAE 得到这个 latent code 之后,test 的时候再 VAE 一次,再和 point 一起作为输入进行预测,着实有些累赘。所以考虑去掉 encoder 使用 decoder-only另外,这个工作在3D 学习社区首次引入 decoder-only给定一个𝑁shapes 的数据集,构建训练样本𝑋𝑖={(𝒙𝑗,𝑠𝑗):𝑠𝑗=SDF𝑖(𝒙𝑗)},每个𝑖对应一个 shape每个𝑗对应一个点,于是给定 shape SDF samples𝑋𝑖后的 shape code𝑧𝑖的后验概率为𝑝𝜃(𝑧𝑖|𝑋𝑖)=𝑝(𝑧𝑖)𝑝(𝑋𝑖|𝑧𝑖)𝑝(𝑋𝑖)=?𝑝(𝑧𝑖)(𝑥𝑗,𝑠𝑗)𝑋𝑖𝑝𝜃(𝑠𝑗|𝑧𝑖;𝒙𝑗)当前形状最好的 Latent Vector 应该是使得这个 SDF 值的判断最为正确的 Vector所以文章的训练方法就是,先随机定义该形状的Latent Vector随便给个先验),通过训练反向传播得到更好的 Vector通过后验不断优化)我们假定𝑝(𝑧𝑖)为特定均值方差的 multivariate-Gaussian𝑝(𝑧𝑖)=12𝜎𝜋exp(𝑧2𝑖𝜎2)对于中的公式,我们用 deep feed-forward network 来拟合𝑓𝜃(𝑧𝑖,𝒙𝑗),然后不失一般性(?)地表示为𝑝𝜃(𝑠𝑗|𝑧𝑖;𝒙𝑗)=exp((𝑓𝜃(𝑧𝑖,𝒙𝑗),𝑠𝑗))于是,在训练时我们把编码向量𝒛和样本位置𝒙𝑗堆叠在一起,如上图 b 所示,作为神经网络的输入,同时在第4层也进行输入(说是再插入到中间一次效果更好)。神经网络梯度反传优化𝜃,同时反传到输入优化𝒛(更确切地说,把部分输入也当成了nn.Parameters),这相当于是在做上面那个后验概率的最大化(MAP)argmin𝜃,{𝑧𝑖}𝑁𝑖=1𝑁𝑖=1(𝐾𝑗=1(𝑓𝜃(𝑧𝑖,𝒙𝑗),𝑠𝑗)+1𝜎2𝑧𝑖2)然后在 inference 的时候,我们冻结网络𝜃,只优化𝒛,继续做 MAP̂𝒛=argmin𝒛(𝒙𝑗,𝒔𝑗)𝑋(𝑓𝜃(𝑧𝑖,𝒙𝑗),𝑠𝑗)+1𝜎2𝑧𝑖2我们可以发现模型在推理阶段仍然是会用到 ground truth 和损失,这是什么意思呢?我们知道 3D Reconstruction 是对于空间里的点进行更高精度的恢复,3D Completion 是对部分可观测点还原出整个形状,二者都可以采样出一定的 ground truth那么在推理的时候我们可以只取一小部分点,利用这些点去进行训练,得到 Latent Vector之后再对全部的点利用刚刚得到的 Latent Vector 进行重建。因为我们之前 decoder 是训练过的(类似于预训练),包含大量的先验知识。所以在这样的 decoder 下,反向传播训练出一个较好的 Latent Vector 是比较快的这与 auto-encoder或者说 encoder-decoder框架相比是一个巨大优势,因为 auto-encoder encoder 期望测试输入与训练数据相似(有些过于依赖训练数据的意思),也就是说泛化性没那么强;但我感觉这样的方法也有缺点,因为 encoder-decoder 架构的Latent Vector 只需要一次 forward 就得到了,而这里 auto-decoder 的方法就要反向传播重训练,应用上稍微复杂一点。也算是一种 LocalOverfitting Generalisable Learning 之间寻求平衡吧(论文这里真的写得很怪且不清晰,其实我觉得把整个模型称作 hypernetwork然后推理的时候产生真正的 network这样描述不就清晰多了。可以参考 谈谈DeepSDFAutoDecoder,写得挺深入)1.4 实验先说一下数据的问题我们需要的数据是(𝑥,𝑦,𝑧,sdf value),这样的数据集目前没有,但是像 ShapeNet 这样的数据集提供了物体的 3D shape mesh每个物体用一个 mesh 表达。把它 normalize 到单位球中(in practice fit to sphere radius of 1/1.03)解决 scale 的问题,半径比1稍小一点参考 TSDF 理解数据的预处理是个大头的工作,这里有两个难点1.必须知道 mesh 的每个三角形的朝向才能判断点在物体内部还是外部,决定 SDF sign2.必须 aggressive 一些,在物体表面附近采点,球内随便产生的点没啥用,学不出来表面。作者的做法描述得很简单,在单位球上均匀假想100个相机,每个得到一个 depth map然后通过一些操作算出符号和距离作者分了4个章节来展示,不细看了,反正就是很厉害效果很好云云Representing Known 3D ShapesRepresenting Test 3D Shapes (auto-encoding)Shape CompletionLatent Space Shape Interpolation一篇复现论文的博客1.5 结论和评价作者自评DeepSDF 在形状表示和完成任务中显著优于适用的 baseline同时实现了表示复杂拓扑、封闭表面以及提供高质量形状法线的目标。DeepSDF 模型能够在不产生离散化错误的情况下表示更复杂的形状,并且所需的内存显著少于之前最先进的结果然而,尽管形状的 SDF 逐点前向采样是高效的,但在推断过程中需要对潜在向量进行显式优化,所需时间显著增加。我们希望通过用更高效的 Gauss-Newton 或类似方法替代 ADAM 优化来提高性能,这些方法利用了解析导数DeepSDF 目前假设模型处于 canonical pose因此野外完成需要对 SE(3) 变换空间进行显式优化,从而增加了推断时间最后,要在单一嵌入中表示包括动态和纹理在内的真实可能场景空间仍然是一个重大挑战,将继续探索这一问题deepSDF 之后涌现了大量的工作,达摩院的 Curriculum DeepSDF 以及 Berkeley Extending DeepSDF 就是典型代表,还有Facebook Deep Local Shapes ETH KAPLAN这也一定程度能理解为什么 DeepSDF 被评为 CVPR2019 最有影响力的几篇工作之一了1.6 论文十问1.论文试图解决什么问题?3D 形状的表示和重建问题2.这是否是一个新的问题?不是新问题,但是 DeepSDF 是第一个用神经网络直接连续地拟合 SDF 的工作3.这篇文章要验证一个什么科学假设?通过神经网络直接拟合 SDF可以更好地表示 3D 形状4.有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?3D 形状的表示和重建问题,主要有 Point-based, Mesh-based, Voxel-based 的显式方法,学习的架构上有 GAN, encoder-decoder, decoder-only 5.论文中提到的解决方案之关键是什么?使用神经网络直接拟合 SDF通过 decoder-only 的方法学习潜在空间,通过 inference 时再训练的方法得到最优的潜在向量6.论文中的实验是如何设计的?通过 ShapeNet 数据集,对每个物体的 mesh 进行处理,得到 SDF 数据集,然后训练模型,展示效果7.用于定量评估的数据集是什么?代码有没有开源?ShapeNet 数据集的处理后版本(需要自己处理);代码开源在 github.com/facebookresearch/DeepSDF8.论文中的实验及结果有没有很好地支持需要验证的科学假设?有的,实验效果还是不错的9.这篇论文到底有什么贡献?提出了一种新的 3D 形状表示方法,用神经网络直接连续地拟合 SDF 的工作,效果不错10.下一步呢?有什么工作可以继续深入?优化推理时间,解决动态和纹理的问题