一、前置知识学习
什么是显示表达,什么是神经隐式表达3D点云、Mesh、voxel等都是经典的显示表达,它们都是直接反应场景的3维几何特征。神经隐式表达就是将场景的几何特征训练进MLP这样的模型中,如果拿到这个模型,不给输入的话,你是完全看不出这是个什么东西,但是,当你对这样的MLP模型输入一串数据,得到一串输出,将这些输出组织起来就可以看得出来这个模型所包含的场景是什么。
MonoSDF的主要创新点和核心内容就是为基于NeRF的三维表面重建系统添加单目几何提示来提升重建效果,所以在阅读这篇论文或者阅读我这篇文章之前请务必先了解NeRF的基本结构,推荐观看B站UP主的视频:【较真系列】讲人话-NeRF全解(原理+代码+公式)_哔哩哔哩_bilibili
SDF(Signed Distance Function)也是MonoSDF重点讨论的内容。可以简单抽象地理解成这样一个函数:输入三维空间中的一个点的坐标,得到该点到其最近的表面的距离,但是注意这个距离是有正负的。具体理解可参考:图解符号距离场(SDF) - 知乎 (zhihu.com)
本文的论文原文地址:
二、核心内容提炼
1.以前重建系统的问题
以前的系统对于更大、更复杂的场景和视点稀疏的场景的表现很差。作者分析原因在于只是用RGB图片来作为整个网络的损失是欠约束的,比如在纹理不明显的区域(一面墙),用rgb损失来约束整个系统是可能有多个解(对一面白墙,不管什么位姿,什么深度,得到的rgb是差不多的)。另外,如果以MLP作为场景的隐式表达,会有这样的问题:①神经隐式模型通常更加倾向表达整个场景的整体趋势而忽略(或者说没能力表达)细节,这也是原文说的inductive smoothness bias,②每次给系统输入一个新帧都要对MLP模型的所有参数做调整,计算代价太大。
2.作者提出的改进方法
对于一组给定的图像(在场景中不同视角拍摄的),利用通用单目估计器(这里是使用的现成的网络——Omnidata model)推理出每个图像的深度和表面法线,并在优化期间将它们与 RGB 图像重建损失一起用作监督信号。之所以作者认为这样的操作能提高重建效果是因为,几何提示和光度误差(或者说色彩损失)其实是可以起到互补作用的:光度一致性(色彩损失)在墙壁等无纹理区域中容易失效,但由这种时候,表面法线可以可靠地被预测。相反,光一致性线索(色彩损失)可以在有纹理区域中建立精确的 全局3D 几何形状,而法线和(相对)深度线索只能提供局部几何信息。
3.隐式场景表达的方法
因为整篇论文都是对SDF隐式表达的改进,所以有必要深入理解各种SDF隐式表达。
①稠密SDF网格:
这是一种最直接的表达方式,在三维空间中构建一组三维网格(分辨率视使用场景而定),直接为每一个网格的中心位置计算SDF值,不位于网格中心的点的SDF值直接通过周围的网格中心插值得到。
②单个MLP的表示法:
先将三维坐标X进行位置编码(不进行位置编码的话,相近的两点的坐标差别不大,输入网络后很难让网络表达出差异性),将编码后的向量输入MLP,由MLP直接输出对应坐标的SDF值
③单分辨率MLP解码的特征网格:
与稠密SDF网格不同的是,该方法的网格保存的是特征向量,同样的,不位于网格中心的三维点的特征向量从周围网格中心点插值得到。这里的MLP与单个MLP的表示法中的MLP是不同的,这里的MLP可以理解成特征网格得到的特征向量的解码器,而单个MLP的表示法的MLP就是三维场景本身。数学化的表达式如下:
其中s是SDF预测值,f是将MLP抽象成函数,r()是位置编码函数,interp()是插值函数,x是三维坐标,是特征向量。
④多分辨率MLP解码的特征网格:
基本概念和单分辨率MLP解码的特征网格是一样的,只是分了多种分辨率,将不同分辨率的特征插值后融合,再送入MLP得到SDF值。关于分辨率设置为多大是根据如下公式计算的:
其中Rmin是最小的分辨率,Rmax是最大的分辨率,L是不同分辨率的个数(有多少种分辨率,L就是多少)
⑤颜色预测:
除了 3D 几何之外,MonoSDF还需要预测颜色值,以便模型可以通过重建损失进行优化。公式定义如下:
其中x是3D点的坐标,v是观察方向(也就是从哪个方向来看这个3d点),n是SDF函数的分析梯度(我也不太能理解这个分析梯度analytical gradient是什么,大概是梯度最大的方向?), z 是 SDF 网络第二个线性头的输出的特征向量。cθ是一个网络权重为 θ 的两层 MLP 。在网格中心之外的三维坐标的z也是通过附近网格中心的z特征向量插值得到。的生成过程如下图(个人觉得这幅图更好理解,不知道作者为什么要放到附录里):
4.基于SDF值得体渲染方法
原始得NeRF是通过网络获得体密度和色彩值,其中体密度是0~1之间的数,用于计算不透明度。但是从“3.隐式场景表达的方法”这一小结中我们可以看见,从网络输出的是SDF值,所以,如果要使用类似NeRF的体渲染方法,就需要将网络输出的SDF值映射到0~1这个区间。映射的公式如下:
其中是可以学习的参数。其中就可以理解成NeRF中的体密度。最后可以得到色彩渲染公式:
其中是指在同一射线r上,比i这个点更靠近相机光心的采样点的透明度的乘积。是与NeRF中的不透明度一样的概念。是指相邻两采样点之间的距离。其实这整个公式就是用和来计算体密度,然后用NeRF的原公式来计算(r)。同理可得:
为了渲染一个像素,从相机中心o通过该像素沿着其视方向v投射一条光线r。沿着光线采样个点,记为,其中表示从相机中心到采样点的距离,它是在采样过程中根据需要设定的参数,用于确定采样点在光线上的位置。而是采样点处的表面法线(surface normal),法线是通过对SDF函数在该点的梯度进行计算得到的,也就是下图显示的地方得到的:
5.单目几何提示的获取
单目深度线索:
- 一种常见的单目几何线索是单目深度图,它可以通过现成的单目深度预测器轻松获得。
- 具体来说,作者使用了预训练的Omnidata模型来为每个输入的RGB图像预测深度图。
- 需要注意的是,在一般场景中,绝对尺度很难估计,所以必须被视为相对线索。
单目法线线索:
- 另一个使用的几何线索是表面法线。与深度线索类似,作者应用相同的预训练Omnidata模型为每个RGB图像获取法线图。
- 与提供半局部相对信息的深度线索不同,法线线索是局部的,能够捕捉几何细节。
- 因此,作者期望表面法线和深度是相互补充的。
总的来说,就是想将这些用Omnidata模型生成的线索用于改进神经隐式表面重建方法。
6.定义损失函数
①色彩损失:
与以前的重建方法一样,就是直接拿生成的rgb色彩和拍摄到的真实色彩做差,来作为色彩损失。
②Eikonal损失:
我们直接从公式上看,大概意思就是期望SDF的梯度越靠近1越好,那么为什么要这么设计呢,我也不知道自己理解得对不对,大家可以去参考论文:A. Gropp, L. Yariv, N. Haim, M. Atzmon, and Y. Lipman. Implicit geometric regularization for learning shapes. In Proc. of the International Conf. on Machine learning (ICML), 2020.
我粗浅的理解成:当我们在一个表面附近有一批采样点,我们对这批采样点求梯度时,可以发现梯度最大的方向与表面的法方向是一致的,我们期待这个梯度最大的方向的梯度等于一,意味着,每距离表面远一个单位,SDF值就增大一个单位,这是特别符合SDF定义的,所以定义了这么个损失。
③深度连续性损失:
就是要使估计的深度(”4.基于SDF值得体渲染方法“中展示的公式)与单目深度预测器(Omnidata模型)获得的深度越近越好,但是请注意,单目估计的深度往往是没有绝对尺度的,也就是估计的深度与单目深度预测器获得的深度的单位可能不同,所以还要加两个调整参数。损失函数和调整参数的计算如下:
④法向量连续损失:
直接给公式:
公式右侧的前半部分没什么好说的,常规操作。后半部分是指,若估计的法向量与Omnidata模型生成的法向量一致的话,那么它们两的内积应该等于一。
⑤完整的损失函数为(加权一下就好了):
三、效果展示
1.与别的方法对比的效果
2.不同隐式表达方法呈现出不同的效果
3.不同提示产生的不同效果
四、总结
这篇论文的idea很简单粗暴,就是在其他的重建方法上加几个损失来添加额外的约束。重点就在于理解各种隐式表达方法、知道作者使用现成的单目几何估计模型来给每一帧生成深度图和法向量并且懂之前说的几个损失函数为什么那样定义就OK了。虽然很粗暴,但看起来效果还不错,也不会明显增加训练、推理时间。