摘要

NeRF 的基本思想是用神经网络作为一个 3D 场景的隐式表达,代替传统的点云、网格、体素、TSDF 等方式,同时通过这样的网络可以直接渲染任意角度任意位置的投影图像。

其主要工作如下:
1)提出一种用 5D 神经辐射场 (Neural Radiance Field) 来表达复杂的几何+材质连续场景的方法,该辐射场使用 MLP 网络进行参数化;
2)提出一种基于经典体素渲染 (Volume Rendering) 改进的可微渲染方法,能够通过可微渲染得到 RGB 图像,并将此作为优化的目标。该部分包含采用分层采样的加速策略,来将 MLP 的容量分配到可见的内容区域;
3)提出一种位置编码 (Position Encoding) 方法将每个 5D 坐标映射到更高维的空间,这样使得我们可以让我们优化神经辐射场更好地表达高频细节内容。

pipeline

我的理解:

对于某张图的一个像素,从该像素发射ray,在这条ray上采样,每个点的5D参数送入MLP训练,输出是该点的颜色和体密度。

然后该条ray上的所有点进行累加(就是经典体素渲染ray-casting的方法),就可以得到原图像的该像素的颜色。

渲染后像素的颜色-原图像素的颜色的残差,采用梯度下降的方法,进行训练

最终训练好的网络,可以输入一个图像的pose,输出该pose下的图像

1 Neural Radiance Field Scene Representation (基于神经辐射场的场景表示)

NeRF 将一个连续的场景表示为一个 5D 向量值函数(vector-valued function),其中:

  • 输入为:3D 位置 x=(x,y,z)\pmb{x}=(x,y,z)xxx=(x,y,z)和 2D 视角方向 (θ,ϕ)(\theta, \phi)(θ,ϕ)
  • 输出为:发射颜色 c=$(r,g,b) $和体积密度 σ

在实际实现中,视角方向表示为一个三维笛卡尔坐标系单位向量 ddd\pmb{d}dddd,我们用一个 MLP 全连接网络表示这种映射:
FΘ:(x,d)→(c,σ)F_Θ:(\pmb{x},\pmb{d})→(\pmb{c},σ)FΘ​:(xxx,ddd)→(ccc,σ) —— (1)

通过优化这样一个网络的参数 Θ 来学习得到这样一个 5D 坐标输入到对应颜色和密度输出的映射。

为了让网络学习到多视角的表示,我们预测体积密度σ 的网络部分输入仅仅是输入位置 x,而预测颜色 c 的网络输入是视角和方向 ddd\pmb{d}dddd。在具体实现上:
1)MLP 网络FΘF_ΘFΘ​ 首先用 8 层的全连接层(使用 ReLU 激活函数,每层有 256 个通道),处理 3D 坐标x,得到 σ 和一个 256 维的特征向量。
2)将该 256 维的特征向量与视角方向与ddd\pmb{d}dddd 视角方向一起拼接起来,喂给另一个全连接层(使用 ReLU 激活函数,每层有 128 个通道),输出方向相关的 RGB 颜色。

本文中一个示意的网络结构如下:

其中:γ\gammaγ 表示从R\mathbb{R}R到更高维 R2L\mathbb{R}^{2 L}R2L的编码函数

(神经网络倾向于学习到频率较低的函数。而通过将输入通过高频函数映射到高维空间中,可以更好地拟合数据中的高频信息。)

2 Volume Rendering with Radiance Fields (基于辐射场的体素渲染)

2.1 经典的体素渲染方法

我们的 5D 神经辐射场将场景表示为:其所在空间中任意点的体素密度和有方向的辐射亮度。

体素密度 σ(x)\sigma(\mathbf{x})σ(x)定义为光线停留在位置 x\mathbf{x}x 处无穷小粒子的可导概率(或者也可以理解为光线穿过此点后终止的概率)。使用经典的立体渲染的原理,我们可以渲染出任意射线穿过场景的颜色。

因此对于某个视角 o\mathbf{o}o 发出的方向为 d\mathbf{d}d 的光线,其在 t 时刻到达点为:
KaTeX parse error: \tag works only in display equations —— (2)

那么沿这个方向在范围 (tn,tf)(t_n, t_f)(tn​,tf​)对颜色积分,获得最终的颜色值 C(r)C(\mathbf{r})C(r) 为:
C(r)=∫tntfT(t)σ(r(t))c(r(t),d)dt,where T(t)=exp⁡(−∫tntσ(r(s))ds)C(\mathbf{r})=\int_{t_{n}}^{t_{f}} T(t) \sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbf{d}) d t, \text { where } T(t)=\exp \left(-\int_{t_{n}}^{t} \sigma(\mathbf{r}(s)) d s\right)C(r)=∫tn​tf​​T(t)σ(r(t))c(r(t),d)dt, where T(t)=exp(−∫tn​t​σ(r(s))ds)
—— (3)

函数 T(t) 表示光线从 tnt_ntn​ 到 ttt 累积的透明度 (Accumulated Transmittance)。换句话说,就是光线从 tnt_ntn​ 到 ttt 穿过没有碰到任何粒子的概率。按照这个定义,视图的渲染就是表示成对于 C(r)C(\mathbf{r})C(r)的积分,它是就是虚拟相机穿过每个像素的相机光线,所得到的颜色。

不过在实际的渲染中,我们并不能进行连续积分,我们使用求积法(quadrature)进行积分的数值求解。通过采用分层采样 (stratified sampling) 的方式对 [tn,tf]\left[t_{n}, t_{f}\right][tn​,tf​]划分成均匀分布的小区间,对每个区间进行均匀采样,划分的方式如下:
ti∼U[tn+i−1N(tf−tn),tn+iN(tf−tn)]t_{i} \sim \mathcal{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]ti​∼U[tn​+Ni−1​(tf​−tn​),tn​+Ni​(tf​−tn​)] —— (4)

对于采样的样本,我们采用离散的积分方法:
C^(r)=∑i=1NTi(1−exp⁡(−σiδi))ci,where Ti=exp⁡(−∑j=1i−1σjδj)\hat{C}(\mathbf{r})=\sum_{i=1}^{N} T_{i}\left(1-\exp \left(-\sigma_{i} \delta_{i}\right)\right) \mathbf{c}_{i}, \text { where } T_{i}=\exp \left(-\sum_{j=1}^{i-1} \sigma_{j} \delta_{j}\right)C^(r)=∑i=1N​Ti​(1−exp(−σi​δi​))ci​, where Ti​=exp(−∑j=1i−1​σj​δj​) —— (5)

其中,δi=ti+1−ti\delta_{i}=t_{i+1}-t_{i}δi​=ti+1​−ti​是相邻样本之间的距离。

下图非常形象地演示了体素渲染的流程:

3 Optimizing a Neural Radiance Field (优化一个神经辐射场)

上述方法就是 NeRF 的基本内容,但基于此得到的结果并能达到最优效果,存在例如细节不够精细、训练速度较慢等问题。为了进一步提升重建精度和速度,我们还引入了下面两个策略:

  • Positional Encoding (位置编码):通过这一策略,能够使得 MLP 更好地表示高频信息,从而得到丰富的细节;
  • Hierarchical Sampling Procedure (金字塔采样方案):通过这一策略,能够使得训练过程更高效地采样高频信息。

3.1 Positional Encoding (位置编码)

尽管神经网络理论上可以逼近任何函数,但是通过实验发现仅用 MLP 构成的 FΘF_{\Theta}FΘ​ 处理输入$ (x, y, z, \theta, \phi)$ 不能够完全表示出细节。这和 Rahaman 等人工作(《On the spectral bias of neural networks. In: ICML (2018) 》)所证明的结论相符,即:神经网络倾向于学习到频率较低的函数。同时他们的工作也表明,通过将输入通过高频函数映射到高维空间中,可以更好地拟合数据中的高频信息。

通过这些发现应用到神经网络场景表达任务中,我们将 FΘF_{\Theta}FΘ​ 修改成两个函数的组合: FΘ=FΘ′∘γF_{\Theta}=F_{\Theta}^{\prime} \circ \gammaFΘ​=FΘ′​∘γ,通过这样的方式可以明显提升细节表达的性能,其中:

  • γ\gammaγ 表示从 R\mathbb{R}R 到更高维 R2L\mathbb{R}^{2 L}R2L 的编码函数
  • FΘ′F_{\Theta}^{\prime}FΘ′​ 是正常的 MLP 网络

本文使用的编码函数如下:

KaTeX parse error: Expected 'EOF', got '}' at position 158: …p\right)\right)}̲ —— (6)

该函数 γ(⋅)\gamma(\cdot)γ(⋅)会应用于三维位置坐标 x\mathbf{x}x (归一化到 [-1, 1] )和三维视角方向笛卡尔坐标 d\mathbf{d}d 。

在本文中对于 γ(x)\gamma(\mathbf{x})γ(x)设置 L=10;对于γ(d)\gamma(\mathbf{d})γ(d) 设置 L=4。

相似地,在 Transformer 中也有一个类似的位置编码操作,不过本文中与其还是根本不同。在 Transformer 中位置编码是用来表示输入的序列信息的,而这里的位置编码是做用于输入将输入映射到高维从而让网络能够更好地学习到高频信息。

3.2 Hierarchical Sampling Procedure (分层采样方案)

分层采样方案来自于经典渲染算法的加速工作,在前述的体素渲染 (Volume Rendering) 方法中,对于射线上的点如何采样会影响最终的效率,如果采样点过多计算效率太低,采样点过少又不能很好地近似。那么一个很自然的想法就是希望对于颜色贡献大的点附近采样密集,贡献小的点附近采样稀疏,这样就可以解决问题。基于这一想法,NeRF 很自然地提出由粗到细的分层采样方案(Coarse to Fine)。

Coarse 部分:首先对于粗网络,我们采样 NcN_cNc​ 个稀疏点(c 表示 Coarse),并将公式 (3) 用新的形式修改(加入权重):

原公式:

加入权重后:

C^c(r)=∑i=1Ncwici,wi=Ti(1−exp⁡(−σiδi))\hat{C}_{c}(\mathbf{r})=\sum_{i=1}^{N_{c}} w_{i} c_{i}, \quad w_{i}=T_{i}\left(1-\exp \left(-\sigma_{i} \delta_{i}\right)\right)C^c​(r)=∑i=1Nc​​wi​ci​,wi​=Ti​(1−exp(−σi​δi​)) —— (7)

其中权重需要进行归一化: w^i=wi∑j=1Ncwj\hat{w}_{i}=\frac{w_{i}}{\sum_{j=1}^{N_{c}} w_{j}}w^i​=∑j=1Nc​​wj​wi​​

这里面的权重 w^i\hat{w}_{i}w^i​ 可以看成沿着射线的分段常数概率密度函数 (Piecewise-constant PDF)。通过这个概率密度函数可以粗略地得到射线上物体的分布情况。

Fine 部分:在第二阶段,我们使用逆变换采样 (Inverse Transform Sampling),根据上面的分布采样出第二个集合 NfN_fNf​ ,最终我们仍然使用公式 (3) 来计算 C^f(r)\hat{C}_{f}(\mathbf{r})C^f​(r) 。但不同的是使用了全部的 Nc+NfN_c + N_fNc​+Nf​ 个样本。使用这种方法,第二次采样可以根据分布采样更多的样本在真正有场景内容的区域,实现了重要性抽样 (Importance Sampling)。

如图所示,白色点为第一次均匀采样的点,通过白色均匀采样后得到的分布,第二次再根据分布对进行红色点采样,概率高的地方密集,概率低的地方稀疏 (很像粒子滤波)。

3.3 Implementation Details (实现细节)

在训练损失函数方面,本文的定义非常简单直接,就是对于粗网络和精网络都用渲染的 L2L_2L2​ Loss,公式如下:(同时优化coarse 和 fine)
L=∑r∈R[∥C^c(r)−C(r)∥22+∥C^f(r)−C(r)∥22]\mathcal{L}=\sum_{\mathbf{r} \in \mathcal{R}}\left[\left\|\hat{C}_{c}(\mathbf{r})-C(\mathbf{r})\right\|_{2}^{2}+\left\|\hat{C}_{f}(\mathbf{r})-C(\mathbf{r})\right\|_{2}^{2}\right]L=∑r∈R​[∥∥∥​C^c​(r)−C(r)∥∥∥​22​+∥∥∥​C^f​(r)−C(r)∥∥∥​22​] —— (9)

其中:

  • R\mathcal{R}R表示一个 batch 中的所有采样的射线集合
  • C(r)C(\mathbf{r})C(r)表示真值的 RGB 颜色
  • C^c(r)\hat{C}_{c}(\mathbf{r})C^c​(r) 表示 Coarse 网络预测的 RGB 颜色
  • C^f(r)\hat{C}_{f}(\mathbf{r})C^f​(r) 表示 Fine 网络预测的 RGB 颜色

NeRF论文解析 - Neural Radiance Field相关推荐

  1. 【论文阅读】NeRF: Representing Scenesas Neural Radiance Fieldsfor View Synthesis

    NeRF是一篇发表在ECCV 2020的一篇文章,并获得了当年Best Paper称号.该技术一经提出就惊艳了众人,NeRF目前也是计算机视觉领域一个非常有趣并且火热开展的研究方向.博主本人后续的研究 ...

  2. 【论文精读】NeRF —— 解读《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》

    NeRF的核心点是实现了复杂静态场景的隐式表达,用一个神经网络来建模. Abstract 本文提出了一种新方法,通过使用稀疏的输入视图集优化底层连续的体积场景函数,实现了合成复杂场景的新视图的SOTA ...

  3. 论文笔记:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    目录 文章摘要 1 Neural Radiance Field Scene Representation (基于神经辐射场的场景表示) 2 Volume Rendering with Radiance ...

  4. 读论文12——NeRF:Representing Scenes as Neural Radiance Fields for View Synthesis

    目录 Abstract Introduction Related Work Neural Radiance Field Scene Representation Volume Rendering wi ...

  5. 论文笔记NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    NeRF使用神经网络来表示场景.给定一个场景,输入该场景一些视角的图片,NeRF可以合成该场景新视角的图片. 神经辐射场 神经辐射场(neural radiance field,NeRF)使用5D的向 ...

  6. 火爆科研圈的三维重建技术:Neural radiance fields (NeRF)

    如果说最近两年最火的三维重建技术是什么,相信NeRF[1]是一个绝对绕不过去的名字.这项强到逆天的技术,一经提出,就被众多研究者所重视,对该技术进行深入研究并提出改进已经成为一个热点.仅仅过了不到两年 ...

  7. [非卷积5D中文翻译及学习笔记] 神经辐射场 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    不使用3D建模,使用静态图片进行训练,用(非卷积)深度网络表示场景的5D连续体表示,再通过ray marching进行渲染. 本中文翻译使用"机器学习+人工校准/注解"的方式完成. ...

  8. 文献翻译阅读-NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    目录 信息 简介 相关工作 神经3D表示 视角合成和基于图像的渲染 方法 体渲染技术(用离散形式表示连续积分) 优化神经场的技术 位置编码 分层体积抽样 实施细节 结果 结论 参考 信息 NeRF,即 ...

  9. 深度学习(20):nerf论文翻译与学习

    目录 1 Introduction 2 Related Work 3 Neural Radiance Field Scene Representation 4 Volume Rendering wit ...

最新文章

  1. MultiRow发现之旅(二)- 详解属性管理器
  2. Java Web 开发必须掌握的三个技术:Token、Cookie、Session
  3. http://blog.sina.com.cn/s/blog_458f3c010100n4st.html
  4. c语言void replace(str,ch)替换字符串,C++ 中字符串查找、字符串截取、字符串替换...
  5. android 自定义 进度条 旋转,Android_Android ProgressBar进度条使用详解,ProgressBar进度条,分为旋转进 - phpStudy...
  6. 【ArcGIS风暴】GlobeLand30全球数据处理教程(批量投影转换、无效值处理、拼接)
  7. 1-26HashSet简介
  8. vdp备份oracle系统,VDP文件级恢复需要在用VDP备份的机器上浏览
  9. android 加网络权限管理,Android添加用户组及自定义App权限的方法
  10. Vnc-server——linux远程桌面配置
  11. centos怎么用命令行启动mysql_centos怎么用命令行启动mysql数据库
  12. JSON入门教程(适合初学者)
  13. 聚石塔,云鼎,多多云-----有一种坑叫盲打
  14. python最全面试题!
  15. 毕业生签三方?报到证?档案户口?
  16. 微信开发者工具网页h5本地开发,解决微信公众号绑定域名,本地无法调用微信api问题
  17. Spark、Storm、Flink横向对比
  18. 巨型计算机语言主要应用于,计算机应用基础知识复习题
  19. 监控系统的基本架构(Metric monitoring)
  20. 数据结构[1]--学习--绪论(学习记录)

热门文章

  1. 处理器架构 (十五) 国产cpu芯片与架构
  2. 【教程】C++-赋值语句
  3. 树莓派4B 8G安装日志(1)——基础环境安装
  4. golang map 锁_go 安全map 实现, 互斥锁和读写锁
  5. 将两个ISO文件挂载至同一个虚拟光驱
  6. python画蛋糕祝福图片大全_蛋糕画画图片大全_简单的简笔画图片大全
  7. ARM服务器搭建 我的世界(MC) 1.18.2 版私服教程
  8. 结对编程之经验教训总结
  9. 5.22 综合案例2.0-4G远程遥控车DEMO(2.2版本接口有更新)
  10. 警惕 “格机软件” 格式化手机全字库..不要轻易给不明觉厉的软件给root权限