简单明了,一文入门视觉SLAM
作者 | 黄浴
转载自知乎
【导读】SLAM是“Simultaneous Localization And Mapping”的缩写,可译为同步定位与建图。最早,SLAM 主要用在机器人领域,是为了在没有任何先验知识的情况下,根据传感器数据实时构建周围环境地图,同时根据这个地图推测自身的定位。因此本文以简单清晰的文字为大家介绍了视觉 V-SLAM。
简单的V-SLAM介绍,就当入门:)。
首先,从双目立体几何(stereo geometry)原理开始来定义外极(epipolar)约束:两个摄像头光心分别是 c0 和 c1,3-D 空间点 p 在两个图像平面的投影点分别是 x0 和 x1,那么直线 c0c1 和两个图像平面的交点即外极点(epipole)e0 和 e1,pc0c1 平面称为外极平面(epipolar plane),它和两个图像平面的交线 l0 和 l1 即外极线(epipolar line);可以看到两个摄像头坐标系之间的转换满足(R,t),同时说明摄像头 c0 的图像点 x0 在摄像头 c1 的图像对应点 x1 一定落在其外极线 l1,反之依然;

(a)对应一条光线的外极线 (b)对应的外极线集合和外极平面 外极线约束
这里需要定义一个本质矩阵(essential matrix)E 和一个基础矩阵(fundamental matrix)F:E = [t]×R,其中 [t]× 是反对称矩阵,即定义向量

那么

而 F = A−TEA−1,其中 A 是摄像头内参数矩阵;对矩阵 E 和矩阵 F 来说,均满足外极约束方程 x1TEx0 =0,x1TFx0 =0
前者是摄像头已标定情况下图像特征点的对应关系,后者是摄像头未标定情况下图像特征点的对应关系;
其次,得到外极线约束(以F矩阵为例,E矩阵同样)如下
l1=Fx0,l0=x1F,
以及,外极点约束(以F矩阵为例,E矩阵同样)如下
Fe0=0,FTe1=0;
根据上面图像特征点的外极约束方程,有 8 点算法求解 F 和 E,以 F 为例,给定一组匹配特征点(n > 7)

定义F矩阵元素fij(i=1~3,j=1~3),那么线性齐次方程组为

简记为
Qf = 0
做SVD得到Q = USVT,而最终F的解是V最右的奇异向量(singular vector);
另外,因为E矩阵完全由摄像头外参数(R和t共6个未知参数,但有一个不确定平移尺度量)决定,所以存在 5 点算法求解 E 矩阵;
可以分解E得到摄像头外参数,其步骤如下:
i. 同样对E矩阵做奇异值分解(SVD):

ii. 那么第一个摄像头投影矩阵简单设为

而第二个摄像头矩阵P2有四种可能情况,如图(a)-(d)所示:

其中



从E矩阵分解得到R和t
根据视图方向与摄像头中心到3-D点的方向之间夹角可以发现,四个可能中只有情况(a)是合理的解;
确定两个视角的姿态之后,匹配的特征点 x,x’可以重建其 3-D 坐标 X,即三角化(triangulation)理论;首先存在一个线性解:设两个摄像头投影矩阵为 P 和 P’,相应的它们列向量为 pi,pi’,i=1~3,则有方程组:AX = 0
其中

但一些误差干扰的存在,上述线性解是不存在的;所以需要一个非线性的解,这里采用 F 矩阵定义的外极约束方程 xTFx’= 0,得到最小化误差函数为

下面采用外极线 l, l’的来约束定义误差,如图所示,将目标函数重写为


外极线定义的误差
另外,在已知重建的 3-D 点集,如何和新视角的 2-D 图像特征点匹配呢?这个问题解法称为 PnP(Perspective n Points),算法如下:
i. 首先,3D 点表示为 4 个控制点的加权和;
ii. 控制点坐标是求解的(12)未知数;
iii. 3D点投影到图像上以控制点坐标建立线性方程;
iv. 控制点坐标表达为零特征向量(null eigenvectors)线性组合;
v. 上面组合的权重(bi)是新未知数(<4);
vi. 增加刚体(rigidity)约束以得到bi二次方程;
vii. 根据bi数目(无论线性化,或重新线性化)求解。
(注:有时候3-D-2-D匹配比3-D之间匹配的精度高)

PnP求解的示意图
这里需要补充两个概念,一是鲁棒估计的随机样本共识法(RANSAC,RANdom SAmple Consensus),另一个是全局优化的集束修正法(BA,bundle adjustment):
i. RANSAC的目的是在包含异常点(outlier)的数据集上鲁棒地拟合一个模型,如图 2-12 所示:
1. 随机选择(最小)数据点子集并实例化(instantiate)模型;
2. 基于此模型,将所有数据点分类为内点(inlier)或异常点;
3. 迭代重复 1-2 步;
4. 选择最大的内地集,以此重新估计最终模型。

RANSAC示意图
ii. BA的目的是优化全局参数估计,对 SLAM 来说,结构重建的 3-D 点 X 和其对应的 2-D 特征点 x ,还有估计的视角变换参数(甚至包括摄像头内参数) P ,位于一个重投影(reprojection)误差函数 D 最小化框架下(如图所示),即


BA示意图
这里集束(Bundle)指2-D点和3-D点之间的光线集,而修正(Adjustment)是指全局优化过程;其解法是非线性迭代的梯度下降法,如Gauss-Newton 方法和其修正 Levenberg-Marquardt 方法,因为问题自身的特性,这里的雅可比矩阵是非常稀疏的;另外,只取重建 3-D 点修正的话,称为 structure only BA,而只取视角变换修正的话,称为 motion-only BA;
在以上基础之上,再重新审视SLAM过程:
i. 首先要提到概念 VO,即视觉里程计(visual odometry);VO 是 SLAM 的一部分,VO 主要是估计视角之间的变换,或者运动参数,它不需要输出制图(mapping)的结果,而且 BA 就是 motion-only 的模式;
ii. SLAM 方法分两种途径,一种是递推滤波器方法,另一种是批处理估计方法;
a) 滤波器方法,比如卡尔曼滤波递推估计,实际上建立一个状态空间的观测模型和状态转换(运动)模型;观察模型描述当摄像头姿态和地标位置(来自于地图)已知时观测(地标)的概率; 运动模型是系统状态(摄像头姿态)转换的概率分布,即马尔可夫过程; 那么在递归贝叶斯估计中,同时更新系统状态和建立的地图,其中融合来自不同视角的观测来完成制图,而估计系统状态可计算摄像头的姿态,即定位问题;
b) 批处理估计方法,也称“关键帧”方法,其步骤是:
1)首先通过选择的头两(关键)帧,采用双目几何的特征点匹配得到初始的3-D点云重建;
2)正常模式:假设 3D 地图可用,并且估计出摄像头增量运动,跟踪特征点并使用 PnP 进行摄像头姿态估计;
3)恢复模式:假设 3D 地图可用,但跟踪失败故没有增量运动,可相对于先前重建的地图重新定位(re-localize)摄像头姿势;
4)关键帧 BA:保持一个“关键帧”子集,状态向量是所有关键帧的 3D 地标和对应摄像头姿势,BA 可以在与跟踪模块并列的线程中调整状态估计;
(注意:关键帧的选择策略是算法性能很重要的一个因素)
SLAM 中的闭环(loop closure)问题:当摄像头又回到原来位置,称为闭环,需要检测闭环,并以此在 BA 框架下优化结构和运动估计;闭环检测和重定位是类似的,可以基于图像特征的匹配实现,俗称“基于图像的重定位(image-based re-localization),当关键帧子集较大的时候,需要对特征匹配进行压缩和加速,比如词包(bag of words)法和K维-树(KD-tree)数据结构等等;
SLAM 中的传感器可以是单目、双目、深度传感器(RGB-D)甚至激光雷达,也可以和 IMU 融合,称为 VINS(visual inertial navigation system)。
附录:G-N 和 L-M 的非线性最小二乘算法
假设有观测向量 zi’,其预测模型为 zi = zi(x),其中x为模型参数;那么最小二乘(LS)法就是最小化如下代价函数:平方误差加权和(weighted Sum of Squared Error,SSE)

其中 Wi 是一个任意对称正定(symmetric positive definite,SPD) 矩阵,特征误差函数为

雅可比矩阵 J 和黑森(Hessian)矩阵 H 的计算为



那么 H 近似为
H ≈ J⊤ W J
作为梯度下降法,其 G-N 迭代的步进量即 z → z + delta z,由下面方程组计算

对于上面 G-N 的迭代步进量计算,可能左边的矩阵不可逆。为此,一种改进的方法是在对角线元素中加入阻尼因子(Damped factor),即 L-M 迭代的步进量计算变成如下方程组

原文链接:
https://zhuanlan.zhihu.com/p/67848295
(*本文为 AI科技大本营转载文章,转载请联系作者)
◆
福利时刻
◆
入群参与每周抽奖~
扫码添加小助手,回复:大会,加入福利群,参与抽奖送礼!
AI ProCon 2019 邀请到了亚马逊首席科学家@李沐,在大会的前一天(9.5)亲授「深度学习实训营」,通过动手实操,帮助开发者全面了解深度学习的基础知识和开发技巧。还有 9大技术论坛、60+主题分享,百余家企业、千余名开发者共同相约 2019 AI ProCon!距离5折优惠票结束还有4天!
推荐阅读
从不温不火到炙手可热:语音识别技术简史
ImageNet错误率小于4%,数据量依然不够,N-Shot Learning或是终极解决之道?
NLP机器翻译深度学习实战课程基础 | 深度应用
重磅!全球首个可视化联邦学习产品与联邦pipeline生产服务上线
用Python的算法工程师们,编码问题搞透彻了吗?
Python冷知识,不一样的技巧带给你不一样的乐趣
90 后程序员健康现状:掉头发、油腻、腰椎间盘突出……| 程序员有话说
真相了!AI 程序员:我们根本没有 80w 年薪好么?
CSDN & 火星财经, 联手发起Libra超级节点竞选!
干货!学霸用12个决策模型告诉你,如何判断你到底需不需要区块链!
你点的每个“在看”,我都认真当成了喜欢
相关文章:
大主子表关联的性能优化方法
【摘要】主子表是数据库最常见的关联关系之一,最典型的包括合同和合同条款、订单和订单明细、保险保单和保单明细、银行账户和账户流水、电商用户和订单、电信账户和计费清单或流量详单。当主子表的数据量较大时,关联计算的性能将急剧降低,在…

Windows7上配置Python Protobuf 操作步骤
1、 按照http://blog.csdn.net/fengbingchun/article/details/8183468 中步骤,首先安装Python 2.7.10; 2、 按照http://blog.csdn.net/fengbingchun/article/details/47905907 中步骤,配置、编译Protobuf; 3、 将(2)中生成的pr…

鲜为人知的静态、命令式编程语言——Nimrod
Nimrod是一个新型的静态类型、命令式编程语言,支持过程式、函数式、面向对象和泛型编程风格而保持简单和高效。Nimrod从Lisp继承来的一个特殊特性抽象语法树(AST)作为语言规范的一部分,可以用作创建领域特定语言的强大宏系统。它还…

机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)
1.cv2.erode(src, kernel, iteration) 参数说明:src表示的是输入图片,kernel表示的是方框的大小,iteration表示迭代的次数 腐蚀操作原理:存在一个kernel,比如(3, 3),在图像中不断的平移,在这个9…

无需成对示例、无监督训练,CycleGAN生成图像简直不要太简单
作者 | Jason Brownlee译者 | Freesia,Rachel编辑 | 夕颜出品 | AI科技大本营(ID: rgznai100)【导读】图像到图像的转换技术一般需要大量的成对数据,然而要收集这些数据异常耗时耗力。因此本文主要介绍了无需成对示例便能实现图…

Git使用常见问题解决方法汇总
1. 在Ubuntu下使用$ git clone时出现server certificate verification failed. CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile: none 解决方法:在执行$ git clone 之前,在终端输入: export GIT_SSL_NO_VERIFY1 2. 在Windows上更新了…

服务器监控常用命令
在网站性能优化中,我们经常要检查服务器的各种指标,以便快速找到害群之马。大多情况下,我们会使用cacti、nagois或者zabbix之类的监控软件,但是这类软件安装起来比较麻烦,在一个小型服务器,我们想尽快找到问…
Ubuntu下内存泄露检测工具Valgrind的使用
在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检测工具Valgrind的使用。Valgrind目前最新版本是3.11.0, 可以从http://www.valgrind.org/ 通过下载源码…

数据为王的时代,如何用图谱挖掘商业数据背后的宝藏?
这是一个商业时代,一个数据为王的时代,也是一个 AI 迎来黄金发展期的时代。据史料记载,商业在商朝已初具规模。斗转星移,时光流转,到 2019 年,商业形式已发生翻天覆地的变化,但是商业的本质——…

旋转卡壳——模板(对踵点)
这东西学了我大概两天吧。。其实不应该学这么久的,但是这两天有点小困,然后学习时间被削了很多\(QwQ\) 说几个坑点。 - 对于题目不保证有凸包的情况,要选用左下角的点,而非单纯的最下边的点构造凸包。 - 对于凸包中只有\(1/2\)个点…

SNMP 协议 OID的使用
为什么80%的码农都做不了架构师?>>> SNMP 协议 OID的使用 SNMP(Simple Network Management Protocol简单网络管理)协议 是现在网络管理系统(NMS)监控网络设备状态的协议,是现在网管事实上的标准…

颜色空间YUV简介
YUV概念:YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL,Phase Alternation Line),是PAL和SECAM模拟彩色电视制式采用的颜色空间。其中的Y、U、V几个字母不是英文单词的组合词,Y代表亮度,其实Y就是图像的灰度值…

基于RNN的NLP机器翻译深度学习课程 | 附实战代码
作者 | 小宋是呢来源 | CSDN博客深度学习用的有一年多了,最近开始NLP自然处理方面的研发。刚好趁着这个机会写一系列 NLP 机器翻译深度学习实战课程。本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:…

trash-cli设置Linux 回收站
trash-cli 设置 Linux 回收站 trash-cli是一个使用 python 开发的软件包,包含 trash-put、restore-trash、trash-list、trash-empty、trash-rm等命令,我们可以通过这条命令,将文件移动到回收站,或者还原删除了的文件。 trash-cli的…

磁盘有时也不可靠
实验服务器的磁盘是最近买的,当卖家问我要普通的还是高级的, 我选择了普通,现在追悔莫及。今天的分析更加详细。首先发现每次实验,出错的文件都不一样,所以应该不是临界条件的问题。下表总结了出错的位置,原…

从原理到落地,七大维度详解矩阵分解推荐算法
作者 | gongyouliu编辑丨Zandy来源 | 大数据与人工智能 ( ID: ai-big-data)导语:作者在《协同过滤推荐算法》这篇文章中介绍了 user-based 和 item-based 协同过滤算法,这类协同过滤算法是基于邻域的算法(也称为基于内存的协同过…

libyuv库的使用
libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。下面说一下libyuv在Windows7VS2013 x6…

封装 vue 组件的过程记录
在我们使用vue的开发过程中总会遇到这样的场景,封装自己的业务组件。 封装页面组件前要考虑几个问题:1、该业务组件的使用场景 2、在什么条件下展示一些什么数据,数据类型是什么样的,及长度颜色等 3、如果是通用的内容,…
Service的基本组成
Service与Activity的最大区别就是一有界面,一个没有界面。 如果某些程序操作很消耗时间,那么可以将这些程序定义在Service之中,这样就可以完成程序的后台运行, 其实Service就是一个没有界面的Activity,执行跨进程访问也…
BP神经网络公式推导及实现(MNIST)
BP神经网络的基础介绍见:http://blog.csdn.net/fengbingchun/article/details/50274471,这里主要以公式推导为主。BP神经网络又称为误差反向传播网络,其结构如下图。这种网络实质是一种前向无反馈网络,具有结构清晰、易实现、计算…
AI应用落地哪家强?CSDN AI Top 30+案例评选等你来秀!
人工智能历经百年发展,如今迎来发展的黄金时期。目前,AI 技术已涵盖自然语言处理、模式识别、图像识别、数据挖掘、机器学习等领域的研究,在汽车、金融、教育、医疗、安防、零售、家居、文娱、工业等行业获得了令人印象深刻的成果。 在各行业…
安利Mastodon:属于未来的社交网络
我为Mastodon开发了一款安卓客户端,v1.0版本已经发布,欢迎下载使用 源码在这里:https://github.com/shuiRong/Gakki ??? 正文 Mastodon(长毛象)是什么? 是一个免费开源、去中心化、分布式的微博客社交网络,是微博、…

通过案例练习掌握SSH 的整合
1. SSH整合_方案01 ** 整合方案01 Struts2框架 Spring框架 在Spring框架中整合了Hibernate(JDBC亦可) 一些业务组件(Service组件)也可以放入Spring框架中迚行管理(昨天的例子) 1. 请求࿰…
tiny-cnn开源库的使用(MNIST)
tiny-cnn是一个基于CNN的开源库,它的License是BSD 3-Clause。作者也一直在维护更新,对进一步掌握CNN很有帮助,因此下面介绍下tiny-cnn在windows7 64bit vs2013的编译及使用。 1. 从https://github.com/nyanp/tiny-cnn下载源码࿱…

玩嗨的2亿快手“老铁”和幕后的极致视觉算法
作者 | Just出品 | AI科技大本营(ID:rgznai100)创立八年,短视频平台快手目前已经有超过两亿人在每天登陆使用,每天还有超过 1500 万条短视频被制作和上传,每天的累计观看数更是达到 150 亿。拥有如此庞大的用户数&…
lsmod命令详解
基础命令学习目录首页 原文链接:http://blog.sina.com.cn/s/blog_e6b2465d0101fuev.html lsmod——显示已载入系统的模块 lsmod 其实就是list modules的缩写,即 列出所有模块. 功能说明:显示已载入系统的模块。 语法:lsmod 说明&a…

javascript模块化、模块加载器初探
最常见网站的javascript架构可能是这样的: 一个底层框架文件,如jQuery一个网站业务框架文件,包含整站公用业务模块类(如弹框、ajax封装等)多个业务文件,包含每个具体页面有关系的业务代码为了减少一个HTTP请求,我们可能…

tiny-cnn执行过程分析(MNIST)
在http://blog.csdn.net/fengbingchun/article/details/50573841中以MNIST为例对tiny-cnn的使用进行了介绍,下面对其执行过程进行分析:支持两种损失函数:(1)、mean squared error(均方差);(2)、cross entropy(交叉熵)。在MNIST中使…

关于element的select多选选择器,数据回显的问题
关于element的select多选,数据回显的问题 在工作中遇到这样一个问题,新建表单时用element的select多选以后,在编辑的时候打开表单发现其他数据能正常显示,多选却无法正常回显。在网上找了很多后,终于解决了这个问题&am…

360金融发布Q2财报:净利6.92亿,同比增长114%,大数据与AI加持的科技服务是新亮点?
8月23日,360金融发布未经审计的2019年第二季度业绩报告。财务数据显示,2019年第二季度,360金融实现收入22.27亿元人民币,较2018年二季度9.79亿元增长128%;净利润为6.18亿元,而去年同期为净亏损1.42亿元&…