【深蓝学院】手写VIO第6章--视觉前端--笔记
第5章相关内容,还是CSDN的传统Markdown编辑器好用。
视觉前段在14讲课程中已经讲过,这里再简单复习一下。
1. 前端工作的定性比较,分析
这一节讲了很多关于前端的方法框架的对比讨论,后面看完了相关的论文之后强烈建议再回来听一听本章的第一节课。
前端和后端不太一样,前端没办法放在同一个框架中把不同方法进行对比(如光流法和特征匹配法),因为可能不同方法在其特定的工况下都能正常工作。
前端实现上的现实问题
实际上那个,前端在SLAM最终精度上的影响比后端更大,体现出来的更直观,比如某一段没有跟踪上之类的,可能就会影响整体的精度。
比如一次仿真中,假设数据和噪声都服从Gaussian distribution,用UKF得到了较好的实验结果,但是在实际情况中可能并不都符合Gaussian distribution,所以这个结论不一定是能够很好地泛化的,overfitting了。
比如有local mapping,sliding window,理论上来说全局的marg会更好,到那时实际中全局的marg计算力量过大,不太易实现,具体看后端能够有多大的算了和空间来做,如果没有的话可能就用个EKF就行了。
不同数据集间精度的对比没有什么意义,Kitti场景简单,动的物体比较少,EUROC可能已经做到头了;TUM-Mono难一点,场景较多,有过门,过墙之类的。
前端因为方法不同(比如特征点法第一步提特征点,直接法第一步求梯度,这些方法都不同,很难在方法内(范式内,先这样理解)进行对比,只能在整个系统之间(范式间)进行对比)。
直接法基于灰度不变假设,相对于PnP来说多了乘了个像素梯度,即若该店的梯度为0,则对T的估计无用,故倾向于选择有梯度的点,且梯度越大贡献越大。
很多地方直接法都比特征点法好,因为可能没办法提取到足够多特征点且容易feature lost。(高翔的主观感受,具体还是需要自己去跑一跑)
光流法:PTAM,Tango,现在比较成熟,但缺点也明显;
FAST+光流,GFTT+光流:很实用,很快;
特征匹配:SIFT,FURF匹配的最好,但是计算量大;
特征匹配和光流都依赖角点,提不出来的场景无法使用。
DSO达到某个误差(如小于3)所需的迭代次数,发现跟使用额KF数量和选点数量有关。
2. 前端介绍(以光流来展开)
上手可以用FAST+光流来做一个看看效果。
VIO的初始化需要讨论一下,下一节讨论。
有一个问题:对于前端,如何保证整体框架是最优的?即第一步计算光流,第二部估计pose…每一步的操作可以保证是最优的,但是没办法保证整体这个前端框架是最优的,大多数是工程上的经验,只要这样做就能得出还不错的结果。你也可以直接搞一个神经网络,输入imgs输出一堆poses和landmarks,
特征提取方法在CV普及开来之前就已经研究出来了,如角点主要看两个方向的梯度分布,对矩阵进行特征值分解(奇异值分解,平方之后就是特征值?特征值体现的是在两个方向上的分布情况):
- 如果两方向梯度都接近于0,倾向于是平坦区域(flat)。
- 如果两个方向都比较大,倾向于角点(Corner)。
- 如果是一方向较大,另一方向较小,倾向于边(Edge)。
具体实现:Harris提出了一个判断方法,计算 S H a r r i s S_{Harris} SHarris指标,
- 如果两个都小,则 S H a r r i s S_{Harris} SHarris接近0,
- 如果都很大,则整体很大,
- 如果一大一小,则结果不大不小,
设置阈值来判断是否为Corner
在Harris基础上改进了评分方式,可以指定选点的个数,根据选点个数来确定比较的阈值。
warp光流:对于光流的改进。由于视角可能会发生变化,特征块也会变化,所以要对特征块进行变换使得变换之后的特征块更像待追踪的块(常取仿射变换),在优化过程中,变换的参数还可以调整,以在线估计最优的变换参数。
还可以给Warp光流加上金字塔,对高速运动的场景效果更好
- 不能远距离track,一个具体例子:如果相机不动,有人从面前走过,期间过了100帧图像,那么可能第1帧和第100帧就无法track上了。
工程上的解决方法例如track with map,上面的方法是track weith last( I k I_k Ik和 I k − 1 t r a c k I_{k-1}track Ik−1track)或者是recent,当做完之后再跟地图去比,把地图中的一些点往投到 I k I_k Ik中投,发现能够投过来,然后再把 I k I_k Ik和 I 1 I_1 I1进行对比,看改点能否被track。 - 远近这种场景比较常见,比如远处是空白,但是近处发现有纹理。
- 角点对效果好,边效果不好
- 稀疏光流约束差,可能存在outlier,如稠密光流约束附近的点的亮度差不多,但稀疏没有。
3. 关键帧与三角化
3.1. 关键帧
- 关键帧是为了减小问题规模,使得后端能够计算得过来
- 处理相机停止的情况,避免后端退化:如果不挑选KF,camera 不动会导致逆深度计算错误,逆深度变成不可观的,有多个解。
关键帧选择: - 不能太近:太近可能退化,或者三角化算不出深度
- 不能太远:太远可能共视点过少,丢掉中间的motion
非KF只算前端,不进后端。
插入KF的一个策略:在后端算力的允许的情况下,尽可能多地插入KF,因为KF对后端是友好的(光束法平差,误差均摊,整体误差变小)
ORB_SLAM2后端有个local mapping,只要该线程idle时就插KF,然后对于冗余的再删掉。
DSO使用了sliding window,窗口内保持5~7个KF,并保持一定的展开,老的几帧,中等的几帧,最新的几帧,有以下策略
- 对于老的关键帧,将其中的landmark投到新的里面去,如果新的里面没有观测到这些landmark,则marg掉老的KF。
- 每个KF都有最小寿命,防止刚进来就被marg。
3.2. 三角化
三角化的条件和时间,有的方法只在KF上提Feature,有的每帧都提。前者计算量很小,但是可能导致三角化时点不够,效果不好;后者计算量大但是效果好。
取(10)第3行,带入(10),取钱两行可得(12),这里说一下矩阵的维度,
P k P_k Pk:3*4,每行系数都是1*4,即 P k , 1 T , P k , 2 T , P k , 3 T P_{k,1}^T,P_{k,2}^T,P_{k,3}^T Pk,1T,Pk,2T,Pk,3T都是4*1
y y y:4*1
(13)中D矩阵每行都是4*1,由于每次观测会有u,v两个方程,所以一次观测就是 ( 2 ∗ 1 ) ∗ 4 (2*1)*4 (2∗1)∗4行的D,n此就是 2 n ∗ 4 2n*4 2n∗4行。
求解
- 作业待解:为什么取 y = u 4 y=u_4 y=u4
- 由于系数矩阵容易满秩,故寻求最小二乘的数值解,对 D T D D^TD DTD进行奇异值分解(SVD),分解出的奇异值一般是从大到小排列, D T D D^TD DTD是 4 ∗ 4 4*4 4∗4的,4个奇异值,判断该解是否有效(判断三角化是否成立),看 σ 4 < < σ 3 \sigma_4<<\sigma_3 σ4<<σ3(经验上取1e-2~1e-4算远小于,也可以卡得更严一点更小一点)是否成立, σ 1 σ 2 σ 3 \sigma_1\sigma_2 \sigma_3 σ1σ2σ3组成了一个三维的空间, σ 4 \sigma_4 σ4是零空间
- D的数值可能不稳定,数值过大的话会导致较小值的影响体现不出来,需要对D进行rescale,取值方法取为一个对角阵,取D最大元素之逆。
- 还需要检测深度是否满足正确条件。
相关文章:

【深蓝学院】手写VIO第6章--视觉前端--笔记
第5章相关内容,还是CSDN的传统Markdown编辑器好用。 视觉前段在14讲课程中已经讲过,这里再简单复习一下。 1. 前端工作的定性比较,分析 这一节讲了很多关于前端的方法框架的对比讨论,后面看完了相关的论文之后强烈建议再回来听一…...

用例图 UML从入门到放弃系列之三
1.说明 关于用例图,这篇文章我将直接照搬罗伯特.C.马丁老爷子在《敏捷开发》一书种的第17章,并配上自己的理解,因为这一章写的实在是太精彩了,希望能够分享给大家,共勉。以下是老爷子的原文中文翻译以及豆芽的个人解读…...
NLP大模型
大模型 1、大模型的模型结构 一般指一亿参数以上的模型。 目前以Transformer为基础自回归生成大致可以分为三种架构: Encoder-only的模型,如BERT Encoder-Decoder的模型,如T5。 Decoder-Only的模型,如GPT系列。...
Python- 将一个字符串列表连接成一个单独的字符串
Python中一个常用的技巧:将一个字符串列表连接成一个单独的字符串。 ,.join(list) 是使用Python的 str.join() 方法。 详细解析: join() 方法: 是一个字符串方法,意味着在一个字符串上调用它。它需要一个参数,通常是一个列表或任…...

深眸科技自研AI视觉分拣系统,实现物流行业无序分拣场景智慧应用
在机器视觉应用环节中,物体分拣是建立在识别、检测之后的一个环节,通过机器视觉系统对图像进行处理,并结合机械臂的使用实现产品分类。 通过引入视觉分拣技术,不仅可以实现自动化作业,还能提高生产线的生产效率和准确…...
吴恩达《微调大型语言模型》笔记
微调(fine-tuning)就是利用特有数据和技巧将通用模型转换为能执行具体任务的一种方式。例如,将 GPT-3 这种通用模型转换为诸如 ChatGPT 这样的专门用于聊天的模型。或者将 GPT-4 转换为诸如 GitHub Coplot 这样的专门用于写代码的模型。 这里…...
Java中的Servlet
Java中的Servlet 在Java中,Servlet是一种用于处理Web请求的服务器端组件。Servlet生命周期是Servlet在运行时所经历的一系列阶段,每个阶段都调用特定的方法。以下是Servlet生命周期内调用的方法过程: 初始化阶段(Initialization&…...

Flutter配置Android SDK路径
在使用VSCode作为开发Flutter的工具时,当选择调试设备时,通常看不到android的模拟器,只能看到Chrome之类的。 原因就是Flutter找不到Android的SDK路径,所以无法识别模拟器,我们用flutter doctor命令检查环境时…...

jwt的基本介绍
说出我的悲惨故事给大家乐呵乐呵:公司刚来了一个实习生,老板让他写几个接口给我,我页面还没画完呢。他就把接口给我了,我敲开心,第一次见这么高效率的后端。但我很快就笑不出来了。他似乎不知道HTTP通信是无状态的。他…...
常见Vue事件修饰符浅析
一、.stop修饰符 .stop修饰符代表event.stopPropagation(),加上这个修饰符,就等于在方法中加上了这句代码。 <!--阻止单击事件继续传播--> <a click.stop"doThis"></a>上面的代码等同于如下代码。 <!--阻止单击事件继…...

怎样开始用selenium进行自动化测试?
如果您刚开始使用 Selenium 进行自动化测试,以下是建议的步骤。 1、安装 Selenium 首先,您需要安装 Selenium。Selenium 支持多种编程语言,如 Python、Java、C# 等。可以通过 pip 命令在 Python 中安装 Selenium: pip install …...
二维数组多次排序 或 嵌套list多次排序
可以排序int[ ][ ]的顺序,也可以排序List<List<Integer>> 顺序 为便于理解,以力扣原题为例:1333.餐厅过滤器 原题中给了一个双重数组,并要求返回一个List<Integer>。 方法1: 会用流的,…...

Flutter - 波浪动画和lottie动画的使用
demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 波浪动画三方库wave lottie动画 Lottie 是 Airbnb 开发的一款能够为原生应用添加动画效果的开源工具。具有丰富的动画效果和交互功能。 # 波浪动画 https://pub-web…...

忘记压缩包密码?解决方法一键找回,省时又便捷!
使用在线rar/zip解密工具,找回rar/zip密码并解密压缩包的方法非常简单。具体步骤如下:首先,在百度上搜索“密码帝官网”,这是一个专业的解密服务网站。然后,点击搜索结果中的链接,进入官网首页。在页面上方…...

“UTONMOS”掀起元宇宙游戏热潮,全球发展前景广阔
我们都知道,市面上无论是PC端的网游还是移动端手游,它如果要做到源源不断的内容输出,不仅取决于游戏公司产品质量和业绩,也与公司的决策和市场沟通密不可分。 元宇宙游戏市场受到关注 近年来,元宇宙游戏市场逐渐升温…...
用idea工具scala 和 Java开发 spark案例:WordCount
目录 一 环境准备 二 scala代码编写 三 java 代码编写 一 环境准备 创建一个 maven 工程 添加下列依赖 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>${spark.version}</vers…...

【git merge/rebase】详解合并代码、解决冲突
目录 1.概述 2.merge 3.rebase 4.merge和rabase的区别 5.解决冲突 1.概述 在实际开发中,一个项目往往是多个人一起协作的,头天下班前大家把代码交到远端仓库,第二天工作的第一件事情都是从服务器上拉最新的代码,保证代码版本…...
nrm,npm源的管理工具
npm手动切换淘宝源 查看当前的仓库 npm config get registry设置成淘宝源 npm config set registry https://registry.npmmirror.com/设置回官方源 npm config set registry https://registry.npmjs.org/手动切换不免不太方便,而且网上很多资料淘宝源还是过期的链接…...

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack
堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。该组件从API Version 7开始支持。可以包含子组件。 一、接口 Stack(value?: { alignContent?: Alignment }) 从API version 9开始,该接口支持在ArkTS卡片中使用。 二、…...

腾讯云2核4G服务器一年和三年价格性能测评
腾讯云轻量2核4G5M服务器:CPU内存流量带宽系统盘性能测评:轻量应用服务器2核4G5M带宽,免费500GB月流量,60GB系统盘SSD盘,5M带宽下载速度可达640KB/秒,流量超额按照0.8元每GB的价格支付流量费,轻…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...