目录

目录

Survey: nerf + surface enhancements


目录
<UNISURF> Unisurf: Unifying neural implicit surfaces and radiance fields for multi-view reconstruction
 

Motivation

task:做了什么

  • 从多视角无 mask 图像中重建表面,并且合成新视角观测

核心 insight: neural radiance model 和 neural implicit shape model 可以用一种统一的方式建模

  • 更高效的 sampling 过程
  • 没有 input mask (不像 DVR,IDR 那样)的情况下也可以学到精确的表面

diss 目前:

  • nerf:
    • cons:没有 accurate surface
    • pros:对非 solid scene 也能用,比如烟雾;本文 focus on solid objects
  • DVR / IDR:
    • pros:可以从图像重建精确表面;
    • cons:
      • 需要 per-pixel mask;🤔 注意 per-pixel mask 和 sihoulette 的区别
        • per-pixel mask 意味着物体上那些有空洞的区域也要扣掉;不然会被认为是背景色实体
      • 网络需要适当的初始化,因为 表面渲染技术 只能在局部提供梯度信息(也就是光线和表面的交点区域) -> 不像 nerf 那样整个空间都密布着梯度
        • https://longtimenohack.com/posts/paper_reading/2021_oechsle_unisurf/image-20210712170332666.png
        • 直觉上讲,这种利用局部梯度信息的最优化过程就是在迭代对初始形状(总是一个球)进行变形

Overview

对 nerf 的魔改:

  • \(\alpha(x) = 1-\exp\left(-\sigma(\mathbf{x})\delta\right)\) 直接改为 \(o(x)\)
    • 即把 nerf 渲染过程中的 \(\alpha(x)\) 替换为\(o(x)\) ,即 Occupancy field,取值 \([0,1]\)\(o=0.5\) 代表表面
  • 颜色场从 \(c(\mathbf{x}_i, \mathbf{d})\) 改为 \(c(\mathbf{x}_i, \mathbf{n}_i, \mathbf{h}_i, \mathbf{d})\),其中 \(\mathbf{n}_i\) 为点 \(\mathbf{x}_i\) 处的法向量,\(\mathbf{h}_i\) 为点 \(\mathbf{x}_i\) 处的几何场特征
    • 对法向量 \(\mathbf{n}_i\)\(\mathbf{h}_i\) 的额外依赖在 IDR 一文中有所提现
  • 渲染射线采样点时:
    https://longtimenohack.com/posts/paper_reading/2021_oechsle_unisurf/image-20210715170809058.png
    • 考虑到,implicit surface 的一个关键假设是只有和表面的第一个交叉点对渲染有贡献;
      • 但是这一点在迭代初始时,表面并没有被好好定义时,并不竟然;
      • 因此,DVR 和 IDR 都需要强 mask 监督(per-pixel mask)
    • 首先寻根找到交叉点,然后从交叉点出发向两侧采样
      • 在刚开始的迭代,采样间隔很大,涵盖整个 volume;effectively bootstrapping
      • 在迭代过程中,采样间隔逐渐变小,靠近估计的交叉点/表面点;一个随迭代代数指数衰减的积分间隔(有最小值)
    • occupancy field 可以直接寻根,在根周围采样,因此也不需要 NeRF 的 hierarchical 重要度采样过程
      • 笔者:而且理论上应该效果会好很多,尤其是在训练的 later 迭代里

思路:

  • start at nothing that:
    • nerf 中的渲染式子
      • https://longtimenohack.com/posts/paper_reading/2021_oechsle_unisurf/image-20210712190238681.png
    • 可以被写作:
      • https://longtimenohack.com/posts/paper_reading/2021_oechsle_unisurf/image-20210712191443032.png
  • 考虑 solid 物体,把 \(\alpha\) 这个 [0,1] 的值直接替换为一个离散的 inside/outside indicator,\(o=0\)代表 free space,\(o=1\)代表 occupied
    • 这种情况下,事实上 \(\hat{C}(\mathbf{r})\) 事实上就只取射线上==第一个 occupied 的点==的 \(c(\mathbf{x_i}, \mathbf{d})\)
  • 然后稍微弱化一下这个设定,不要 \(\{0,1\}\) 的极端,而是取像 occupancy field 那样的 \([0,1]\) 范围值;这时,\(o=0.5\) iso-surface即作为曲面表达,即得到了 accurate 表面的表面

训练

  • Loss
    • 图像重建 \(l_1\) loss
    • 表面法向量 \(l_2\) 正则 \(\lVert \mathbf{n}(\mathbf{x}_s) - \mathbf{n}(\mathbf{x}_s + \epsilon) \rVert\),其中\(\mathbf{x}_s\) 就是渲染图像时采样的像素射线和表面的交点(直接通过寻根过程找到)

结果

  • https://longtimenohack.com/posts/paper_reading/2021_oechsle_unisurf/image-20210712195219132.png
  • https://longtimenohack.com/posts/paper_reading/2021_oechsle_unisurf/image-20210712195402231.png

Implementation

网络结构

  • occupancy field: \(o_{\theta}\)

    • 类似 IDR,使用8层MLP+256 hidden + softplus 激活
    • 初始化,使得 decision boundary 是一个 sphere
  • radiance field: \(c_{\theta}\)

    • 4层MLP;
  • 一样的位置编码

最优化过程

  1. 采用了和 IDR / IGR 相同的 geometric init,即保证初始化后的 implicit surface model 是一个大致的球形(sphere init),半径可控
    1. 笔者:intro里面diss了geometric init,可自己还是要用 geometric init 🐶
    2. 如图,初始化时最后一层 bias(-1)*radius,中间还有对每层权重以及针对 positional embedding 的专门处理
      https://longtimenohack.com/posts/paper_reading/2021_oechsle_unisurf/image-20210723095914244.png
      • 搞清楚原理
  2. 随机采样 rays
  3. render all sampled rays
    1. root-finding:256均匀采样点;用 secant 方法迭代8步[32]
      • [32] Occupancy networks 事实上 occupancy networks没有这个过程,作者应该是引错了,应该引他们的另外一篇论文 DVR
    2. interval 内 64 个 query points在 \(\left[t_s-\Delta, t_s+\Delta\right]\),32 个 freespace中(camera和interval的下界之间,也就是camera \(t=0\)\(t=t_s-\Delta\) 之间)
    3. 两步衰减?应该指的是学习率在200k和400k衰减两次,总共训练450k迭代

数据集

DTU

  • 虽然没提,但应该仍然做了 camera 的 re-normalization 到单位球内;
  • 因为训练时没有mask,所以需要建模 background;因此,实际的ROI考虑是4倍大的半径;射线采样也只在这个ROI中进行
  • background is black

Indoor Scene from SceneNet

  • 定义ROI,使得所有相机都位于一个 sphere 内,并且 sphere 的中心大致就是 scene 的中心
    • 这里需要写一个 re-normalize 函数工具,使得所有相机形成的总visual hull的中心大致是一个sphere的中心,同时这个sphere的半径刚好把所有相机都包进去
  • background is black

BlendedMVS

  • background 过于复杂,使用 nerf++ 的设定,额外用一个 seperate 的 background model 可以起到很好的效果,可以 seperate foreground and background properly
<NeuS> NeuS: Learning neural implicit surfaces by volume rendering for multi-view reconstruction
 

Review

  • 🚀 额外和 4 月发的 UNISURF 进行了对比
    https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210712222800256.png
  • 它的采样过程并没有像 UNISURF 那样先进行求根,再在表面附近取interval:
    • 这大概率是因为 SDF 本身已经提供了距离表面的距离,因此可以直接利用 SDF 值对权重函数进行一定设计,而不需要先求出表面点的深度然后再在表面点附近取interval
  • 其映射策略 相当于只在乎穿过表面附近的点的cdf的下降沿

Result

  • https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210712134017888.png
  • 精细结构,效果惊艳
    https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210712133236579.png
  • SDF 表面,背景干净
    https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210712133324389.png
  • 无 mask 重建
    https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210713093038402.png

Motivation

task / 做了什么

  • 从多视角图片中重建表面;
  • 给 SDF 做 volume render
  • introducing a density distribution induced by SDF:引入一种由 SDF 引导的 density 函数(非常接近 VolSDF)
  • 发现对 SDF 引导的 density,直接简单用 volume rendering 会有可识别的误差;因此额外提出了一套新的 volume rendering 机制来保证一阶 SDF 估计无偏的表面重建

一阶估计无偏

diss 之前:

  • IDR 等 从 SDF 进行 volume rendering 来反过来做三维重建的工作:
    • cons:
      • 难以应对 abrupt 突然的 深度改变和复杂的物体;
        • 由于其在渲染时只考虑光线和表面的单个交点;因此梯度只存在于单个点,对于高效的反向传播来说非常 local;因此在最优化时常常陷入局部最优
        • 如 (a) 图上部分,对于突然的深度改变,网络只能预测出光滑的不准确的蓝色点https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210713094536430.png
      • 需要 per-pixel mask 来收敛到一个 valid surface;
  • nerf:
    • pros:
      • 因为在渲染时考虑了光线上的多个点,因此可以应对突然的深度改变

对 NeRF 的魔改

how to NeRF(SDF)

  • opacity 直接替换为 SDF 的概率密度函数 \(\phi_s(f(\mathbf{x}))\)\(\phi_s(x)={se^{-sx}}/{\left(1+e^{-sx}\right)^2}\)\(f\) 即代表 SDF 函数,\(s\) 是一个 trainable parameter
  • SDF 零值面表达形状
  • logistic density distribution,是 Sigmoid function \(\Phi_s(x)=(1+e^{-sx})^{-1}\) 的导函数
  • 原则上,\(\phi_s(x)\) 可以是任意 在 0 处 unimodal 单峰(bell-shaped,铃形) 的密度函数,这里选择 logistic density function 是因为其计算便利性
  • \(\phi_s(x)\) 的标准差是 \(1/s\), 也是一个 trainable parameter,即当网络收敛时 \(1/s\) 趋向于 0
  • 注意:和传统 volume rendering 的形式不同,这里直接使用 \(\phi_s(x)\) 作为 opacity

渲染过程

  • 给定一个像素,起点为 \(\mathbf{o}\),光线方向为 \(\mathbf{v}\),其上一点为 \(\mathbf{p}(t)=\mathbf{o} + t \mathbf{v}\)

  • 这个像素的渲染一般通式为:\(w(t)\) 是权重函数,所以要求 \(w(t)>0\)\(\int_0^{+\infty}w(t)=1\)

    \[C(\mathbf{o}, \mathbf{v}) = \int^{+\infty}_0 w(t) \;\; c(\mathbf{p}(t), \mathbf{v}) \rm{d}t \]

  • 作者认为从2D图像学习精确的SDF的表达的关键是 建立一个合适的基于SDF的 weight function \(w(t)\),有两点要求:

    • Unbiased.
      • 对于某条相机射线 \(\mathbf{p}(t)\) 和 surface 的交点 \(\mathbf{p}(t^*)\)\(w(t)\)\(t^*\) 处应取得局部最大值
      • 相机射线和SDF zero-level set 的交点的像素贡献最大
    • Occulusion-aware.
      • 同一条射线上两个深度 \(t_0\)\(t_1\),如果 \(f(t_0)=f(t_1)\)\(t_0 < t_1\),那么应该有 \(w(t_0)>w(t_1)\)
      • 即考虑自体遮挡,如果一条射线多次交叉表面,应该(更多地)使用最靠近相机的交点的颜色
  • 作者讨论了两种 \(w(t)\) 表达,最终选择了下式形式,其中 \(f\) 代表 SDF 函数

https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210726213357475.png

naive 的 \(w(t)\) 权重函数设计

即直接利用先前的 volume rendering pipeline:

\[w(t)=T(t)\sigma(t) \]

\(\sigma(t)\) 是传统体渲染中的 volume density,\(T(t)=\exp(-\int_0^t\sigma(u){\rm d}u)\) 是 accumulated transmittance

设定直接取 \(\sigma(t)=\phi_s(f(\mathbf{p}(t)))\)

只能做到 occulusion-aware,但是有 bias,在射线打到表面之前 \(w(t)\) 已取得了局部最优

作者提出的 \(w(t)\) 权重函数设计

  • 首先讨论一种straight-forward 方式

    \[w(t) = \frac{ \phi_s(f(\mathbf{p}(t)))}{ \int_0^{+\infty} \phi_s( f( \mathbf{p}(u) ) ) {\rm d}u } \tag{4} \]

    • 显然无偏,但是没有occlusion-aware:两个SDF交叉点将在\(w(t)\)中产生两个等值的峰
  • 在此基础上,进一步改进,得到最终的表达:

    \[\begin{eqnarray*} w(t)=T(t)\rho(t), \; T(t)=\exp(-\int_0^t \rho(u){\rm d}u) \tag{5} \\ \rho(t)=\max \left( \frac{-\frac{ {\rm d} \Phi_s}{ {\rm d} t} (f(\mathbf{p}(t)))}{\Phi_s(f(\mathbf{p}(t)))}, 0 \right) \tag{10} \end{eqnarray*} \]

    • 这里的作者定义的 opaque density \(\rho(t)\) 与 naive 中的 \(\sigma(t)=\phi_s(f(\mathbf{p}(t)))\) 设计的不同是关键
    • 思路:
      • 想要做occlusion-aware,可以借鉴体渲染中的思路,\(w(t)=T(t)\rho(t), \, T(t)=\exp(-\int_0^t \rho(u){\rm d}u)\),所以现在问题变为怎样设计一个合适的\(\rho(t)\)
      • 首先:在射线与表面单次相交、表面是平面的设定下,从式(4)(5) 出发导出 \(\rho(t)\)\(f(\mathbf{p}(t))\) 为输入 的表达式,然后再推广到多次表面相交的情况下
      • 推广:在一般的光滑曲面情况下,在射线与表面的交点区域,可以用上述局部平面近似,从而保证对于一般光滑曲面仍然存在上述的无偏的设定
  • 离散化

    \[\begin{eqnarray*} \hat{C} && =\sum^n_{i=1}T_i \alpha_i c_i \\ T_i && =\prod_{j=1}^{i-1}(1-\alpha_j) \\ \alpha_i && = \max \left(\frac{ \Phi_s(f(\mathbf{p}(t_i))) - \Phi_s(f(\mathbf{p}(t_{i+1}))) }{ \Phi_s(f(\mathbf{p}(t_i))) } ,0 \right) \end{eqnarray*} \]

最终的\(w(t)\)的设计效果可视化:\(w(t)\) 保证SDF的估计是一阶无偏,并且是 occlusion-aware 的

https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210726224421339.png

采样过程

基本没怎么改动 nerf 原来的 stratified sampling 过程;

  • 没有用 coarse network 和 fine network;只训了一个network
  • 首先均匀采样一组点,然后再coarse importance sampling + fine importance sampling
    • coarse sampling 64个点,的 概率值由 固定的很大的标准差 \(1/s\) 定义的 \(\phi_s(f(\mathbf{x}))\) 给出
    • fine sampling 64个点,的概率值由 learned \(1/s\) 定义的 \(\phi_s(f(\mathbf{x}))\) 给出
  • 首先均匀采样64个点作为coarse sampling 点;
  • 然后利用这组均匀coarse点 和其对应的 由固定的很大的标准差 \(1/s\) 定义的 \(\phi_s(f(\mathbf{x}))\) 值 构造 pdf,采样64个fine点

Loss

  • L1重建误差;对于 outliers 鲁棒,训练稳定
  • Eikonal 项:在sampled points上,SDF法向量的loss
  • mask 项:mask 的 BCE (binary cross entropy)
    • 这里的预测可微分mask就是通过射线上\(w(t)\)的和求出来的

Supp

Geometric Init 的效果及其可视化

  • 上一行是没有 geometric init (random init)的结果,下一行是有 geometric init 的结果

https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210727205548199.png

trainable standard deviation \(1/s\) 的曲线

https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210727205737385.png

Future work

  • 目前只用了单个标量 \(s\) 来建模整个空间所有点的概率分布的标准差;将来考虑和几何网络一起建模一个整个空间 不同空间位置不同标准差 的场,依赖于不同的局部几何特征;和场景一起最优化。

Implementations

  • 网络结构
    • SDF网络 \(f\) 结构同 IDR,8层256宽MLP;
      • \(\beta=100\) 的 softplus
      • 第4层skip connections
    • radiance 网络4层256宽MLP;condition on 空间位置 \(\mathbf{p}\), 法向量 \(\mathbf{n}\),SDF网络的特征向量
    • 空间位置 \(\mathbf{p}\) 6个embedding, 观察方向 \(\mathbf{v}\) 4个embedding
    • 同IDR,使用weight normalization 来稳定训练过程
  • 采样
    • 🤔 这里的 ROI 设置是怎么回事?

      • 类似 nerf++ 对相机进行了额外的scaling操作? 和UNISURF等文章一样,统一都直接用的IDR仓的相机scaling操作
    • 假定ROI区域位于一个单位球

    • coarse/fine sampling = 64个点;[by author] “large fixed” \(1/s\) = \(1/64\)

    • 对于 w/o mask 的 setting

      • 额外在单位球外采样32个点

      • (单位球)外部的场景使用 NeRF++ 来表达

        • 这里是额外的 NeRF++球外网络?

    • https://longtimenohack.com/posts/paper_reading/2021_wang_neus/image-20210727204513458.png

      • sampled section points,\(\mathbf{q}_i=\mathbf{o}+t_i \mathbf{v}\);sampled mid-points \(\mathbf{p}_i = \mathbf{o} + \frac{ t_i + t_{i+1} }{2} \mathbf{v}\)
      • \(\alpha_i\) 在 sampled sections points 上计算,\(\alpha_i = \max \left(\frac{ \Phi_s(f(\mathbf{p}(t_i))) - \Phi_s(f(\mathbf{p}(t_{i+1}))) }{ \Phi_s(f(\mathbf{p}(t_i))) } ,0 \right)\)
        • N+1 个 sections 点产生 N 个 alpha 值
      • color \(c_i\) 的在 sampled mid points 上计算
  • 训练
    • 使用 SAL 一文中提出的 geometric initialization
    • 每个batch采512个rays,300k iterations,训练14小时(w/ mask) / 16小时(w/o mask),2080Ti
<VolSDF> Volume rendering of neural implicit surfaces
 

Review

  • 深入体素采样过程;
  • 看似简单的修改,实则在数学证明上下足了功夫,改进了体素采样过程

Resource

Motivation

  • https://longtimenohack.com/posts/paper_reading/2021_yariv_volume/image-20210712200422511.png
  • 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\) 决定
  • 好处:
    • 为表面的几何形状带来了一个有用的 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\)的函数)
引理
  1. 固定\(\beta\),设定任意一个 \(\epsilon\),那么一个充足的采样可以保证 上界<\(\epsilon\)

  2. 固定采样点个数,设定任意一个 \(\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\)​ 来估计一个 \(\hat{O}\)​ 序列
  • 用估计出来的 \(\hat{O}\) 序列来 inverse CDF 采样一组(\(m=64\)​) fresh new 的点来算 \(\hat{O}\)
    • 🤔 笔者:为什么不用前面算法自己得到的所有点的 \(\hat{O}\) 并用于后面的volume render?因为显存无法支持呀!这个算法本身计算都是在 with torch.no_grad() 中包裹的,不保留梯度所以没什么显存占用;最后输出的64个点要用于volume render计算,全程保留梯度;每条射线64个带梯度的点显存占用就已经非常大了
效果
  • https://longtimenohack.com/posts/paper_reading/2021_yariv_volume/image-20210715171303918.png
    • orange: estimated opacity
    • blue: true opacity
    • black: SDF
    • yellow dots:采样点举例
    • ref:true opacity error
    • faint red:error bound
  • https://longtimenohack.com/posts/paper_reading/2021_yariv_volume/image-20210715171622548.png
    • 每条 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;​
    • blendedMVS这种复杂背景数据集:
      • \(r\)​​ 外部的volume用类似NeRF++的参数化方式;32个点,均匀\(1/r\)采样;

  1. 注意这里使用的是volume graphics中的 emission-absorption 模型 / 发光-吸收模型 ↩︎