经典文献阅读之--DROID-SLAM(完美的深度学习slam框架)

0. 简介

深度学习和SLAM现在结合越来越紧密了,但是实际上很多时候深度学习只会作为一个block放在slam系统中。而很多深度学习slam算法,在slam这边的性能都不是太好,尤其是回环和全局优化这块。因为有一些深度学习的工作就不太适合做回环检测。回环检测对于slam算法来说非常重要,因为relative pose的精度及其稳定性,很容易带来累积误差。而回环是目前唯一一个可以用来修正累积误差的。
回环检测需要去评估两个图片的相似性,传统的方法是基于特征点,然后训练词袋包。这样每张图片就有了唯一的特征,利用距离+图片特征做匹配,检测回环,然后再基于图片配准的方法做算pose。基本上回环和前端定位用的是一套方案,这样不需要增加额外的算力,就能实现回环检测,但是很多基于深度学习的方法,要么没有回环,要么增加额外的特征做回环(这样就需要额外的算力和存储)。而《DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras》一文就是在这个方面做出了改进,这篇文章的通讯是ImageNet的一作。可以看出文章的含金量,相关的代码已经在Github上开源了。

1. 主要贡献

在这项工作中,我们介绍了DROID-SLAM,这是一个基于深度学习的全新SLAM系统。它具有最先进的性能,在具有很大差距的挑战性基准测试中胜过现有的SLAM系统,无论是传统的还是基于学习的。具体来说,它具有以下优势:
高精度:我们在多个数据集和模态上相较于先前工作都取得了显著的改进。在TartanAir SLAM竞赛[55]中,我们在单目轨迹上将误差减少了62%,在立体轨迹上减少了60%,超过了先前最佳结果。在ETH-3D RGB-D SLAM排行榜[42]上,我们在考虑了误差和灾难性失败率的AUC指标下,比第二名高出35%。在EuRoC[2]上,使用单目输入,我们在零失败的方法中将误差降低了82%,相较于ORB-SLAM3,它只在11个序列中成功了10个,我们将误差降低了43%。在使用立体输入时,我们将误差降低了71%。在TUM-RGBD[44]上,我们在零失败的方法中将误差降低了83%。
高鲁棒性:我们的系统遭受的灾难性失败要远远少于先前的系统。在ETH-3D上,我们成功跟踪了32个RGB-D数据集中的30个,而下一个成功跟踪的只有19/32。在TartanAir、EuRoC和TUM-RGBD上,我们完全没有失败。
强泛化能力:我们的系统仅使用单目输入进行训练,却能直接使用立体或RGB-D输入来获得更高的精度,而无需重新训练。我们在4个数据集和3个模态上的所有结果都是由单一模型实现的,它只受过一次训练,且完全是在合成的TartanAir数据集上使用单目输入进行训练的。

2. 主要方法

我们以视频作为输入,有两个目标:估计相机的轨迹并构建环境的三维地图。我们首先描述单目设置;在第6节中,我们描述如何将系统推广到立体和RGB-D视频。
表示:我们的网络在有序图像集合 { I t } t = 0 N \{I_t\}^N_{t=0} {It}t=0N上运行。对于每个图像 t t t,我们维护两个状态变量:相机姿态 G t ∈ S E ( 3 ) G_t ∈ SE(3) GtSE(3)和逆深度 d t ∈ R + H × W d_t ∈ \mathbb{R}^{H×W}_+ dtR+H×W。姿态集合 { G t } t = 0 N \{G_t\}^N_{t=0} {Gt}t=0N和逆深度集合 { d t } t = 0 N \{d_t\}^N_{t=0} {dt}t=0N未知的状态变量,在推理过程中随着新帧的处理而迭代更新。在本文的其余部分,当我们提到深度时,请注意我们使用逆深度参数化。
我们采用帧图 ( V , E ) (\mathcal{V},\mathcal{E}) (VE)来表示帧之间的共视关系。边 ( i , j ) ∈ E (i,j)∈ \mathcal{E} (ij)E表示图像 I i I_i Ii I j I_j Ij具有重叠的视场和共享点帧图在训练和推理过程中动态构建。在每次姿态或深度更新后,我们可以重新计算可见性以更新帧图。如果相机返回到先前映射的区域,我们在图中添加长程连接以执行闭环。

3. 特征提取与相关性

系统从每个新添加的图像中提取特征。这一阶段的关键组成部分借鉴了 RAFT[49] 的方法。[RAFT是输入两帧RGB迭代的优化光流,DROID-SLAM是输入arbitrary数量的RGB,迭代的优化深度和位姿。(Joint global refinement of all camera poses and depth maps对于消除累计飘移和回环检测至关重要)]

3.1 特征提取

每个输入图像都经过特征提取网络的处理。该网络由6个残差块和3个下采样层组成,生成密集的特征图,分辨率为输入图像的1/8。与 RAFT[49] 一样,我们使用两个独立的网络:一个特征网络和一个上下文网络。特征网络用于构建相关性体积集合,而上下文特征在每次更新操作符应用时被注入到网络中

3.2 相关性金字塔

对于帧图中的每条边 ( i , j ) ∈ E (i, j) ∈ \mathcal{E} (i,j)E,我们通过计算 g θ ( I i ) g_θ(I_i) gθ(Ii) g θ ( I j ) g_θ(I_j) gθ(Ij) 中特征向量的所有配对的点积来生成一个4D相关性体积
C u 1 v 1 u 2 v 2 i j = ⟨ g θ ( I i ) u 1 v 1 , g θ ( I j ) u 2 v 2 ⟩ (1) C_{u_1 v_1 u_2 v_2}^{ij} = \left\langle g_\theta (I_i)_{u_1 v_1}, g_\theta (I_j)_{u_2 v_2} \right\rangle \tag{1} Cu1v1u2v2ij=gθ(Ii)u1v1,gθ(Ij)u2v2(1)

然后,我们执行对相关性体积最后两个维度的平均池化,按照RAFT[49]的方法形成一个4级相关性金字塔。

3.3 相关性查找

我们定义了一个查找运算符,它使用半径 r r r网格对相关性体积进行索引 L r : R H × W × H × W × R H × W × 2 → R H × W × ( r + 1 ) 2 L_r : \mathbb{R}^{H×W×H×W} × \mathbb{R}^{H×W×2}→ \mathbb{R}^{H×W×(r+1)^2} Lr:RH×W×H×W×RH×W×2RH×W×(r+1)2

查找运算符接受一个 H × W H×W H×W坐标网格作为输入,并使用双线性插值从相关性体积中检索值。该运算符应用于金字塔中的每个相关性体积,并通过连接每个级别的结果来计算最终特征向量。

4. 更新算子

我们SLAM系统的核心组件是一个经过学习的更新算子,如图2所示。该更新算子是一个带有隐藏状态h的3×3卷积GRU。每次应用该算子都会更新隐藏状态,并额外产生一个姿势更新 ∆ ξ ( k ) ∆ξ^{(k)} ξ(k)和深度更新 ∆ d ( k ) ∆d^{(k)} d(k)。姿势和深度更新通过在SE3流形上的重新投影和向量加法分别应用于当前深度和姿势估计。
G ( k + 1 ) = Exp ⁡ ( Δ ξ ( k ) ) ∘ G ( k ) , d ( k + 1 ) = Δ d ( k ) + d ( k ) . ( 2 ) \mathbf{G}^{(k+1)} = \operatorname{Exp}(\Delta \bm{\xi}^{(k)}) \circ \mathbf{G}^{(k)}, \mathbf{d}^{(k+1)} = \Delta \mathbf{d}^{(k)} + \mathbf{d}^{(k)}. \qquad \qquad (2) G(k+1)=Exp(Δξ(k))G(k),d(k+1)=Δd(k)+d(k).(2)

迭代更新操作产生一系列姿态和深度值,期望能够收敛到一个稳定的点 { G ( k ) } → G ∗ \{G^{(k)}\} → G^∗ {G(k)}G, { d ( k ) } → d ∗ \{d^{(k)}\} → d^∗ {d(k)}d,反映出真实的重建情况。在每次迭代开始时,我们使用当前姿态和深度值的估计来估算对应关系。给定一个像素坐标网格, p i ∈ R H × W × 2 p_i ∈ \mathbb{R}^{H×W×2} piRH×W×2,在第 i i i帧中,我们计算密集的对应关系场 p i j p_{ij} pij
在这里插入图片描述

图2: 更新操作符说明。该操作符作用于画面图中的边缘,预测流程修订并通过(DBA)层映射到深度和姿态更新。

p i j = Π c ( G i j ∘ Π c − 1 ( p i , d i ) ) , p i j ∈ R H × W × 2 G i j = G j ∘ G i − 1 . ( 3 ) \mathbf{p}_{ij} = \Pi_c(\mathbf{G}_{ij} \circ \Pi_c^{-1}(\mathbf{p}_i, \mathbf{d}_i)), \quad \mathbf{p}_{ij} \in \mathbb{R}^{H \times W \times 2} \quad \mathbf{G}_{ij} = \mathbf{G}_j \circ \mathbf{G}_i^{-1}. \quad (3) pij=Πc(GijΠc1(pi,di)),pijRH×W×2Gij=GjGi1.(3)

对于图像帧中的每个边缘 ( i , j ) ∈ E (i, j) ∈ \mathcal{E} (i,j)E,这里的 Π c Πc Πc摄像机模型,将一组3D点映射到图像上,而 Π c − 1 Π^{-1}_c Πc1是逆投影函数,将逆深度图d和坐标网格 p i p_i pi 映射到3D点云(附录中提供公式和雅可比矩阵)。 p i j p_{ij} pij表示使用估计的姿势和深度将像素 p i p_i pi映射到帧 j j j中的坐标。

4.1 输入

我们使用对应场来索引相关卷积体来获取相关特征。另外,我们使用对应场来推导由摄像机运动引起的光流,即 p i j − p j p_{ij} - p_j pijpj的差异。此外,上一次BA解决方案的残差与流场连接,使网络能够使用前一次迭代的反馈。相关特征提供关于 p i j p_{ij} pij周围的视觉相似性的信息,使得网络能够学习对齐视觉相似的图像区域。然而,对应关系有时是模糊的。流场提供了一种补充信息源,使网络能够利用运动场的平滑性来获得鲁棒性。

4.2 更新

相关特征和光流特征分别通过两个卷积层进行映射,然后注入到GRU中。此外,我们通过逐元素相加将上下文特征(由上下文网络提取)注入到GRU中。
ConvGRU是一个具有小感受野的局部操作。我们通过对图像的空间维度进行隐藏状态平均,提取全局上下文,并将这个特征向量作为额外的输入注入到GRU中。在SLAM中,全局上下文非常重要,因为大的移动物体导致的错误对应可能会降低系统的准确性。对网络来说,识别并拒绝错误的对应是非常重要的。
GRU会生成一个更新的隐藏状态 h ( k + 1 ) h^{(k+1)} h(k+1)。我们不是直接预测深度或姿态的更新,而是预测密集光流场空间中的更新。我们将隐藏状态通过另外两个卷积层映射,产生两个输出:(1)修订的光流场 r i j ∈ R ( H × W × 2 ) r_{ij} ∈ \mathbb{R}^{(H×W×2)} rijR(H×W×2) (对应上图中的蓝色的线)。和(2)相关的置信度图 w i j ∈ R + ( H × W × 2 ) w_{ij} ∈ \mathbb{R}^{(H×W×2)}_+ wijR+(H×W×2)(对应上图中的红色的线)。修订的 r i j r_{ij} rij 是网络预测的修正术语,用于纠正密集对应字段中的错误。我们用 p i j ∗ = r i j + p i j p^∗_{ij} = r_{ij} + p_{ij} pij=rij+pij 表示已修正的对应。
然后,我们在共享相同源视图 i i i 的所有特征上对隐藏状态进行汇集,并预测像素级的阻尼因子 λ λ λ。我们使用 softplus 运算符来确保阻尼项为正数。此外,我们利用汇集的特征来预测一个 8x8 的掩膜,可用于上采样逆深度估计。
在这里插入图片描述

4.3 Dense Bundle Adjustment Layer (DBA)

…详情请参照古月居

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14955.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【windows 下使用 tree】

windows git bash 下使用 tree 下载tree二进制文件 https://gnuwin32.sourceforge.net/packages/tree.htm 解压缩找到 tree.exe 扔进git bash的命令目录 C:\Program Files\Git\usr\bin 打开测试

GxtWaitCursor:Qt下基于RAII的鼠标等待光标类

有时我们需要以阻塞的方式执行一点耗时的操作&#xff0c;这时需要主窗口光标呈现忙状态&#xff0c;GxtWaitCursor正是为此设计&#xff1b;重载的构造函数&#xff0c;可以让光标呈现忙状态一定时间后自动恢复。 GxtWaitCursor.h #pragma once#include <QObject>// // …

通过Python,Tkinter,文本文件,Openpyxl。实现【图书馆管理系统实现技术】

图书馆管理系统 目录 项目概述类定义 -Book类 -Library类书籍管理功能 -添加书籍 -查找书籍 -借阅书籍 -归还书籍 -列出所有书籍数据持久化 -保存书籍 -加载书籍操作日志记录图形用户界面(GUI) -界面设计 -功能实现代码原理总结实现界面 ![](https://i-blog.csdnimg.cn/dire…

飞牛私有云访问外网

飞牛私有云 fnOS NAS 是一款有着卓越的性能以及强大的兼容性和智能化的管理界面&#xff0c;它之所以能在 NAS 市场中脱颖而出&#xff0c;是因为 fnOS 基于最新的 Linux 内核&#xff08;Debian发行版&#xff09;深度开发&#xff0c;不仅兼容主流 x86 硬件&#xff0c;还支持…

HTML之表单学习记录

如果一个页面仅仅供用户浏览&#xff0c;那就是静态页面。如果这个页面还能实现与服务器进行数据交互&#xff08;像注册登录、话费充值、评论交流&#xff09;​&#xff0c;那就是动态页面。表单是我们接触动态页面的第一步。其中表单最重要的作用就是&#xff1a;在浏览器端…

redis 原理篇 30 redis内存回收 过期key处理

三十分&#xff0c;又是一个长视频&#xff0c;挺好&#xff0c;但是从标题来看&#xff0c;内容应该很简单&#xff0c;或者说&#xff0c;是他能讲简单的类型&#xff0c;本来还想再搞一篇&#xff0c;但是三十分钟的话&#xff0c;五点五十了&#xff0c;算了&#xff0c;下…

【STM32F1】——无线收发模块RF200与串口通信

【STM32F1】——无线收发模块RF200与串口通信 一、简介 本篇主要对调试无线收发模块RF200的过程进行总结,实现了以下功能。 串口普通收发:使用STM32F103C8T6的USART2串口接收中断,实现两个无线收发模块RF200间的通信。二、RF200介绍 电压:3.4-5.5V工作频率:418~455MHz发…

【MySQL从入门到放弃】InnoDB磁盘结构(二)

前言 前面我们解析了InnoDB磁盘结构中的表空间、数据字典、双写缓冲区。 本文我们继续探究磁盘结构中剩余的几个核心组件:重做日志(redo log)、撤销日志(undo log)、二进制日志(binlog) 一、重做日志 ( redo log ) WAL(Write-Ahead Logging)机制 WAL 的全称是…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转这些功能

&#xff08;一&#xff09;安装插件SystemVerilog - Language Support 安装一个vscode插件即可&#xff0c;插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&#xff0c;但它只能提…

LLM RAG系列:一文详解RAG,看完这篇你必会(文末福利)

RAG系列 本文介绍了RAG以及RAG pipeline的整个流程&#xff0c;包括请求转换、路由和请求构造、索引和检索、生成和评估等&#xff0c;其中引用了大量有价值的论文。 参考Advanced RAG Series: Generation and Evaluation中的5篇文章&#xff0c;并丰富了相关内容。 请求转换…

服务器硬件介绍

计算机介绍 现在的人们几乎无时无刻都在使用电脑&#xff01;而且已经离不开电脑了。像桌上的台式电脑(桌机)、笔记本电脑(笔电)、平板电脑、智能手机等等&#xff0c;这些东西都算是电脑。 台式机电脑介绍 计算机又被称为电脑。台式机电脑主要分为主机和显示器两个部分&…

docker启动mysql数据库镜像,开启大小写不敏感,开启不区分大小写,挂载数据库日志文件,挂载数据库文件

docker启动mysql数据库镜像,开启大小写不敏感,开启不区分大小写,挂载数据库日志文件,挂载数据库文件 查询数据库是否区分大小写 SHOW VARIABLES LIKE lower_case_table_names;查询数据库是否支持大小写lower_case_table_names 被设置为 1,即表名不区分大小写。如果值为 1…

SpringBoot 打造图片阅后即焚功能

阅后即焚”&#xff08;Snapchat-like feature&#xff09;是指一种社交媒体或信息传递功能&#xff0c;用户在阅读某条信息或查看某张图片后&#xff0c;该信息或图片会自动销毁&#xff0c;无法再次查看。这种功能的主要目的是保护用户的隐私和信息安全&#xff0c;防止敏感信…

年轻人应该读毛选(一到五卷)!!!

在线网址&#xff1a;中文马克思主义文库毛泽东 (marxists.org) 书籍的现实意义&#xff0c;往往是在读后很久才能有所体会的。 推荐《毛泽东选集》——智慧与实践的经典之作 今天想给大家推荐一本充满智慧和深刻洞见的书——《毛泽东选集》。这不仅是一本书&#xff0c;更是…

Java期末复习暨学校第六次上机课作业

Java期末复习暨学校第六次上机课作业&#xff1a; 第一题&#xff1a; 通过new关键字实例化了一个Students类对象s&#xff0c;并调用set方法分别赋值&#xff0c;最后调用study和introduce方法。 输出结果&#xff1a; 第二题&#xff1a; 给出了一个无参构造方法和有参构造…

【操作系统】守护进程

一、守护进程的概念 守护进程是一个在后台运行并且不受任何终端控制的进程 二、自己实现守护进程 1.预备知识 &#xff08;1&#xff09;/dev/null /dev/null是一个特殊的设备文件&#xff0c;往这个文件里写不进去任何数据&#xff0c;也读不出来任何数据 因此&#xff0…

MySQL数据库常用命令大全(完整版——表格形式)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

TCP滑动窗口

TCP滑动窗口&#xff08;Sliding Window&#xff09; 什么是滑动窗口&#xff1f; TCP滑动窗口是TCP协议中的一种流量控制机制&#xff0c;用于调节发送方和接收方之间的数据传输速率&#xff0c;以避免网络拥塞和提高传输效率。 滑动窗口机制允许发送方在不等待确认应答的情…

main中的int argc, char* argv[],命令行调用函数时输入参数用的

int argc&#xff1a;表示命令行参数的数量。argc 至少为1&#xff0c;因为第一个参数总是程序的名称。char* argv[]&#xff1a;是一个字符指针数组&#xff0c;用于存储每个命令行参数的字符串。argv[0] 是程序的名称&#xff0c;argv[1] 是第一个参数&#xff0c;依此类推。…