目录

目录

UNISURF: Unifying Neural Implicit Surfaces and Radiance Fields for Multi-View Reconstruction


<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