Motivation
首个基于RGB-D相机,用MLP做场景表征实时SLAM系统
传统的稠密建图SLAM使用占用栅格图 occupancy map 或者 signed distance function 做场景表征,占用的内存空间很大;
相比于传统的TSDF场景表征方法,iMAP能重建出未被观察到的地方;
隐式场景表征 implicit scene representation 可以用来做相机位姿估计,但是都是离线形式,计算需求量大,本文使用深度图像能达到实时效果;
持续学习 continual learning 往往会遇到灾难性遗忘 catastrophic forgetting 的问题,本文采用 replay-based approach,将先前的结果缓存。
Method
分为两个线程,Tracking 固定网络(场景表征),优化当前帧对应的相机位姿;Mapping 对网络和选定的关键帧做联合优化。
-
implicit scene neural network
借鉴NeRF,用一个MLP将3D坐标点转换成颜色和体积密度值:
p = ( x , y , z ) F θ ( p ) = ( c , ρ ) \bold p=(x,y,z)\\ F_\theta(\bold p)=(\bold c,\rho) p=(x,y,z)Fθ(p)=(c,ρ)
但是与NeRF有区别,没有考虑视角方向(因为不需要对镜面反射建模)论文中还提到了 Gaussian positional embedding 将输入的3D坐标转换到n维空间(?)
-
Depth and Color rendering
通过 query 得到的 scene network 来从指定视角得到深度和颜色图像
输入是相机位姿 T W C T_{WC} TWC和像素坐标 [ u , v ] [u,v] [u,v],先反投影到世界坐标系:
r = T W C K − 1 [ u , v ] \bold r=T_{WC}K^{-1}[u,v] r=TWCK−1[u,v]
然后在视角射线上采样:
p i = d i r d i ∈ { d 1 , … , d N } \bold p_i=d_i\bold r\qquad d_i\in\{d_1,\dots,d_N\} pi=dirdi∈{d1,…,dN}
Query 之前得到的场景网络得到颜色和体积密度:
( c i , ρ i ) = F θ ( p i ) (\bold c_i,\rho_i)=F_\theta(\bold p_i) (ci,ρi)=Fθ(pi)
将体积密度转换为占据概率 occupancy probability :
δ i = d i + 1 − d i o i = 1 − exp ( − ρ i δ i ) w i = o i ∏ j = 1 i − 1 ( 1 − o j ) \delta_i=d_{i+1}-d_i\\ o_i=1-\exp(-\rho_i\delta_i)\\ w_i=o_i\prod_{j=1}^{i-1}(1-o_j) δi=di+1−dioi=1−exp(−ρiδi)wi=oij=1∏i−1(1−oj)
得到深度和颜色:
D ^ [ u , v ] = ∑ i = 1 N w i d i I ^ [ u , v ] = ∑ i = 1 N w i c i \hat{D}[u,v]=\sum^N_{i=1}w_id_i\\ \hat{I}[u,v]=\sum^N_{i=1}w_i\bold c_i D^[u,v]=i=1∑NwidiI^[u,v]=i=1∑Nwici
计算深度的方差:
D ^ v a r [ u , v ] = ∑ i = 1 N w i ( D ^ [ u , v ] − d i ) 2 \hat{D}_{var}[u,v]=\sum^N_{i=1}w_i(\hat{D}[u,v]-d_i)^2 D^var[u,v]=i=1∑Nwi(D^[u,v]−di)2 -
joint optimisation
用关键帧集合,针对网络参数和相机位姿做联合优化。使用ADAM优化器,使用的loss是光度误差和几何误差的加权
光度误差 photometric error :
几何误差 geometric error,使用到了深度的方差 :
上面提到的都是 Mapping 阶段
Tracking 阶段,与Mapping并行但是频率更高,针对 latest frame ,固定场景网络,使用之前提到的loss和优化器优化位姿
-
Keyframe selection
考虑到计算的复杂度和图像的冗余性(redundancy),基于 information gain 选取关键帧。
第一帧一定会被选取,用来做网络初始化和世界坐标系的固定;
每新增一个关键帧,保存一次network作为snapshot(之前提到的防止 catastrophic forgetting 的缓存机制);
后续关键帧的选取方法是,与snapshot做比较,看是否观察到了新区域。
具体做法:
-
在 snapshot 和 frame 上随机选取 s 个像素点
-
比较深度值差异,计算如下一个分数,然后与阈值做比较,小于就加入关键帧:
-
-
Active sampling
为了减少计算的复杂度,本文分别对像素点、关键帧都做了 Active Sampling
-
image active sampling
这一步要对图像随机选点,但是要针对性地选择,更有价值(细节多、重建不够precise)的图像块要取更多的点。
选取方法是先分块,先均匀采样,分块求loss,计算每一块的权重,然后再根据权重采样。
-
keyframe active sampling
为了限制联合优化的计算复杂度,每次迭代只选三个关键帧。同上,也是计算loss在分配权重
-
Conclusion
MLP的结构收敛速度不够快,考虑结合instant-NGP?