当前位置: 首页 > news >正文

原始 NeRF 论文主要点细致介绍

本文介绍论文 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis( ECCV 2020)里面主要的 3 个部分:Volume RenderingPositional EncodingHierarchical Volume Sampling。相信本文详细的介绍会让你对 NeRF 的论文有比较深入细致的了解。本文主要参照 vtuber AI葵的视频讲解,讲解1链接和讲解2链接。

Volume Rendering

在这里首先要说明的是 NeRF 论文中的公式(3),它是从论文中公式(1)的定积分通过矩形法求定积分推导而来。
先抛出几个符号: σ , α , δ \sigma ,\qquad \alpha,\qquad \delta σ,α,δ
还有一个重要概念:transmittance
它们的含义如下:

  • σ \sigma σ:Volume Density
  • α \alpha α:透明度
  • δ \delta δ:两个采样点之间的距离
  • transmittance:具体解释见下文

由相机 o 和某个成像点 C 两点确定的射线如图 1 所示。以相机为原点 o \mathbf{o} o,射线方向为坐标轴方向建立坐标轴。则坐标轴上任意一点坐标可表示为 o + t d \mathbf{o}+t\mathbf{d} o+td。其中 t t t 为该点到原点距离, d \mathbf{d} d为单位方向向量。near,far 实际上是两个垂直于射线,平行于成像平面的平面。在这里,也用nearfar表示那两个平面与射线的交点。在射线上采样的范围是从 near 点到 far 点。理论上,如果对于相关的 scene 我们一无所知,near 点应该被设在在原点(相机处),far 点则在 无穷远。但是实际上如果我们要处理的是 synthetic dataset,则会根据已知的物体在 scene 中的范围调整 near 和 far。因为这样可以减少计算量。
将 near 到 far 的范围 n 等分,在第 i i i 个等分小区间内均匀随机采样,得到采样点点 C i \mathbf{C}_i Ci。注意,用大写的 C i \mathbf{C}_i Ci 代表第 i i i个采样点。而小写的 c i \mathbf{c}_i ci 代表它的RGB颜色向量

在这里插入图片描述

图1. NeRF Volume Rendering 示意图

首先, α \alpha α 是由 σ \sigma σ 推导得到的一个量
α = 1 − e − σ δ (1) \alpha=1-e^{-\sigma\delta}\tag{1} α=1eσδ(1)

  • σ = 0 \sigma=0 σ=0 时, α = 0 \alpha=0 α=0,这表示当 Volume Density 为 0 时,透明度为 0,完全透明,从相机发出的光继续向后传播,当前点对成像点的颜色无贡献,也不影响后面点对成像点颜色的贡献。
  • σ → + ∞ \sigma \to +\infty σ+ α → 1 \alpha\to 1 α1,这表示此时 透明度为1,完全不透明,使得从相机发出的光被完全阻挡在当前点,使得当前点后面的点对成像点 C 的颜色无贡献。
    如图 2 所示,图中标号1,2处没物体,透明度为 0 ;标号3,4处被物体占据,透明度为1。
    在这里插入图片描述
图2.乐高玩具,图中标号1,2处没物体,透明度为 0 ;标号3,4处被物体占据,透明度为1。

现在,先给出成像点 C 的颜色公式:

C ^ = c 1 α 1 + c 2 α 2 ( 1 − α 1 ) + c 3 α 3 ( 1 − α 1 ) ( 1 − α 2 ) + . . . + c n α n ( 1 − α 1 ) ( 1 − α 2 ) . . . ( 1 − α n − 1 ) (2) \begin{aligned} \hat{\mathbf{C}} =&\mathbf{c}_1 \alpha_1 \\ & + \mathbf{c}_2 \alpha_2 (1-\alpha_1 ) \\ & + \mathbf{c}_3 \alpha_3 (1-\alpha_1 ) (1-\alpha_2 ) \\ &+ ... \\ &+ \mathbf{c}_n \alpha_n (1-\alpha_1 ) (1-\alpha_2 )...(1-\alpha_{n-1}) \tag{2} \end{aligned} C^=c1α1+c2α2(1α1)+c3α3(1α1)(1α2)+...+cnαn(1α1)(1α2)...(1αn1)(2)
其中, α \alpha α 的定义见上文公式(1)。 C i C_i Ci对应的 t r a n s m i t t a n c e i transmittance_i transmittancei
( 1 − α 1 ) ( 1 − α 2 ) . . . ( 1 − α i − 1 ) (1-\alpha_1 ) (1-\alpha_2 )...(1-\alpha_{i-1}) (1α1)(1α2)...(1αi1)
t r a n s m i t t a n c e i transmittance_i transmittancei 可以理解为除去当前点 C i C_i Ci 前面的 点 C 1 , C 2 , . . . , C i − 1 C_1,C_2,...,C_{i-1} C1,C2,...,Ci1C 的影响之后, C i C_i Ci能对 C产生的最大影响系数。然后, α i \alpha_i αi 乘上 t r a n s m i t t a n c e i transmittance_i transmittancei的乘积才是最终的 C i C_i CiC 颜色的权重,记作 w e i g h t i weight_i weighti
不同相机射线的采样点不同,对应的 transmittance 不同,这就解释了为什么Scene 中同一个三维点,从不同的方向去看颜色可能是不同的。
等式(2)就是 NeRF 论文里面的等式(3):
C ^ ( r ) = ∑ i = 1 N T i ( 1 − e − σ i δ i ) c i , T i = e − ∑ j = 1 i − 1 σ j δ j (3) \hat{C}(\mathbf{r})= \sum_{i=1}^NT_{i}(1-e^{-\sigma_i\delta_i})\mathbf{c}_i, \qquad T_{i}=e^{-\sum_{j=1}^{i-1}\sigma_j\delta_j} \tag{3} C^(r)=i=1NTi(1eσiδi)ci,Ti=ej=1i1σjδj(3)
在等式(2)中,将 α \alpha α的公式带入,即可化为等式(3)
阅读等式(2)比等式(3)更容易理解 Volume Rendering 的过程,但是前者可能不太简洁,不太方便放到论文上。所以我们看到的在NeRF论文上出现的是 等式(3)而不是等式(2)。
其中, C ^ ( r ) \hat{C}(\mathbf{r}) C^(r) 表示用论文方法 estimate(preditct)的成像点 C 的颜色。 r = o + t d \mathbf{r}=\mathbf{o}+t\mathbf{d} r=o+td,代表一条唯一的相机射线。
再介绍一下相邻采样点之间的距离 δ i \delta_i δi 的计算方法。针对每个采样点 C 1 , C 2 , . . . , C n \mathbf{C}_1,\mathbf{C}_2,...,\mathbf{C}_n C1,C2,...,Cn ,事先知道每个采样点对于的距离相机o的距离 z 1 , z 2 , . . z n z_1,z_2,..z_n z1,z2,..zn。那么有两个 list:
Z 1 = [ z 1 , z 2 , . . . , z n − 1 ] (4) Z_1 = [z_1,z_2,...,z_{n-1}] \tag{4} Z1=[z1,z2,...,zn1](4)
Z 2 = [ z 2 , z 3 , . . . , z n ] (5) Z_2 = [z_2,z_3,...,z_{n}] \tag{5} Z2=[z2,z3,...,zn](5)
等式(5)减去等式(4),有
[ δ 1 , δ 2 , . . . , δ n − 1 ] : = [ z 2 − z 1 , z 3 − z 2 , . . . , z n − z n − 1 ] : = Z 2 − Z 1 [\delta_1,\delta_2,...,\delta_{n-1}]:= [z_2-z_1,z_3-z_2,...,z_{n}-z_{n-1}]:=Z_2-Z_1 [δ1,δ2,...,δn1]:=[z2z1,z3z2,...,znzn1]:=Z2Z1
特殊地, δ n = + ∞ − z n \delta_{n}=+\infty-z_n δn=+zn,在NeRF的代码中,作者将 δ n \delta_{n} δn设置成一个很大的正数。

Positional Encoding

NeRF成功的因素,除了文章本身的 idea 外,即训练一个 MLP :
F Θ : ( x , d ) ↦ ( C , σ ) (6) F_\Theta:(\mathbf{x},\mathbf{d})\mapsto (\mathbf{C}, \sigma) \tag{6} FΘ:(x,d)(C,σ)(6)
其中, x , d \mathbf{x},\mathbf{d} x,d 分别代表 scene 中的任意一个三维坐标和单位方向向量。
C , σ \mathbf{C},\sigma C,σ 分别代表由三维坐标和方向向量唯一确定的相机射线确定的三维坐标处的颜色,和三维坐标处的 Volume Density。
还包括一个非常重要的 trick:Positional Encoding。图2展示了 NeRF论文中的实验结果对比。在图2中用红色矩形框标注出来的就是没有使用 Positional Encoding 的结果,它明显比使用了的(Complete Model)结果差。差的部分主要体现在图像的一些 high-frequency 部分。
在这里插入图片描述

图3.

那么,为什么说Positional Encoding 至关重要呢?
为了回答这个问题,首先要介绍一下关于“图像”的一个概念:high-frequency (高频)和 low-frequency(低频)。如图4所示,标号1所处的地方是白色类似于桌布的东西,标号2所处的地方是核桃。在前者的小区域内,移动一点位置,颜色并不会变化很大,但是后者就会。前者的区域对应 low-frequency,后者的区域对应 high-frequency。

在这里插入图片描述

图4. high-frequency 和 low-frequency 对比示意图

那么,Positional Encoding 具体是怎么做的呢?
首先,给出函数 γ ( x ) \gamma(x) γ(x) 的定义,
γ ( x ) = [ sin ⁡ ( 2 0 π x ) , cos ⁡ ( 2 0 π x ) , sin ⁡ ( 2 1 π x ) , cos ⁡ ( 2 1 π x ) , … , sin ⁡ ( 2 L − 1 π x ) , cos ⁡ ( 2 L − 1 π x ) ] T (7) \gamma(x) =[\sin(2^0\pi x), \cos(2^0\pi x) , \sin(2^1\pi x), \cos(2^1\pi x),\quad \dots \quad, \sin(2^{L-1}\pi x), \cos(2^{L-1}\pi x)]^{T} \tag{7} γ(x)=[sin(20πx),cos(20πx),sin(21πx),cos(21πx),,sin(2L1πx),cos(2L1πx)]T(7)
公式(7)中的 L L L 在下文中会解释其含义。
图 5 中下半部分使用了 Positional Encoding: x \mathbf{x} x先经由 γ ( x ) \gamma(x) γ(x)处理,然后将处理后的中间量输入进 F Θ F_\Theta FΘ

在这里插入图片描述

图5. Positional Encoding 是要对 input 处理后再传入 MLP
在论文中,作者有这么一段话

This is consistent with recent work by Rahaman et al. [34], which shows that deep networks are biased towards learning lower frequency functions. They additionally show that mapping the inputs to a higher dimensional space using high frequency functions before passing them to thenetwork enables better fitting of data that contains high frequency variation.

上面这段话指出——深度神经网络偏向于学习图像 low-frequency 的部分,而针对 high-frequency 的部分难以学习,而对输入施加如公式(7)所示的 Positional Encoding 后,则能将 input 映射到高维空间从而解决这个问题。
公式(7)中 L L L的值决定了神经网络能学习到的最高频率的大小

  • 如果 L L L 的值太小,则会导致 high-frequency 区域难以重现的问题。
  • 如果 L L L 的值太大,则会导致重现出来的图像有很多噪声的情况。关于 L L L 值的大小对重现图像的效果的影响,可以参考论文 Fourier Features Let Networks Learn High Frequency Functions in Low Dimensional Domains。
  • NeRF 的作者根据实验结果,发现关于三维点坐标 x \mathbf{x} x 和 单位方向向量 d \mathbf{d} d L L L分别取 10 与 4 的情况,实验效果比较好。

针对三维位置 x \mathbf{x} x,讨论 γ ( x ) \gamma(\mathbf{x}) γ(x) 输出的维度大小。
首先, x \mathbf{x} x 有 3 个分量。针对每个分量,如公式(7)所示,都会得到拥有 L × 2 = 10 × 2 = 20 L\times2=10\times2=20 L×2=10×2=20 个维度的输出。所以输出一共有 60 60 60 个维度。

Hierarchical Volume Sampling

在 NeRF中,一共有训练两个 MLP,分别是 m o d e l c model_c modelc (coarse)和 m o d e l f model_f modelf(fine),它们的模型结构一样,只是参数不同。它们分别对应 Hierarchical Volume Sampling 两次抽样的模型。

  • 第一次抽样是先将在相机射线上,由 near 和 far 构成的范围 n 等分,然后在每个小区间内均匀采样得到一个采样点 C i C_i Ci,最终一共 n 个采样点。将得到的采样点的位置信息和其他信息输入 MLP,MLP 输出每个采样点的 Volume Density。
  • 第二次采样是基于第一次采样点的结果。在上文中,已经提及某个采样点 C i C_i Ci w e i g t h i weigth_i weigthi的概念: α i \alpha_i αi 乘上 t r a n s m i t t a n c e i transmittance_i transmittancei的乘积才是最终的 C i C_i CiC 颜色的权重,记作 w e i g h t i weight_i weighti。那么,第二次采样会对第一次采样结果中 w e i g h t i weight_i weighti 较大的区域多多采样。即在 w e i g h t i weight_i weighti值大的地方采样多一些,在 w e i g h t i weight_i weighti 值小的地方采样少一些。

关于第二次采样,具体地,首先对 w e i g h t i weight_i weighti归一化,即
w i ^ = w i ∑ j = 1 N C w j (8) \hat{w_i}=\frac{w_i}{\sum_{j=1}^{N_C}w_j} \tag{8} wi^=j=1NCwjwi(8)
其中, w i w_i wi表示 w e i g h t i weight_i weighti w i ^ \hat{w_i} wi^表示归一化后的 w i w_i wi N c N_c Nc是第一次采样的采样点数目。
现在注意到, ∑ i = 1 N c w i ^ : = 1 \sum_{i=1}^{N_c} \hat{w_i}:=1 i=1Ncwi^:=1
w i ^ \hat{w_i} wi^ 构造累计分布函数(CDF)。
举个例子,比如说:第一次采样有 6 个采样点,它们的 weight 分别是
30 , 5 , 70 , 10 , 120 , 30 30, 5 , 70, 10 ,120, 30 30,5,70,10,120,30
那么该例子的 累计 weight 曲线如图 6 所示。横轴是采样样本点的 index,竖轴是累计 weight。
在竖轴上[0,1]范围内以 0.0625 为间距等距采样,灰色虚线与蓝色实线相交的点是“采样点”。
在 NeRF 代码中,实际上采样点取的是灰色虚线与 Theoretical 累计分布函数曲线的交点。图中的蓝色阶梯曲线是 Empirical累计分布函数曲线,所以看到有一些采样点是相同的。这是因为本人举的这个例子和画图技术所限,没能把 Theoretical 累计分布函数曲线画出来。但是应该不影响理解。
不难看出,在曲线拥有比较长的阶梯的地方,第二次采样的点的数目会很多。
阶梯长是因为那个地方对应的第一次采样点有大的 weight值。

最后,把那些黑色虚线与 Theoretical 累计分布函数曲线交点对应的点给采样出来,就实现了在 第一次采样点 中 weight 比较大的地方多采样,weight 比较小的地方少采样。

在这里插入图片描述

图6. Hierarchical Volume Sampling 第二次采样示意图

相关文章:

  • 关于AOP的学习过程简单总结
  • 英语词典缩略词
  • SQL 2008 T-Prep 上课心得(二)
  • conda虚拟环境指定python版本出错
  • 浅谈 自定义Vista启动管理项
  • 光线追踪渲染技术能听懂的介绍
  • 使用游标会更好
  • 生成相机光线:栅格空间-NDC-屏幕空间-世界
  • 《荒漠甘泉》4月17日
  • 根据tensor 构造 cdf
  • 理解 tensor, cat, unsquee, stack
  • ITIL-以流程为中心的IT管理行业标准
  • NeRF代码学习记录
  • VC数据类型转换大全 (转)
  • Tensor unsqueeze 以 broadcast
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Babel配置的不完全指南
  • CentOS从零开始部署Nodejs项目
  • Gradle 5.0 正式版发布
  • Linux链接文件
  • mysql 5.6 原生Online DDL解析
  • Promise初体验
  • SpingCloudBus整合RabbitMQ
  • tweak 支持第三方库
  • Vue2 SSR 的优化之旅
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 嵌入式文件系统
  • 设计模式走一遍---观察者模式
  • 深度学习中的信息论知识详解
  • 算法---两个栈实现一个队列
  • 微信支付JSAPI,实测!终极方案
  • 小程序 setData 学问多
  • 新书推荐|Windows黑客编程技术详解
  • 正则表达式小结
  • python最赚钱的4个方向,你最心动的是哪个?
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014#Day.2 T3 解方程
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)h264中avc和flv数据的解析
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ... 是什么 ?... 有什么用处?
  • .net framework4与其client profile版本的区别
  • .NET运行机制
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @requestBody写与不写的情况
  • @SuppressWarnings(unchecked)代码的作用
  • [ C++ ] STL---string类的使用指南
  • [ANT] 项目中应用ANT