热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SLAM笔记(五)光束平差法(BundleAdjustment)

1.什么是光束平差法前边的八点法,五点法等可以求出闭式解的前提是已经知道确切的点对。但实际情况中往往存在大量的噪声,点与点不是精确地对应甚至出现一些错

1.什么是光束平差法

前边的八点法,五点法等可以求出闭式解的前提是已经知道确切的点对。但实际情况中往往存在大量的噪声,点与点不是精确地对应甚至出现一些错误匹配。 
光束平差法由Bundle Adjustment翻译得来,有两层意思: 
对场景中任意三维点P,由从每个视图所对应的的摄像机的光心发射出来并经过图像中P对应的像素后的光线,都将交于P这一点,对于所有三维点,则形成相当多的光束(bundle);实际过程中由于噪声等存在,每条光线几乎不可能汇聚与一点,因此在求解过程中,需要不断对待求信息进行调整(adjustment),来使得最终光线能交于点P。对m帧,每帧含N个特征点的目标函数如下: 
这里写图片描述 
(1) 
其中:表示受白噪声影响的估计二维点坐标,为投影函数,ruguo 如果点j出现在图i上,则,否则。 
这是一个非凸问题。 
式子(1)表示对所有点 
以上便是光束平差法目标函数的原理。由于场景中特征点往往较多,该问题是一个巨大的高维非线性优化问题。接下来,需要对上述式子进行求解,这是光束平差法的核心内容。 
针对具体应用场景,光束平差法有不同收敛方法。目前常用的方法有梯度下降法,牛顿法,高斯牛顿法,Levenber-Marquardt等方法。


2.1 一阶方法——梯度下降法

所谓一阶方法,即对问题的目标函数进行泰勒一阶展开后进行迭代求解的方法。梯度下降法是一阶方法之一。当梯度为负值时,沿着梯度方向就是函数值f变小最快的方向。梯度下降法就是让函数沿着下降最快的方向去找函数值的最小值,就像水流沿着斜率最大的方向流去。对于变量都为标量的函数,形象的描述是始终用一条直线来拟合曲线。梯度下降法迭代式子如下:

 

(2)

 

其中,ϵ表示自己设置的迭代步长,可用一维线性搜索动态确定。x表示自变量。

严格意义上,梯度下降法并不决定函数f(x)下降方向,因为它仅仅是一个余向量而非向量,只能通过最终标量的正负而非实际的向量指引函数下降方向。梯度下降法的复杂度是Ο(n),其中n为待解决问题的大小,比如矩阵E的行数。实际过程中,常常使用一维线性搜索方法来寻找合适的步长。


2.2 二阶方法——牛顿法(Newton Method)

牛顿法是二阶优化方法,即会将目标函数展开至泰勒二阶项然后进行优化求解。与梯度法相比,它们利用到了目标函数的二阶导数。形象地讲,如用牛顿法求解自变量为标量的函数时,用二次曲线来拟合最优化点时的函数曲线。

对目标函数E,其二阶泰特展开式为:

其中g为E的雅克比矩阵,H为E的海塞矩阵。

由于优化点的导数为0,即:

上式展开,易知x的迭代式子为:

由于牛顿法下降速度很快。实际中往往加上一个步长因子γϵ(0,1),来控制收敛的速度:

牛顿法是二阶收敛的,收敛速度很快。在实际应用中,向量x往往非常大(每个视图中图像处理后特征点数量可能达到万个以上),海森矩阵H将非常大,求海塞矩阵的逆的运算消耗将非常大,对于牛顿法来说,计算复杂度是O(n3)。此外,由于海塞矩阵不一定可逆。其三,对于大多数一阶优化方法,可以采用诸如图形处理器(Graphics Processing Unit)并行的方式来加速,但对于海塞矩阵求逆来说这显然无法实现。因此实际中往往出现一阶方法比二阶方法更快收敛。


2.3 拟牛顿法——高斯牛顿法(Gauss-Newton Method)

所谓拟牛顿法,就是用其他式子来模拟替代海塞矩阵。假如牛顿法中的海塞矩阵不是正定(positive definitive)的,无法求解;此外,海森矩阵H往往非常大,求海塞矩阵的逆的运算消耗也很大(对于牛顿法来说,计算复杂度是O(n3)),因此,引入用拟牛顿法来用正定矩阵代替海塞矩阵和海塞矩阵的逆。常用的拟牛顿法有高斯牛顿法(Gauss-Newton Method)。

假设最小二乘问题目标函数如下: 

其中ri(x)是对应观测值与预测值之间的残差。

仿照2.3可以得到牛顿法中的迭代式子(10)。不过其中梯度矩阵g:

海塞矩阵H:

如果对于一个近线性的优化问题,则上式第二项更趋近于0,因此舍弃第二项,上式为:

则:

也即有:

由于采用 ,计算量大大减少

应当特别指出,上式成立的条件是。在结构与运动过程中,由于一般认为到场景位置点的距离比较远的,因此短暂的移动过程中,可以认为从摄像机到场景位置点的距离是近似不变的。在距离不变,也就是一个维度固定的前提下,投影函数π是线性的。因此该近似符合应用场景,是很好的近似。


2.4 Levenberg-Marquardt方法

另外一种思路是将牛顿法和梯度法融合在一起。数学上是阻尼最小二乘法的思路,即近似只有在区间内才可靠。对于

此处μ是信赖区间半径,D为对∆进行转换的矩阵(在Levenberg的方法中,他将D设置为单位矩阵)。

即加上一个单位矩阵I的倍数和使之成为:

这种方法时保证改进后的海塞矩阵可逆且正定。从效果上,是用λ在牛顿法与梯度法之间做出权衡。当λ很小时,上式几乎等同与牛顿法式子,当λ很大时,上式等同于梯度下降法的式子。

后来,Levenberg(1944)对此方法进行了改进。他将H替换成高斯牛顿法中的拟合矩阵:

其中: (15)

但容易出现的问题是,当 很小的时候,λI可能很大。这样会极大地偏向梯度法,降低收敛速度。因此为了提高收敛速度,Marquardt 提出了一种新的自适应方法:它的迭代式子中:

因此当很小时,该方法也不会特别偏向梯度法。

在L-M方法中,采用了近似程度描述ρ

即ρ=实际下降/近似下降。当ρ太大,则减少近似范围(增大λ),当p太大,则增加近似范围(减少λ)。

因此最常使用的光束平差法模型, L-M算法计算步骤如下:

a)给定初始值; 
b)对第k次迭代,求解 
c)计算ρ 
d)若ρ>0.75(经验值),则μ=2μ(经验值,实际可视作变化迭代步长); 
若ρ<0.25&#xff08;经验值&#xff09;&#xff0c;则μ&#61;0.5μ&#xff08;经验值&#xff09;; 
e)如果ρ大于某阈值&#xff0c;则该次近似是可行的&#xff0c;回到b&#xff09;继续迭代&#xff1b;否则算法已经收敛&#xff0c;迭代结束。


2.5与高斯牛顿法相比LM算法的优缺点

高斯牛顿法的缺点是&#xff1a;


  • 可能是奇异的病态的&#xff0c;无法保证求解的增量的稳定性&#xff1b;
  • 步长可能很大从而导致无法满足高斯牛顿的一阶能大致拟合的假设 
    优点&#xff1a;
  • 下降速度比LM快

LM是信赖区域优化法的代表&#xff0c;而加上步长的高斯牛顿法是线搜索方法的代表。


3 关于光束平差法的其他问题

&#xff08;1&#xff09;初始值

光束平差法需要比较好的初始值才能比较快地收敛&#xff0c;所以光束平差法一般作为重建流水线的最后一个步骤&#xff0c;在此之前&#xff0c;需要使用多视图几何中传统的八点法&#xff0c;五点法等传统多视图几何算法先算出R,T等信息。

&#xff08;2&#xff09;步长控制

引入步长控制&#xff0c;既可以是避免收敛时步长太大而在最优点附近震荡&#xff0c;也可以加快收敛速度。加入迭代步长的原因&#xff0c;是因为 牛顿法中 下降方向 可能和真实下降方向不一致* 。*比如可能会出现几个最优点相邻比较近的情况&#xff0c;那么优化过程将在几个谷底之间跳来跳去迟迟不收敛。为了避免这种情况&#xff0c;增加收敛速率&#xff0c;加入一个迭代步长γ&#xff0c;来使迭代朝着真实下降方向走。如果在鞍点&#xff0c;在沿着海塞矩阵为负的方向迭代。实际应用中&#xff0c;可以采用每一次迭代后&#xff0c;再对γ进行一维搜索的方法来寻找合适步长。也可以采用L-M的方法&#xff0c;通过改变信任区间的方式&#xff0c;来进行步长控制。 
4.常用优化库&#xff1a; 
常用BA库&#xff1a; 
sba: A Generic Sparse Bundle Adjustment C/C&#43;&#43;

Apero/MicMac, a free open source photogrammetric software. Cecill-B licence.

Package Based on the Levenberg–Marquardt Algorithm (C, MATLAB). GPL.

cvsba: An OpenCV wrapper for sba library (C&#43;&#43;). GPL.

ssba: Simple Sparse Bundle Adjustment package based on the Levenberg–Marquardt Algorithm (C&#43;&#43;). LGPL.

OpenCV: Computer Vision library in the contrib module. BSD license.

mcba: Multi-Core Bundle Adjustment (CPU/GPU). GPL3.

libdogleg: General-purpose sparse non-linear least squares solver&#xff0c;based on Powell’s dogleg method. LGPL. 
ceres-solver: A Nonlinear Least Squares Minimizer. BSD license. 
g2o: General Graph Optimization (C&#43;&#43;) - framework with solvers for sparse graph-based non-linear error functions. LGPL.

DGAP: The program DGAP implement the photogrammetric method of bundle adjustment invented by Helmut Schmid and Duane Brown. GPL. 
工程上常用的是g2o和ceres-solver。此上列表来源不可考&#xff0c;如有侵权请联系我以删除。


推荐阅读
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文介绍了如何通过配置 Android Studio 和 Gradle 来显著提高构建性能,涵盖内存分配优化、并行构建和性能分析等实用技巧。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文探讨了高质量C/C++编程的最佳实践,并详细分析了常见的内存错误及其解决方案。通过深入理解内存管理和故障排除技巧,开发者可以编写更健壮的程序。 ... [详细]
  • 作为一名 Ember.js 新手,了解如何在路由和模型中正确加载 JSON 数据是至关重要的。本文将探讨两者之间的差异,并提供实用的建议。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
author-avatar
甘文靖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有