系列文章目录
下面是关于 "NeRF的基本理论和原理" 的复习大纲:
@TOC
概述
1. Neural Radiance Field (NeRF) 神经辐射场:NeRF是一种基于神经网络的场景表示方法,通过学习场景中每个点的辐射和颜色信息,从而能够在任意视角下合成逼真的图像。它通过在三维空间中对点进行采样,并为每个点预测辐射和颜色,从而构建场景的隐式表示。
2. 隐式表示和视角合成:传统的三维场景表示方法通常使用显式几何模型,如网格或体素。而NeRF采用隐式表示,不需要显式地存储几何信息,而是通过神经网络预测场景属性。这使得NeRF能够实现从不同视角合成图像,即视角合成。
3. NeRF的应用领域:NeRF在多个领域具有广泛的应用,如机器人技术中的场景建模、城市建图用于创建逼真的城市模型、自主导航中的环境感知、虚拟现实和增强现实中的逼真场景渲染等。
4. 可微分体素渲染:NeRF的训练涉及到对场景中的体素进行渲染,以比较预测的辐射和颜色与真实图像之间的差异。这个渲染过程是可微分的,意味着可以使用反向传播进行优化,从而有效地训练NeRF模型。
基本理论和原理
1. Neural Radiance Fields (NeRF) 的背景和目的
NeRF 最初是由 Mildenhall 等人在 2020 年提出的,用于新颖的视图合成。由于能够高度真实地合成复杂场景的视图,NeRF 在该领域引起了广泛关注。
2. NeRF 的基本形式
基本上,NeRF 模型将三维场景表示为由神经网络近似的辐射场。这个辐射场为场景中的每个点和每个观察方向描述颜色和体积密度。
3. 数学公式的描述
这可以写为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> F ( x , θ , ϕ ) → ( c , σ ) F(\mathbf{x},\theta,\phi)\to(\mathbf{c},\sigma) </math>F(x,θ,ϕ)→(c,σ)
其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> x = ( x , y , z ) \mathbf{x}=(x,y,z) </math>x=(x,y,z) 是场景中的坐标, <math xmlns="http://www.w3.org/1998/Math/MathML"> ( θ , ϕ ) (\theta,\phi) </math>(θ,ϕ) 表示方位角和极角, <math xmlns="http://www.w3.org/1998/Math/MathML"> c = ( r , g , b ) \mathbf{c}=(r,g,b) </math>c=(r,g,b) 代表颜色, <math xmlns="http://www.w3.org/1998/Math/MathML"> σ \sigma </math>σ 代表体积密度。这个 5D 函数通常由一个或多个多层感知器 (MLP) 近似,有时被表示为 <math xmlns="http://www.w3.org/1998/Math/MathML"> F Θ F_{\Theta} </math>FΘ 。
4. 视图方向的描述
两个观察角 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( θ , ϕ ) (\theta,\phi) </math>(θ,ϕ) 通常由 <math xmlns="http://www.w3.org/1998/Math/MathML"> d = ( d x , d y , d z ) \mathbf{d}=(d_x,d_y,d_z) </math>d=(dx,dy,dz) 表示,这是一个 3D 笛卡尔单位向量。
5. 神经网络的表示
这种神经网络表示通过限制 <math xmlns="http://www.w3.org/1998/Math/MathML"> σ \sigma </math>σ 的预测,即场景的内容,与观察方向无关来实现多视图的一致性。然而,颜色 <math xmlns="http://www.w3.org/1998/Math/MathML"> c \mathbf{c} </math>c 被允许同时依赖于观察方向和场景坐标。
6. NeRF 模型的实现
在 NeRF 中通过设计 MLP 为两个阶段来实现基准模型的。第一阶段输入为 <math xmlns="http://www.w3.org/1998/Math/MathML"> x \mathbf{x} </math>x,并输出 <math xmlns="http://www.w3.org/1998/Math/MathML"> σ \sigma </math>σ 和一个高维特征向量。在第二阶段,特征向量与观察方向 <math xmlns="http://www.w3.org/1998/Math/MathML"> d \mathbf{d} </math>d 连接,并传递给另一个 MLP,该 MLP 输出 <math xmlns="http://www.w3.org/1998/Math/MathML"> c \mathbf{c} </math>c。值得注意的是,Mildenhall 等人认为 <math xmlns="http://www.w3.org/1998/Math/MathML"> σ \sigma </math>σ MLP 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> c \mathbf{c} </math>c MLP 是同一个神经网络的两个分支,但后续的大多数研究者认为它们是两个独立的 MLP 网络。
7. 新视图合成的过程
使用经过训练的 NeRF 模型进行新的视图合成大致如下:
- 对于合成图像中的每个像素:通过场景发送相机光线,并生成一组采样点。这在图 1 的 (a) 中展示。
- 对于每个采样点:使用观察方向和采样位置使用 NeRF MLP 计算局部颜色和密度。这在图 1 的 (b) 中展示。
- 使用体积渲染:使用这些颜色和密度生成图像。这在图 1 的 (c) 中展示。
8. 体积渲染的数学描述
考虑到要渲染的场景的体积密度和颜色函数,使用体积渲染来获得任何相机光线的颜色 <math xmlns="http://www.w3.org/1998/Math/MathML"> C ( r ) C(\mathbf{r}) </math>C(r),其中相机光线 <math xmlns="http://www.w3.org/1998/Math/MathML"> r ( t ) = o + t d \mathbf{r}(t)=\mathbf{o}+t\mathbf{d} </math>r(t)=o+td 有相机位置 <math xmlns="http://www.w3.org/1998/Math/MathML"> o \mathbf{o} </math>o 和观察方向 <math xmlns="http://www.w3.org/1998/Math/MathML"> d \mathbf{d} </math>d。公式描述为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> C ( r ) = ∫ t 1 t 2 T ( t ) ⋅ σ ( r ( t ) ) ⋅ c ( r ( t ) , d ) ⋅ d t , C(\mathbf{r})=\int_{t_1}^{t_2}T(t)\cdot\sigma(\mathbf{r}(t))\cdot\mathbf{c}(\mathbf{r}(t),\mathbf{d})\cdot dt, </math>C(r)=∫t1t2T(t)⋅σ(r(t))⋅c(r(t),d)⋅dt,
这里, <math xmlns="http://www.w3.org/1998/Math/MathML"> σ ( r ( t ) ) \sigma(\mathbf{r}(t)) </math>σ(r(t)) 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> c ( r ( t ) , d ) \mathbf{c}(\mathbf{r}(t),\mathbf{d}) </math>c(r(t),d) 分别表示沿着观察方向 <math xmlns="http://www.w3.org/1998/Math/MathML"> d \mathbf{d} </math>d 的相机光线上点 <math xmlns="http://www.w3.org/1998/Math/MathML"> r ( t ) \mathbf{r}(t) </math>r(t) 的体积密度和颜色,而 <math xmlns="http://www.w3.org/1998/Math/MathML"> d t dt </math>dt 表示光线在每个积分步骤上行进的微小距离。
<math xmlns="http://www.w3.org/1998/Math/MathML"> T ( t ) T(t) </math>T(t) 是累积的透射率,表示光线从 <math xmlns="http://www.w3.org/1998/Math/MathML"> t 1 t_1 </math>t1 到 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t 行进而不被拦截的概率,由以下公式给出:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> T ( t ) = exp ( − ∫ t 1 t σ ( r ( u ) ) ⋅ d u ) . T(t)=\exp(-\int_{t_1}^t\sigma(\mathbf{r}(u))\cdot du). </math>T(t)=exp(−∫t1tσ(r(u))⋅du).
9. 新视图的渲染过程
新的视图是通过追踪相机光线 <math xmlns="http://www.w3.org/1998/Math/MathML"> C ( r ) C(r) </math>C(r) 经过要合成的图像的每个像素来渲染的。这个积分可以通过数值方法计算。
数值采样方法:原始实现和大多数后续方法使用了一种非确定性的分层采样方法,其中光线被分成 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 个等间隔的区间,并从每个区间均匀地取一个样本。然后,上述方程可以近似为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> C ^ ( r ) = ∑ i = 1 N α i T i c i \hat{C}(\mathbf{r})=\sum_{i=1}^N\alpha_iT_i\mathbf{c}_i </math>C^(r)=i=1∑NαiTici
其中,
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> T i = exp ( − ∑ j = 1 i − 1 σ j δ j ) T_i=\exp(-\sum_{j=1}^{i-1}\sigma_j\delta_j) </math>Ti=exp(−j=1∑i−1σjδj)
<math xmlns="http://www.w3.org/1998/Math/MathML"> δ i \delta_i </math>δi 是从样本 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 到样本 <math xmlns="http://www.w3.org/1998/Math/MathML"> i + 1 i + 1 </math>i+1 的距离。 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( σ i , c i ) (\sigma_i, c_i) </math>(σi,ci) 是沿着给定光线的样本点 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 计算的密度和颜色,由 NeRF MLP(s) 计算得出。 <math xmlns="http://www.w3.org/1998/Math/MathML"> α i \alpha_i </math>αi 在样本点 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 处的透明度/不透明度,由以下公式给出:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> α i = 1 − exp ( σ i δ i ) \alpha_i=1-\exp(\sigma_i\delta_i) </math>αi=1−exp(σiδi)
这种方法的关键在于正确地估计每个像素的颜色,同时考虑到场景中的物体和其他因素。
10. 计算光线的期望深度
首先介绍通过积累的透射率来完成计算光线的期望深度。公式为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> d ( r ) = ∫ t 1 t 2 T ( t ) ⋅ σ ( r ( t ) ) ⋅ t ⋅ d t . d(\mathbf{r})=\int_{t_1}^{t_2}T(t)\cdot\sigma(\mathbf{r}(t))\cdot t\cdot dt. </math>d(r)=∫t1t2T(t)⋅σ(r(t))⋅t⋅dt.
公式被近似为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> D ^ ( r ) = ∑ i = 1 N α i t i T i \hat{D}(\mathbf{r})=\sum_{i=1}^N\alpha_it_iT_i </math>D^(r)=i=1∑NαitiTi
这个公式基于前面的公式近似了深度的计算。
某些深度正规化方法使用期望深度来限制场景表面上的密度为delta-like函数,或者强制深度平滑性。
对于每个像素,使用平方误差光度损失来优化 MLP 参数。在整个图像上,该损失由以下公式给出:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> L = ∑ r ∈ R ∣ ∣ C ^ ( r ) − C g t ( r ) ∣ ∣ 2 2 L=\sum_{r\in R}||\hat{C}(\mathbf{r})-C_{gt}(\mathbf{r})||_2^2 </math>L=r∈R∑∣∣C^(r)−Cgt(r)∣∣22
这里的 <math xmlns="http://www.w3.org/1998/Math/MathML"> C g t ( r ) C_{gt}(\mathbf{r}) </math>Cgt(r) 是与 <math xmlns="http://www.w3.org/1998/Math/MathML"> r r </math>r 相关的训练图像像素的真实颜色,而 <math xmlns="http://www.w3.org/1998/Math/MathML"> R R </math>R 是与待合成图像相关的光线的批次。
11. NeRF 模型的位置编码
NeRF 模型经常使用位置编码,这在渲染视图中改进了细节重建。在原始实现中,对场景坐标 <math xmlns="http://www.w3.org/1998/Math/MathML"> x \text{x} </math>x 和观察方向单位向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> d \mathbf{d} </math>d 的每个组件应用了以下位置编码:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> γ ( v ) = ( s i n ( 2 0 π v ) , c o s ( 2 0 π v ) , s i n ( 2 1 π v ) , c o s ( 2 1 π v ) , . . . , s i n ( 2 N − 1 π v ) , c o s ( 2 N − 1 π v ) ) , \gamma(v)=(sin(2^0\pi v),cos(2^0\pi v),sin(2^1\pi v),cos(2^1\pi v),...,sin(2^{N-1}\pi v),cos(2^{N-1}\pi v)), </math>γ(v)=(sin(20πv),cos(20πv),sin(21πv),cos(21πv),...,sin(2N−1πv),cos(2N−1πv)),
其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 是用户确定的编码维度参数,在原始论文中, <math xmlns="http://www.w3.org/1998/Math/MathML"> x \text{x} </math>x 设置为 <math xmlns="http://www.w3.org/1998/Math/MathML"> N = 10 N=10 </math>N=10 , <math xmlns="http://www.w3.org/1998/Math/MathML"> d \mathbf{d} </math>d 设置为 <math xmlns="http://www.w3.org/1998/Math/MathML"> N = 4 N=4 </math>N=4 。但是,最近的研究已经通过位置编码的替代形式进行了实验并获得了很好的结果,包括可训练的参数化、积分和层次化变体。