《NICE-SLAM: Neural Implicit Scalable Encoding for SLAM》是 2022 年 CVPR 收录的一篇开创性论文,提出了一种将 神经隐式表示 与 层次化体素编码 相结合的稠密 RGB-D SLAM 系统。下面将系统性介绍其算法原理、关键策略、公式推导思路以及创新点。
一、算法整体框架概览
NICE-SLAM 结合了以下几个模块:
- Tracking 模块:使用基于渲染的 Pose 优化方法进行相机位姿估计;
- Mapping 模块:通过神经网络学习隐式场景几何(SDF)和颜色;
- 层次化体素网格表示:采用 coarse-to-fine 层次化的 feature grid 编码场景信息;
- 先验引导:通过预训练的几何 auto-decoder 引导几何表示学习。
二、核心公式与推导思路
1. 神经隐式场景表示(Neural Implicit Representation)
使用一个多层感知机(MLP)建模 场景几何(SDF) 和 颜色:
f θ ( x , z ( x ) ) → ( SDF ( x ) , RGB ( x ) ) f_{\theta}(x, \mathbf{z}(x)) \rightarrow \left( \text{SDF}(x), \text{RGB}(x) \right) fθ(x,z(x))→(SDF(x),RGB(x))
其中:
- x ∈ R 3 x \in \mathbb{R}^3 x∈R3:查询点的三维坐标;
- z ( x ) \mathbf{z}(x) z(x):从 feature grid 中获取的局部特征;
- θ \theta θ:神经网络参数。
2. 层次化体素特征编码(Hierarchical Feature Grid)
场景被划分为 coarse → mid → fine 的三个分辨率网格,每一层都有其独立的特征张量 F l \mathcal{F}_l Fl:
z ( x ) = ϕ ( x , F c o a r s e , F m i d , F f i n e ) \mathbf{z}(x) = \phi(x, \mathcal{F}_{coarse}, \mathcal{F}_{mid}, \mathcal{F}_{fine}) z(x)=ϕ(x,Fcoarse,Fmid,Ffine)
ϕ \phi ϕ:三线性插值函数。
3. Tracking:基于渲染的 Pose 优化
通过将当前帧渲染为深度图 D ^ \hat{D} D^,并与观测深度图 D D D 对比,优化相机位姿:
min T ∈ S E ( 3 ) ∑ x ∈ Ω ∥ D ( x ) − D ^ ( x ; T , f θ ) ∥ 2 \min_{T \in SE(3)} \sum_{x \in \Omega} \left\| D(x) - \hat{D}(x; T, f_{\theta}) \right\|^2 T∈SE(3)minx∈Ω∑ D(x)−D^(x;T,fθ) 2
渲染深度图通过体渲染(volume rendering)方式进行,采用沿光线查找零交点的方法(Zero-Crossing of SDF)。
4. Mapping:反向传播优化 feature grid
对于每一帧,将其加入优化窗口,反向传播误差更新:
- MLP 参数 θ \theta θ
- Grid 特征 F l \mathcal{F}_l Fl
目标是最小化所有帧的重建误差,包括:
- RGB 重建误差;
- SDF → TSDF 转换后的深度误差;
- Eikonal 正则项(保持 SDF 梯度为 1)。
5. Eikonal Loss(SDF 正则化)
L e i k o n a l = E x [ ( ∥ ∇ x SDF ( x ) ∥ 2 − 1 ) 2 ] \mathcal{L}_{eikonal} = \mathbb{E}_{x} \left[ \left( \|\nabla_x \text{SDF}(x)\|_2 - 1 \right)^2 \right] Leikonal=Ex[(∥∇xSDF(x)∥2−1)2]
该项确保 SDF 是合法的 signed distance 函数(单位梯度)。
三、主要创新点
创新点 | 说明 |
---|---|
多尺度体素特征(Hierarchical Grid) | 结合 coarse/mid/fine 三层特征,实现高效可扩展的场景编码;可适应大规模环境 |
引入预训练几何先验 | 在初始阶段将 auto-decoder 生成的 SDF 模型作为初始几何,有助于早期收敛 |
Alternating Tracking/Mapping 策略 | 每帧 alternately 进入 tracking → mapping 模块,提升了实时性能与精度 |
稀疏体素更新 | 仅在相机视野范围内更新特征,提高效率 |
高效的体渲染 | 利用 SDF 隐式曲面投影而非显式体素,实现更精细的几何细节表达 |
四、主要部分公式推导
- SDF 渲染过程推导(Ray Marching)
- TSDF 监督公式与损失函数
- Pose 优化中的梯度推导(反向传播到位姿)
4.1、SDF 渲染过程推导
1、 背景:使用隐式函数表示表面
隐式表面用 Signed Distance Function(SDF)定义:
$$
\text{SDF}(x) =
\begin{cases}
< 0 & \text{inside surface} \
= 0 & \text{on surface} \
0 & \text{outside surface}
\end{cases}
$$
目标是获取每条光线上与 SDF = 0 曲面的交点,来渲染深度。
2、 Ray Marching (零交点查找)
对每个像素 u ∈ Ω u \in \Omega u∈Ω,从相机出发发出一条光线:
r ( t ) = o + t ⋅ d , t ∈ [ t m i n , t m a x ] r(t) = o + t \cdot d, \quad t \in [t_{min}, t_{max}] r(t)=o+t⋅d,t∈[tmin,tmax]
- o o o:相机中心;
- d d d:归一化光线方向(通过内参和像素坐标计算)。
沿这条光线采样多个点:
x i = r ( t i ) , t i = t 0 + i ⋅ Δ t x_i = r(t_i), \quad t_i = t_0 + i \cdot \Delta t xi=r(ti),ti=t0+i⋅Δt
查找某一段 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1],满足:
SDF ( x i ) ⋅ SDF ( x i + 1 ) < 0 \text{SDF}(x_i) \cdot \text{SDF}(x_{i+1}) < 0 SDF(xi)⋅SDF(xi+1)<0
即过零点。可使用 线性插值 获取交点:
t ∗ = t i + SDF ( x i ) SDF ( x i ) − SDF ( x i + 1 ) ⋅ Δ t t^* = t_i + \frac{\text{SDF}(x_i)}{\text{SDF}(x_i) - \text{SDF}(x_{i+1})} \cdot \Delta t t∗=ti+SDF(xi)−SDF(xi+1)SDF(xi)⋅Δt
得到深度值:
D ^ ( u ) = ∥ r ( t ∗ ) − o ∥ = t ∗ \hat{D}(u) = \|r(t^*) - o\| = t^* D^(u)=∥r(t∗)−o∥=t∗
3 、深度渲染损失(Tracking Loss)
L depth = ∑ u ∈ Ω ( D ^ ( u ; T ) − D ( u ) ) 2 \mathcal{L}_{\text{depth}} = \sum_{u \in \Omega} \left( \hat{D}(u; T) - D(u) \right)^2 Ldepth=u∈Ω∑(D^(u;T)−D(u))2
- D ^ ( u ; T ) \hat{D}(u; T) D^(u;T):根据当前相机姿态 T ∈ S E ( 3 ) T \in SE(3) T∈SE(3) 渲染出的深度;
- D ( u ) D(u) D(u):实测深度图。
4.2、TSDF 监督损失推导(Mapping Loss)
监督目标:使网络估计的 SDF 与 ground truth 的 TSDF 相匹配。
1、 TSDF 定义(截断 Signed Distance)
真实 TSDF:
TSDF g t ( x ) = sign ( D ( u ) − ∥ x − o ∥ ) ⋅ min ( ∣ D ( u ) − ∥ x − o ∥ ∣ τ , 1.0 ) \text{TSDF}_{gt}(x) = \text{sign}(D(u) - \|x - o\|) \cdot \min\left( \frac{|D(u) - \|x - o\||}{\tau}, 1.0 \right) TSDFgt(x)=sign(D(u)−∥x−o∥)⋅min(τ∣D(u)−∥x−o∥∣,1.0)
- τ \tau τ:截断距离;
- x x x:投影自像素 u u u;
- D ( u ) D(u) D(u):深度图中真实值。
神经网络预测:
SDF ^ ( x ) = f θ ( x , z ( x ) ) \hat{\text{SDF}}(x) = f_\theta(x, \mathbf{z}(x)) SDF^(x)=fθ(x,z(x))
2、TSDF 监督损失函数
L TSDF = ∑ x ∈ V ( SDF ^ ( x ) − TSDF g t ( x ) ) 2 \mathcal{L}_{\text{TSDF}} = \sum_{x \in \mathcal{V}} \left( \hat{\text{SDF}}(x) - \text{TSDF}_{gt}(x) \right)^2 LTSDF=x∈V∑(SDF^(x)−TSDFgt(x))2
- V \mathcal{V} V:当前可见体素集合。
3 、总 Mapping Loss 结构
L map = L TSDF + λ e i k o n a l ⋅ L eikonal + λ r g b ⋅ L r g b \mathcal{L}_{\text{map}} = \mathcal{L}_{\text{TSDF}} + \lambda_{eikonal} \cdot \mathcal{L}_{\text{eikonal}} + \lambda_{rgb} \cdot \mathcal{L}_{rgb} Lmap=LTSDF+λeikonal⋅Leikonal+λrgb⋅Lrgb
4.3、Pose 优化中的梯度推导(Tracking)
1、 优化目标
我们要优化相机位姿 T ∈ S E ( 3 ) T \in SE(3) T∈SE(3):
T = [ R t 0 1 ] , R ∈ S O ( 3 ) , t ∈ R 3 T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}, \quad R \in SO(3),\ t \in \mathbb{R}^3 T=[R0t1],R∈SO(3), t∈R3
优化目标是最小化渲染误差:
L ( T ) = ∑ u ( D ^ ( u ; T ) − D ( u ) ) 2 \mathcal{L}(T) = \sum_{u} \left( \hat{D}(u; T) - D(u) \right)^2 L(T)=u∑(D^(u;T)−D(u))2
2、 参数化位姿增量(李代数)
采用李代数 ξ ∈ R 6 \xi \in \mathbb{R}^6 ξ∈R6 表示增量:
T new = exp ( ξ ^ ) ⋅ T old T_{\text{new}} = \exp(\hat{\xi}) \cdot T_{\text{old}} Tnew=exp(ξ^)⋅Told
其中 exp ( ξ ^ ) ∈ S E ( 3 ) \exp(\hat{\xi}) \in SE(3) exp(ξ^)∈SE(3) 是指数映射。
3、 使用链式法则计算梯度
目标是:
∂ L ∂ ξ = ∑ u 2 ( D ^ ( u ; ξ ) − D ( u ) ) ⋅ ∂ D ^ ( u ; ξ ) ∂ ξ \frac{\partial \mathcal{L}}{\partial \xi} = \sum_u 2 \left( \hat{D}(u; \xi) - D(u) \right) \cdot \frac{\partial \hat{D}(u; \xi)}{\partial \xi} ∂ξ∂L=u∑2(D^(u;ξ)−D(u))⋅∂ξ∂D^(u;ξ)
而渲染深度 D ^ \hat{D} D^ 依赖于光线上 SDF 的零交点 → 所以反向传播路径为:
ξ → T(ξ) → x_cam = T·x_world → SDF(x) → hatD → L
可通过 PyTorch 的自动求导或手动反推链式导数实现。
总结表
模块 | 公式 | 说明 |
---|---|---|
SDF 渲染 | t ∗ = t i + SDF ( x i ) SDF ( x i ) − SDF ( x i + 1 ) ⋅ Δ t t^* = t_i + \frac{\text{SDF}(x_i)}{\text{SDF}(x_i) - \text{SDF}(x_{i+1})} \cdot \Delta t t∗=ti+SDF(xi)−SDF(xi+1)SDF(xi)⋅Δt | 从零交点处计算深度 |
TSDF 监督 | L T S D F = ∑ ( SDF ^ − TSDF g t ) 2 \mathcal{L}_{TSDF} = \sum \left( \hat{\text{SDF}} - \text{TSDF}_{gt} \right)^2 LTSDF=∑(SDF^−TSDFgt)2 | 显式 TSDF 引导隐式学习 |
Pose 优化 | ∂ L ∂ ξ \frac{\partial \mathcal{L}}{\partial \xi} ∂ξ∂L | 利用 SE(3) 李代数优化位姿 |
四、实验与性能
- 在 Replica, ScanNet, TUM RGB-D 等数据集上进行了测试;
- 比较对象包括:iMAP, Vox-Fusion, NICE-SLAM (ablation),在重建质量和运行效率上优于对手;
- 重建分辨率达到 512³,支持在线大规模场景建图。