一文详解非线性优化算法:保姆级教程-基础理论

不论是刚入门SLAM的小白,还是导航相关专业的同学,都对“非线性优化”这个词不陌生,如果你说你没听过这个词,那“因子图”一词总该略有耳闻吧,如果还是不知道,那就只能拿SLAM14讲敲你了。

自我进入SLAM领域以来,就再也没有逃出非线性优化的魔掌了,业界神书SLAM十四讲上还单独分出来一章对非线性优化进行了基础且详细的讲解,不过上了这么多年学的我们,早已经看透了这一切,书上写着“1+1=2”,实际操作中就开始解N个参数的方程组了。[一脸苦笑.gif]。如果你想耍滑头溜过非线性优化的大门,也可以,但你们会重逢的,在第七章重逢,第八章重逢,第九章重逢……在第十四章重逢。是的,非线性优化占据了SLAM的大半壁江山,于是,便有了这个专题——《非线性优化系列讲解》。

这个专题主要分为两大部分:Ceres和g2o,这两个是用于非线性优化的C++库,很常用,每个部分我都会由浅入深,结合代码逐行讲解,并在后续录制讲解视频供大家深度掌握,敬请关注。

非线性优化之G2O:基础理论知识

在这部分主要进行SLAM14讲中的基础知识讲解,若已熟读过的同学可以绕道下一步,在后续部分推导用到的公式我都会再次给出,并标记。

★问题一:什么是非线性最小二乘?

先举个简单的例子,在大家考试过程中,会有一个理想目标分数和实际分数以及满分,每次考试后,我们会得到实际分数,然后对实际分数和目标分数之间的差值进行评估,再对相应的学科进行难关攻克,以争取在下次考试中得到更好的成绩。

一文详解非线性优化算法:保姆级教程-基础理论_第1张图片

一文详解非线性优化算法:保姆级教程-基础理论_第2张图片

这便构成了最简单的最小二乘问题。可以想到,要使得有最小值,即找到函数极值点,而极值点往往在导数为零的点,对于易求解的,使用求导的方式,但在SLAM中,往往导数不易求解,无法找到极值点。

因此,选择使用一种很原始的方法,迭代试验法:

一文详解非线性优化算法:保姆级教程-基础理论_第3张图片

★问题二:高斯牛顿法求解非线性最小二乘

一文详解非线性优化算法:保姆级教程-基础理论_第4张图片

一文详解非线性优化算法:保姆级教程-基础理论_第5张图片

一文详解非线性优化算法:保姆级教程-基础理论_第6张图片

SLAM中更多用到列文伯格-马夸尔特方法,也被称为阻尼牛顿法,其收敛速度比高斯牛顿法慢但比高斯牛顿法更加健壮。

★问题三:列文伯格-马夸尔特法求解非线性最小二乘

Levenberg-Marquardt算法是使用最广泛的非线性最小二乘算法,同时具备梯度法和牛顿法的优点。

一文详解非线性优化算法:保姆级教程-基础理论_第7张图片

于是构建一个改良版的非线性优化框架:

一文详解非线性优化算法:保姆级教程-基础理论_第8张图片

对于[2]中的式子,用拉格朗日乘子将其转化为一个无约束问题:

一文详解非线性优化算法:保姆级教程-基础理论_第9张图片

这个方程在SLAM计算中会多次用到。

理论部分就到这里结束了,我不得不说一句,这些公式看起来都很有逼格,但怎么使用是真的搞不懂,因此,接下来的部分我会从浅入深依次推进讲解非线性优化。

本系列主要介绍两个非线性优化库ceres和g2o,g2o是结合SLAM十四讲的代码和ORB-SLAM3的优化代码进行详细讲解,ceres是结合SLAM十四讲的代码和PL-VINS的优化代码进行详细讲解,后续会逐步推出,敬请期待。

【Lesson 1 如何对一个简单的函数进行优化?】

(代码来自SLAM14讲第六讲)

先介绍两个很常见的非线性优化库:ceres和g2o。

方便大家使用,前辈们已经为我们封装好了基本的非线性优化库相关函数,我们需要做的就是在读懂基本库的同时,根据程序需要对基类函数进行派生,构造符合我们需求的类函数。Ceres和g2o对于我们大多数基本用户来说,都是一个用于非线性优化的基本函数库,其实没有太大的偏好,当然,大神都是自建库,这和我就没太大关系了。现在的很多开源代码,大多也是基于这两种优化库进行的,比如ORB-SLAM系列使用的是g2o优化库,VINS系列使用的是ceres库,这个就是一个使用偏好的问题,没有特别推荐的。

对于ceres和g2o的安装,推荐两个文档,网上还有其他参考,我只是随意挑选了两个,供大家参考。

Ceres:

https://blog.csdn.net/weixin_39373577/article/details/81285420

g2o:

https://blog.csdn.net/Qzx9059/article/details/88681998

具体安装请大家根据自己的环境自行配置,这里就不多说了。

更多的重点放在库的使用,首先我们通过一个简单的非线性最小二乘函数,引出最基本的使用方法。

一文详解非线性优化算法:保姆级教程-基础理论_第10张图片

一文详解非线性优化算法:保姆级教程-基础理论_第11张图片

一文详解非线性优化算法:保姆级教程-基础理论_第12张图片

一文详解非线性优化算法:保姆级教程-基础理论_第13张图片

再看信息矩阵,信息矩阵在书中没有非常详细的说明其来源,但在实际应用中,却起到了极大地作用,因此我在这里对其进行详细的分析。

提到信息矩阵,需要提到和他很接近的一个矩阵:协方差矩阵。

首先我们看什么是协方差矩阵,大家都知道方差,对于单个随意变量来说,方差是用来形容单个随机变量的离散程度,通俗一些讲,就是数据稳定程度。而协方差是来刻画两个随机变量的相似程度。

一文详解非线性优化算法:保姆级教程-基础理论_第14张图片

这两个式子进行对比,可以发现,单个随机变量的方差,可以视为随机变量与其自身的协方差。定义一群随机变量,两两随机变量之间的协方差为:           

一文详解非线性优化算法:保姆级教程-基础理论_第15张图片

协方差矩阵的实际应用会在接下来的每一段代码中进行分析,因此,这里没看太懂的同学也不要慌,慢慢来,后面更精彩。

备注:作者也是我们「3D视觉从入门到精通」特邀嘉宾:一个超干货的3D视觉学习社区

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「计算机视觉工坊」公众号后台回复:深度学习,即可下载深度学习算法、3D深度学习、深度学习框架、目标检测、GAN等相关内容近30本pdf书籍。

下载2

在「计算机视觉工坊」公众号后台回复:计算机视觉,即可下载计算机视觉相关17本pdf书籍,包含计算机视觉算法、Python视觉实战、Opencv3.0学习等。

下载3

在「计算机视觉工坊」公众号后台回复:SLAM,即可下载独家SLAM相关视频课程,包含视觉SLAM、激光SLAM精品课程。

重磅!计算机视觉工坊-学习交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

一文详解非线性优化算法:保姆级教程-基础理论_第16张图片

▲长按加微信群或投稿

一文详解非线性优化算法:保姆级教程-基础理论_第17张图片

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

一文详解非线性优化算法:保姆级教程-基础理论_第18张图片

 圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  一文详解非线性优化算法:保姆级教程-基础理论_第19张图片

你可能感兴趣的:(算法,人工智能,编程语言,计算机视觉,机器学习)