# 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;:thinking: 注意 per-pixel mask 和 sihoulette 的区别
- per-pixel mask 意味着物体上那些有空洞的区域也要扣掉;不然会被认为是背景色实体
- 网络需要适当的初始化,因为 表面渲染技术 只能在局部提供梯度信息(也就是光线和表面的交点区域) -> 不像 nerf 那样整个空间都密布着梯度
- ![image-20210712170332666](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 一文中有所提现
- 渲染射线采样点时:
![image-20210715170809058](image-20210715170809058.png)
- 考虑到,implicit surface 的一个关键假设是只有和表面的第一个交叉点对渲染有贡献;
- 但是这一点在迭代初始时,表面并没有被好好定义时,并不竟然;
- **因此**,DVR 和 IDR 都需要强 mask 监督(**per-pixel** mask)
- 首先寻根找到交叉点,然后从交叉点出发向两侧采样
- 在刚开始的迭代,采样间隔很大,涵盖整个 volume;effectively bootstrapping
- **在迭代过程中,采样间隔逐渐变小**,靠近估计的交叉点/表面点;一个随迭代代数指数衰减的积分间隔(有最小值)
- occupancy field 可以直接寻根,在根周围采样,因此也不需要 NeRF 的 hierarchical 重要度采样过程
- 笔者:而且理论上应该效果会好很多,尤其是在训练的 later 迭代里
### 思路:
- start at nothing that:
- nerf 中的渲染式子
- ![image-20210712190238681](image-20210712190238681.png)
- 可以被写作:
- ![image-20210712191443032](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})$
- 然后稍微弱化一下这个设定,不要 $\lbrace 0,1\rbrace$ 的极端,而是取像 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$ 就是渲染图像时采样的像素射线和表面的交点(直接通过寻根过程找到)
## 结果
- ![image-20210712195219132](image-20210712195219132.png)
- ![image-20210712195402231](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 :dog:
2. 如图,初始化时最后一层 `bias` 为 `(-1)*radius`,中间还有对每层权重以及针对 `positional embedding` 的专门处理
![image-20210723095914244](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