头图
👋本文章主要记载有关NeRF和SLAM方面的资料。
作者是科研小白,做此文章一方面是学习记录,同时也想能够获得大家的反馈,从而不断地丰富自己的知识面和方法论,因此希望大家能够不吝赐教,也希望大家能够给我提供一些学习交流的圈子!

教程资料

原生NeRF Paper

http://arxiv.org/abs/2003.08934



【原创】NeRF 三维重建 神经辐射场 建模 算法详解 NeRF相关项目汇总介绍。_哔哩哔哩_bilibili

b站up主讲述NeRF原理,视频分辨率比较低(明明我记得之前是比较清晰的),但是比较直白,容易理解一些NeRF的一些物理含义。(对于新事物的理解,我觉得最快的方法就是找点具象化的东西看看,理解其存在形式和含义,再去看理论基础)



Nerf-Medium

这个Medium上的教程强烈推荐看一下,可以结合论文的公式稍微理解一下(直接看Method部分就ok,带着目的看论文比较容易理解)
注意:Medium遇到很怪的一个点,不登陆免费,登陆反而收费了



体渲染: https://zhuanlan.zhihu.com/p/32431795

其他NeRF的资料

Tutorial for NeRF(对上面那个Medium的教程做的一些记录)

marching cubes是一个生成3D mesh的算法
3D数据的表达形式:从3D voxels到点云到SDF
传统三维构建的共同缺点:

  • 相机:耗时和需要大量数据
  • 雷达:昂贵
  • 人工建模耗费时间和精力
  • 对于高反射物体、“网状”物体,如灌木丛和链状栅栏,或透明物体,都不适合大规模扫描。

影响模型精度:stair-stepping effects and driff

一些综述

来自Frank Dellaert大佬整理的:

NeRF简单讲解

概念

光场,其用不同方向观测角度下的光线扫描三维空间中的每个点,分别有五个变量 、 (分别是空间中点的三维坐标和光线的角度)

为什么只有两个变量,因为在空间中一个点定下来之后,就是经纬度的问题了,不像是描述位姿。

NeRF基于光场(light/radiance fields)。NeRF则是构建从光场的5D空间描述,到4D空间的映射(颜色,强度density),\( c=(R,G,B) \),\( \sigma \) 。density可以理解为光线在五维空间中被截断的likehood,比如遮挡。

NeRF的标准范式 \( F:(x,d) \rightarrow (c, \sigma) \)

在生成式场景重建课题(generalized scene reconstruction)中,给定相机位姿和图像,还有许多SFM系列算法: COLMAP, Agisoft Metashape, Reality Capture, or Meshroom

之前为了做一个项目用了挺多三维重建的现成库:COLMAP、CMVS、Meshroom、VisualSFM等,如果需要请在评论留言,我后面再出一篇文章介绍这些工具的使用。

优势

  • 直接数据驱动
  • 场景的连续表达
  • 隐式考虑物体特性:specularity高光,roughness粗糙度
  • 隐式表达光感

NeRF的流程:

  1. 数据处理
    通过给定位姿和图像,构建射线,通过对射线进行采样生成数据点,采用 coarse-to-fine 的方式,先均匀分段,然后对每个段进行随机采样,这样就用 \( r = o + td \) 来表示每一个采样点,就是 \( r = (x,y,z) \),其中方向 \( d=(\theta ,\phi) \) 就是每个相机坐标的原点和 \( v_c=[0,0,-1] \) 经过 \( T_{wc} \) 转到世界坐标下,注意这里不需要加上 \( v_o \),因为只是代表一个朝向

    Axes3D.quiver(X,Y,Z,U,V,W,/,length=1,...)X,Y,Z 是箭头的起点坐标,U,V,W是箭头的方向组成
    注意:OpenGL和COLMAP数据之间的坐标系问题

    NeRF OpenCV OpenGL COLMAP DeepVoxels坐标系朝向


  1. 分层采样:是对每个均分的 bin 区间通过均匀分布的形式进行采样,这里好像还可以通过逆深度进行表示,主要是在射线中,nearfar 进行分段
    图片


  1. 模型构建通过采样获得初始数据后,就利用NeRF来构建 5D 到 4D 的映射,网络架构如下:

    注意这里的 PositionEncoder 不仅仅是 60,还会包含原来的 3 各个维度,即 L=10 的时候(cos,sin),3*20+3

    PositionEncoding:
    图片

    图片


  1. 训练:网络输出是 rgb_mapdepth_mapacc_mapweights 损失:\( Loss=MSE(rgb\_map,target\_img) \) 由于该过程是直接可微分的,因此可以求导反向传播
    图片

    • Coarse
      首先,需要通过网络输出重新渲染出来一个rgb_map,他的流程是Coarse-to-Fine的,通过一个Coarse的NeRF输出对应的\( c=(R,G,B) ,\sigma \),然后进行加权运算,就是体渲染的过程:

      1. 连续积分方程

      图片

      1. 离散化

      图片

      其中, \( \delta \) 是两个采样点之间的间距, \( \alpha \) 是传统的定义 \( \alpha_i = 1-exp(-\sigma_i \delta_i) \)
    • Fine(Hierarchical Volume sampling)

      通过Coarse网络输出的 \( \sigma \) 计算权重 \( w_i \),然后对用权重构建一个pdf,根据累加得到的cdf进行重要性采样,这里其实跟轮盘赌有点类似,这样会产生一些新的节点 \( N_f \),结合Coarse阶段的采样点 \( N_c \)一并送入到网络中

      Fine这里是将 \( N_F、 N_c \) 进行了cat的

    图片

SDF地图表达

TSDF 是对 SDF 一种截断,即限制栅格地 SDF 值在 -1 到 1 之间。 首先是构建一个栅格坐标系:\( [0,0,0] \),在真实空间中的表达为\( [x_0,y_0,z_0] \),对于每个体素有长宽高,假设都等于l,这样空间的一个点\( [x,y,z] \)就可以表达到TSDF地图中的一个体素坐标。 同样根据这种思想,获得栅格坐标为\( p = [x_g,y_g,z _g] \),就能够转到世界坐标,进而转到相机坐标,通过结合相机的深度图,就知道栅格的TSDF值: \( SDF(x) = cam_z(x) - dist(p) \)

网格生成之TSDF算法学习笔记

图片

图片

光线追踪光线表示:
图片

👏本文参与了SegmentFault 思否写作挑战赛,欢迎正在阅读的你也加入。


02
1 声望1 粉丝