对NeRF的开源代码的解读请见博文 原始NeRF代码学习记录。

2022-11-20

NeRF 做得这么好的原因有:

  • 它将渲染做成可微了,然后就可以数据驱动。
  • 它避免了用复杂的物理模型去建模,而只是用非常简单的 MLP 去建模。但这也导致了不好的地方,就是物理意义不明显,不容易监督。

根据计算机图形学的知识,三维物体的shape+texture,camera,图像这三种信息,知道两个就能推出第三个。

2022-10-23

CVPR 2022 6 hour Tutorial on Neural Fields in Computer Vision

2022-9-23

如下图,蓝色的一坨是 三维物体,然后两个黑色的平面(与z轴垂直)把物体 “夹住”,
这两个平面与 z 轴的交点的 z 轴坐标值分别为 near、far。
任意一条相机光线 ray,其在 z 轴上的投影虚线对应光线ray位于 把物体包围住的一个box里的部分(计算机图形学的一个概念)。
在对 ray上的点进行采样时,先于 z 轴上 在[near, far] 的范围采样,然后映射到 ray 上对应的部分。


代码,如下:

t_vals = torch.linspace(0., 1., steps=N_samples)
if not lindisp:z_vals = near * (1.-t_vals) + far * (t_vals)..................
pts = rays_o[...,None,:] + rays_d[...,None,:] * z_vals[...,:,None] # [N_rays, N_samples, 3]

2022-9-5更新:

论文 supplementary 中提到的 转换到 NDC space 的 insights 来自这篇博文。
将坐标系变换到 NDC空间(Normalized Device Coordinate, [−1,1]3[-1,1]^3[−1,1]3)并不是对所有的情况,只有对那些 forward-facing的场景才会施加,对 360。360^。360。场景,是不会施加的。(NDC only works when the whole scene lies behind a “near” plane perpendicular to the camera axis. So yes, it will only work for a half-hemisphere scene with less than 180 degree field of view, and certainly not for 360 degree scenes. Issue47

2022-9-4更新:

有两个网络:coarsefine,采样的时候首先均匀采样 NcN_cNc​个点,输入coarse网络,根据 volume rendering 的公式,inverse-sample 出 NfN_fNf​ 个点,但是输入 fine 模型的不是只有 NfN_fNf​ 个点,而是 Nc+NfN_c+N_fNc​+Nf​ 个点。这么看, fine 模型的表现多少依赖于 coarse 模型。因为 fine 模型的采样点依赖于 coarse 模型。

2022-9-2更新:

作者认为 NeRF 不是用来做3维重建的,它真正想做的是视图重建
其实NeRF三维重建的效果不是太好

2022-08-31更新:

NeRF以像素为单位进行训练,像素的训练都是独立的。
更新一个本人产生的疑惑及其答案。
问题sampling points 的信息(RGB, σ\sigmaσ)是怎么得到的呢?
这个问题的产生受到了论文中下面表达式的影响
FΘ(x,d)=(C,σ)\mathbf{F}_{\Theta}(\mathbf{x},\mathbf{d})=(\mathbf{C},\sigma)FΘ​(x,d)=(C,σ)
下意识觉得 MLP 是对 输入的多张图像进行处理。
答案:NeRF 的MLP恰恰是以 sampling points 为输入,输出对它们预测的信息。然后 volume rendering,得到对应的图像。

本文介绍论文 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/opacity
  • α\alphaα:透明度 / occupancy probability
  • δ\deltaδ:两个采样点之间的距离
  • transmittance:具体解释见下文

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

图1. NeRF Volume Rendering 示意图

首先,α\alphaα 是由 σ\sigmaσ 推导得到的一个量
α=1−e−σδ(1)\alpha=1-e^{-\sigma\delta}\tag{1}α=1−e−σδ(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^=c1α1+c2α2(1−α1)+c3α3(1−α1)(1−α2)+...+cnα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−αn−1​)​(2)
其中,α\alphaα 的定义见上文公式(1)。CiC_iCi​对应的 transmittanceitransmittance_itransmittancei​ 为
(1−α1)(1−α2)...(1−αi−1)(1-\alpha_1 ) (1-\alpha_2 )...(1-\alpha_{i-1})(1−α1​)(1−α2​)...(1−αi−1​)
transmittanceitransmittance_itransmittancei​ 可以理解为除去当前点 CiC_iCi​ 前面的 点 C1,C2,...,Ci−1C_1,C_2,...,C_{i-1}C1​,C2​,...,Ci−1​对 C 的影响之后,CiC_iCi​能对 C产生的最大影响系数。然后,αi\alpha_iαi​ 乘上 transmittanceitransmittance_itransmittancei​的乘积才是最终的 CiC_iCi​ 对C 颜色的权重,记作weightiweight_iweighti​。
不同相机射线的采样点不同,对应的 transmittance 不同,这就解释了为什么Scene 中同一个三维点,从不同的方向去看颜色可能是不同的。
等式(2)就是 NeRF 论文里面的等式(3):
C^(r)=∑i=1NTi(1−e−σiδi)ci,Ti=e−∑j=1i−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=1∑N​Ti​(1−e−σi​δi​)ci​,Ti​=e−∑j=1i−1​σ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+td\mathbf{r}=\mathbf{o}+t\mathbf{d}r=o+td,代表一条唯一的相机射线。

计算相邻点距离

再介绍一下相邻采样点之间的距离 δi\delta_iδi​ 的计算方法。针对每个采样点C1,C2,...,Cn\mathbf{C}_1,\mathbf{C}_2,...,\mathbf{C}_nC1​,C2​,...,Cn​ ,事先知道每个采样点对于的距离相机o的距离z1,z2,..znz_1,z_2,..z_nz1​,z2​,..zn​。那么有两个 list:
Z1=[z1,z2,...,zn−1](4)Z_1 = [z_1,z_2,...,z_{n-1}] \tag{4}Z1​=[z1​,z2​,...,zn−1​](4)
Z2=[z2,z3,...,zn](5)Z_2 = [z_2,z_3,...,z_{n}] \tag{5}Z2​=[z2​,z3​,...,zn​](5)
等式(5)减去等式(4),有
[δ1,δ2,...,δn−1]:=[z2−z1,z3−z2,...,zn−zn−1]:=Z2−Z1[\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​,...,δn−1​]:=[z2​−z1​,z3​−z2​,...,zn​−zn−1​]:=Z2​−Z1​
特殊地,δn=+∞−zn\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},\sigmaC,σ 分别代表由三维坐标和方向向量唯一确定的相机射线确定的三维坐标处的颜色,和三维坐标处的 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⁡(20πx),cos⁡(20πx),sin⁡(21πx),cos⁡(21πx),…,sin⁡(2L−1πx),cos⁡(2L−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(2L−1πx),cos(2L−1πx)]T(7)
公式(7)中的 LLL 在下文中会解释其含义。
图 5 中下半部分使用了 Positional Encoding:x\mathbf{x}x先经由 γ(x)\gamma(x)γ(x)处理,然后将处理后的中间量输入进 FΘF_\ThetaFΘ​ 。

图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)中LLL的值决定了神经网络能学习到的最高频率的大小

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

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

Hierarchical Volume Sampling

在 NeRF中,一共有训练两个 MLP,分别是 modelcmodel_cmodelc​ (coarse)和 modelfmodel_fmodelf​(fine),它们的模型结构一样,只是参数不同。它们分别对应 Hierarchical Volume Sampling 两次抽样的模型。

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

关于第二次采样,具体地,首先对 weightiweight_iweighti​归一化,即
wi^=wi∑j=1NCwj(8)\hat{w_i}=\frac{w_i}{\sum_{j=1}^{N_C}w_j} \tag{8}wi​^​=∑j=1NC​​wj​wi​​(8)
其中, wiw_iwi​表示weightiweight_iweighti​,wi^\hat{w_i}wi​^​表示归一化后的 wiw_iwi​,NcN_cNc​是第一次采样的采样点数目。
现在注意到,∑i=1Ncwi^:=1\sum_{i=1}^{N_c} \hat{w_i}:=1i=1∑Nc​​wi​^​:=1
对 wi^\hat{w_i}wi​^​ 构造累计分布函数(CDF)。
举个例子,比如说:第一次采样有 6 个采样点,它们的 weight 分别是
30,5,70,10,120,3030, 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 第二次采样示意图

原始 NeRF(新视图重建的神经辐射场) 论文主要点细致介绍相关推荐

  1. [论文阅读-NeRF+SLAM]NeRF-SLAM:使用神经辐射场表征的实时稠密单目SLAM系统

    NeRF-SLAM NeRF-SLAM: Real-Time Dense Monocular SLAM with Neural Radiance Fields 第一个结合稠密单目SLAM和层次化体素神 ...

  2. 神经辐射场(NERF)模型:一个令人惊叹的三维场景重建方法

    在计算机图形学.计算机视觉和增强现实等领域,三维场景重建一直是一个热门话题.近年来,神经网络模型的出现已经彻底改变了这个领域,而其中最引人注目的就是 NERF(神经辐射场)模型.在这篇文章中,我们将深 ...

  3. MedNeRF:用于从单个X射线重建3D感知CT投影的医学神经辐射场

    摘要  计算机断层扫描(CT)是一种有效的医学成像方式,广泛应用于临床医学领域,用于各种病理的诊断.多探测器CT成像技术的进步实现了额外的功能,包括生成薄层多平面横截面身体成像和3D重建.然而,这涉及 ...

  4. NeRF神经辐射场ECCV2020

    目录 NeRF前置内容:渲染和观察方向 摘要 1.Introduction 2.Related Work 2.1.Neural 3D shape representations 2.2.View sy ...

  5. NERF++: ANALYZING AND IMPROVING NEURAL RADIANCE FIELDS分析和改进神经辐射场

    目录 NERF++: ANALYZING AND IMPROVING NEURAL RADIANCE FIELDS分析和改进神经辐射场 ABSTRACT 1 INTRODUCTION 2 PRELIM ...

  6. 神经辐射场 (NeRF) 概念

    神经辐射场 (NeRF) 概念 理论介绍   NeRF模型以其基本形式将三维场景表示为由神经网络近似的辐射场.辐射场描述了场景中每个点和每个观看方向的颜色和体积密度.这写为: F(x,θ,φ)→(c, ...

  7. 大汇总 | 9种基于神经辐射场NeRF的SLAM方法你都知道吗?

    作者 | 秦通  编辑 | 算法邦 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[SLAM]技术交流群 后台回复[SLAM综述]获取 ...

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

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

  9. 五问Nerf | 简单易懂的神经辐射场入门介绍

    作者 | lcltopismine3 编辑 | 汽车人 原文链接:zhuanlan.zhihu.com/p/597579341 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨 ...

最新文章

  1. nginx的平滑升级方法:
  2. OnFocuChangeListener焦点事件
  3. python scale()函数_【Python菜鸟进阶大神】Matplotlib数据可视化007:词云
  4. java图片上传(mvc)
  5. 移动端中使用调试控制台
  6. 硬盘快速格式化和格式化的区别
  7. 大脑应对危机的模式_危机的完整形式是什么?
  8. Intel Core Enhanced Core架构/微架构/流水线 (15) - 先进智能缓存
  9. onvif协议client与server对接
  10. 非递归求解N皇后问题(回溯法)
  11. Hbase Scan类 ResultScanner类
  12. latex 左对齐_LaTeX从入门到提高(3)
  13. 2007年8月28日 月全食 照片
  14. 在Windows编译libssh
  15. 基于OpenGL的贪吃蛇游戏设计与实现
  16. php 3.2 下载,PHPWind
  17. Gatekeeper:首个开源的DDoS防护系统
  18. latex如何使文字不空格_latex空格怎么打_latex空格
  19. 数据资产治理:元数据采集那点事
  20. 光交删zone注意事项

热门文章

  1. 工程师也该学习机器学习了!
  2. 蚂蚁集团副总裁,任复旦大学人工智能学院院长!
  3. html语言闪烁特效代码,css3 实现文字闪烁效果的三种方式示例代码
  4. uniapp px转rpx
  5. 2021年广东工业大学第11届腾讯杯新生程序设计竞赛(同步赛)F osu
  6. Intellij IDEA 初学入门图文教程(六) —— IDEA 在 Performing VCS Refresh 卡死
  7. Cisco路由器内部网关协议(IGP)实验:OSPF
  8. android计算器开发论文,基于Android计算器功能的实现毕业设计论文
  9. Deferred Shading介绍
  10. /var/tmp/rpm-tmp. 安装失败时找不到tmp文件的应对方法