参考文章:https://arxiv.org/abs/2210.00379
神经辐射场(NeRF)模型是一种新视图合成方法,它使用体积网格渲染,通过MLP进行隐式神经场景表达,以学习3D场景的几何和照明。
应用:照片编辑、3D表明提取、人体建模、3D表达和视图合成等。
特点:模型自监督。对于一个场景,只需要多视图图像及其姿态,而无需3D或深度监督。
NeRF模型将3D场景表达为用神经网络表示的辐射场。辐射场描述了各点在各视角下的颜色和密度。即 F ( x , θ , ϕ ) → ( c , σ ) F(x,\theta,\phi)\rightarrow(c,\sigma) F(x,θ,ϕ)→(c,σ)其中 x x x为点的3D坐标, ( θ , ϕ ) (\theta,\phi) (θ,ϕ)为视线的水平角与俯仰角, c c c表示颜色, σ \sigma σ表示体积网格密度。该函数使用MLP(记为 F Θ F_\Theta FΘ)进行近似。 ( θ , ϕ ) (\theta,\phi) (θ,ϕ)也可表达为3维的单位方向向量 d d d。
该表达需要满足多视图一致性,即 σ \sigma σ(场景的内容)与视角无关,而 c c c与坐标和视角均相关。通常来说,会设计两个MLP,第一个MLP输入 x x x,输出 σ \sigma σ与高维特征向量 h h h: σ , h = σ-MLP ( x ) \sigma,h=\text{σ-MLP}(x) σ,h=σ-MLP(x)高维特征向量 h h h与视线方向 d d d拼接后输入第二个MLP得到 c c c: c = c-MLP ( [ h ; d ] ) c=\text{c-MLP}([h;d]) c=c-MLP([h;d])由于密度和颜色都完全被MLP表达,因此这种方法被称为隐式场景表达。
设相机射线为 r ( t ) = o + t d r(t)=o+td r(t)=o+td,其中 o o o为相机位置, d d d为射线方向。则可按下式得到色彩 C ( r ) C(r) C(r): C ( r ) = ∫ t 1 t 2 T ( t ) ⋅ σ ( r ( t ) ) ⋅ c ( r ( t ) , d ) ⋅ d t C(r)=\int_{t_1}^{t_2}T(t)\cdot\sigma(r(t))\cdot c(r(t),d)\cdot dt C(r)=∫t1t2T(t)⋅σ(r(t))⋅c(r(t),d)⋅dt其中 σ ( r ( t ) ) \sigma(r(t)) σ(r(t))和 c ( r ( t ) , d ) c(r(t),d) c(r(t),d)为射线 r ( t ) r(t) r(t)处的体积网格密度和颜色。
T ( t ) T(t) T(t)为累积透明度,表示射线从 t 1 t_1 t1到 t t t不被拦截的概率: T ( t ) = exp ( − ∫ t 1 t σ ( r ( u ) ) ⋅ d u ) T(t)=\exp\left(-\int_{t_1}^t\sigma(r(u))\cdot du\right) T(t)=exp(−∫t1tσ(r(u))⋅du) 通过追踪待合成图像的像素对应的相机射线,可计算积分。但是通常会通过分层抽样法来计算其近似值。具体来说,射线会被分为等长的 N N N段,然后在各段内均匀抽样一个点,并用求和近似上面的积分: C ^ ( r ) = ∑ i = 1 N α i T i c i , 其中 T i = exp ( − ∑ j = 1 i − 1 σ j δ j ) \hat{C}(r)=\sum_{i=1}^N\alpha_iT_ic_i,其中T_i=\exp\left(-\sum_{j=1}^{i-1}\sigma_j\delta_j\right) C^(r)=i=1∑NαiTici,其中Ti=exp(−j=1∑i−1σjδj)其中 δ i \delta_i δi为采样点 i i i与 i + 1 i+1 i+1的距离; ( σ i , c i ) (\sigma_i,c_i) (σi,ci)为射线上采样点 i i i的密度和颜色(使用NeRF MLP计算)。 α i \alpha_i αi为采样点 i i i处alpha合成的透明度/不透明度: α i = 1 − exp ( σ i δ i ) \alpha_i=1-\exp(\sigma_i\delta_i) αi=1−exp(σiδi)
期望的深度可使用积累透明度沿射线计算: d ( r ) = ∫ t 1 t 2 T ( t ) ⋅ σ ( r ( t ) ) ⋅ t ⋅ d t d(r)=\int_{t_1}^{t_2}T(t)\cdot\sigma(r(t))\cdot t\cdot dt d(r)=∫t1t2T(t)⋅σ(r(t))⋅t⋅dt上式同样可使用求和近似: D ^ ( r ) = ∑ i = 1 N α i t i T i \hat{D}(r)=\sum_{i=1}^N\alpha_it_iT_i D^(r)=i=1∑NαitiTi某些深度正则化方法会使用期望深度将密度限制为类似(在场景表面取峰值的)delta函数的形式,或是保证深度的平滑性。
对每个像素,考虑其平方误差光度损失,以优化MLP参数。总损失为: L = ∑ r ∈ R ∥ C ^ ( r ) − C g t ( r ) ∥ 2 2 L=\sum_{r\in R}\|\hat{C}(r)-C_{gt}(r)\|_2^2 L=r∈R∑∥C^(r)−Cgt(r)∥22其中 C g t ( r ) C_{gt}(r) Cgt(r)是与射线 r r r关联像素的真实颜色, R R R是待合成图像的相机射线集合。
NeRF模型通常会使用位置编码,因其有利于渲染图像的细节重建。原始的位置编码 γ \gamma γ是在点 x x x的坐标(归一化到 [ − 1 , 1 ] [-1,1] [−1,1])以及射线单位方向向量 d d d的每个分量 v v v上进行的: γ ( v ) = ( sin ( 2 0 π v ) , cos ( 2 0 π v ) , sin ( 2 1 π v ) , cos ( 2 1 π v ) , ⋯ , sin ( 2 N − 1 π v ) , cos ( 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),\cdots,\sin(2^{N-1}\pi v),\cos(2^{N-1}\pi v)) γ(v)=(sin(20πv),cos(20πv),sin(21πv),cos(21πv),⋯,sin(2N−1πv),cos(2N−1πv))其中 N N N为用户定义的维度参数。