1 NeRF原理
NeRF (Neural Radiance Fields,神经辐射场) 是2020年ECCV会议上的Best Paper,其将隐式表达推上了一个新的高度,仅用2D不同的posed images
作为监督,即可渲染出复杂的三维场景
。一石激起千层浪,自此之后NeRF迅速发展起来被应用到多个技术方向上例如新视点合成、三维重建等等,并取得非常好的效果,其影响力是十分巨大的。NeRF神经辐射场
是一种面向三维隐式空间建模的深度学习模型,这种深度学习模型是全连接神经网络(MLP多层感知机)
。NeRF 所要做的任务是 Novel View Synthesis,一般翻译为新视角合成任务
,定义是:在已知视角下对场景进行一系列的捕获 (包括拍摄到的图像,以及每张图像对应的内外参),不需要中间三维重建的过程,仅根据位姿内参和图像,合成新视角下的图像。输入稀疏的多角度带pose的图像,训练得到一个神经辐射场模型,根据这个模型可以渲染出任意视角下的清晰的照片。
也可以简要概括为用一个MLP神经网络去隐式地学习一个三维场景
。在基于Nerf的表示方法下,三维空间被表示为一组可学习且连续的辐射场,由输入图像+姿态
学习后,输出色彩+密度
。
位置编码:传统的MLP网络不善于学习高频数据信息,但是基于颜色的纹理信息都是高频的,如果直接使用MLP学习,会导致学得纹理的表面相当模糊。因此引入了位置编码,让MLP同时学习高低频信息,提升清晰度。注意这里的PE和transformer里面的PE不一样。
在这个过程中有一个非常重要的概念Volume Rendering with Radiance Fields (辐射场体渲染)
,对光线进行追踪、积分、建模,使用MLP将光线编码成颜色以及密度值,将三维场景的表示保存在MLP的权重中,输入很多已知,来生成图像。
3D渲染物理方程:
其中x
为当前待分析的三维空间坐标,d
为光线照射方向,这个公式分成两部分:
L
o
(
x
,
d
)
=
L
e
(
x
,
d
)
+
∫
Ω
f
r
(
x
,
d
,
ω
i
)
L
i
(
x
,
ω
i
)
c
o
s
θ
d
w
i
L_o(x,d)=L_e(x,d)+\int_\Omega f_r(x,d,\omega_i)L_i(x,\omega_i)cos\theta dw_i
Lo(x,d)=Le(x,d)+∫Ωfr(x,d,ωi)Li(x,ωi)cosθdwi
第一部分代表x为光源点时,自身在d方向上的辐射量。
第二部分为,该点光源照射到其他表面后,折射在d方向的辐射。第二部分中
f
r
(
x
,
d
,
ω
i
)
f_r(x,d,\omega_i)
fr(x,d,ωi) 为散射函数,
L
i
(
x
,
ω
i
)
L_i(x,\omega_i)
Li(x,ωi) 为从
w
i
w_i
wi方向接收到的辐射,
θ
\theta
θ 为
w
i
w_i
wi与 d的夹角。
为什么要提这个?因为人眼中的色彩,很大一部分是通过神经辐射场中的辐射来的。人眼会接收到光,而光就是电磁辐射,或者说是振荡的电磁场,光又有波长和频率,其中光的颜色是由频率决定的。如果大家记得初中物理的话,大多数光是不可见的,仅有的很窄的一段人眼可见的光谱称为可见光谱,对应的频率就是我们认为的颜色。
因此,我们可以间接认为,建模辐射光
即是建模对应的颜色
。而Nerf则是一组可以对上面渲染方程近似求解的MLP
,通过建模辐射光,从而对三维场景的颜色进行建模。这也就是Nerf的工作原理。在基于Nerf的表示方法下,三维场被表示为一组可学习且连续的辐射场。
NeRF输入输出:
给定一组连续拍摄的图像+姿态,Nerf尝试使用光线位置、光照方向、对应三维坐标(x,y,z)
为输入,输出目标的密度(形体)+颜色
。输入共计五变量,也因此被称为“5D辐射场
”。具体来说,给定空间点坐标(x,y,z)与观测方向(
d
x
d_x
dx,
d
y
d_y
dy,
d
z
d_z
dz)中任意两个,第三个通过叉乘求出,俗称“知二得三”)可求解得该点的密度值(其实是光线在该点终止的概率)
与对应的颜色(RGB值)
。预测了颜色值,和当前姿态下对应的输入图片求损失,则可进行优化使模型逐步收敛。
密度
σ
\sigma
σ、不透明度opacity、光线透过率T:
Nerf模型如何渲染:
Nerf引入了经典的体渲染理论来进行色彩与密度(也就是Nerf输出值)的建模。相关物理公式如下(实际使用该公式的离散化形式),这个公式看上去极度复杂;里面涉及三组物理量:光线累积量
T
(
x
)
T(x)
T(x)、体素密度
σ
(
x
)
\sigma(x)
σ(x)、颜色
c
(
x
)
c(x)
c(x):
(1)体素密度
σ
(
x
)
\sigma(x)
σ(x) 反映了该模型在该光线的某处的粒子的密度,也就是一个具体的三维坐标上粒子的密度
(2)颜色
c
(
x
)
c(x)
c(x) 反应了该具体的三维坐标上,从光线的方向看去,粒子反射的颜色
(3)光线累积量
T
(
x
)
T(x)
T(x) 是一个随着光线的路径长度增加,而不断对体素密度积分的量,它的大小是随着光线达到的地方深度的增加而逐渐减小的,也就是说透明度在不断的下降,光线没有碰撞到任何粒子的概率在减小.
据此可以设想体渲染方程的物理意义:解决了遮挡问题与无界问题。
离散化:
分层体素渲染(Hierarchical volume sampling):
这里还是要先解释一下背景:直接使用上面公式中的体渲染积分,需要控制采样起始点。如果直接对全局采样,所需要的计算消耗过大,且采样区间的点较为稀疏。假设使用均匀分布采样,则直接采样效率低。选择恰当的起始、终止点在这里是非常重要的。选择起始点区间长度太小,则采样点不足,影响训练结果。基于体渲染方程分析,一个合理的采样选择是,最好尽可能的避免在空缺部分以及被遮挡了的部分进行过多的采样,因为这些部分对最好的颜色贡献是很少的。
那么如何采样效率最高呢?Nerf使用两个网络同时进行训练 (后称 coarse 和 fine 网络), coarse 网络输入的点是通过对光线均匀采样得到的,根据 coarse 网络预测的体密度值,对光线的分布进行估计,然后根据估计出的分布进行第二次重要性采样,然后再把所有的采样点一起输入到 fine 网络进行预测。
逆变换采样的作用是,在分布 p 的 CDF 值域上均匀采样,其采样结果与原分布 p 中的采样同分布。因此如果获取当前分布困难,可以通过逆变换采样,简化问题难度。
NeRF缺点:速度慢!!
2 NeRF加速
NeRF训练非常耗时,如何加速是个值得探究的问题!
针对NeRF加速研究进展 [专栏推荐]:NeRF Baking
Plenoxels
Plenoxels是一种voxel-based NeRF,发现NeRF成功的秘诀其实是它的体积渲染方程,与其最耗时的神经网络关系不大。因此除了用MLP
表示三维场景,还可以用体素voxel
表示三维场景(如Plenoxel方法),从而加速训练,不需要神经网络,仅仅通过梯度下降和正则化便实现了同样的效果,而且速度还快了100倍:多层感知机MLP是隐式的表示
,体素voxel是显示的表示
,因此voxel是张量Tensor,是可以分解的!!
。
Plenoxels首先重建了一个稀疏的体素表格,每个被占用的体素都带有不透明度和球谐系数。所需的颜色信息就存储在这些球谐系数中,每个颜色通道需要9个系数表示,一共有三个颜色,那么每个体素就需要27个球谐系数来表示它的颜色。
相机射线经过的每个点的颜色和不透明度,就是通过其最近处的8个体素的三线性插值计算的。
接着与NeRF一样,使用体积渲染技术将得到的颜色与不透明度进行3D渲染。
Plenoxels通过对渲染的像素的平均平方误差 (MSE)进行最小化,来优化体素的不透明度和球谐系数,并且使用TV正则化帮助消除噪声。
KiloNeRF
根据场景进行MLP的分解,使用数千个微型 MLP 而不是单个大型 MLP 可以显著提高速度。
每个单独的 MLP 只需要表示场景的一部分,因此可以使用更小且评估速度更快的 MLP。通过将这种分治法的策略与进一步的优化相结合,与原始 NeRF 模型相比,渲染速度提高了两个数量级,而不会产生高存储成本。使用师生蒸馏进行训练,我们表明可以在不牺牲视觉质量的情况下实现这种加速。
Instant NGP
一种可学习参数的多分辨率哈希编码
结构替换 NeRF 中使用的三角函数频率编码,使得模型可以使用更小的 MLP 结构获得等效或者更好的结果。而更小的模型、多分辨率编码的高效并行以及纯 cuda 的原生加速实现, 使得 NeRF 的训练时间从小时级压缩到分钟级甚至是秒级。
上图是NGP的简易过程:
第一步是将坐标点(xyz的真实值)转换为hash表中的index
途中蓝色粉色表示了不同的Level下的计算,不同的Level,网格的分辨率不同(上图中粉色网格小,粉色的分辨率就比蓝色的大)
第二步是在不同层级的hash table中找到目标值周围的八个点位的值,然后进行三线性插值
第三步就是将所有的Level的结果拼接,到这里就算完成了encoding
第四步就是送入神经网络即可
输入编码的历史背景:
对输入数据编码是一个很常见的课题, 我们在很多领域都可以看到,例如
- 在机器学习中, 我们常常会将低维输入映射到高维从而使复杂的数据结构呈现线性的性质,例如独热编码(one-hot encoding), 核方法(kernel trick)。
- 在 ViT 中, 输入编码也是不可获取的信息, 这里输入编码主要作用是告诉模型当前处理的数据在图像的具体位置,本质上起到一个注意力的机制。
- 在 NeRF 原文中, 我们用到的编码形式和 ViT 用到的很相似,都是采用三角函数形式的频率编码, 但是这儿不是用作样本位置提示的目的, 而是给输入引入高频信息, 让模型更好的学习到样本的细节。NGP中不仅网络权重要进行训练,编码参数也要进行训练。
两个点位的值会索引到同一个地方产生冲突:但是神经网络的训练,会将这种冲突的索引分开,虽然key是不够的,但是在空间中大部分的区域也是没有值的,因此神经网络会将更有价值的点位作为主导梯度的部分。
TensoRF
相比于基于坐标的NeRF方法,TensoRF将辐射场表示为voxel grid feature。之前也有不少方法采用了voxel grid,但他们需要很多GPU显存来存储这些voxel,而且voxel的大小会随着场景的大小增加以3次方的速度增加;并且有些方法需要提前计算MLP的输出来进行蒸馏,导致训练时间过长。
TensoRF针对之前方法在中没有高效地利用voxel grid,提出了可以将一个feature grid看做1个4维张量(tensor)的形式,也就是前3维表示空间坐标XYZ,第四维表示特征通道维度。这样我们就可以在辐射场建模中采用传统的张量分解算法了。而张量分解算法可以帮助对高维数据降维,并压缩数据,从而减少建模时的空间占用。
2D张量分解:奇异值分解
3D张量分解:
CP分解(Candecomp Parafac)
VM分解(Vector-Matrix)
3 SDF + NeRF
无论2D或者3D资产都有隐式(implicit)
和显式(explicit)
两种存储方式,比如3d模型就可以用mesh直接存储模型数据,也可以用sdf、点云(point cloud)、神经网络(nerual rendering)来表示
Mesh网格:直接使用NeRF神经辐射场
效果不好,但SDF有向距离场
(Signed Distance Function)是一个更好的选择。
SDF的本质就是存储每个点到图形的最近距离
,即将模型划出一个表面,在模型表面外侧的点数值>0,在模型表面内侧的点数值<0。SDF(Signed Distance Field)在3d和2d中都有对应的应用。在3d中光线追踪对于性能的消耗过大,所以sdf常常被用来作为物体的隐式表达,配合Ray Marching达到接近光线追踪的效果,也有比如deepSDF这种对于模型的隐式表达方面的应用。在2d中,sdf常常被用来表示字体,原神的面部渲染中阴影部分贴图也是基于sdf生成的。
DeepSDF:一种基于学习的shape-conditioned classifier,决策边界就是shape表面本身(SDF)。核心思想就是直接对点采样,然后直接用MLP模型做回归,简单暴力。
利用密度
提取mesh效果不好,于是我们思考将SDF引入NeRF:明确输入(一组2D RGB图片),输出(SDF作为三维场景表示),同时除了SDF还有Occupancy可以代替作为三维场景表示!!!
, 最新神经隐式描述进行3D重建的工作主要使用SDF或occupancy表示表面, 下一章我们将进行介绍。
如何引入?
首先明确NeRF的工作:一组"光线“经过MLP,输出密度场和颜色场,渲染得到2D图像,与真实的图计算loss,反向传播训练。
因为利用密度提取mesh效果不好,于是我们将Density替换为SDF
。但如何将SDF转换为Density?
但如何将SDF转换为Density?NeuS
: 第一步是构造从3D模型到图像的渲染方法(在传统图形学称为光栅化)。 第二步是构造体积渲染训练SDF网络
NeRF和NeuS离散化对比:
4 Occupancy + NeRF
纵观国内外自动驾驶公司的硬件方案主要分为两大路线:1、特斯拉纯视觉方案Occupancy+NeRF,2、其他公司多模态(雷达、相机)融合方案。本文暂不争论两个路线的优劣。仅就特斯拉的占用网络进行解析。占网络从纯视觉方案出发解决通用障碍物(任意障碍物)检测,可以说是一大技术突破,还是非常值得学习的。
BEV
vs Volume Occupancy
最主要的区别就是,前者是 2D表示,而后者是3D表示。第二是固定矩形,在设计感知系统时,经常会将检测与固定输出尺寸联系起来,矩形无法表示一些异形的车辆或者障碍物。如果您看到一辆卡车,将在featuremap上放置一个 7x3 的矩形,如果看到一个行人,则使用一个 1x1 的矩形。问题是,这样无法预测悬垂的障碍物。如果汽车顶部有梯子,卡车有侧拖车或手臂;那么这种固定的矩形可能无法检测到目标。而使用Occupancy Network的话,看到下图中,是可以精细的预测到这些情况的。
特斯拉占用网络Occupancy从整体上看应该是采用了 三维重建中“Occupancy Network” 和 NeRF的思想,并进一步扩展整合。特斯拉应该是主要借鉴这篇voxel-based NeRF。将occupancy的输出作为nerf的输入,然后通过nerf的Loss,将梯度回传给occupancy,进行监督训练。
5 NeRF应用简介
常见应用
NeRF最先是应用在新视点合成方向,由于其超强的隐式表达三维信息的能力后续在三维重建方向迅速发展起来。接下来介绍下NeRF的几个主流应用方向。
自动驾驶
传统方法:流程复杂,效果不好,场景稀疏。
NeRF方法:流程简单,效果好,场景稠密。
元宇宙/游戏:
新视点合成(View Synthesis)
360度重建
大场景重建
人体重建
3D风格迁移
镜面反射场景重建
…
实际应用的挑战
位姿偏移、光照差异、动态物体、大场景下的资源消耗。
(1)相机位姿: P,T,R,X,Y,Z
如何获计算准确相机位姿?相机标定板、SLAM、SFM、NeRF
位姿优化:BARF
(2)光照差异:
(3)动态物体
(4)街道等大场景下的资源消耗
6 NeRF自动驾驶
NeRF与自动驾驶的交集主要在:场景重建
、深度估计
两方面。
[1] https://www.youtube.com/watch?v=KC8e0oTFUcw
[2] Plenoxels: Radiance Fields without Neural Networks, CVPR 2022,arXiv:2112.05131
[3] Grid-Centric Traffic Scenario Perception for Autonomous Driving: A Comprehensive Review, 2023, arXiv:2303.01212
[4] CLONeR: Camera-Lidar Fusion for Occupancy Grid-aided Neural Representations, 2022, arxiv 2209.01194
[5] Urban Radiance Fields, CVPR 2022, arXiv:2111.14643
[6] S-NeRF: Neural Radiance Fields for Street, ICLR 2023, arXiv:2303.00749
[7] Block-NeRF: Scalable Large Scene Neural View Synthesis, CVPR 2022, arXiv:2202.05263
[8] Switch-NeRF: Learning Scene Decomposition with Mixture of experts for Large-sacle Neural Radiance Fields, ICLR 2023, https://openreview.net/pdf?id=PQ2zoIZqvm
[9] SceneRF: Self-Supervised Monocular 3D Scene Reconstruction with Radiance Fields, 2023, arXiv:2212.02501
[10] Behind the Scenes: Density Fields for Single View Reconstruction, 2023, arXiv:2301.07668文章来源:https://www.toymoban.com/news/detail-422580.html
文章来源地址https://www.toymoban.com/news/detail-422580.html
到了这里,关于神经网络辐射场NeRF、实时NeRF Baking、有向距离场SDF、占用网络Occupancy、NeRF 自动驾驶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!