目录

目录

NeuS: Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction


<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