本文主要是介绍Nerf-Wild神经辐射场论文学习笔记 Neural Radiance Fields for Unconstrained Photo Collections,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言:
本文为记录自己在Nerf学习道路的一些笔记,包括对论文以及其代码的思考内容。
公众号: AI知识物语
B站后续同步更新讲解
本篇文章主要针对其数学公式来学习其内容,欢迎批评指正!!!
(代码下篇出)
1:摘要
提出基于学习(learning-based)方法,使用野外照片的非结构化集合(unstructured collections of in-the-wild photographs)来合成复杂场景。之前的Nerf通过MLP的权重来模拟场景的密度、颜色。虽然在静态对象生成上比较好,但在uncontrolled images不受控的图片中,会有一些ubiquitous,real-world phenomenon,也就是可变照明或者瞬时遮光器variable illumination or transient occluders,本文基于Nerf引入了一些列扩展来解决这些问题。
概况来讲:
Nerf要求在相同位置、视角拍摄的照片完全一样,也就是必须在尽可能短的时间内拍的照片,因为这种情况下光线变化等影响会很小;nerf-wild放松了限制,通过解决光照变化以及移动遮挡的问题,来使得输入的照片不一定完全一样,同一个位置、同一个视角上午拍的或者下午拍的都可以作为输入。
创新点:
(1)
通过学习的低维隐空间,建模图形的appearance外观变化,比如光照、天气,进而生成潜在优化框架,优化每个图形的外观嵌入embeded,使得Nerf-Wild获得学习照片集合中共享外观表示来使得图形间光度和环境变化更灵活。
(2)
把场景分解为静态、动态,使用二次体积辐射场和数据相关不确定性场对瞬态元素进行建模,其中数据相关不确定场捕获可变观测噪声,并进一步减少瞬态对象对静态场景表示的影响。
下面讲按照论文章节来介绍:
2:Background(原来Nerf的工作)
简单回顾下Nerf
Nerf使用一个连续(可导)的体积辐射场来表示场景,具体结构为MLP多层感知机,将空间位置 x=(x,y,z)以及方向位置d=(dx,dy,dz)输入,输出密度σ和颜色c = (r,g,b)。现在,为了得到多视角下场景(我们肉眼看到的图像场景由一个个像素组成),需要计算单个像素的颜色,Nerf将MLP网络输出的密度σ和颜色c = (r,g,b)作为输入,通过体渲染操作来生成像素。
补充:
(1)在场景中,把密度σ和颜色c = (r,g,b)通过积分操作,来模拟场景中的光线
(2)光线表示为r(t) = o + td ,o表示起点,td表示距离起点的某个方向间隔
见下图公式
式(1) (注意这里是求和,原先的Nerf是求导)
C_^ = T * α *c
下面这个是最初的Nerf 计算体素pixel的公式
参数解释:
r(t):光线上某个采样点
c(t): MLP输出的color值,采样点t_k处的color值
σ(t):MLP输出的密度值,也就是采样点t_k处的密度值
α(σ(tk)δk):根据光线路径上的位置和密度,调整每个采样点在渲染过程中的权重。融合权重会根据光线的密度进行调整,以补偿密度对颜色估计的影响。
α(x)=1−exp(−x)
T(t_k):表示从第采样点t_k到光线终点的透射比
δ_k = t_k - t_k:这里是两个正交点之间的距离。(在最初的Nerf中表示为相邻采样点的距离)
分层采样用于选择t_n和t_f(摄像机的近平面和远平面)之间的正交点
{tk}K_k =1。
通过对沿着光线方向进行采样的辐射场值进行加权,根据透射率和颜色信息来估计每个像素点的颜色。这种方法能够更好地处理光线在场景中的衰减和颜色的变化,从而提高重建的视觉质量。
内容补充:
(1)T(tk)的计算是通过从相机位置c到采样点tk之间的路径上的密度(density)值进行累乘得到的。路径上的密度值反映了介质对光线的吸收和散射程度。因此,通过累乘路径上的密度值,可以计算出光线在路径上的衰减情况。
(2)公式2中,σ(tk)是采样点tk处的密度(density),δk是采样点之间的距离。这个公式中的积分表示对路径上的密度进行累积,从相机位置c到达采样点tk。
(3)δ_k表示两个正交点之间的距离。正交点是指在光线路径上与场景中的物体相交的点,并且与该物体的表面垂直(正交)相交。
那么,δ_k = t_k - t_k 表示相邻两个正交点之间的距离,即两个相交点在光线路径上的参数化位置之差。通过计算这个距离,我们可以获得两个正交点的位置之间的空间距离,用于光线追踪和渲染中的各种计算和操作。
(4)透射率是指光线在通过介质时被吸收或散射的程度。它通常用一个介于0和1之间的值来表示,表示光线通过介质时保留下来的比例。
透射率与介质的吸收和散射特性有关。当光线通过介质时,部分光线会被介质吸收,使光线的强度减弱。另一部分光线会被介质中的颗粒或分子散射,导致光线的方向改变。透射率表示通过介质的光线相对于入射光线的强度比例。
2.1: Nerf的两个网络(输出密度σ和color)
使用ReLU的MLP网络来输出(表示)密度值σ
使用Sigmoid的MLP网络来输出(表示)color值c
参数解释:
γ_x:表示经过位置编码的空间数据 (x是空间xyz坐标向量)
γ_d:表示经过位置编码的方向数据 (d是空间dx,dy,dz方向向量)
θ1,θ2:MLP需要拟合的量,训练MLP网络,也就是在拟合其的过程
z(t)在方程(3)表示的是MLP网络1中输入位置编码后的位置信息,会输出密度和z(t),把他理解为一个向量信息(特征),记做隐向量z
在方程(4)中,把向量z,编码后的视角向量输入MLP网络2中,输出c,color值。
归纳,概况来讲,z(t)理解为一个中间值,其向量值由位置信息影响;z(t)会影响生成color值;密度值与位置信息有关,视角无关;color值与位置信息和视角信息都有关
补充:
(1)
为了拟合θ,Nerf(具体来说也就是MLP)会最小化预测生成的图像与每个(大小为HW3)target图像的损失。
(To fit parameters θ, NeRF minimizes the sum of squared reconstruction errors with respect to an RGB image collection {Ii}N i=1, Ii ∈ [0, 1]H×W×3.)
(2)
图像集合中的每个图像都会与(提前计算好的,比如使用Colmap生成)camera参数配对;
(3)
我们提前precompute计算Image --i中的pixel(像素)–j对应的一系列光线,记为ray_ij,这里的每条光线都穿过3D场景中的点o_i(可以理解为第i张图像image的起点,3D location),并且光线方向为d_ij(第i张image中第j个pixel视角下的color)
通过上面的介绍,我们知道,体渲染操作是对光线上每个点,利用其密度和color来进行数值积分计算。为了提高对光线上采样点的效率(光线有些地方点贡献度高,有些贡献度低,具体看前几篇介绍Nerf的),本文同时优化粗coarse和细fine模型。
2.2:Nerf的损失函数
两个MLP网络使用以下的损失函数来进行最小值优化
数学解释:
(1)
矩阵A=[0,1,2;2,1,3]
范数双竖线加下标: 矩阵中每个元素平方和的平方根,sqrt(sum(xi.^2)),比如A的L2范数就为19
范数学习链接
(2)
举例图中的左边式子,target,也叫真值的像素与粗网络预测的像素先后进行L2范数计算和平方计算(平方,可能是为了避免负值),右边同理
3:Wild-Nerf工作
在摘要里,我们刚刚看到了,户外场景wild environment中,同一地点、角度的拍摄会受 光度变化以及瞬时物体变化的影响。
光度变化:一天中的时间和大气条件直接影响场景中物体的照明(以及因此产生的辐射),可能导致额外的光度不一致additional photometric inconsistencies。
瞬时物体:现实世界的地标很少被孤立地捕捉,它们周围没有移动的物体或遮挡物。地标的旅游照片尤其具有挑战性,因为它们通常包含摆拍的人类主体和其他行人。
针对上述问题,该论文扩展了NeRF,以允许图像相关的外观和光照变化image- dependent appearance and illumination variations ,从而可以显式地模拟图像之间的光度差异,允许瞬时物体被联合估计并从3D世界的静态表示中分离出来
参数解释:
输入:appearance embedding外观 + 视角方向 + 三维位置 + 瞬时transient embedding
输出:静态static和瞬态transient的颜色和密度
4.1 Latent Appearance Modeling
为了让Nerf能够更好地处理光照变化variable lighting以及 photometric post-processing问题,采用了GLO方法(Generative Latent Optimization)。
具体来说就是(1)给每个图片分配了一个关联的隐编码l_a_i,其会随着训练杯优化,具体公式入(6)(7)
方程解释:
(6)左边是第i张图预测的像素值,右边是体渲染render函数,其输入为ray,c(color)和密度
(7)左边是本文引入的c_i(t),理解为第i张image,光线位置t处的点的color,右边是输出color的MLP网络,其输入是隐向量z(t),位置编码过后的方向向量,以及外观嵌入向量l (appearance embedding vector)
补充:
1:这里重在区别方程(6)和(1)中的 c_i参数,是不同的,前者引入了外观嵌入向量。
2:这里引入的外观嵌入向量也会随着MLP网络中θ2被优化而优化
4.2 Transient Objects
瞬息物体对我们需要渲染的主体部分进行了遮挡,因此最后渲染图片的颜色也应该是不同的, 为了解决瞬态现象transient phenomena问题,作者提出了2个MLP,也就是2个(辐射)场一个是静态场(static),也就是我们真正想要还原的物体的场,另一个是瞬时场(transient),也即那些移动的遮挡物。
(1)把输出color的MLP网络指定为static head静态头,并额外添加瞬态头additional transient head,其输出color颜色和密度,并允许密度值在不同的训练图像间变化,该方法使得Nerf-W可以让网络在重建静态场景的时候不会把其前面的遮挡物重建上去。
(2)不假设所有观察到的像素颜色都同样可靠,而是允许我们的瞬态头发射不确定场emit a field of uncertainty(很像我们现有的颜色和密度场),这允许我们的模型调整其重建损失adapt its reconstruction loss,以忽略不可靠的像素和可能包含遮挡物的3D位置。
简单来说,静态场和原始NeRF没有任何区别,而瞬时场中作者要求光线不仅给出颜色和密度,还需要给出一个不确定性(uncertainty),即当前观测点的可信度到底有多少。比如,模型在重建一个静止建筑时,其对行人、鸟等运动物体给出比较低的可信度,给静止的建筑、台阶等等比较高的可信度。另外,由于那些移动的遮挡物在每个视角中都不同,因此作者还给瞬时场增加了一个视角先验(transiant embedding)
我们将每个像素的颜色建模为各向同性的正态分布isotropic normal distribution,我们将最大化其可能性likelihood,并且我们使用与NeRF使用的相同的体绘制方法来“绘制”该分布的方差。这两个模型组件允许NeRF-W在没有明确监督的情况下理清disentangle静态和瞬态现象。
为了建立自己的 transient head瞬态头,该论文基于体渲染方程6,增加了静态密度σ和radiance辐射c_i,及其对应的瞬态密度σ_T_i和辐射 c_T_i,静态与动态相加在进行累加计算。
用瞬态部分的瞬态密度σ_T_i和辐射 c_T_i来增强静态密度和亮度
具体Wild-Nerf渲染方程如下:
这是原来的方程:
参数解释:
r(t):光线上某个采样点
c(t): MLP输出的color值,采样点t_k处的color值
σ(t):MLP输出的密度值,也就是采样点t_k处的密度值
α(x)= 1 -exp(-x)
T(t_k):表示从第采样点t_k到光线终点的透射比
δ_k = t_k - t_k:这里是两个正交点之间的距离。(在最初的Nerf中表示为相邻采样点的距离)
分层采样用于选择t_n和t_f(摄像机的近平面和远平面)之间的正交点
{tk}K_k =1。
方程(8)(9)与(1)区别注意:
(8)在(1)的基础上添加了transient head,左边是static静态部分,右边动态部分transient head
同时(9)中也根据对应static静态部分添加了瞬态部分transient head
论文采用采用Kendall等人[15]的贝叶斯学习框架Bayesian learning framework来模拟观察到的颜色的不确定性。我们假设观察到的像素强度pixel intensities是固有的噪声(任意的)inherently noisy (aleatoric),并且进一步假设这种噪声是依赖于输入的(异质的)input-dependent (het- eroscedastic)。我们用各向同性正态分布isotropic normal distribution 对观察到的颜色C_i 建模,该正态分布具有依赖于图像和光线的方差β_i ^2和平均值c_i。
瞬态物体对我们需要渲染的主体部分进行了遮挡,因此最后渲染图片的颜色也应该是不同的,作者选择在渲染过程中直接估计方差
直接估计方差
方差β_i (r)通过瞬时密度σ(t),通过α(alpha-compositing)透明度来渲染颜色
为了使瞬态变量可以跨图像变化,论文给训练的每个图像image_i分配了第二个embed-ding I 量(类似于appearance embedding),其作为瞬态变量输入第三个MLP,其输出得到的是瞬态(前面有遮挡)的密度,颜色,不确定性。
Relu + sigmoid激活函数用在瞬态下的密度和color值,
softplus(x)=log(1+exp(x))
β_min作为一个超参数,其可以确保每条射线被分配了最小的重要性
方程13其意义是将输出从( − ∞ , + ∞ ) 映射到( 0 , + ∞ ),作者把上述loss构造给了fine model,而coarse model还是使用了经典loss。
前两项是Ci®的(移过的)负对数似然,符合均值Ci®和方差βi®2的正态分布。较大的βi®值会减弱分配给像素的重要性,假设它属于某个瞬态对象。第一项被第二项平衡(当Bi过于大的时候,第1项接近0,第2项就会平衡,使其不那么靠近0),它对应于正态分布的对数配分函数,并且排除了βi® =∞处的平凡最小值。第三项是在(非负)瞬态密度σ(τ)上具有乘法器λu的L1正则化器。这阻碍了模型使用瞬态密度来解释静态现象。
概况来说,方程13表示的是image_i中射线ray_r对真值(target)颜色Ci(r)的一个损失函数,其一个最大似然函数以及后验估计的估计(不确定性服从正态分布的情况下)
在测试时,我们忽略瞬态场和不确定场;只表示σ(t)和c(t)图4给出了一个示例
4.3. Optimization
与NeRF一样,我们同时优化了两个MLP:一个使用上述模型和损失loss的精细模型,一个只使用潜在外观建模组件的粗糙模型。除了参数θ,我们优化每幅图像的外观嵌入和瞬态嵌入
外观嵌入
瞬态嵌入
则NeRF-W的损失函数为:
对于测试集可视化,我们选择来最佳拟合目标图像(例如图8)或者将其设置为任意值。
5:Result
表1:NRW[22]、NeRF[24]和所提出模型的两次缩减在摄影旅游数据集[13]上的定量结果。最好的结果会被突出显示。NeRF-W在PSNR和MS-SSIM的所有数据集上都优于以前的技术水平,并在LPIPS中取得了具有竞争力的结果。请注意,LPIPS通常倾向于使用NRW等训练具有对抗性或感知损失的方法对典型的GAN伪影不太敏感,参见图7和14(补充)。
6:Limitations
虽然 NeRF-W 能够从非结构化照片生成逼真且时间一致的渲染,但在训练图像中很少观察到的场景区域或仅在非常倾斜的角度(例如地面)观察到的场景区域中,渲染质量会下降,如图所示 如图 10 所示。与 NeRF 类似,NeRF-W 对相机校准误差也很敏感,这可能会导致场景中已成像的部分重建模糊。相机校准不正确。
7:Conclusion
我们提出了 NeRF-W,这是一种基于 NeRF 构建的非结构化互联网照片集对复杂环境进行 3D 场景重建的新颖方法。 我们学习每个图像的潜在嵌入,捕获野外数据中经常出现的光度外观变化,并将场景分解为图像相关和共享的组件,以允许我们的模型从静态场景中分离瞬态元素。 对真实世界(和合成)数据的实验评估表明,与之前的状态相比,在定性和定量上有了显着的改进最先进的方法。
8:补充材料
模型参数
以下是我们记录的NeRF-W的选择超参数。
1我们对超参数空间进行了网格搜索,以选择下面的值。请注意,这些值是针对Phototourism数据集中的Brandenburg Gate场景进行优化的,并在其他场景中重复使用。
2与NeRF一样,我们使用MLP架构来建模密度和辐射。
3我们对“基本”组件应用了8层512个隐藏单元,
4对“静态”和“瞬时/不确定性”组件分别应用了4层128个隐藏单元(参见图3)。
5对于位置编码函数γ,我们在编码位置时使用15个频率,在编码视角时使用4个频率。
6训练过程中,每条射线从粗糙模型和细化模型中采样512个点,每条射线总共采样1024个点。
7在评估过程中,我们将该数量增加到2048个。
8外观的潜在嵌入向量具有嵌入维度大小n (a) = 48。
9对于瞬时对象,我们使用嵌入维度大小n (τ) = 16。
10我们选择了0.01作为L1正则化器乘数λu,0.03作为最小重要性βmin。
11模型使用Adam在300,000次迭代中进行训练,批量大小为2048,初始学习率为0.001,在每150,000次迭代后减小十倍。
这篇文章本来是今年3月份写的,后面一直躺在草稿箱里面,最近在做一些整理性工作,就顺便把这篇文章给完成了。
中间参考了CSDN很多相关博客的介绍,因为看了好多好杂,就不一一列举了,同时我看他们的博客以及视频讲解分享,自己当时的一些错误的想法也得到了纠正,在这里我一致感谢,respect!
最近刚刚搬完寝室,发个照片纪念下自己给工位
这篇关于Nerf-Wild神经辐射场论文学习笔记 Neural Radiance Fields for Unconstrained Photo Collections的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!