工业控制
作者:泡椒味的口香糖 |
NeRF这两年真的是火出天际,ICCV 2023有非常多的NeRF文章,有优化速度精度的,也有动态环境这样的特殊场景NeRF。但NeRF和SLAM结合还是一个很新兴的方向,首先实时性难以保证,结合更多的也是去进行稠密建图,像iMAP和NICE-SLAM这样同时优化位姿和建图的还比较少见,估计出的位姿精度也明显低于传统SLAM,大尺度范围建图存在遗忘问题,包括回环检测的就更少了。
GO-SLAM这项工作似乎在一定程度上解决了这个问题,来自ICCV 2023最新开源的工作,是一个实时优化位姿和稠密建图的NeRF SLAM框架。笔者觉得最大的亮点在于引入回环和BA来校正轨迹和3D场景,很大程度上拉近NeRF SLAM和传统SLAM的轨迹精度,这在以前的工作中是没有的,因为回环很容易让位姿和NeRF直接割裂。
今天笔者将带领读者阅读这项工作,当然笔者水平有限,如何有理解不当的地方欢迎大家一起讨论。
1. 效果展示
先来看看具体的运行效果。
GO-SLAM主要还是基于NeRF进行稠密重建,可以发现相较于NICE-SLAM这些SOTA方案,GO-SLAM重建场景的全局一致性更好,这主要是因为它引入了回环和全局BA来优化累计误差。
对于各种室内场景的3D稠密重建,都取得了相当不错的效果。
还有在EuRoC数据集上的定性重建结果。相较于DROID-SLAM,GO-SLAM的重建效果更加干净!
2. 摘要
神经隐式表示最近在稠密同步定位与地图构建( Simultaneous Localization And Mapping,SLAM )上展示了令人信服的结果,但在重建过程中存在相机跟踪误差和畸变的积累。为此,本文提出了一种基于深度学习的稠密视觉SLAM框架GO-SLAM,对位姿进行全局优化,并进行实时三维重建。鲁棒的姿态估计是其核心,由有效的闭环和在线完全BA支持,通过利用输入帧完整历史的学习全局几何来优化每一帧。同时,我们实时更新隐式和连续的表面表示,以确保三维重建的全局一致性。在各种合成和真实数据集上的实验结果表明,GO-SLAM在跟踪鲁棒性和重建精度方面优于现有方法。此外,GO-SLAM具有通用性,可以在单目、双目和RGB-D输入下运行。
3. 算法解析
GO-SLAM是最新的进行隐式3D重建的SLAM方案,一方面不断更新全局位姿,另一方面重建实时、连续的稠密3D场景。
GO-SLAM由三个并行线程组成:前端跟踪、后端跟踪,以及实例建图。GO-SLAM的前端跟踪线程是直接用的DROID-SLAM的跟踪模块,后面训练过程也是直接调的DROID-SLAM的预训练权重,只不过加入了新的回环和BA优化。然后使用RAFT来计算新一帧相对于最后一个关键帧的光流,如果平均流大于阈值,则创建新关键帧。后端跟踪线程的重点是通过全BA生成全局一致的位姿和深度预测。最后,实例建图线程根据最新的位姿信息实时更新三维重建。GO-SLAM的输入可以是单目双目,还可以是RGB-D,非常的通用!
那么回环检测如何实现呢?
这里还是一个基于关键帧的图优化问题。这个回环过程分为两步:
(1)选择最近N个局部关键帧之间的高可视性连接;
(2)从局部关键帧和局部窗口外的历史帧检测回环关系。
具体的实现过程中,作者为回环检测和BA建立了一个大的共视矩阵,矩阵元素是通过反投影得到的平均刚体光流。如果平均光流大于阈值,则被认为共视程度低,会被直接滤除掉。共视矩阵的维度就是Nx关键帧数量。
共视矩阵建立以后,就可以为具有邻接关系和高共视关系的关键帧对建立优化边,也就是图中的红色方框。这里还有一个trick,就是为了避免冗余,当优化边(两个关键帧的连接关系)加入到图以后,就会抑制这两个关键帧的邻域关系。具体的回环检测流程是,从共视矩阵的未探索部分按共视程度降序采样,连续检测三个回环候选帧,如果平均流均低于阈值,则认为检测到了回环,然后进行优化。这个方法其实和ORB-SLAM2很像。
之后,就可以进行优化,这里是直接使用DBA层(具体原理可参考DROID-SLAM论文)来求解非线性最小二乘问题,同时优化相机位姿G和逆深度d。其中(i,j)表示连接关系,Π表示投影函数,p表示像素位置,公式里面的G表示位姿变换关系。最后使用高斯牛顿法来优化局部关键帧的最优位姿和深度。
后端优化这一块,显然不能直接优化所有的历史帧。作者的做法是,开启一个新的共视关键帧图,在插入新边以后抑制冗余邻域边。这样就可以很大程度上降低计算量。GO-SLAM考虑了输入帧的完整历史信息,并连续对齐所有关键帧位姿。它还使用对齐策略实现瞬时闭环和全局结构的校正,在内存和时间都很有效率。
现在可以用获得的位姿和深度图进行NeRF了,那问题又来了,如何确保更新后的重建保持全局一致呢?同时用所有关键帧来做NeRF肯定可以保证全局一致性,但也就没办法实时了。
这里作者对参与稠密重建的关键帧进行了筛选:
首先,确保包含最新的两个关键帧和未经建图优化的关键帧。然后将所有关键帧按照当前和上次更新状态之间的位姿差降序排列,并从排序列表中选择前10个关键帧。最后,为了解决遗忘问题,还使用分层抽样从所有可用的关键帧中选择10个关键帧。
后面NeRF的渲染就是直接使用了现成的NeuS模型。
损失函数这一块设置的比较多,除了比较常用的图像光度损失和深度损失,还引入了正则化项来优化SDF:
为了监督SDF进行精确的表面重建,还计算采样点xi到关键帧深度Dm的距离来近似采样点xi的真实SDF。在Dm-预测深度(b)为不同值时采取不同的损失函数策略:
最终的损失函数是几项小损失的加权和:
4. 实验
实验这一块,运行设备是i9-10920X CPU和一块3090。作者分别评估了轨迹精度和建图精度,更侧重轨迹精度,使用的数据集包括TUM RGB-D、EuRoC、ETH3D-SLAM、ScanNet还有Replica,轨迹评估非常多。评估指标方面,主要就还是使用ATE,其他指标包括准确率、完成率、完成比值,还有F指数,还有用L1评估了深度估计的精度。
下面是在TUM数据集上的ATE对比结果,左侧是单目结果,右侧是RGB D结果。GO-SLAM的精度达到最优,这也是笔者第一次见到NeRF SLAM的精度超越传统方法。这个实验做的很详细的,像之前的NICE-SLAM和iMAP也只是对比了fr1/desk、fr2/xyz和fr3/office这三个序列,但是GO-SLAM这一块对比的序列很多,还同时对比了传统方法和学习方法。但笔者对ORB-SLAM2/3的结果有些不认可,ORB-SLAM3并没有在那么多序列上跟踪失败。
下面是EuRoC实验,GO-SLAM的精度同样出彩。值得注意的是,传统SLAM在单目序列上容易跟踪失败,但是GO-SLAM可以保持鲁棒性。
还在EuRoC和ETH3D上对比了稠密重建的效果,GO-SLAM的重建精度优于DROID-SLAM。
下面是在ETH3D上的实验,y轴是成功的轨迹,x轴是RMSE精度,最大误差是2cm。这个结果说明GO-SLAM优于基于点、基于surfel的、基于体素的方案。BundleFusion和GO-SLAM有点类似,只是更侧重稠密重建。但BundleFusion的姿态估计极易受误差的影响,导致重建质量较差。
ScanNet上的结果表明,DROID-SLAM在短序列和RGB-D输入上表现较好,但在单目场景下处理较长序列时,其精度急剧下降。相比之下,GO-SLAM的结果始终很不错。此外,由于没有全局优化来消除累积误差,iMAP和NICE-SLAM在位姿估计和三维重建方面效果不是太好。
最后是Replica实验,对比的方案也很全,最新的Orbeez-SLAM都有。这里可以看出来NICE-SLAM的运行速度还是太慢了。这里也推荐「3D视觉工坊」新课程《彻底剖析激光-视觉-IMU-GPS融合SLAM算法:理论推导、代码讲解和实战》。
大家一定很关心运行效率,作者对比了CPU频率、GPU显存、FPS和最终精度。整体来看,GO-SLAM需要的计算资源还是比较多的,运行速度也不快,但是达到了一个CPU/GPU需求和精度的平衡。
5. 总结
NeRF和SLAM结合是一个非常新兴的方向,有大量的点可以挖掘。GO-SLAM这篇文章是ICCV 2023的最新工作,同时优化SLAM的轨迹轨迹和NeRF的稠密重建,效果非常好。笔者觉得这项工作最大的意义在于第一次在NeRF-based SLAM中引入了回环检测和全局BA,以此来消除累积误差。这项工作还没有完全开源,感兴趣的小伙伴可以跟踪一下相关的Github进展。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !