Volume Rendering of Neural Implicit Surfaces
<VolSDF>
Volume rendering of neural implicit surfacesReview
- 深入体素采样过程;
- 看似简单的修改,实则在数学证明上下足了功夫,改进了体素采样过程
Resource
- 对第 3 章的理解笔记 [jupyter notebook]
Motivation
- nerf 的形状由 generic 的 density function 来表达,而且存在任意的 level set,形状非常粗糙、低分辨率
- 让 nerf 的用上高质量的 SDF 的形状表达
- task;做了什么:
- 从多视角的无 mask 图像中三维重建物体表面、材质
- 改进 volume rendering 中的几何表达与重建
- 通过将 density 建模为 geometry 的函数
对 nerf 的魔改
将 volume density \(\sigma(x)\) 建模为一个 learnable 的 SDF 的变换:
- \(\sigma(x) = \alpha \Psi_{\beta}(-\text{SDF})\)
- 式中,\(\alpha, \beta >0\) 都是 learnable 参数, \(\Psi_{\beta}(s)\) 为 zero-mean, \(\beta\)-scale 的拉普拉斯分布的 CDF 函数:
\[\Psi_{\beta}(s)=\left\{ \begin{array}{l} \frac{1}{2}\exp\left(\frac{s}{\beta}\right) & & \text{if} \; s \leq 0 \\ 1-\frac{1}{2}\exp\left(-\frac{s}{\beta}\right) & & \text{if} \; s > 0 \end{array} \right. \]
- 当 \(\beta \rightarrow 0\) 时,\(\Psi_{\beta}\) 退化到一个简单的 1/0 inside/outside indicator
- 直觉上说,这个 density \(\sigma\) 建模了一个同质固体,带有常数 density \(\alpha\),并且 density 靠近边界时均匀平滑衰减,衰减平滑程度由 \(\beta\) 决定
- 式中,\(\alpha, \beta >0\) 都是 learnable 参数, \(\Psi_{\beta}(s)\) 为 zero-mean, \(\beta\)-scale 的拉普拉斯分布的 CDF 函数:
- 好处:
- 为表面的几何形状带来了一个有用的 inductive bias,相比于过去任意零值面
- \(\sigma(x) = \alpha \Psi_{\beta}(-\text{SDF})\) 的定义 facilitates a ==bound== on the error of the opacity;以往这样的 bound 是不会自动出现的
- ❓ 这个 bound 指 \(\alpha\) ?
渲染过程(回答了为什么这样设计 density)
体素渲染的本质就是(is all about) 估计 沿着相机射线上的辐射亮度(radiance)的积分,其中有两个重要的量:
- 体素不透明度 volume’s opacity \(O\),或者其等价量 透明度 transparency \(T\)
- 光场
light field
\(L\)
透明度代表着对于任意 \(t \geq 0\) ,光子成功穿过 segment \([\mathbf{c}, \mathbf{x}(t)]\) 而不
弹回被吸收1 的概率\(T(t)=\exp\left( -\int_{0}^{t} \sigma(x(s))\rm{d}s \right)\)而不透明度就是 \(O(t)=1-T(t)\)
- \(O(t)\)是一个单调递增函数,\(O(t)=0\),如果假设每条射线最终都被遮挡的话,\(O(\infty)=1\);
- 在这种意义上,可以把 \(O\) 视作一个 CDF/概率分布函数,而 \(\tau(t)=\frac{\rm{d}O}{\rm{d}t}(t)=\sigma(x(t))T(t)\) 即为其 PDF/概率密度函数
因此,体素渲染过程即为一条射线上的 期望像素
- \(I(\mathbf{c}, \mathbf{v}) = \int_0^{\infty} L(\mathbf{x}(t), \mathbf{n}(t), \mathbf{v}) \;\; \tau(t)\)
- 光场 \(L\) 函数之所以额外加了 法向量 \(\mathbf{n}\) 作为条件输入,是考虑到常见材质的 BRDF 一般依赖于表面法向量 \(\mathbf{n}\)
- ❓ Q:为什么是这样的
- A:来自体图形学发光-吸收模型的基本公式;这里的 \(L\) 函数为预乘了 \(\alpha\) 的颜色值
采样过程(利用 opacity 的 error bound 进行采样)
将积分式 \(I(\mathbf{c}, \mathbf{v}) = \int_0^{\infty} L(\mathbf{x}(t), \mathbf{n}(t), \mathbf{v}) \;\; \tau(t)\) 近似为加和式 \(\sum_{i=1}^{m-1} \hat{\tau}_i L_i\)
- \(\hat{\tau}_i \approx \tau(s_i) \Delta s\),近似PDF乘以interval length;
- \(\tau(t)=\frac{\rm{d}O}{\rm{d}t}(t)=\sigma(\mathbf{x}(t))T(t)\) -> 就是直接从那个积分定义求导推出来的
- \(L_i=L(\mathbf{x}(s_i), \mathbf{n}(s_i), \mathbf{v})\) 是当前点采样出来的光场
由于 PDF 函数 \(\tau\) 常常集中于物体边界区域,积分近似采样函数的选择对积分估计的质量有严重影响;一种解决方案就是利用 inverse CDF \(O^{-1}\)做适应性采样(即NeRF的fine sampling)。
diss NeRF做法的问题:
- 单次adaptive sampling / fine sampling不足以产生准确的采样点:使用粗鲁的、naive的\(O\)的近似会导致 sub-optimal 的采样点,会错过或者过度延展不可忽视的(在边界/表面附近)的那些 \(\tau\) 值
error bound 证明
流程
- 从 在任意一个积分segment \([t_i, t_{i+1}]\) 中, \(\lvert \frac{d}{ds} \sigma(\mathbf{x}(s)) \rvert\) 存在上界
- 推出 在任意一个积分segment \([t_i, t_{i+1}]\) 中, \(\int_{0}^{t} \sigma(\mathbf{x}(s))\) 与离散乘法加法的黎曼和近似积分 的误差存在上界
- 从而推出 在任意一个积分segment \([t_i, t_{i+1}]\) 中, \(O(t)\) 的积分近似误差存在上界(上界为segment终点的无符号距离\(d*\) 与 \(\alpha\)和\(\beta\)的函数)
引理
固定\(\beta\),设定任意一个 \(\epsilon\),那么一个充足的采样可以保证 上界<\(\epsilon\)
固定采样点个数,设定任意一个 \(\epsilon\),那么一个充分大的 \(\beta\) (不小于\(\frac{\alpha M^2}{4(n-1)\log(1+\epsilon)}\))可以保证 上界<\(\epsilon\)
- \(M\)是 \(t\) 采样时候的上界 \(t\in[0,M]\)
依据 error bound 的采样算法
目的:这个采样算法最终能够保证 \(O(t)\) 的积分近似误差不超过设定的 \(\epsilon\)
流程:
核心目的是通过充足的采样点使得网络自己现在的 \(\beta\) 就能满足上界 \(<\epsilon\),从而得到一个积分误差可控的 \(\hat{O}\) 序列
- 初始化采样:均匀采 \(n=128\) 个点;然后根据引理2选取一个 \(\beta_+\)(大于当前 \(\beta\)) 保证 \(\epsilon\) 被满足
- 迭代最大5次上采样点,直到采样足够充足使得网络现在的 \(\beta\) 就能够满足上界\(<\epsilon\);(如果5次上采样以后还是不行,就选取最后一次迭代的那个\(\beta_+\),而不是现在网络自己的\(\beta\))
- 为了能够减小 \(\beta_+\),同时保证 \(\epsilon\) 被满足,上采样添加 \(n\) 个采样点
- 每个 区间采的点的个数和该区间当前 error bound 值成比例
- 由均值定理,区间\((\beta, \beta_+)\)中一定存在一个\(\beta_*\)刚好让 error bound 等于 \(\epsilon\)
- 所以用二分法(最大10个迭代)来找这样的一个\(\beta_*\)来更新 \(\beta_+\)
- 为了能够减小 \(\beta_+\),同时保证 \(\epsilon\) 被满足,上采样添加 \(n\) 个采样点
- 用最后的上采样点和选取的\(\beta\) 来估计一个 \(\hat{O}\) 序列
- 用估计出来的 \(\hat{O}\) 序列来 inverse CDF 采样一组(\(m=64\)) fresh new 的点来算 \(\hat{O}\)
- 🤔 笔者:为什么不用前面算法自己得到的所有点的 \(\hat{O}\) 并用于后面的volume render?因为显存无法支持呀!这个算法本身计算都是在
with torch.no_grad()
中包裹的,不保留梯度所以没什么显存占用;最后输出的64个点要用于volume render计算,全程保留梯度;每条射线64个带梯度的点显存占用就已经非常大了
- 🤔 笔者:为什么不用前面算法自己得到的所有点的 \(\hat{O}\) 并用于后面的volume render?因为显存无法支持呀!这个算法本身计算都是在
效果
- orange: estimated opacity
- blue: true opacity
- black: SDF
- yellow dots:采样点举例
- ref:true opacity error
- faint red:error bound
- 每条 ray 的误差的 heat map
训练:
- (和IDR设定一样)geometry 网络输出SDF与256维feature
- “light field” 网络 \(L(\mathbf{x}, \mathbf{n}, \mathbf{v}, \mathbf{z})\)
- 实际上 \(\alpha\) 就是 \(\beta^{-1}\),网络自己学的只有 \(\beta\)
- 一个 batch 1024 个像素
Loss:
RGB L1 loss 与 SDF 法向量的 eikonal 正则(权重为0.1)
Implementation
Dataset
- DTU
- BlendedMVS:
- 📍
能直接整体学,不像UNISURF或者NeuS那样需要额外的 NeRF++ 背景模型 - 见训练细节一节,还是用了NeRF++的背景设定
- 📍
Camera
- 这里可以仔细看看是怎么做的;最终保证一个r=3的包络球
训练细节
- geometry:8层,256,第4层skip connetction;
- geometric initialization
- light field:4层,256 + 最后一层 sigmoid 激活
- 初始 \(\beta=0.1\)
- 射线的far值设定为\(M=2r\)
- 学习率 5e-4 指数衰减到 5e-5;
- DTU每个训练100k个迭代;blendedMVS每个训练200k个迭代
- 关于背景:
- 为了满足所有的rays(包括那些不和任何表面相交的rays)最终都是occluded(\(O(\infin)=1\))的假设
- DTU这种简单一些的数据集:
- 把SDF建模为: \(d_{\Omega}(\boldsymbol{x})=\min\{d(\mathbf{x}), r-\lVert x \rVert_2)\}\)
- \(r\) 是 scene 的 bounding sphere,比如作者他们用的把相机都包裹在半径为3.0的球里;
- 向外延伸时,背景的距离值会重新下降甚至变为负数;完全等价于在r=3的半径又放了一个外翻的球面(r<3是外,r>3是里)
- 渲染时,最大的深度为 \(2r\);这意味着 far 值为6.0;
- 把SDF建模为: \(d_{\Omega}(\boldsymbol{x})=\min\{d(\mathbf{x}), r-\lVert x \rVert_2)\}\)
- blendedMVS这种复杂背景数据集:
- 把 \(r\) 外部的volume用类似NeRF++的参数化方式;32个点,均匀\(1/r\)采样;
注意这里使用的是volume graphics中的 emission-absorption 模型 / 发光-吸收模型 ↩︎