作者:泡椒味的口香糖 |
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进展。
美容仪市场不断扩大,UGS优肌诗或成美容仪行业新一代主流力量
这款KD25F对电竞玩家是最合适不过了 240HZ、0.5ms的电竞显示器
rfid应用案例:晨控智能RFID读写器在发动机装配线上的应用
工程师认识工程和解决问题的一些思路
智能电视的开机广告你厌烦吗
3D重建的SLAM方案算法解析
黑莓 Ghost/Ghost Pro 曝光 预计只在印度发售
TRINAMIC推出智能马达解决方案
什么是多线程
有关USB2.0的常见问题
在TPT中创建SOTIF场景
电磁机械制动控制线路的工作原理
IDC揭晓2017年至2020年全球机器人十大预测
电机引线线束焊接机的特点
MAX2550-MAX2553收发器Femtocell无线参考设计
5G手机渗透率在节节攀升,推动零部件采购量的大幅提升
常用数控加工计算公式和最全螺纹标准
5G车载网关让医院无人配送车“灵活”起来
超宽带 (UWB) 如何助力打造智能工厂?后面四个落地案例值得参考
从fan-in、fan-out看setup和hold time violation