Event-based Stereo Visual Odometry(双目事件相机里程计)论文学习

2023-11-07

本文详细介绍一篇双目事件相机里程计的论文,Event-based Stereo Visual Odometry,港科大沈邵劼团队Yi Zhou和TU Berlin的Guillermo Gallego共同完成,并公布了代码。我准备在接下来一段儿时间认真研究一下这篇论文与代码,欢迎想深入研究这个方法的朋友与我交流。转载请注明出处

论文下载:arXiv, https://arxiv.org/abs/2007.15548
github代码:https://github.com/HKUST-Aerial-Robotics/ESVO
柯翰同学在公众号的一篇简单介绍:基于双目事件相机的视觉里程计

1. 算法流程

在这里插入图片描述
算法总体流程如上图所示,主要包括三个重要模块(虚线矩形框),分别是:数据处理、Tracking和Mapping。暂时不去管初始化部分,我们关注数据流的方向,可以发现,在Tracking时,传入的是Time-Surface(本文往后缩写为TS)和Local Map,得到运动变换位姿pose;之后,pose和TS等共同完成完整的Mapping过程。

2. 基础知识

2.1 Time-Surface 时间表面

是一种事件相机数据表达方式,请看之前我博客中对这个进行的总结:【事件相机整理】角点检测与跟踪总结 - Time surface / SAE

2.2 Student t 分布

wiki介绍:https://en.wikipedia.org/wiki/Student%27s_t-distribution
作者通过对数据集测试,发现左右目相事件机中,匹配像素的残差 r r r统计上符合“学生t分布”(中文表述不清,原文为: r r r denotes the temporal difference between two corresponding pixels x i , 1 , x i , 2 x_{i,1}, x_{i,2} xi,1,xi,2 inside neighborhoods)由此实现了多帧图像对深度进行融合。

2.3 ZNCC 零均值归一化相似性

是双目像素匹配时利用的一种度量方法,在极线约束上寻找匹配的像素点。在算法初始化部分使用。

2.4 IRLS 迭代重权重最小二乘

wiki介绍: https://en.wikipedia.org/wiki/Iteratively_reweighted_least_squares
一种非线性迭代优化算法,在Mapping过程中利用IRLS得到最优逆深度

2.5 Compositional LK

LK光流跟踪方法的一种变形,增量式而不是绝对式,避免了重复计算完整的雅克比矩阵。在Tracking过程中不断更新计算Warpping Parameter,从而得到运动轨迹。注意每次只是计算更新的部分 W ( x , ρ ; θ ) ← W ( x , ρ ; θ ) ⋅ W ( x , ρ ; Δ θ ) W(x, \rho; \theta) \leftarrow W(x, \rho; \theta) \cdot W(x, \rho; \Delta \theta) W(x,ρ;θ)W(x,ρ;θ)W(x,ρ;Δθ),即式中的 Δ θ \Delta \theta Δθ

3. Tracking部分

3.1 TS negative

论文并没有使用原始的TS进行Tracking,而是使用了 TS negative(后面简写为TSn), τ ‾ ( x ) = 1 − τ ( x ) \overline \tau(x)=1-\tau(x) τ(x)=1τ(x)。作者指出,由于TS的一侧往往是斜坡状,另一侧是陡峭的,所以沿着斜坡可以搜寻到当前Edge在图像中的位置。由此,当使用 ( 1 − τ ) (1-\tau) (1τ)时,值越小意味着距离真实Edge越近。

3.2 目标函数

上面提到,当TSn越小,这意味着图像这个位置对应了真实世界的Edge。在Tracking时,我们需要根据已有的Mapping结果(Local Map),将已知逆深度的Edge点投影到Frame上,计算对应的TSn的数值,进行相加,越小这意味着投影的参数约正确。例如,当位姿完全正确时,真实世界的Edge投影到Frame时,对应的TSn应该全接近0。从而我们可以写出目标函数为: θ ∗ = arg min ⁡ θ ∑ x ∈ S ( τ ‾ ( W ( x , ρ ; θ ) ) 2 , \theta^*=\argmin_ \theta \sum_{x \in S}(\overline \tau(W(x, \rho; \theta))^2, θ=θargminxS(τ(W(x,ρ;θ))2, 即寻找一个最佳的Warpping Parameter θ \theta θ,使Frame中所有有逆深度的点( x ∈ S x\in S xS)经过Warp后对应的TSn尽可能小。其中Warp就是定义为反投影后经过6DoF变换再投影, W ( x , ρ ; θ ) = π l e f t ( T ( π r e f − 1 ( x , ρ ) , G ( θ ) ) ) , W(x, \rho; \theta)=\pi_{left}(T(\pi_{ref}^{-1}(x, \rho), G(\theta))), W(x,ρ;θ)=πleft(T(πref1(x,ρ),G(θ))), 即根据参考位置反投影,经过运动参数 G ( θ ) G(\theta) G(θ)变换再投影到左目。论文指出,只利用左目进行计算就够了,加上右目没有明显的提升。

3.3 优化过程

论文指出,利用Compositional LK算法,不断迭代更新,得到最佳的T。

4. Mapping

Mapping部分主要也有两部分,首先对event的逆深度进行估计,之后再进行半稠密重建。

4.1 Event的深度估计

4.1.1 目标函数

深度估计时,需要知道Tracking的轨迹,进行运动补偿(所以需要一个初始化部分,才能够保证Tracking部分能够首先进行),估计一个event的逆深度 ρ \rho ρ

当我们估计在 t t t时刻一个event的深度 ρ \rho ρ时,我们可以得到这个event在左右目的坐标 x 1 t , x 2 t x_1^t, x_2^t x1t,x2t,如果深度估计的正确,这两者对应的TS应该是相同,且之前一段儿时间 δ t \delta t δt(100Hz)内对应的TS应该也是相同的。所以目标函数定义为: ρ ∗ = arg min ⁡ ρ C ( x , ρ , T l e f t ( , t ) , T r i g h t ( , t ) , T t − δ t , t ) \rho^*=\argmin_\rho C(x, \rho, \Tau_{left}(, t), \Tau_{right}(, t), T_{t-\delta t, t}) ρ=ρargminC(x,ρ,Tleft(,t),Tright(,t),Ttδt,t) 其中 T l e f t / r i g h t \Tau_{left/right} Tleft/right为该像素点在这段儿时间内的TS对应的值,而 C C C具体为: C ( . . . ) = ∑ x 1 , i ∈ W 1 , x 2 , i ∈ W 2 ∣ τ l e f t t ( x 1 , i ) − τ r i g h t t ( x 2 , i ) ∣ 2 2 C(...)=\sum_{x_{1,i}\in W_1, x_{2,i}\in W_2} |\tau_{left}^t(x_{1, i})-\tau_{right}^t(x_{2, i})|_2^2 C(...)=x1,iW1,x2,iW2τleftt(x1,i)τrightt(x2,i)22 即对应的TS值的差。而 x 1 , x 2 x_1, x_2 x1,x2为: x 1 = π ( T c t − ϵ c t ⋅ π − 1 ( x , ρ k ) , x_1=\pi(T_{c_{t-\epsilon}}^{c_t} \cdot \pi^{-1} (x, \rho_k), x1=π(Tctϵctπ1(x,ρk), 即经过当前假设逆深度投影后,经过对应时间戳投影到指定时刻的Frame。

4.1.2 优化

优化采用任何一种非线性优化方法即可,例如GN方法

4.1.3 初始化

初始化时,由于不知道 T T T 的轨迹,所以直接在极线上搜索匹配,只用ZNCC即可。不知道 T T T所以无法得到 T c t − ϵ T_{c_{t-\epsilon}} Tctϵ,所以不是很精确,但作为初始化已经足够了。

4.2 半稠密重建

由4.1,我们得到了一个稀疏的深度图,下一步通过融合的方式,得到半稠密的深度图。在这个过程中,并不是利用一次观测,而是利用了多次观测的结果,所以同时收敛了深度的取值。这部分内容类似深度滤波,但提出了新的融合方法。

在这里插入图片描述
如图,每次观测得到一个稀疏深度图,经过一段儿时间后(M次观测)融合得到更为精确、半稠密的深度图。

作者通过真值,统计两个数据集估计逆深度的残差分布,发现是个Student t分布(下文缩写为St)。当某个像素有多次观测时,多个逆深度进行融合,得到新的St分布。

接下来用到了IRLS进行优化,但我还没能理解这部分是在干啥,就先跳过了。

在融合时,将每次观测计算得到的有深度的像素点投射到下一次观测的像平面,由于不是整数像素,所以在新的像平面中考虑周围4像素是否是同一个数据点。1. 如果是同一个数据点,则利用St分布叠加方式将上一次的逆深度分布作为先验,叠加最新的观测逆深度分布获得后验逆深度分布;2. 如果不是同一个数据点(由二者逆深度分布的均值和方差判断),则取方差较小的作为当前像素点的逆深度;3. 如果最新的测量中没有得到这个像素点的逆深度,则直接定为上次的分布。由此,实现了多次测量的逆深度的融合,也得到了更稠密的深度图。

5. 小结

本文我认为最有创新之处就是多次测量的融合方法。

其他很多地方作者考虑的很细致,也有很多技巧。参考文献有五六十篇非常之多,只能说港科和Guillermo Gallego在EB和Stereo VO上有很深的积累。

在这里插入图片描述(Running results of source codes)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Event-based Stereo Visual Odometry(双目事件相机里程计)论文学习 的相关文章

随机推荐

  • 如何让html的按钮居中,如何让你的htmlbutton本身居中的实现

    这篇文章主要介绍了如何让你的html button本身居中的实现 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 如何让你的html button本身居中呢 这个很好找思
  • 行业领先公司和软件系统

    QEMU是一套由法布里斯 贝拉 Fabrice Bellard 所编写的以GPL许可证分发源码的模拟处理器软件 在GNU Linux平台上使用广泛 QEMU编译后生成一个可执行文件 通过执行文件形成一个模拟器处理软件 该软件相当于一个操作系
  • C# LINQ分组求最大、最小、平均值

    C LINQ分组求最大 最小 平均值 private void GroupBy List
  • 使用Python保存`requests`请求的文件的代码

    使用Python保存requests请求的文件的代码 在Python中 你可以使用requests库发送HTTP请求 并且可以很方便地保存请求返回的文件 下面是一个示例代码 演示了如何使用requests库发送请求并保存文件 import
  • Webpack/Babel/⼯程化 笔试题精讲1

    核 概念 entry webpack 构建第 步 output 输出 loader 模块转换器 于将模块的原内容按照需求转换成新内容 plugin 扩展插件 在 webpack 构建过程的特定时机注 扩展逻辑 来改变或优化构建结果 mode
  • 【Java】NIO和BIO有什么区别?回答:天壤之别

    引流 第一时间阅读最新文章的方式 Java NIO和BIO有什么区别 答案 天壤之别 Java NIO不简单呐 Channel Buffer Selector 一 什么是NIO 1 概念 NIO是java1 4中引入的 被称为new I O
  • 一堆小技巧--常见写法的优化(持续更新。。)

    不用定义变量来交换两个数的值 int temp a a b b temp 可以替换成 a a b b a b a a b 详情见小技巧 使用异或来替换原本的常量交换 使用 gt gt 替换原来的 2取中点 int mid left righ
  • blender翻转渲染图

    想要实现如下功能 翻转生成的渲染图 在blender里设置物体属性的scale 翻转哪个轴就在哪个轴取反 翻转X轴的效果 翻转Y轴的效果
  • CSS定位知识点补充(父相子绝)

    定位 定位 定位模式 position 边偏移 top right bottom left 定位模式 用于指定一个元素在文档中的定位方式 边偏移则决定了该元素的最终位置 静态定位 position static 元素的默认定位方式 无定位的
  • C++ Most vexing parse(C++最头疼的解析)

    首先需要了解 在C 中 如下三种方式声明了同一个函数 int f double d 声明接受一个double参数d 返回值为int类型的函数 int f double d 效果一样 参数名外的括号会被忽略 int f double 直接省略
  • Spring框架中的缓存管理详解

    标题 Spring框架中的缓存管理详解 摘要 本文将介绍Spring框架中的缓存管理 探讨如何使用Spring提供的缓存注解和配置来提升应用的性能 通过详细说明缓存的概念 应用场景以及示例代码 帮助读者理解和使用Spring中的缓存管理 1
  • AI实战训练营(Class 11)MMEditing 安装与使用

    AI实战训练营 Class 11 MMEditing 安装与使用 安装配置 MMagic 安装 Pytorch 安装 MMCV 和 MMEngine 环境 安装 MMagic 从源码安装MMagic 检查安装成功 安装其它工具包 黑白照片上
  • argsort()函数

    argsort 函数是对数组中的元素进行从小到大排序 并返回相应序列元素的数组下标
  • Flink的Standalone集群部署

    在上篇进行单机的Standalone部署 Flink的Standalone部署实战 本篇介绍Flink的Standalone集群部署 Flink集群为主从架构 主是JobManager 从为TaskManager 支持一主多从 本次搭建环境
  • 代码源div1二分答案(前缀和+贪心+二分)

    include
  • live常见问题:如何降低Ableton Live Suite的CPU负载?

    Ableton Live 11 Suite for Mac是Mac平台上能够用于创建和录制音乐的音乐制作软件 软件本身就占用的很大的内存空间 如果下载的其插件和固件的话 会大大增加CPU的负荷 那么如何降低Ableton Live Suit
  • 【Go语言例题】迷宫的广度优先搜索

    Go语言例题 迷宫的广度优先搜索 用循环创建二维slice 使用slice来实现队列 用Fscanf读取文件 对Point的抽象 Fscanf在遇到 n才结束 遇到 r时就会把 r替换成0 这就有个问题 要注意自己的文本换行符是什么 在Wi
  • 使用Gitee去拉取项目和上传项目

    关于Gitee的使用是为了我们更的好去使用Git上传自己的代码 和托管项目也有助于团队的开发 也可以上传到Gitee官网去分享和开源自己的项目 这里我们就开始给大家介绍怎么去用IDEA去创建一个项目和配置我们的Gitee 1 用IDEA去创
  • Android之aar包中R文件混淆问题

    发现问题 解决问题要对症下药 先看报错日志 java lang NoSuchFieldError No static field a of type I in class Lcom R layout or its superclasses
  • Event-based Stereo Visual Odometry(双目事件相机里程计)论文学习

    本文详细介绍一篇双目事件相机里程计的论文 Event based Stereo Visual Odometry 港科大沈邵劼团队Yi Zhou和TU Berlin的Guillermo Gallego共同完成 并公布了代码 我准备在接下来一段