DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation:学习用于形状表示的连续有符号距离函数
NeuS: Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction:通过体绘制学习神经隐式曲面用于多视图重建
1、Deep SDF
1、介绍
传统的表面重建技术中,SDF是基于离散化体素对物体或者场景表面的一种表达,而现实中表面是连续的,本文提出了一种名为DeepSDF的方法,在SDF函数能够表示物体的基础上,用神经网络来拟合这个SDF函数,从而实现用神经网络隐式的表示这个物体,并且由于神经网络的万能拟合性质,原则上来说能够表示任意连续的、任意复杂形状的物体,可以表示一整类形状。
通过连续的体积场表示形状的表面:场中的点的大小表示到表面边界的距离,符号表示该区域是在形状的内部(-)还是外部(+)
下图是传统sdf的公式,X是物体,p为空间中某点,当p点在物体表面内部,距离为负,在表面外面,距离为正。
论文给出的公式
s > 0是外部,s < 0是内部,s = 0是物体表面。
2、训练
用神经网络当做SDF函数的拟合器,训练完(或者说拟合完)之后,输入大量自定义的三维空间采样点,再提取出所有值为0的点组成面,就能够重建整个三维物体了
1、直接训练
为给定目标形状训练单个深度网络,如图所示。给定目标形状,我们准备一组由3D点样本及SDF值组成的对X
网络结构,需要让网络输出的y,更加接近实际的SDF公式给出的值s。
损失函数
损失函数实际就是计算预测得到的SDF值与真实SDF之间的一个距离,多出来的参数 δ 用于将注意力集中在表面附近。clamp(x, δ) := min(δ, max(−δ, x))
实验中使用 δ = 0. 1和一个由8个全连接层组成的前馈网络,每个层都应用了dropouts。所有内层均为512维,具有ReLU非线性,输出非线性回归SDF值为tanh,使用Adam优化器。
2、学习形状的潜在空间
用上述的方法,并不是数据驱动的,而更像是一种数学的方法,每次进行重建的时候都得重新训练一个神经网络得到表示这个物体的专属SDF。只能对单一形状进行重建,因为模型没有包含任何shape的信息。
下面将shape用latent vector的方式作为网络的第二个输入,以此适应多种形状,每一种形状都有一个对应的code
论文中使用自动解码器来学习形状嵌入,而无需编码器。与潜在代码由编码器产生的自动编码器不同,自动解码器直接接受潜在向量作为输入。在训练开始时,将随机初始化的潜在向量分配给每个数据点,并且通过标准反向传播将潜在向量与解码器权重一起优化。 在推理过程中,解码器权重是固定的,并估计最佳潜在向量。 在概念上,将这个潜在向量映射到一个连续的SDF表示的3D形状
上式的X也变成了编码zi ,i表示索引,第几个形状
该公式允许使用单个神经网络对多个SDF进行建模。给定解码模型fθ,与潜在向量z相关联的连续表面类似地用fθ(z,x)的决策边界表示,并且形状可以再次通过例如光线投射或行进立方体来离散化以进行可视化。
论文中开发了一种用于训练和测试自动解码器的概率公式,该公式自然地引入了潜在空间正则化以改进泛化。 基于概率对DeepSDF模型进行建模
1、对于一个由N个shapes构成的数据集合,每个shape都有对应的SDF的ground-truth SDFi,一组由K个样本点以及SDF值
由于没有编码器,每个潜在代码zi都与训练形状Xi配对。给定形状SDF样本Xi的后超形状代码zi可通过后验概率计算为为:
假设码p(zi)上的先验分布是具有球面协方差σ2I的零均值多变量高斯分布
并假设给定zi和xj的情况下有如下概率成立: L(fθ(zi,xj),sj)表示损失函数,
得到解码器训练阶段的优化目标方程
编码zi 有以下方程计算得到
概率公式化这里参考博客
参考链接1
1、NeuS
论文中提出了一种新的神经表面重建方法,称为NeuS,用于从2D图像输入中高保真地重建对象和场景,将曲面表示为带符号距离函数(SDF)的零值集。
NeRF仅学习体积密度场,作为新视角合成,但是难以从中提取高质量的表面,对于形状的重建也不是很好
所以将NerF中的体密度改为SDF值,将体积渲染方法应用于学习隐式SDF表示,改变体渲染计算公式中的权重值,更好的应用于表面和形状重建。
输入:一组3D对象的姿势图像{Ik},输出:重建表面S。
1、场景表示
如下图:
这里引入概率密度函数 S-density: ϕ ( f ( x ) ) logistic density distribution, ϕ (x)是Sigmoid函数的倒数,关于y轴对称,也在y轴上(x=0)取得最大值,这种形式对后面体渲染计算比较合适。
f(x)表示的是SDF函数,可以看出,当SDF为零的时候(也就是物体表面),ϕ (x)取得最大值,在最高峰处。
2、渲染
颜色计算公式如下,c(p(t),v)和NerF中相同,指的是不同方向看过去某点处的rgb颜色值,但是w(t)替换了原式中的T(t)σ(t),作为新的权重。
这里的权重必须满足以下条件:
1、Unbiased无偏性,权重需要在相机光线与物体表面相交点 p ( t ∗ )(即SDF值为0的时候)达到局部最大值。即表面附近的点对最终结果的贡献最大
2、Occlusion-aware感知遮挡,当两个点具有相同的SDF值时,更靠近视点的点对最终输出颜色的贡献应大于其他点。也就是说,空间中出现遮挡的情况,前面的点吸收光线更多,剩下一部分光线供给后面的点吸收,所以前面的权重更大。
最初公式中,直接将s密度代替体密度与T(t)相乘作为权重,虽然满足感知遮挡,但是NerF中的权重不满足第一点,在表面权重不是局部最大值。
下图是和NerF的修改的权重的对比图
修改结果
下图是修改的权重,首先定义了不透明密度函数ρ(t),它是标准体积渲染中体积密度σ的对应物。然后通过以下公式计算新的权重函数w(t)
这是单平面相交情况下不透明密度ρ(t)的公式
下图是沿光线p(t)有多个曲面相交的一般情况,当光线在两个面之间时会变成负,把它拓展到多曲面的情况需要在这时将之设为0,
下图是经过多曲面时,SDF与权重变化图
3、离散化
类似 NeRF,定义采样点 n个
4、损失函数
总的损失函数,color Loss为渲染图与gt图差异,regLoss是对所有采样点正则化(regularize),形式有些类似规范化,不过是对SDF的梯度。最后是如果有mask监督,则加入mask Loss
BCE是二进制交叉熵损失
5、复现效果
这里代码复现了训练到十万次和三十万次得到的渲染图
Loss
渲染
NeuS的网络结构与这篇论文 Multiview neural surface reconstruction by disentangling geometry and appearance. 使用的网络结构类似,使用了两个MLP。第一个MLP输入是位置(x,y,z),计算SDF值,将SDF、生成的256维特征向量、位置p、观察方向v输入到第二个MLP中,输出得到RGB颜色值。网络结构如下图
参考链接
https://zhuanlan.zhihu.com/p/496752239
https://blog.csdn.net/m0_46094914/article/details/124324284
版权归原作者 川河w 所有, 如有侵权,请联系我们删除。