DeepVO 论文阅读

论文信息

题目:DeepVO Towards End-to-End Visual Odometry with Deep Recurrent Convolutional Neural Networks
作者:Sen Wang, Ronald Clark, Hongkai Wen and Niki Trigoni
代码地址:http://senwang.gitlab.io/DeepVO/ (原作者并没有开源)
pytorch版本代码地址:https://github.com/ChiWeiHsiao/DeepVO-pytorch
时间:2017年

Abstract

大多数现有的单目视觉里程计(VO)算法都是在标准流程下开发的,包括特征提取、特征匹配、运动估计、局部优化等。虽然其中一些算法已经表现出优越的性能,但它们通常需要仔细设计和专门微调才能正常工作在不同的环境中。恢复单眼 VO 的绝对尺度还需要一些先验知识

本文通过使用深度循环卷积神经网络 (RCNNs) ,提出了一种新颖的单目 VO 端到端框架。由于它是以端到端的方式进行训练和部署的,因此它可以直接从一系列原始RGB图像(视频)数据中推断出相机姿态,无需采用传统VO管道中的任何模块。

基于 RCNN,它不仅通过卷积神经网络自动学习 VO 问题的有效特征表示,而且还使用深度循环神经网络隐式建模顺序动态和关系。

Introduction

在本文中,我们利用深度循环卷积神经网络(RCNN)提出了一种基于深度学习的新型单目 VO 算法 。由于它是以端到端的方式实现的,因此它不需要经典 VO 管道中的任何模块(甚至相机校准)。
主要贡献有三方面:
1)我们证明单目VO问题可以通过基于深度学习的端到端方式解决,即直接从原始 RGB 图像估计姿势。恢复绝对尺度既不需要先验知识也不需要参数。
2)我们提出了一种 RCNN 架构,通过使用 CNN 学习的几何特征表示,能够将基于 DL 的 VO 算法推广到全新的环境。
3) 图像序列的序列依赖性和复杂的运动动力学对于 VO 很重要,但人类无法显式或轻松地建模,但它们可以由深度递归神经网络 (RNN) 隐式封装和自动学习。

Related Work

基于几何的方法

(这部分不多解释)
1)基于稀疏特征的方法:
2)直接方法:

基于学习的方法

由于 CNN 无法对顺序信息进行建模,因此之前的工作都没有考虑图像序列或视频进行顺序学习。在这项工作中,我们通过利用 RNN 来解决这个问题。

通过 RCNN 进行端到端视觉里程计

提出的RCNN框架

所提出的端到端 VO 系统的架构如图 所示。它以视频剪辑或单目图像序列作为输入。在每个时间步,通过减去训练集的平均 RGB 值来对 RGB 图像帧进行预处理,并且可以选择将其大小调整为 64 倍数的新大小。两个连续图像堆叠在一起以形成张量深度 RCNN 学习如何提取运动信息和估计姿势。具体来说,图像张量被输入 CNN,为单目 VO 生成有效特征,然后通过 RNN 进行顺序学习。每个图像对都会在网络的每个时间步产生一个姿态估计。 VO 系统随着时间的推移而发展,并在捕获图像时估计新的姿势。
在这里插入图片描述

基于CNN的特征提取

KITTI 数据集上的张量示例。它有 9 个卷积层,除了 Conv6 之外,每层后面都有一个修正线性单元 (ReLU) 激活,即:共17层。网络中感受野的大小逐渐从 7 × 7 减小到 5 × 5,然后减小到 3 × 3,以捕获小的有趣特征。引入零填充是为了适应感受野的配置或在卷积后保留张量的空间维度。通道的数量,即用于特征检测的滤波器的数量,增加以学习各种特征。
在这里插入图片描述
CNN的构成:
在这里插入图片描述

基于RNN的序列建模

RNN 与 CNN 的不同之处在于,它随着时间的推移保持其隐藏状态的记忆,并且它们之间具有反馈循环,这使得其当前隐藏状态成为先前隐藏状态的函数,如图 2 所示的 RNN 部分。因此, RNN 可以找出输入与序列中先前状态之间的联系。给定时间 k k k 的卷积特征 x k x_k xk,RNN 在时间步 k k k 更新为:
在这里插入图片描述
where h k h_k hk and y k y_k yk are the hidden state and output at time k k k respectively, W terms denote corresponding weight matrices, b b b terms denote bias vectors, and H H H is an element-wise non- linear activation function, such as sigmoid or hyperbolic tangent.

为了能够发现和利用长轨迹拍摄的图像之间的相关性,我们采用长短期记忆(LSTM)作为我们的 RNN,它能够通过引入记忆门和单元来学习长期依赖性。它明确确定要丢弃或保留哪些先前的隐藏状态以更新当前状态,并期望在姿势估计期间学习运动。
在这里插入图片描述

图 3 显示了折叠的 LSTM 及其随时间的展开版本以及 LSTM 单元的内部结构。可以看到,展开LSTM后,每个LSTM单元都与一个时间步相关联。给定时间 k k k 处的输入 x k x_k xk 以及前一个 LSTM 单元的隐藏状态 h k − 1 h_{k−1} hk1 和存储单元 c k − 1 c_{k−1} ck1 ,LSTM 根据以下公式在时间步 k k k 处更新:
在这里插入图片描述
where ⊙ \odot is element-wise product of two vectors, σ is sigmoid non-linearity, t a n h tanh tanh is hyperbolic tangent non-linearity, W terms denote corresponding weight matrices, b b b terms denote bias vectors, i k , f k , g k , c k i_k, f_k, g_k, c_k ik,fk,gk,ck and o k o_k ok are input gate, forget gate, input modulation gate, memory cell and output gate at time k k k, respectively

尽管 LSTM 可以处理长期依赖性并具有深层时间结构,但它仍然需要网络层的深度来学习高级表示和对复杂动态进行建模。

在我们的例子中,深度 RNN 是通过堆叠两个 LSTM 层来构建的,其中一个 LSTM 的隐藏状态是另一个 LSTM 层的输入,如图 2 所示。在我们的网络中,每个 LSTM 层都有 1000 个隐藏状态。

成本函数和优化

所提出的基于 RCNN 的 VO 系统可以被认为是计算相机姿势的条件概率 Y t = ( y 1 , . . . , y t ) Y_t = (y_1, ..., y_t) Yt=(y1,...,yt) 给定一系列单目 RGB 图像 X t = ( x 1 , . . . , x t ) X_t = (x_1, ..., x_t) Xt=(x1,...,xt) 直到时间 t t t从概率的角度来看:
在这里插入图片描述

建模和概率推理在深度 RCNN 中进行。为了找到 VO 的最佳参数 θ*,DNN 最大化 (3):
在这里插入图片描述
为了学习 DNN 的超参数 θ,时间 k 时的地面真实姿势 ( p k , ϕ k ) (p_k, \phi_k) (pk,ϕk) 与其估计姿势 ( p ^ k , ϕ ^ k ) (\hat{p}_k, \hat{\phi}_k) (p^k,ϕ^k)之间的欧几里德距离被最小化。损失函数由所有位置 p 和方向 ϕ \phi ϕ的均方误差 (MSE) 组成:
在这里插入图片描述
其中 ∥ ⋅ ∥ \left \| \cdot \right \| 是 2-范数,κ(实验中为 100)是平衡位置和方向权重的比例因子,N 是样本数。方向 ϕ \phi ϕ 由欧拉角而不是四元数表示,因为四元数受到额外的单位约束,这阻碍了深度学习的优化问题。我们还发现,在实践中使用四元数会在一定程度上降低方向估计。

EXPERIMENTAL RESULTS

1)数据集:KITTI VO/SLAM基准[3]有22个图像序列,其中11个(序列00-10)与地面实况相关。其他 10 个序列(序列 11-21)仅提供原始传感器数据。

由于该数据集是在动态物体较多的城市地区行驶时以相对较低的帧率(10 fps)记录的,并且行驶速度高达90 km/h,因此对于单目VO算法来说非常具有挑战性。

2)训练和测试:进行两个单独的实验来评估所提出的方法。第一个是基于序列00-10,通过groundtruth定量分析其性能,因为groundtruth仅针对这些序列提供。为了有单独的数据集进行测试,仅使用相对较长的序列00、02、08和09进行训练。将轨迹分割成不同的长度,以生成大量的训练数据,总共产生 7410 个样本。训练好的模型在序列03、04、05、06、07和10上进行测试以进行评估。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】从0到1讲继承|复杂的菱形继承

个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 前言 本文主要讲述的是继承的概念,以及基类和派生类和衍生出的各种东西,还有多继承…

前端代码注释率

nodejs差代码注释率 /*** author duan* source https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192* date 2023-7-7* * 统计指定目录下代码行数及注释率* * 用法: node count.js <路径> [后缀名]...* 后缀名不填的话默认为统计 .js 和 .ts 文件* *…

Jenkins通过OpenSSH发布WinServer2016

上一篇文章> Jenkins集成SonarQube代码质量检测 一、实验环境 jenkins环境 jenkins入门与安装 容器为docker 主机IP系统版本jenkins10.10.10.10rhel7.5 二、OpenSSH安装 1、下载 官网地址&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/op…

MaxPatrol SIEM 增加了一套检测供应链攻击的专业技术

我们为 MaxPatrol SIEM 信息安全事件监控系统增加了一套新的专业技术。 该产品可帮助企业防范与供应链攻击相关的威胁。 此类攻击正成为攻击者的首要目标&#xff1a;它们以软件开发商和供应商为目标&#xff0c;网络犯罪分子通过他们的产品进入最终目标的基础设施。 因此&a…

Android Studio 启用设备远程调试配置完整步聚

启用手机设置->开发者选项-无线调试,然后选择允许 已启用后无线调试变成绿色 ,点击无线调试进入详情页面 点击Android Studio的Device Manager 下的WIFI图标 会弹出下图窗口 打开手机的开发者选项中的WIFI调试(无线调试)下的使用二维码配对设备进行扫描. 设备配对成功后手机…

带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库&#xff0c;编译出的库适合香橙派&#xff0c;这时候交叉编译可执行程序的平台和链接库的格式也是正确的&#xff0c;然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置&#xff0c;但是现在还没有学习过&#xf…

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…

【Redis】内存数据库 Redis 基础

目录 内存数据库Redis概念Redis 安装Redis的启动方式Redis命令行客户端 Redis通用命令Redis key结构Redis value数据类型String 和基础操作Hash 和基础操作List 和基础操作Set 和基础操作Sorted_set 和基础操作 Redis的Java客户端Jedis客户端SpringDataRedis客户端自定义RedisT…

TypeScript基础学习

目录 一、安装 1、下载国内镜像 2、安装 3、查看安装情况 4、使用例子 二、变量声明 1、规则 2、声明的四种方式 3、注意 4、类型断言 5、类型推断 6、变量作用域 三、基础类型&#xff08;共11种&#xff09; 1、Any 类型 2、Null 和 Undefined 3、never 类型…

Thread类的常用方法

文章目录 二. Thread类及常见方法2.1 常见构造方法2.2 Thread 的几个常见属性2.3 启动一个线程 start()2.4 终止一个线程2.5 等待一个线程 join()2.6 获取当前线程的引用2.7 休眠当前线程 二. Thread类及常见方法 2.1 常见构造方法 方法说明Thread()创建线程对象Thread(Runna…

C语言每日一题:11.《数据结构》链表分割。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a;使用带头链表 1.构建两个新的带头链表&#xff0c;头节点不存储数据。 2.循环遍历原来的链表。 3.小于x的尾插到第一个链表。 4.大于等于x尾插到第二个链表。 5.进行链表合并&#xff0c;注意第二个链表的尾的下一…

RISC-V 指令集介绍

1. 背景介绍 指令集从本质上可以分为复杂指令集&#xff08;Complex Instruction Set Computer&#xff0c;CISC&#xff09;和精简指令集&#xff08;Reduced Instruction Set Computer&#xff0c;RISC&#xff09;两种。复杂指令集的特点是能够在一条指令内完成很多事情。 指…

【外卖系统】分类管理业务

公共字段自动填充 需求分析 对于之前的开发中&#xff0c;有创建时间、创建人、修改时间、修改人等字段&#xff0c;在其他功能中也会有出现&#xff0c;属于公共字段&#xff0c;对于这些公共字段最好是在某个地方统一处理以简化开发&#xff0c;使用Mybatis Plus提供的公共…

iPhone 7透明屏的显示效果怎么样?

iPhone 7是苹果公司于2016年推出的一款智能手机&#xff0c;它采用了4.7英寸的Retina HD显示屏&#xff0c;分辨率为1334x750像素。 虽然iPhone 7的屏幕并不是透明的&#xff0c;但是苹果公司在设计上采用了一些技术&#xff0c;使得用户在使用iPhone 7时可以有一种透明的感觉…

28.利用fminsearch、fminunc 求解最大利润问题(matlab程序)

1.简述 1.无约束&#xff08;无条件&#xff09;的最优化 fminunc函数 : - 可用于任意函数求最小值 - 统一求最小值问题 - 如求最大值问题&#xff1a; >对函数取相反数而变成求最小值问题&#xff0c;最后把函数值取反即为函数的最大值。 使用格式如下 1.必须预先把函数存…

【Golang 接口自动化08】使用标准库httptest完成HTTP请求的Mock测试

目录 前言 http包的HandleFunc函数 http.Request/http.ResponseWriter httptest 定义被测接口 测试代码 测试执行 总结 资料获取方法 前言 Mock是一个做自动化测试永远绕不过去的话题。本文主要介绍使用标准库net/http/httptest完成HTTP请求的Mock的测试方法。 可能有…

113、单例Bean是单例模式吗?

单例Bean是单例模式吗? 通常来说,单例模式是指在一个JVM中,一个类只能构造出来一个对象,有很多方法来实现单例模式,比如懒汉模式,但是我们通常讲的单例模式有一个前提条件就是规定在一个JVM中,那如果要在两个JVM中保证单例呢?那可能就要用分布式锁这些技术,这里的重点…

性能测试基础知识(三)性能指标

性能测试基础知识&#xff08;三&#xff09;性能指标 前言一、时间特性1、响应时间2、并发数3、吞吐量&#xff08;TPS&#xff09; 二、资源特性1、CPU利用率2、内存利用率3、I/O利用率4、网络带宽使用率5、网络传输速率&#xff08;MB/s&#xff09; 三、实例场景 前言 性能…

面试总结(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…