论文:https://arxiv.org/abs/2003.08934
TensorFlow代码:https://github.com/bmild/nerf
PyToch代码:https://github.com/yenchenlin/nerf-pytorch

一、文章概述

1.问题导向

从新视点生成照片级真实感输出需要正确处理复杂的几何体和材质反射比属性。目前还没有一种方法可以生成照片级的场景渲染,传统的Sfm重建质量不够高且仅仅将照片颜色投影到模型。

2.目标

利用稀疏输入图片实现从任何视点高质量渲染场景。NeRF是一种使用神经网络来隐式表达3D场景的技术。
3D场景表征可分别为:
显式 (explicit representaion):Mesh、Point Cloud、Voxel、Volume
隐式(implicit representation):使用函数来对场景集合进行描述。

3.摘要

我们提出了一种方法,通过使用稀疏的输入视图集优化底层连续体积场景函数,实现合成复杂场景的新颖视图的最先进的结果。我们的算法使用全连接(非卷积)深度网络表示场景,其输入是单个连续 5D 坐标(空间位置 (x, y, z) 和观察方向 (θ, φ)),其输出是体积密度和该空间位置处与视图相关的发射辐射率。我们通过查询沿相机光线的5D坐标来合成视图,并使用经典的体积渲染技术将输出颜色和密度投影到图像中。由于体积渲染本质上是可微分的,因此优化表示所需的唯一输入是一组具有已知相机姿势的图像。我们描述了如何有效地优化神经辐射场,以渲染具有复杂几何和外观的场景的逼真新颖视图,并展示了优于神经渲染和视图合成先前工作的结果。

4.贡献

  1. NeRF首次利用5D隐式表示来最小化渲染图像和真实图像的误差
  2. 使用连续的5D函数(神经辐射场)表达静态场景
  3. 基于经典的volume rendering技术提出了一种可微渲染的过程
  4. 提出了位置编码(positional encoding)将5D输入映射到高维空间

    5.不足

  • 计算速度慢
  • 只针对静态场景
  • 泛化性差
  • 需要大量视角

    二、方法解析

    2.1 系统pipeline


    输入:(x,y,z,θ,ϕ) 3D空间位置x,y,z与2D观测方向θ,ϕ
    网络:MLP
    损失函数:渲染函数是可微的,最小化合成和真实观察图像之间的残差
    输出:(R,G,B,σ) 预测颜色值RGB与体密度(透明度)σ
    系统的详细流程如下

    2.2 使用5D辐射场体渲染

    朗伯定律是光学中的一个基本原理,它描述了当光线照射在理想的散射表面或者完全漫反射表面上时,出射光强度只与入射光强度和入射角有关,与观察角无关。然而,在现实生活中,许多物体并不符合这一规律。例如,镜子、金属等具有镜面反射特性的物体就会产生非朗伯效应。这也是为什么作者要构建5D的辐射场。使用经典的立体渲染方法来渲染一个光线 ray 穿过场景得到的颜色,2D视图上每一个像素颜色值都是3D场景上在该观测方向的射线上一组采样点的加权叠加。单一新视角的视图中每一个像素点的RGB值需要这一条射线上所有的采样点的(R,G,B,σ)来决定,体渲染的数学表达如下C(r)为预期颜色。

    NeRF是用MLP来隐式表达一个场景,它是点对点的表示方式。我们如果想要获得一个新视角的试图,我们则需要获得这个视角下,观测射线上所有采样点的(R,G,B,σ)。假设视图的分辨率是240x240,设每条射线上采样16个点,那NeRF中的MLP需要进行240x240x16次推理,得到的结果可以用来进行体渲染。

    2.3 层次化体采样

    上述的立体渲染采样方式是不高效的,空白区域和遮挡区域并没对渲染图像取到作用,因此作者提出了层次化体采样,层次化体采样包含粗采样和精采样,
  • 粗采样:在光线上均匀采样,根据体渲染公式获得每个采样点的权重(由体密度和位置远近共同决定);
  • 精采样:根据粗采样获得的权重,做一个光线上的归一化,将权重之和置为1,得到概率密度函数(PDF)。根据PDF来精采样,即让更重要的线段上有更多的采样点。最后,粗采样和精采样的采样点一起进入体渲染,共同作用得到像素的颜色值。
    例如,通常距离光心越近,影响成像的权重越高,则可以得到如下采样

    2.4 位置编码

    基础的优化方式来优化复杂场景的神经辐射场无法收敛得到较高分辨率的表达特征。神经网络更偏向于学习低频的函数表达,对高频变化(如高频的颜色和几何形状的变化)的表现不太好,使用高频函数将输入提前编码到更高维的空间,然后再送入神经网络学习的话,能够让网络更好的学习这些高频变化。
    位置编码的核心思想是尽量使相邻位置的输出结果不相似,这样渲染出的视角分辨率更高,如下图所示,增添了位置编码使得渲染效果更加清晰锐利。没有位置编码导致纹理相近区域的细节会丢失。

    作者将神经辐射场函数拆分F_Θ=F_Θ^’∘γ,对频率位置编码其中γ(p)=((sin⁡(2^0 πp),cos⁡(2^0 πp),⋯,sin⁡(2^(L-1) πp),cos⁡(2^(L-1) πp)))
    所谓编码就是让原本相近的数据变得明显不同例如,对于频率位置编码:假设一个位置的x1=30,它相邻的位置是x2=31,经过x= sin(x*512)编码以后,x1编码后的位置为-0.6842,而x2编码后的位置为0.6240。差距一目了然。这里的 512 则表示频率。

    参考文献

  1. https://blog.csdn.net/qq_45752541/article/details/130072505?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171507268416800197037884%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171507268416800197037884&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-130072505-null-null.142^v100^pc_search_result_base4&utm_term=nerf&spm=1018.2226.3001.4187

  2. https://blog.csdn.net/leviopku/article/details/129933938?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171507268416800197037884%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171507268416800197037884&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-129933938-null-null.142^v100^pc_search_result_base4&utm_term=nerf&spm=1018.2226.3001.4187

  3. https://blog.csdn.net/jiaoyangwm/article/details/133804918?ops_request_misc=&request_id=&biz_id=102&utm_term=nerf&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-9-133804918.nonecase&spm=1018.2226.3001.4187