跳转至

[NeRF] Representing Scenes as Neural Radiance Fields for View Synthesis

约 1701 个字 预计阅读时间 9 分钟

3DV Reconstruction

文章信息

论文笔记


贡献

  1. 将复杂集合形状和材质的连续场景表达为 5D 神经辐射场的方法,将其参数化为基本的 MLP 网络;
  2. 基于经典体积渲染技术的可微分渲染程序,我们用它从标准 RGB 图像中优化这些表示。这包括一种分层采样策略,将 MLP 的容量分配给具有可见场景内容的空间;
  3. 使用位置编码(positional encoding),将 5D 座标映射到更高维的空间,以实现更高频率的场景内容的表示;

提出的表示方法有如下好处:

  • 可以表达复杂真实的几何形状
  • 适合使用投影图像做梯度优化
    • 问题:什么意思?
  • 降低了高分辨率空间图像的存储成本

方法

使用如下一个“函数”来表示一个静态场景:

FΘ:(x,d)(c,σ)where x=(x,y,z),  d is a 3D Cartesian unit vector,  c=(r,g,b),  σ is the density. \begin{aligned} & F_{\Theta}:(\mathrm{x}, \mathrm{d}) \rightarrow (\mathrm{c}, \sigma) \\ & \text{where } \mathrm{x} = (x,y,z), \; \mathrm{d} \text{ is a 3D Cartesian unit vector}, \; \mathrm{c} = (r,g,b), \; \sigma \text{ is the density}. \end{aligned}
  • 全是 FC;
  • 输入是 5D 座标——点的空间座标 (x,y,z)(x,y,z) 和视角方向 (θ,ϕ)(\theta, \phi)
  • 输出是体积密度以及对应空间位置的与视角有关的辐射(或者说视角有关的 RGB 颜色);

为了保证多视角下观察到的内容具有一致性,做如下约束:

  • 关于密度 σ\sigma 的函数,仅与点的空间位置 x=(x,y,z)\mathrm{x} = (x,y,z) 有关,而与视角无关;
  • 关于颜色 c\mathrm{c} 的函数,与点的空间位置 x=(x,y,z)\mathrm{x} = (x,y,z) 和观察方向 d\mathrm{d} 同时有关;
    • 这大概与 NeRF 在不同视角上光影表现的良好也有较大关系;
  • 实现上是先通过 MLP 用 x\mathrm{x} 训练出 σ\sigma 和一个中间特征向量,再将这个中间向量与 d\mathrm{d} 拼接,继续放到 MLP 中;

利用如上“函数”,具体来说操作如下:

  • 在场景中匹配穿过的相机光线以生成采样的 3D 点集合;
  • 使用这些点以及对应的 2D 视角方向输入到网络中,以得到颜色和密度集合;
  • 使用传统的体积渲染技术累积这些颜色和密度以得到 2D 图像;

为了能够让 MLP 表示更高频率的函数,引入了位置编码(positional encoding)


此外,关于渲染,使用的是传统的体积渲染方法,累积一条光线上的颜色和密度,得到最终的颜色,所使用的公式如下:

C(r)=tntfT(t)σ(r(t))c(r(t),d)dt,    where T(t)=exp(tntσ(r(s))  ds) \begin{aligned} & \mathrm{C}(\mathrm{r})= \int_{t_n}^{t_f} T(t) \cdot \sigma\left( \mathrm{r}(t) \right) \cdot \mathrm{c} \left( \mathrm{r}(t), \mathrm{d} \right) \cdot \mathrm{d}t \end{aligned},\;\; \text{where } T(t) = \exp\left( -\int_{t_n}^t \sigma\left(\mathrm{r}(s)\right) \; \mathrm{d}s \right)

对这个式子稍作解释,tnt_ntft_f 分别表示 near 和 far 的光线边界(bound),光线结果 C(r)C(\mathrm{r}) 通过累积这两个端点之间的按权累积得到,其权重为 T(t)T(t),观察其定义式可发现,随着 tt 的增大,T(t)0T(t) \rightarrow 0,即约往后的点约不容易被看到,这也是符合常识的。而累积的对象为 σ(r(t))c(r(t),d)\sigma(\mathrm{r}(t)) \cdot \mathrm{c}(\mathrm{r}(t), \mathrm{d}),即密度和颜色的乘积,注意两个参数——密度表征形状特征,仅与空间位置有关;而颜色同时与观察角度有关,这暗含着光影信息。

然而,由于积分的操作性差,所以使用一种离散的抽样累积来实现这件事,将光线均匀划分为 NN 个区间,按均匀分布在每个点采样一个点,进行累积,即对于区间 tit_i

tiU[tn+i1N(tftn),tn+iN(tftn)] t_i \sim U \left[ t_n + \frac{i-1}{N} \left( t_f - t_n \right), t_n + \frac{i}{N} \left( t_f - t_n \right) \right]

对应的颜色计算公式改写为:

C^(r)=i=1NTi(1exp(σiδi))ci,    where Ti=exp(j=1i1σjδj) and δi=ti+1ti \begin{aligned} \hat{C}(\mathrm{r}) = \sum_{i=1}^{N} T_i \cdot (1 - \exp(-\sigma_i \delta_i)) \cdot \mathrm{c}_i, \;\; \text{where } T_i = \exp\left( -\sum_{j=1}^{i-1} \sigma_j \delta_j \right) \text{ and } \delta_i = t_{i+1} - t_i \end{aligned}

其中,σ(r(t))\sigma(\mathrm{r}(t)) 别替换为 (1exp(σiδi))(1-\exp(-\sigma_i\delta_i)),在结合了区间长度的情况下又重新将密度映射回了 [0,1][0,1]

在之后的策略中,还会对采样规则做进一步优化。


至此为止是 NeRF 主要的方法,但是这些方法仍然不足以让它达到最先进的效果,因此这里引入两个改进措施。

  1. 使用位置编码(positional encoding)来使 MLP 能够支持更高频的图像信息;
  2. 使用结构化的采样(hierarchical sampling)使能够更有效地对这种高频表示进行采样;

位置编码为一个 γ:RR2L\gamma : \R \rightarrow \R^{2L}

γ(p)=(sin(20πp),cos(20πp),,sin(2L1πp),cos(2L1πp)) \gamma(p) = \left( \sin(2^0 \pi p), \cos(2^0 \pi p), \cdots, \sin(2^{L-1} \pi p), \cos(2^{L-1} \pi p) \right)

γ()\gamma(\cdot) 应用于 x\mathrm{x} 的三个分量(被标准化到 [1,1][-1,1] 上)和 d\mathrm{d} 的两个分量上,实现维度提升,以此优化在高频内容上的表现。在文章中提到,Lx=10,Ld=4L_\mathrm{x} = 10, L_\mathrm{d} = 4

而分层采样,针对的是之前的均匀划分为 NN 个区间进行均匀采样。显然,某些“空气”区域和被遮挡的区域对渲染结果并不会有很大影响,而在空间上这些内容可能占了绝大部分(尤其是没有半透明物体的情况下),均匀采样在这种情况下就显得非常低效。

分层采样的大致思路是,首先使用一个粗略(coarse)的网络,利用 NcN_c 个粗略(coarse)的均匀采样点,通过计算 w^i=normalize(Ti(1exp(σiδi)))\hat{w}_i = normalize\left( T_i \cdot (1 - \exp(-\sigma_i \delta_i)) \right) 得到每个点的权重,而这个权重则反应了每一个采样点附近有效点的分布情况,可以看作一个概率密度函数(PDF)。接下来我们在这个分布的基础上再采样得到 NfN_f 个精细(fine)采样点,与 NcN_c 个粗略(coarse)点一起放到精细(fine)网络中进行训练。


使用的 loss 如下:

L=rRays[C^c(r)Cg.t.(r)22+C^f(r)Cg.t.(r)22] \mathcal{L} = \sum_\mathrm{r\in \text{Rays}} \left[ \left\| \hat{C}_c(\mathrm{r}) - C_{g.t.}(\mathrm{r}) \right\|_2^2 + \left\| \hat{C}_f(\mathrm{r}) - C_{g.t.}(\mathrm{r}) \right\|_2^2 \right]

参考资料

社区 Pytorch 复现代码的注释:https://github.com/IsshikiHugh/nerf-pytorch


最后更新: 2024年1月19日 15:53:31
创建日期: 2024年1月13日 19:00:24
激励

评论