0


当下呼声最高的NeRF究竟是什么?

目录

(一)前言

  作为今年计算机视觉领域最火的AI技术,NeRF可谓是应用广泛,前景一片大好。

  自2020年在计算机视觉领域,神经辐射场(Neural Radiance Field, NeRF)作为一种具有隐式场景表示的新型视场合成技术一经被提出便引起了广泛的关注。一石激起千层浪,在此之后的两三年的各大顶会上相关文章层出不穷。作为一种新颖的视图合成和三维重建方法,NeRF模型在机器人、城市地图、自主导航、虚拟现实/增强现实等领域都有广泛的应用。
在这里插入图片描述
  NeRF通过隐式表达的方式将新视角合成任务推向了一个新的高度。那么,什么是“新视角合成方法”呢?什么又是“隐式表达”呢?

  接下来让我们一起了解一下NeRF吧~

  NeRF——其核心点在于非显式地将一个复杂的静态场景用一个神经网络来建模。在网络训练完成后,可以从任意角度渲染出清晰的场景图片。为了训练网络,针对一个静态场景,需要提供大量相机参数已知的图片。基于这些图片训练好的神经网络,即可以从任意角度渲染出图片结果了。理解NeRF主要是需要理解三个方面:

  • 如何用NeRF来表示3D场景?
  • 如何基于NeRF渲染出2D图像?
  • 如何训练NeRF?

接下来就从这三个方面来了解NeRF是如何工作的。

(二)NeRF工作的Pipeline

  简单的来说,NeRF工作的过程可以分成三部分:三维重建渲染训练

1、Neural Radiance Field Scene Representation

  三维重建部分本质上是一个2D到3D的建模过程,利用三维位置(x,y,z)和二维方位视角(θ,φ) 作为输入,输出是颜色c=(r,g,b)和体素密度(σ),主要是通过利用多层感知机(MLP)网络建模来近似地表示输入与输出的映射关系,形成了3D场景的“隐式表示”。
在这里插入图片描述

2、Volume Rendering with Radiance Fields

  渲染部分本质上是一个3D到2D的建模过程,渲染部分利用重建部分得到的3D点的颜色及体素密度沿着光线进行整合得到最终的2D图像像素值。该部分使用经典体渲染(Volume Rendering) 的原理渲染通过场景的任何光线的颜色,即下面这条式子:

     C
    
    
     (
    
    
     r
    
    
     )
    
    
     =
    
    
     
      ∫
     
     
      
       t
      
      
       n
      
     
     
      
       t
      
      
       f
      
     
    
    
     [
    
    
     T
    
    
     (
    
    
     t
    
    
     )
    
    
     σ
    
    
     (
    
    
     r
    
    
     (
    
    
     t
    
    
     )
    
    
     )
    
    
     c
    
    
     (
    
    
     r
    
    
     (
    
    
     t
    
    
     )
    
    
     ,
    
    
     d
    
    
     )
    
    
     d
    
    
     t
    
    
     ]
    
    
     ,其中
    
    
     T
    
    
     (
    
    
     t
    
    
     )
    
    
     =
    
    
     
      ∫
     
     
      
       t
      
      
       n
      
     
     
      t
     
    
    
     [
    
    
     σ
    
    
     (
    
    
     r
    
    
     (
    
    
     s
    
    
     )
    
    
     )
    
    
     d
    
    
     s
    
    
     ]
    
   
   
    C(r)=∫_ {t_n}^{t_f}[T(t)σ(r(t))c(r(t),d)dt],其中 T(t)=∫_{t_n}^t [σ(r(s))ds]
   
  
 C(r)=∫tn​tf​​[T(t)σ(r(t))c(r(t),d)dt],其中T(t)=∫tn​t​[σ(r(s))ds]

  其中函数

    T
   
   
    (
   
   
    t
   
   
    )
   
  
  
   T(t)
  
 
T(t)表示射线从

 
  
   
    
     t
    
    
     n
    
   
  
  
   t_n
  
 
tn​到

 
  
   
    t
   
  
  
   t
  
 
t沿射线累积透射率,即射线从

 
  
   
    
     t
    
    
     n
    
   
  
  
   t_n
  
 
tn​到

 
  
   
    t
   
  
  
   t
  
 
t不碰到任何粒子的概率。

  其实,所谓渲染,就是利用已经建立好的三维模型,重构出物体的表面点,再根据相机投影关系,生成任意视角的2D图像,也就是模拟人眼对物体的观察过程。
  比如,你看了一眼三维物体,就知道了它的颜色和质感。也就是:三维坐标 + 视角 = RGB + 透明度(纹理)。该部分即下图红框部分:
在这里插入图片描述

3、Training

  在训练部分,主要是利用渲染部分得到的2D图像,通过与Ground Truth做

     L
    
    
     2
    
   
  
  
   L_2
  
 
L2​损失函数(

 
  
   
    
     L
    
    
     2
    
   
  
  
   L_2
  
 
L2​ Loss)进行网络优化。

3.1 训练高质量NeRF的重要技巧

  • Positional encoding(位置信息编码)   positional encoding 的方式主要是将位置信息映射到高频则能有效提升清晰度效果。因为NeRF函数的输入为位置和角度信息,尽管神经网络是通用的函数近似器,但是让①中的MLP网络(F:(x,d) -> (c,σ))直接操作 (x,y,z,θ,φ)输入会导致渲染在表示颜色和几何形状方面的高频变化方面表现不佳,得到的结果是相对模糊的。   因此在将(x,y,z,θ,φ) 输入传递给网络之前,需要使用高频函数将输入映射到更高维度的空间,可以更好地拟合包含高频变化的数据,比如正余弦周期函数的形式: γ ( p ) = ( s i n ⁡ ( 2 0 π p ) , c o s ⁡ ( 2 0 π p ) , … , s i n ⁡ ( 2 ( L − 1 ) π p ) , c o s ⁡ ( 2 ( L − 1 ) π p ) ) γ(p)=(sin⁡(2^0 πp),cos⁡(2^0 πp),…,sin⁡(2^{(L-1)} πp),cos⁡(2^{(L-1)} πp)) γ(p)=(sin⁡(20πp),cos⁡(20πp),…,sin⁡(2(L−1)πp),cos⁡(2(L−1)πp))   也就是说采用position encoding 能够使得网络更容易的理解并建模位置信息。在这里插入图片描述
  • Hierarchical volume sampling (多层级体积采样)   由于在Volume Rendering过程中计算量很大,是在每条相机光线上的N个查询点密集地评估神经辐射场网络,这是低效的(仍然重复采样与渲染图像无关的自由空间和遮挡区域),对最终的颜色没有啥贡献。于是提出一种分层体积采样的做法,同时优化一个“粗糙”的网络和一个“精细”的网络。   做法是:首先使用分层抽样对第一组N_c位置进行采样,并在这些位置评估“粗糙”网络。给出这个“粗糙”网络的输出,然后我们对每条射线上的点进行更明智的采样,即利用反变换采样从这个分布中采样第二组 N f N_f Nf​位置,然后将 N c + N f N_c+N_f Nc​+Nf​采样得到的数据输入“精细”网络,并计算最终渲染的光线颜色 C ( r ) C(r) C(r)。   简单来说,就是先通过第一次采样把大概的分布采出来,然后第二次采样利用反变换采样(用的是概率论中的拒绝采样),对第一次采到的大概的分布再采一次,达到了重要性采样的目的。

3.2 关于Loss

  Loss是 “粗糙”网络和“精细”网络渲染结果和真实像素颜色之间的总平方误差。

     L
    
    
     o
    
    
     s
    
    
     s
    
    
     =
    
    
     
      ∑
     
     
      
       r
      
      
       ∈
      
      
       R
      
     
    
    
     [
    
    
     ∣
    
    
     ∣
    
    
     
      
       C
      
      
       ^
      
     
     
      c
     
    
    
     (
    
    
     r
    
    
     )
    
    
     −
    
    
     C
    
    
     (
    
    
     r
    
    
     )
    
    
     ∣
    
    
     
      ∣
     
     
      2
     
     
      2
     
    
    
     +
    
    
     ∣
    
    
     ∣
    
    
     
      
       C
      
      
       ^
      
     
     
      f
     
    
    
     (
    
    
     r
    
    
     )
    
    
     −
    
    
     C
    
    
     (
    
    
     r
    
    
     )
    
    
     ∣
    
    
     
      ∣
     
     
      2
     
     
      2
     
    
    
     ]
    
   
   
    Loss=\sum_{r∈R} [||\hat{C}_c (r)-C(r)||_2^2+||\hat{C}_f (r)-C(r)||_2^2]
   
  
 Loss=r∈R∑​[∣∣C^c​(r)−C(r)∣∣22​+∣∣C^f​(r)−C(r)∣∣22​]

  其中

      C
     
     
      ^
     
    
    
     c
    
   
   
    (
   
   
    r
   
   
    )
   
  
  
   \hat{C}_c (r)
  
 
C^c​(r)为“粗糙”网络输出,

 
  
   
    
     
      C
     
     
      ^
     
    
    
     f
    
   
   
    (
   
   
    r
   
   
    )
   
  
  
   \hat{C}_f (r)
  
 
C^f​(r)为“精细”网络的输出。使用Adam优化器,学习速率从5e-4,并在优化过程中指数衰减到5e-5。优化一个场景通常需要10 - 30万次迭代,集中在一个NVIDIA V100 GPU上(大约1-2天) 。

(三)NeRF局限性与思考

1、NeRF效果为什么那么好,它解决了现有三维表达的哪些问题?

  视角合成方法指的是对于某一场景给定某些视角下的观测(图片),通过算法合成新视角下的观测(图片)的方法。通常使用一个中间3D场景表征作为中介来生成高质量的虚拟视角,如何对这个中间3D场景进行表征,分为了“显示表示”和“隐式表示”,然后再对这个中间3D场景进行渲染,生成照片级的视角。

  “显示表示”3D场景包括Point Cloud,Voxel,Mesh,Volume等,它能够对场景进行显式建模,但是因为其是离散表示的,导致了不够精细化会造成重叠等伪影,更重要的是它存储的三维场景表达信息数据量极大,对内存的消耗限制了高分辨率场景的应用。

  “隐式表示”3D场景通常用一个函数来描述场景几何,可以理解为将复杂的三维场景表达信息存储在函数的参数中。因为往往是学习一种3D场景的描述函数,因此在表达大分辨率场景的时候它的参数量相对于“显示表示”是较少的,并且“隐式表示”函数是种连续化的表达,对于场景的表达会更为精细。

  下图是3D数据的不同表示类型:

(1) 点云(Point clouds)
(2) 体素网格(Voxel grids)
(3) 多边形网格(Polygon meshes)
(4) 多视图表示(Multi-view representations)
其中:
• 点云是三维空间(xyz坐标) 点的集合。
• 体素是3D空间的像素。量化的,大小固定的点云。每个单元都是固定大小和离散坐标。
• mesh是面片的集合。
• 多视图表示是从不同模拟视点渲染的2D图像集合。

  NeRF做到了利用 “隐式表示” 实现了照片级的视角合成效果,它选择了Volume作为中间3D场景表征,然后再通过Volume rendering实现了特定视角照片合成效果。可以说NeRF实现了从离散的照片集中学习出了一种隐式的Volume表达,然后在某个特定视角,利用该隐式Volume表达和体渲染得到该视角下的照片。

  显式是离散的表达,不能精细化,导致重叠等伪影,耗费内存,限制了在高分辨率场景的应用。隐式是连续的表达,能够适用于大分辨率的场景,而且不需要3D信号进行监督。 在NeRF之前,它的缺点是无法生成照片集的虚拟视角。

2、NeRF为什么那么慢?如何加速?

  NeRF速度慢的原因有几个方面,第一,有效像素少,生成得到的2D图像有效像素不到1/3,能够快速得到有效像素可以提升推理速度。第二,有效体素少,采样192个点,其中只有表面附近的点密度σ比较大,其他的点没必要进行推理。第三,网络推理速度慢,需要12层全连接网络推理,才能得到1个体素的颜色和密度,能优化这个性能也可以大大加快推理速度。

3、为什么没看到其大规模商业应用?什么限制了它的普及?

  NeRF目前还没有比较成功的商业化的应用,论文中的出色效果许多无法在现实中落地。技术如果不能落地,就会变成空中楼阁。NeRF还存在训练速度慢、渲染速度慢、只能用于静态场景、泛化性能差、需要大量视角、难以与传统渲染管线融合等问题,隐式神经表示是未来的视觉领域的新钥匙,它的意义还需要时间和实验来证明。但是它所呈现了那一个个惊艳的demo,确实是我们对视觉和图形学最理想的追求。

4、考虑将其用于business(元宇宙核心技术)

  因为我们公司是一个跨国公司,很多人不在同一个工作地点,而每天都需要参加teams meeting来讨论工作内容和进度。在meeting过程中,无法做到像在同一个会议室中面对面的沟通,除了声音,表情和动作也会传递很多信息,这将导致不必要的沟通障碍,信息不匹配等问题。

(四)最后

  NeRF的效果非常酷炫,同时也提供了一种3D场景建模的新形式。NeRF本身当然存在很多的问题,最重要的是其渲染速度很慢,渲染一帧约要1分钟左右。但后续的新方法提出了很多优化的方式,比如Point-NeRF大大优化了速度问题,也使得NeRF有了在实际场景应用的可能。

  除了速度,还有许多其他值得关注的点,总的来说,NeRF简洁的表示方式和优秀的效果带来了丰富的可玩性和拓展性,是非常棒的工作。


本文转载自: https://blog.csdn.net/qq_41524053/article/details/127628353
版权归原作者 一圈zyy 所有, 如有侵权,请联系我们删除。

“当下呼声最高的NeRF究竟是什么?”的评论:

还没有评论