辐射神经场算法——NeRF算法详解

Posted Leo-Peng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了辐射神经场算法——NeRF算法详解相关的知识,希望对你有一定的参考价值。

辐射神经场算法——NeRF算法详解

辐射神经场算法——NeRF算法详解

NeRF(Neural Radiance Fields)是2020年ECCV会议上的Best Paper,一石激起千层浪,在此之后的两三年的各大顶会上相关文章层出不穷,其影响力可见一斑,NeRF通过隐式表达的方式将新视角合成任务(Novel View Synthesis Task)推向了一个新的高度。那么,什么是“新视角合成任务”呢?什么是“隐式表达”呢?

“新视角合成任务"指的是对于某一场景给定某些视角下的观测(图片),通过算法合成新视角下的观测(图片)的任务,如下图所示:

"隐式表达"指的是在渲染过程不对目标物体或者场景进行显示地建模,如果是从SLAM方向过来的同学解决该任务一个很直观的想法就是通过SFM的方法对目标进行三维稠密重建,然后再通过相机模型反投影到新视角下,这种具备三维表达的方法就是典型的显示表达。而NeRF则是通过一个全连接网络替换三维稠密重建的过程,我们并不知道目标在三维空间中的长什么样子,但是可以通过在三维空间中进行采样和积分获得目标在新视角的观测。具体的过程我们在下文进行详细介绍。

1. Volume Rendering方法

NeRF是将神经网络应用于传统物理模型的一个典型例子,我们可以先了解Volume Rendering这一物理模型的定义,这一部分是介绍传统的Volume Rendering方法,仅仅相当于背景介绍,如果想了解NeRF积分公式的推导过程也可以直接跳到第二部分。Volume Rendering在维基百科的定义如下:

立体渲染(英语:Volume rendering),又称为体绘制,是一种用于显示离散三维采样数据集的二维投影的技术。
一个典型的三维数据集是CT或者磁共振成像采集的一组二维切面图像。通常这些数据是按照一定规则如每毫米一个切面,并且通常有一定数目的图像像素。这是一个常见的立体晶格的例子,每个体素用当前体素附近区域的采样值表示。
为了渲染三维数据集的二维投影,首先需要定义相机相对于几何体的空间位置。另外,需要定义每个点即体素的不透明性以及颜色,这通常使用RGBA(red, green, blue, alpha)传递函数定义每个体素可能值对应的RGBA值。

下面我们从Volume Rendering的原理进行推到,并最终会获得和NeRF中的积分公式:

Volume Rendering针对的对象通常为半透明材质,比如烟、云等,发生如下现象:
吸收(absorption):光能转化为介质内其它形式的能(如热能);
外散射(out-scattering):光打在介质粒子上散射到其它方向去了;
自发光(emission):介质内其它形式的能(如热能)转化成光能;
内散射(in-scattering):其它方向来的光打在介质粒子上恰好散射到本方向上;
其中前两者使光线亮度衰减,后两者使光线亮度增强。

为了获得最终的积分公式,我们将从先从微分方程开始推导

一条沿 ω \\omega ω方向行进的光线,在上任取一点 P P P P P P点出线元为 d t dt dt,光线在经过点 P P P之前亮度为 L L L,通过 P P P亮度获得增量 d L dL dL
对于吸收 d L = − σ a ∗ L ∗ d t dL=-\\sigma_a * L*dt dL=σaLdt其中 σ a \\sigma_a σa为absorption coefficient,表示点 P P P处由于吸收亮度衰减的线密度,上式表明入射亮度越大吸收越大。
对于外散射 d L = − σ s ∗ L ∗ d i d L=-\\sigma_s * L* d_i dL=σsLdi其中 σ s \\sigma_s σs为scattering coefficient,表示点 P P P处由于散射亮度衰减比例的线密度,上式也表明了入射亮度越大散射越大。
对于自发光 d L = L e ∗ d t d L=L_\\mathrme * d t dL=Ledt上式表明自发光的亮度不受入射光线亮度的影响。
对于内散射
假设亮度为 L i L_i Li的光线 ω i \\omega_i ωi方向射向 P P P点,则其中 σ s ∗ d t \\sigma_s*d_t σsdt比例的亮度发生散射,其中 σ s \\sigma_s σs和外散射公式中的 σ s \\sigma_s σs含义相同。这部分亮度中有 p ( ω i → ω ) d ω i p\\left(\\omega_i \\rightarrow \\omega\\right)d\\omega_i p(ωiω)dωi比例恰好散射到 ω \\omega ω方向上,其中, p ( ω i → ω ) p\\left(\\omega_i \\rightarrow \\omega\\right) p(ωiω)为相phase function,表示从 ω i \\omega_i ωi方向射入的光散射到 ω \\omega ω方向的概率密度。所以 ω i \\omega_i ωi方向的光线 L i L_i Li贡献的内散射亮度为: L i σ s d t ∗ p ( ω i → ω ) d ω i L_i \\sigma_s d t^* p\\left(\\omega_i \\rightarrow \\omega\\right) d \\omega_i Liσsdtp(ωiω)dωi由于所有方向都对内散射亮度都有贡献,所以对上述做球面积分,即得到点 P P P处因内散射增加的总亮度为: d L = ∫ Ω L i σ s d t ∗ p ( ω i → ω ) d ω i = ( σ s ∫ Ω p ( ω i → ω ) L i d ω i ) d t d L=\\int_\\Omega L_i \\sigma_s d t * p\\left(\\omega_i \\rightarrow \\omega\\right) d \\omega_i=\\left(\\sigma_s \\int_\\Omega p\\left(\\omega_i \\rightarrow \\omega\\right) L_i d \\omega_i\\right) d t dL=ΩLiσsdtp(ωiω)dωi=(σsΩp(ωiω)Lidωi)dt综合吸收、外散射、自发光、内散射四种效应可以得到: d L = − σ a ∗ L ∗ d t − σ s ∗ L ∗ d t + L e ∗ d t + ( σ s ∫ Ω p ( ω i → ω ) L i d ω i ) ∗ d t d L=-\\sigma_a * L* d t-\\sigma_s * L* d t+L_e * d t+\\left(\\sigma_s \\int_\\Omega p\\left(\\omega_i \\rightarrow \\omega\\right) L_i d \\omega_i\\right) * d t dL=σaLdtσsLdt+Ledt+(σsΩp(ωiω)Lidωi)dt为了简化公式,我们可以令: σ t = σ a + σ s \\sigma_t=\\sigma_a+\\sigma_s σt=σa+σs S = L e + σ s ∫ Ω p (

以上是关于辐射神经场算法——NeRF算法详解的主要内容,如果未能解决你的问题,请参考以下文章

辐射神经场算法——Wild-NeRF / Mipi-NeRF / BARF / NSVF / Semantic-NeRF / DSNeRF

辐射神经场算法——Wild-NeRF / Mipi-NeRF / BARF / NSVF / Semantic-NeRF / DSNeRF

NeRF算法Keras实现教程

本科生新算法打败NeRF,不用神经网络照片也能动起来,提速100倍|开源

本科生新算法打败NeRF,不用神经网络照片也能动起来,提速100倍|开源

CVPR 2022 | 鲁棒的神经辐射场重建