个人知乎文章链接:https://zhuanlan.zhihu.com/p/3383996241
一、预备知识
1. NeRF重建
NeRF的全称是Neural Radiance Fields,即将场景表示为视场合成的神经辐射场,用神经网络来拟合辐射场,实现对三维场景的隐式表示。本质是完成了图形学里面的3D渲染(Render)功能,3D信息的隐式表达。
渲染:将场景定义(包括摄像机、灯光、表面几何和材料)转换为模拟摄像机图像的过程称为渲染。简单来说就是模拟相机的拍照过程,生成的结果是该视角下看到的一张照片。
隐式表达:告诉你3D点满足特定的关系,而不是告诉你点具体在哪。例如,3D球面上的任意一点都满足 。只要找到所有的x,y,z满足F(x,y,z)=0,就能将图像画出来。缺点就是很难去描述复杂的物体;优点有:
- 容易表示;
- 做某些查询很容易(例如判断物体在外面还是里面,计算到表面的距离等);
- 很容易对光线与表面求交的
- 对于简单的物体们,用隐式的表示方法是很精确的,没有采样错误
- 易于处理拓扑结构(比如流体)
显示表达:3D点直接给出或通过参数映射的方式,可以方便看模型,但很难判断点是否在模型上或模型内外。
三维shape的表征方式:显示表达的方式分为点云、网格和体素;隐式表达的方式有SDF和NeRF(mesh)
传统的三维重建方法:
- 主动式:结构光重建、TOF方法、三角测距法
- 被动式:SFM、REMODE、SVO
NeRF相对于传统方式的优势:
- 继承了体积表示的有点,可以表示复杂的几何形状和外观
- 适合使用投影图像进行基于梯度的优化
- 克服了在高分辨率建模复杂场景时,离散化体素网格带来的存储成本过高问题。
NeRF神经辐射场是一种面向三维隐式空间建模的深度学习模型,这种深度学习模型是全连接神经网络(MLP多层感知机);接下来引出MLP的简单介绍:
2. 多层感知器(Multi-Layer Perceptron,MLP)
神经网络分为输入层、隐藏层和输出层。隐藏层前几层可以是简单函数进行提取信息,后几层可以是复杂函数进行学习。
- MLP包含输入层、隐藏层、输出层。层与层之间是全连接的(上一层的任何一个神经元与下一层的
所有神经元都有连接) - 激活函数:中间会加入激活函数,其作用是:给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数; 不使用激活函数的话,每层都是线性组合,不管多少个线性函数组合得到还是个线性函数。
- 前向传播和后向传播:就是将上一层的输出作为下一层的输入,并计算下一层的输出,一直到运算到输出层为止;后向传播:实际上,反向传播仅指用于计算梯度的方法。而另一种算法,例如随机梯度下降法,才是使用该梯度来进行学习。原则上反向传播可以计算任何函数的导数,在这其中也还会用到链式求导法则。
卷积神经网络:
输入是多通道矩阵了,然后每一层的函数和激活函数都是滤波器进行滤波的过程了,并且会有以下几个特点:
- 每一层中,输入的通道数与滤波器的通道数相同
- 全部参与计算的滤波器个数与最后输出的通道数一致
- 权重参数w=滤波器大小与输入和输出通道数乘积
- 偏置b=滤波器个数即输出通道的个数
- 输出大小:(输入+2*padding-filter size)/stride+1
参数:需要网络学习的参数:w b
超参数:模型训练需要的外部设置的参数比如学习率迭代次数,隐藏层的层数,激活函数的选择等
找到最优的超参数方法就是不断尝试
二、nerf论文摘要与介绍
接下来的内容和文章https://blog.csdn.net/guanjing_dream/article/details/135606180一致,我觉得此文章的形式和内容对初学者非常友好,为了尊重作者,所以我把原贴贴在这里。然后我就只是针对性写一些更助于自己理解的内容。
论文提出了一种方法,该方法通过使用稀疏的输入视图集来优化底层连续体素场景函数,
(1)连续体素场景函数:指静态场景表示为连续的5D函数,该函数输出空间中每个点(x,y,z)在每个方向(θ,φ)上发射的辐射度。
实现了合成复杂场景的新视图的最新结果。我们的算法使用一个全连接(非卷积)深度网络来表示一个场景,其输入是一个连续的5D坐标(3D位置+2D旋转),输出是该空间对应的体素密度和基于视角的辐射场。
(2)输入:稀疏的图像集以及对应的pose(3d位置+2d旋转)
(3)输出:体素密度+RGB(也能有其他输出,深度视差等)
我们沿着相机光线查询5D坐标,并使用经典的体素渲染技术将输出的颜色和密度投影到图像中。因为体素渲染是自然可微分的,
(4)可微分:代表可以使用梯度下降等优化算法进行优化网络模型
所以优化我们的表示所需的唯一输入是一组具有已知相机姿势的图像。我们描述了如何有效地优化神经辐射场,以渲染具有复杂几何形状和外观的场景的真实感新视图,并展示了优于先前神经渲染和视图合成工作的结果。
整体算法过程:
1)使相机光线穿过场景以生成一组采样的3D点,
2)使用这些点及其对应的2D观测方向作为神经网络的输入以产生一组颜色和密度的输出,
3)使用经典的体渲染(Volume rending)技术将输出的颜色和密度信息累积到2D图像中。
使用梯度下降来优化这个模型,通过最小化每个观测到的图像和相应的基于我们的方法得到的视图渲染结果之间的误差。通过将多个视图之间的这种误差最小化,激励网络通过将高体积密度和准确的颜色分配给包含真实底层场景内容的位置来预测场景的连贯模型。
算法过程对应的图示:
具体对上图的解释和位置编码引入的原因在上述文章中都讲的很详细。
NeRF优点:不需要精确的3D几何信息,只需要RGB信息
三、基于神经辐射场的场景表示
对应上述文章的这部分
四、基于辐射场的体渲染
回顾上面两张图中所示的算法流程:
最开始定义射线(NeRF中的射线定义是以相机光心为原点),将其转到世界坐标系,然后利用采样策略在每条射线上进行点的采样,定义每个点的坐标和方向(5D坐标),紧接着就是根据上述两个图中所示,将5D坐标进行位置编码送入MLP网络,输出每条射线上每个点的RGB和体密度。
第一张图对应第二张图的(a)(b)过程——神经辐射场,即NeRF将场景建模成MLP神经网络的参数(网络权重),也就是场景建模隐式表达。接下来就要进行基于辐射场的体渲染过程。
立体渲染(volume rendering)
首先需要明白一件事,光线上采样的点与最终合成RGB图像的关系:相机光心发射一条光线,打到3D物体上,最后反射到2d呈现平面上是一个像素,即:一条射线上的N个采样点,最终渲染成一个像素点RGB值。
渲染的物理公式定义
其中:
T:累计透光率,光线传到此点还剩多少光
sigma:当前点的体密度(MLP网络输出)
c:当前点的RGB值(MLP网络输出)
tn~tf:射线范围
点的密度越大,它阻挡光线的能力也就越强,同样对渲染RGB的权重也越重要
对应的离散模式如下:
对应的loss也如图二所示,为“粗糙”网络和“精细”网络渲染rgb与真实像素的总平方误差
五、神经辐射场优化
引入了两种改进,以实现高分辨率复杂场景的表现。第一种是输入坐标的位置编码,有助于MLP表示高频函数,第二种是分层采样过程,使我们能够有效地对这种高频表示进行采样。
位置编码
也是对应上述文章此部分。
两个表现:
- 5D输入,渲染在表示颜色和几何形状的高频变化方面表现不佳。
- 将输入传递到网络之前,使用高频函数将输入映射到更高维空间可以更好的拟合包含高频变化的数据。
具体为:函数γ会将原始的坐标信息进行一个广义的傅立叶变换(也有点像归一化处理),使得原本相邻的两个位置差距扩大以实现更高分辨率的处理效果(如将30和31两个连续的数值经过一次编码后变成−0.6842和0.6240,这使得迭代过程中变得更加精细)
是否采用位置编码的差距体现如下图所示:
分层体积采样
问题现象:沿着每条相机射线的N个查询点上密集评估神经辐射场网络的渲染策略是低效的:对渲染图像没有贡献的自由空间和遮挡区域仍然被重复采样。
背景:从早期的体渲染工作中获得了灵感[20],并提出了一种分层表示,通过按样本对最终渲染的预期效果成比例分配样本来提高渲染效率。
思路:不只是使用单个网络来表示场景,而是同时优化两个网络:一个“粗略”网络和一个“精细”网络。
方法:
- 首先使用分层采样对一组Nc个位置进行采样,并评估这些位置的“粗略”网络,计算每个采样位置的权重,并进行归一化处理,最后得到一个概率密度函数。
- 给定这个“粗略”网络的输出,然后沿着每条射线对权重更大的点进行更精确的采样,其中样本偏向体积的相关部分。
具体实现:
- 采样Nc(64)个点,计算每个点的权重,对应公式5.随后进行归一化处理,得到概率密度函数,并根据此函数再采样第二组Nf个点。
- 在一共采样Nc+Nf个点中评估“精细”网络,并使用公式3计算射线的最终渲染颜色。
实现细节和损失函数
为每个场景优化单独的神经连续体积表示网络。这只需要场景的RGB图像、相应的相机姿态和内参数以及场景边界(距离相机的最近和最远距离)。
在每次优化迭代中,我们从数据集中的所有像素集中随机采样一批相机射线,然后按照第5.2节中描述的分层采样来查询来自粗略网络的Nc个样本和来自精细网络的Nc+Nf个样本。然后,我们使用第4节中描述的体积渲染过程来渲染两组样本中每条光线的颜色。
损失只是粗略渲染和精细渲染的渲染和真实像素颜色之间的总平方误差:
其中R是每个batch中光线的集合,C®是颜色渲染真值,下标为c和f的分别是基于粗采样网络的预测和基于精细网络采样的预测。注意:即使最终的渲染结果来源于精细网络采样的预测,但是也需要将基于粗网络采样的预测损失最小化,以便来自粗略网络的权重分布可以用于在精细网络中分配样本,于是就构成了上述公式6。
在我们的实验中,我们使用4096条射线的批量大小,每条射线在粗略体积中以Nc=64个坐标采样,在精细体积中以Nf=128个附加坐标采样。我们使用Adam优化器[18],单个场景的优化通常需要大约100-300k次迭代才能收敛到单个NVIDIA V100 GPU上(大约1-2天)。
六、论文实验结果&NeRF优缺点
评估指标
1.峰值信噪比PSNR(Peak Signal to Noise Ratio)
衡量最大值信号和背景噪音之间的图像质量参考值。PSNR的单位为dB,其值越大,图像失真越少。一般来说,PSNR高于40dB说明图像质量几乎与原图一样好;在30-40dB之间通常表示图像质量的失真损失在可接受范围内;在20-30dB之间说明图像质量比较差;PSNR低于20dB说明图像失真严重。
2. 结构相似性指数SSIM(structural similarity index)
一种用于量化两幅图像间的结构相似性的指标。与L2损失函数不同,SSIM仿照人类的视觉系统(Human Visual System,HVS)实现了结构相似性的有关理论,对图像的局部结构变化的感知敏感。SSIM从亮度、对比度以及结构量化图像的属性,用均值估计亮度,方差估计对比度,协方差估计结构相似程度。SSIM值的范围为0至1,越大代表图像越相似。如果两张图片完全一样时,SSIM值为1。
3.学习感知图像块相似度LPIPS(Learned Perceptual Image Patch Similarity)
也称为“感知损失”(perceptual loss),用于度量两张图像之间的差别。LPIPS的值越低表示两张图像越相似,反之,则差异越大。
NeRF优缺点
优点:
- 新视点合成效果逼真
- 可微渲染
局限性:
- 无法编辑
- 输入图像比较稠密
- 只能处理静态场景
- 光照必须固定
- 低动态范围
- 训练速度慢
- 每个场景必须要重新训练,没有泛化能力
针对以上列举的NeRF局限性,下面是各类NeRF针对不同缺点的改进优化:
- 加速训练:Instant NGP、TensoRF、Plenoxels
- 泛化能力:PixelNeRF、MVSNeRF
- 处理图像模糊、高动态范围:Deblur-NeRF、HDR-NeRF
- 图像存在畸变的:Self-Calibrating Neural Radiance Fields
- 位姿不准:BARF/GNeRF
- 不同尺度、不同光照:Mip-NeRF、NeRF in the wild
- 少量图像:MVSNeRF、Depth-supervised NeRF