NeRF、NeRF SLAM、Active SLAM系列
本人最近粗略看了一些基于NeRF的工作,原本学习的是SLAM方向,发现有一些NeRF和SLAM结合的工作,并且由于NeRF的地图效果实在给人较好的可视感受,故想要研究一番,并且上研后组内的方向有想向Active SLAM方面做,故也有所涉及。
* 以下观点都是我个人的见解,不正确指出望能批评指正,也是一个获得反馈学习的过程
NeRF、SLAM简述
首先在分析主流工作之前先简述一下NeRF、SLAM的概念。
SLAM
SLAM(Simultaneous Localization And Mapping,同时定位与地图构建),正如字面意思,能够同时完成自身定位和地图构建,这里我们主语可以选用机器人,就是一个机器人如何在未知的环境中通过传感器的输入完成定位、建图,并且两者是相辅相成的,精确的定位能够保证地图的优良性,而反之地图的完美又能够使得传感器数据的匹配更加准确从而获得更加精确的定位。
在我刚上本科的时候好像还是一个比较小众的方向,但是最近几年乘着自动驾驶的快车已经飞速开卷了,但实际上大家还是在卷精度,真正落地的应用,可能还是扫地机器人、餐厅送餐等,总体来说在实现真正的自动驾驶、取代外卖物流等工作还有很长一段路要走,倒是矿厂自动驾驶挖掘机落地还比较快(主要是日常生活环境太复杂了,主要是人)。
NeRF
NeRF(Neural Radiance Field,神经辐射场)是一种以基于光场理论的环境隐式表达。
- 为什么是隐式?
因为NeRF的输出不是常规SLAM中的地图,二维的Cartographer生成的是二维栅格地图、ALOAM等激光SLAM生成的是点云地图、ORB-SLAM2生成稀疏点云、Droid SLAM稠密点云(基于学习的端到端,吊打ORBSLAM3,这就是4张3090的魅力吗,但是建的图也惊艳到我了)[蓝色直接跳转Github]
好的,撤回来说NeRF,NeRF的输入是相机的世界坐标 x , y , z x,y,z x,y,z,朝向 θ \theta θ、 ϕ \phi ϕ,共5D输入,然后输出是该个相机位姿下的图像,怎么样是不是很抽象?所以并没有所谓的几何空间点的表达,一切都隐式地在神经网络里面了。
- 辐射场是什么意思?
辐射场这里指的是光辐射,之前所过NeRF是基于光场利用的,当光线和空间中的粒子接触的时候总会有一部分被吸收、一部分被反射、一部分是物体自己发出的辐射(这里我可能不对光和辐射进行严格区别),其中概念也和计算机图形学中辐射场立体渲染有关,而NeRF则是一种简化的表达,将空间中的任意一个点都给定一个密度值density
记 σ \sigma σ,它也有自己的颜色color
记 c = ( r , g , b ) c=(r,g,b) c=(r,g,b)。 - 而之前所说的图像是怎么获得的呢?
然后依照相机模型,我们可以直观理解一下相机成像,是光线照射到相机成像CMOS/CCD(感光元器件),然后在生成像素。因此正是知道了相机的位置和朝向,从而通过针孔相机模型其实知道每个像素对应于空间中的一条射线的位置,这样就可以通过将射线上的点密度值density
、颜色值color
,进行积分(离散就是累加)得到像素的值,从而生成一张完整的图像,而通过对密度值density
进行积分(求和)就可以得到深度图了。
不搞个视频我怕你们不学了
NeRF的基础学习
接下来是我在从零了解NeRF过程中收集的一些学习资料,希望能够给大家带来一些帮助,我也刚开始了解这个方向几个星期,希望不要误人子弟,哈哈哈
原生NeRF
NeRF的诞生就是ECCV 2020的一篇Paper吧。
- 新世界的大门:http://arxiv.org/abs/2003.08934
- Github:https://github.com/bmild/nerf
- Pytorch版本:https://github.com/yenchenlin/nerf-pytorch
教程资料
代码实践
Tutorial for NeRF
地址:Medium(不登录反而能看)
个人记录针对上面教程的记录:
marching cubes是一个生成3D mesh的算法,从NeRF网络恢复3D模型所用的方法
3D数据的表达形式:从3D voxels到点云到SDF
传统三维构建的共同缺点:
相机:耗时和需要大量数据
雷达:昂贵
人工建模
对于高反射物体、“网状”物体,如灌木丛和链状栅栏,或透明物体,都不适合大规模扫描。
影响模型精度:stair-stepping effects and driff
概念
光场,其用不同方向观测角度下的光线扫描三维空间中的每个点,分别有五个变量 x = ( x , y , z ) x =(x,y,z) x=(x,y,z)、 d = ( θ , ϕ ) d=(\theta ,\phi) d=(θ,ϕ)(分别是空间中点的三维坐标和光线的角度)
为什么只有两个变量,因为在空间中一个点定下来之后,就是经纬度的问题了,不像是描述位姿。
NeRF基于光场(light/radiance fields)。NeRF则是构建从光场的5D空间描述,到4D空间的映射(颜色,强度density), c = ( R , G , B ) , σ c=(R,G,B),\sigma c=(R,G,B),σ。density可以理解为光线在五维空间中被截断的likehood,比如遮挡。
NeRF的标准范式: F : ( x , d ) → ( c , σ ) F:(x,d) \rightarrow (c,\sigma) F:(x,d)→(c,σ)
在生成式场景重建课题(generalized scene reconstruction)中,给定相机位姿和图像,还有许多SFM系列算法: COLMAP, Agisoft Metashape, Reality Capture, or Meshroom
NeRF的几个过程
数据处理
通过给定位姿和图像,构建射线,通过对射线进行采样生成数据点,采用Coarse-to-fine的方式,先均匀分段,然后对每个段进行随机采样,这样就用 r = o + t d r = o + td r=o+td 来表示每一个采样点,就是 r = ( x , y , z ) r = (x,y,z) r=(x,y,z),其中方向 d = ( θ , ϕ ) d=(\theta ,\phi) d=(θ,ϕ) 就是每个相机坐标的原点和 v c = [ 0 , 0 , − 1 ] v_c=[0,0,-1] vc=[0,0,−1] 经过 T w c T_{wc} Twc 转到世界坐标下,注意这里不需要加上 v o v_o vo ,因为只是代表一个朝向
Axes3D.quiver(X,Y,Z,U,V,W,/,length=1,…)
X,Y,Z是箭头的起点坐标,U,V,V是箭头的方向组成
注意OpenGL和COLMAP数据之间的坐标系问题
https://blog.csdn.net/OrdinaryMatthew/article/details/126670351
分层采样:
是对每个均分的bin
区间通过均匀分布的形式进行采样,这里好像还可以通过逆深度进行表示,主要是在射线中,near
到far
进行分段
模型构建
通过采样获得初始数据后,就利用NeRF来构建5D到4D的映射,网络架构如下:
注意这里的PositionEncoder不仅仅是60,还会包含原来的3各个维度,即
L
=
10
L=10
L=10的时候(cos,sin),编码后维度:3*20+3
○ PositionEncoding:
NeRF的优势
● 直接数据驱动
● 场景的连续表达
● 隐式考虑物体特性:specularity高光,roughness粗糙度
● 隐式表达光感
A overview of NeRF
不同类型的NeRF工作
A litany of papers have since sought to expand the functionality of the original with features such as few-shot and one-shot learning[2, 3], support for dynamic scenes[4, 5], generalizing the light field into feature fields[6], learning from uncalibrated image collections from the web[7], combining with LiDAR data[8], large-scale scene representation[9], learning without a neural network[10], and many more. For some great overviews of NeRF research, see this great overview from 2020 and another overview from 2021 both by Frank Dellaert.
SLAM学术界的泰斗,Frank Dallaert(https://dellaert.github.io/),gtsam的作者,也开始转行研究NeRF,可见NeRF的价值和对视觉SLAM的意义。Frank大佬写了一系列NeRF相关文章的综述。
● https://link.zhihu.com/?target=https%3A//dellaert.github.io/NeRF/
● https://link.zhihu.com/?target=https%3A//dellaert.github.io/NeRF21/
● https://link.zhihu.com/?target=https%3A//dellaert.github.io/NeRF22/
第一次先分享这么多吧,后续还会单独更新一个专栏,分别对NeRF的论文进行归纳整理