Nerf方法就是经典的隐函数渲染方案。
Nerf的开山之作"Nerf: Representing scenes as neural radiance fields for view synthesis"发表于2020年的eccv上。
Nerf的主要目的:利用已有的大量2D数据作为监督,用已有的2D数据去生成该物体或者场景,新视角下的重建结果。
Nerf 的主要过程就是利用5D向量值函数去拟合整个三维场景的表示。利用
去表示整个场景。
输入空间中一个点的3D坐标x,以及观察视角d。生成对应的颜色值C,以及不透明度σ,这也是与现实世界相对应的。
在Nerf的渲染和训练过程,利用到了volume rendering的思想(如下图所示)。
如上图中的蓝色点所示,它是从空间中某一像素所发出的一条射线上的点,那么我们根据这个点对应的3D坐标位置与视角d,通过上面的Nerf5D向量值函数,计算出该点对应的颜色值与不透明度。基于这个思想,我们将整条射线上所有点的颜色值与体积密度计算出来。再将整条射线上点的颜色进行积分,那得到的积分值,就是对应像素点的颜色值。这实际上也是volume rendering的思想。
在理论上,这个积分应该是连续的,不过在实际的渲染或者工程当中,想实现连续的积分不太现实。在这里我们的解决方案就是利用离散积分的方式,对射线上的点进行均匀采样,利用采样点的离散的积分和,来模拟上面的过程。
那在实际的train或者渲染过程,也是上面刚才说到的,利用离散积分的方式,对空间中的点进行采样,然后渲染出对应视角的颜色值,将其与GT做比较,利用误差去优化网络。
那其实可以法线,在这个过程中会有一个如何对空间中点采样的策略问题。因为如果采样点过多,那计算效率就会降低,那如果采样点过少,又无法很好地近似整个场景的三维表示。怎么设置采样策略就比较重要了。
在这里我们有一个非常朴素的想法,对于我们的重建结果或者渲染结果而言,并不是空间中所有的点都重要,对于空间中那些空旷的点,它对于最终的重建结构影响不是很大。真正起作用的点是物体所在的区域,它们才对真正的重建结果起作用。那么我们在采样的过程中,对于物体在的区域多采样,对于空旷的区域少采样,用这种分层采样的方式去优化采样的策略。
NSVF
对于如何优化Nerf的时间上的效率问题,如何做空间中点的采样,2020年的另一篇工作NSVF也提出了一种解决思路。
在NSVF中,作者将整个三维空间用体素分割出来,在采样的过程中只对空间中有意义的点进行采样,对于没有意义的空的区域,那完全抛弃掉。然后再逐级的对体素进行精细化操作,在这个过程每个体素块的采样率不变,但是随着体素块变小,会对场景中细节区域的学习会更多。
总结:用体素表达三维空间,自剪枝的part,逐级精细化。
像刚才我们讲到,为了优化Nerf的训练速度、渲染速度等等。研究人员尝试对如何采样这部分进行设计和优化,Nerf最开始的采样方案是分层采样的策略,后来的NSVF提出的,基于体素的多分辨率采样+自剪枝的策略,也多速度的问题做了一定程度的优化,但是这个优化是针对特殊task的,所以不具备通用性。
那么为了提出一种通用的加速方案,能够对不同的任务进行加速,这也是这篇论文的目的。
instant-NGP
这篇论文的主要核心点是,提出了一种多分辨率哈希编码的通用方案,对不同的任务进行加速处理。
对于传统的深度学习模型,我们可以用m(x,Φ)去表示它,这里的Φ就是我们希望网络学习到的权重。但是在instant-ngp中,作者还通过这个函数y=enc(x,)对输入x再进行编码操作,获得y,将这个y输入到我们的网络中去加速我们特定任务的速度和拟合质量。我认为对于x再编码的操作,就是instant-ngp这么快的核心。在这里的话,我认为这个过程有些像,复合函数的味道。
总结:instant-ngp不但有可训练的网络权重Φ,也有编码参数。
同时在这个过程中,作者将这些参数分为L层,每层包含了T个维度为F的特征向量。L对应的是特定分辨率体素的编码层,也做为一个超参数,在这里被设置为16。也就是体素分辨率的变化分为16级。其中每一层的变化由Nl去调整。
在这里我的理解是,分级操作实际是,假设有一个三维坐标点,它是float型,那通过分级操作,对这个float型坐标点进行向上取整或向下取整,使其变为一个整数型值。
后面的话,它通过一个空间哈希函数,对特征向量进行调整,分配到不同的哈希表中去。
在这里有一个问题,其实可以发现,instant-ngp