NeRF-SLAM: Real-Time Dense Monocular SLAM with Neural Radiance Fields
第一个结合稠密单目SLAM和层次化体素神经辐射场(hierarchical volumetric neural radiance fields)的3D场景重建算法,能实时地用图像序列实现准确的辐射场构建,并且不需要位姿或深度输入。
核心思想是,使用一个稠密单目SLAM pipeline来估计相机位姿和稠密深度图以及它们的不确定度,用上述信息作为监督信号来训练NeRF场景表征
Rosinol等人 基于方差对深度估计值赋予权重,然后将它们融合到体素表征中,从而构建准确的场景表征(3D网格)。
Rosinol et al. [23] further show that dense monocular SLAM can reconstruct faithful 3D meshes of the scene by weighting the depths estimated in dense SLAM by their marginal covariance, and subsequently fusing them in a volumetric representation
本文从上述工作中获得启发,用他们的方法来计算深度和位姿不确定度。但是将场景表征由 volumetric TSDF 换成了 hierarchical volumetric neural radiance field
Instant-NGP 用了 基于哈希的层次化体素表征 hash-based hierarchical volumetric representation 来表征场景,实现实时的神经辐射场训练。
Droid-SLAM 使用了SOTA的稠密光流估计架构(a state-of-the-art dense optical flow estimation architecture )作为视觉里程计,同时,使用了降采样后的深度图来规避维度问题。
Droid-SLAM avoids the dimensionality problem by using downsampled depth maps that are subsequently upsampled using a learned upsampling operator
本文用Droid-SLAM作为前端(tracking frontend),使用了其预训练的权重
本文算法包含tracking和mapping两个并行运行的线程,其中 tracking 作为前端,使用稠密单目(dense monocular)SLAM估计稠密深度图(dense depth maps)和相机位姿,同时会输出对深度和位姿的不确定度估计;mapping 后端使用前端的输出信息作为监督,训练一个辐射场(radiance field),其损失函数是颜色误差(color loss)和带权重的深度误差(depth loss weighted by the depths’ marginal covariances),权重值由先前的不确定度得到。
跟踪线程使用Driod-SLAM,由每个关键帧计算 dense depth maps 和位姿。
首先,计算两帧之间的稠密光流 p i j \bold p_{ij} pij 以及权重 Σ p i j \Sigma_{\bold p_{ij}} Σpij。这里使用的是与Raft类似的架构,其核心是 Convolutional GRU
然后利用光流(flow)和权重作为测量值,建立BA问题,其中用逆深度图(inverse depth maps)表示每个关键帧的3D几何,最终可以转化为线性最小二乘问题,需要求解线性方程组 H x = b Hx=b Hx=b,即
[ C E E T P ] [ Δ ξ Δ d ] = [ v w ] \begin{bmatrix}C&E\\E^T&P\end{bmatrix}\begin{bmatrix}\Delta\boldsymbol\xi\\\Delta\bold d\end{bmatrix}=\begin{bmatrix}\bold v\\\bold w\end{bmatrix} [CETEP][ΔξΔd]=[vw]
为了解决这个线性最小二乘问题,先用 schur complement 方法将Hessian矩阵降维成 reduced camera matrix 。
利用高斯消元法:
[ I − E P − 1 0 I ] [ C E E T P ] [ Δ ξ Δ d ] = [ I − E P − 1 0 I ] [ v w ] [ C − E P − 1 E T 0 E T P ] [ Δ ξ Δ d ] = [ v − E P − 1 w w ] \begin{aligned}\begin{bmatrix}I&-EP^{-1}\\0&I\end{bmatrix}\begin{bmatrix}C&E\\E^T&P\end{bmatrix}\begin{bmatrix}\Delta\boldsymbol\xi\\\Delta\bold d\end{bmatrix}=\begin{bmatrix}I&-EP^{-1}\\0&I\end{bmatrix}\begin{bmatrix}\bold v\\\bold w\end{bmatrix}\\ \begin{bmatrix}C-EP^{-1}E^T&0\\E^T&P\end{bmatrix}\begin{bmatrix}\Delta\boldsymbol\xi\\\Delta\bold d\end{bmatrix}=\begin{bmatrix}\bold v-EP^{-1}\bold w\\\bold w\end{bmatrix} \end{aligned} [I0−EP−1I][CETEP][ΔξΔd]=[I0−EP−1I][vw][C−EP−1ETET0P][ΔξΔd]=[v−EP−1ww]
这样,得到 reduced camera matrix H T = C − E P − 1 E T H_T=C-EP^{-1}E^T HT=C−EP−1ET
然后采用 cholesky 分解,利用 front and back-substitution 求出位姿 T T T,然后再求出深度 D D D
先求解 H T Δ ξ = v − E P − 1 w H_T\Delta\boldsymbol\xi=\bold v-EP^{-1}\bold w HTΔξ=v−EP−1w(使用cholesky分解),得到位姿更新量 Δ ξ = [ C − E P − 1 E T ] − 1 ( v − E P − 1 w ) \Delta\boldsymbol\xi=[C-EP^{-1}E^T]^{-1}(\bold v-EP^{-1}\bold w) Δξ=[C−EP−1ET]−1(v−EP−1w)
进而求深度更新量 Δ d = P − 1 ( w − E T Δ ξ ) \Delta\bold d=P^{-1}(\bold w-E^T\Delta\boldsymbol\xi) Δd=P−1(w−ETΔξ)
Cholesky分解求解线性方程组 A X = b AX=b AX=b
对 A A A作cholesky分解( A A A需要时对称正定矩阵)
A = L L T A=LL^T A=LLT原线性方程转换为 L L T X = b LL^TX=b LLTX=b,令 L Y = b LY=b LY=b,求 Y Y Y
Y = L − 1 b Y=L^{-1}b Y=L−1bL L T X = L Y ⟶ L T X = Y LL^TX=LY\longrightarrow L^TX=Y LLTX=LY⟶LTX=Y,求 X X X
X = L − T Y X=L^{-T}Y X=L−TY
利用上一步计算出来的深度和位姿再一次计算光流 p i j = ∏ ( T i j ∏ − 1 ( p i , d i ) ) \bold p_{ij}=\prod(\bold T_{ij}\prod^{-1}(\bold p_i,\bold d_i)) pij=∏(Tij∏−1(pi,di))并作为GRU的初始估计值
然后,计算稠密深度图和位姿的边缘协方差(marginal covariances)
Σ d = P − 1 + P − T E T Σ T E P − 1 Σ T = ( L L T ) − 1 \begin{aligned} \Sigma_{\bold d}&=P^{-1}+P^{-T}E^T\Sigma_{\bold T}EP^{-1}\\ \Sigma_{\bold T}&=(LL^T)^{-1} \end{aligned} ΣdΣT=P−1+P−TETΣTEP−1=(LLT)−1
这里是怎么计算的?
根据协方差矩阵、信息矩阵与边际概率(即本文中提到的marginal covariances)、条件概率的关系, d , T \bold d,\bold T d,T的边际概率分别为协方差矩阵的左上元素和右下元素。
而Hessian矩阵 H H H就是信息矩阵,即协方差矩阵的逆,因此,首先要求协方差矩阵即为对 H H H求逆
利用 Schur complement 对 H H H进行分解以便于求逆:
H = [ I E P − 1 0 I ] [ C − E P − 1 E T 0 0 P ] [ I 0 P − 1 E T I ] H=\begin{bmatrix}I&EP^{-1}\\0&I\end{bmatrix}\begin{bmatrix}C-EP^{-1}E^T&0\\0&P\end{bmatrix}\begin{bmatrix}I&0\\P^{-1}E^T&I\end{bmatrix} H=[I0EP−1I][C−EP−1ET00P][IP−1ET0I]
求逆:
Σ = H − 1 = [ I 0 − P − 1 E T I ] [ ( C − E P − 1 E T ) − 1 0 0 P − 1 ] [ I − E P − 1 0 I ] \Sigma=H^{-1}=\begin{bmatrix}I&0\\-P^{-1}E^T&I\end{bmatrix}\begin{bmatrix}(C-EP^{-1}E^T)^{-1}&0\\0&P^{-1}\end{bmatrix}\begin{bmatrix}I&-EP^{-1}\\0&I\end{bmatrix} Σ=H−1=[I−P−1ET0I][(C−EP−1ET)−100P−1][I0−EP−1I]
求对角元素:
Σ T = ( C − E P − 1 E T ) − 1 = ( L L T ) − 1 Σ d = P − 1 E T ( C − E P − 1 E T ) − 1 E P − 1 + P − 1 = P − 1 + P − T E T Σ T E P − 1 \Sigma_{\bold T}=(C-EP^{-1}E^T)^{-1}=(LL^T)^{-1}\\ \Sigma_{\bold d}=P^{-1}E^T(C-EP^{-1}E^T)^{-1}EP^{-1}+P^{-1}=P^{-1}+P^{-T}E^T\Sigma_{\bold T}EP^{-1} ΣT=(C−EP−1ET)−1=(LLT)−1Σd=P−1ET(C−EP−1ET)−1EP−1+P−1=P−1+P−TETΣTEP−1
最后,将上面计算出来的信息( D , T , Σ d , Σ T \bold D,\bold T,\Sigma_{\bold d},\Sigma_{\bold T} D,T,Σd,ΣT)作为监督来训练NeRF表征
Mapping线程最小化建图损失函数 L M ( T , Θ ) \mathcal{L}_M(\bold T,\Theta) LM(T,Θ):
L M ( T , Θ ) = L r g b ( T , Θ ) + λ D L D ( T , Θ ) \mathcal{L}_M(\bold T,\Theta)=\mathcal{L}_{rgb}(\bold T,\Theta)+\lambda_D\mathcal{L}_D(\bold T,\Theta) LM(T,Θ)=Lrgb(T,Θ)+λDLD(T,Θ)
颜色损失函数为光度误差:
L r g b ( T , Θ ) = ∥ I − I ⋆ ( T , Θ ) ∥ 2 \mathcal{L}_{rgb}(\bold T,\Theta)=\Vert I-I^\star(\bold T,\Theta)\Vert^2 Lrgb(T,Θ)=∥I−I⋆(T,Θ)∥2
其中图像中每个点的像素值的计算方法与原始NeRF论文一致:
C = ∑ i T i ( 1 − exp ( − σ i δ i ) ) c i C=\sum_i\mathcal{T}_i(1-\exp(-\sigma_i\delta_i))\bold c_i C=i∑Ti(1−exp(−σiδi))ci
透射率(transmittance)定义与NeRF一致:
T i = exp ( − ∑ j < i σ j δ j ) \mathcal{T}_i=\exp(-\sum_{jTi=exp(−j<i∑σjδj)
几何损失函数考虑到了深度的不确定度(即深度的marginal covariances) Σ D \Sigma_{\bold D} ΣD
L D ( T , Θ ) = ∥ D − D ⋆ ( T , Θ ) ∥ Σ D 2 \mathcal{L}_D(\bold T,\Theta)=\Vert D-D^\star(\bold T,\Theta)\Vert^2_{\Sigma_{\bold D}} LD(T,Θ)=∥D−D⋆(T,Θ)∥ΣD2
每一点的深度值由如下方式计算:
d ⋆ = ∑ i T i ( 1 − exp ( − σ i δ i ) ) d i d^\star=\sum_i\mathcal{T}_i(1-\exp(-\sigma_i\delta_i))d_i d⋆=i∑Ti(1−exp(−σiδi))di
此外,MLP输入的形式参考了Instant-NGP(用于网络加速)
仅当有新关键帧生成时,Tracking线程将新关键帧的位姿、RGB图、深度图以及深度的边缘协方差传递给Mapping线程
只有在Tracking线程滑动窗口内的信息会被传给Mapping
滑动窗口法中最多包含8个关键帧
当当前帧与先前关键帧之间的平均光流大于一定阈值时,会生成新的关键帧
内存占用很大