Optimizer类

ORB_SLAM2优化类一共有五个优化
这里先说一下利用g2o的BundleAdjustment优化

  1. 初始化优化器(稀疏,线性,LM算法)
  2. 设置关键帧位姿为顶点
  3. 设置地图点位置为顶点
  4. 对于每一个地图点,将它与能观测到该点的关键帧之间的重投影误差设置为边
  5. 设置完成,进行优化
  6. 更新优化后的关键帧位姿和地图点位置

一、GlobalBundleAdjustemnt(全局优化):对所有的地图点和关键帧进行优化
全局BA优化在本程序中有两个地方使用:

  • 单目初始化:CreateInitialMapMonocular函数
  • 闭环优化:RunGlobalBundleAdjustment函数
    在这里插入图片描述

二、LocalBundleAdjustment(局部优化):对某一关键帧的局部地图点集合和局部关键帧进行优化

局部优化在LocalMapping线程处理完队列中最后一个关键帧时使用

  1. 初始化优化器
  2. 将参数关键帧及其共视关键帧位姿设置为顶点
  3. 将能观测到局部地图点的关键帧(不包含步骤2中的关键帧)作为补充关键帧,将其位姿也设置为顶点
  4. 将局部地图点设置为顶点
  5. 对于每一个局部地图点,将它与能观测到该点的关键帧之间的重投影误差设置为边
  6. 进行第一回优化,去除优化后误差较大的顶点,不再优化它们
  7. 进行第二回优化,去除优化后误差较大的顶点
  8. 更新优化后的关键帧位姿和地图点位置

Pos3是新加入的关键帧,其初始估计位姿已经得到。此时,Pos2是和Pos3相连的关键帧,X2是Pos3看到的三维点,X1是Pos2看到的三维点,这些都属于局部信息,共同参与Bundle Adjustment。同时,Pos1也可以看到X1,但它和Pos3没有直接的联系,属于Pos3关联的局部信息,参与Bundle Adjustment,但取值保持不变。Pos0和X0不参与Bundle Adjustment。
因此,参与优化的是下图中红色椭圆圈出的部分,其中红色代表取值会被优化,灰色代表取值保持不变。(u,v)是X在Pos下的二维投影点,即X在Pos下的测量(measurement)。优化的目标是让投影误差最小。
在这里插入图片描述

三、PoseOptimization(位姿图优化):地图点固定,只对当前帧的位姿进行优化
用于LocalTracking中运动模型跟踪,参考帧跟踪,地图跟踪TrackLocalMap,重定位

  1. 初始化优化器
  2. 设置输入的关键帧位姿为顶点
  3. 设置关键帧对应的地图点与该关键帧的重投影误差(地图点固定,是一元边)为边
  4. 进行4次优化,每次十次迭代,剔除外点和误差过大的边
  5. 更新优化后的关键帧位姿

四、OptimizeEssentialGraph(优化本质图):所有的关键帧都是顶点,但边只是进行了一部分边的优化
用于闭环检测Sim3调整后优化

  1. 初始化优化器
  2. 将所有关键帧的位姿设置为顶点
  3. 某一帧,因为有闭环而新产生了一些跟他相连的关键帧,在该帧与这些关键帧之间建立边
  4. 某一帧,找出他的父关键帧,建立二者之间的边
  5. 某一帧,如果他有与他匹配的闭环帧,在二者之间建立边
  6. 某一帧,找出与它连接权重大于一定值的关键帧,建立该帧与这些帧之间的边
  7. 进行优化
  8. 根据优化结果更新各帧位姿,矫正地图点的位置

五、OptimizeSim3(优化Sim3):当前关键帧与闭环关键帧之间进行Sim3优化
在用RANSAC求解过Sim3,以及通过Sim3匹配更多的地图点后,对当前关键帧,闭环关键帧,以及匹配的地图点进行优化,获得更准确的Sim3位姿,再去下一步的闭环调整

  1. 初始化优化器
  2. 将两帧之间的sim3设置为顶点
  3. 将两针之间匹配上的地图点分部在各自相机坐标系下的位置设置为顶点
  4. 分别设置两帧对应的地图点的重投影误差为边
  5. 进行优化
  6. 剔除重投影误差过大的边
  7. 再进行一次优化,剔除外点
  8. 更新优化后的sim3

Pos6和Pos2为一个可能的闭环。通过之间的投影误差来优化
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TensorFlow优化器是一种用于训练神经网络的算法,它可以自动调整模型参数以最小化损失函数。TensorFlow提供了多种优化器,包括梯度下降、Adam、Adagrad等。这些优化器可以根据不同的场景和需求进行选择和调整,以提高模型的性能和效率。 ### 回答2: TensorFlow中的优化器(Optimizer)是一个用于优化神经网络模型的算法。它帮助我们根据训练数据来更新模型的参数,使得模型的预测结果更加准确。TensorFlow提供了多种优化器,每个优化器都有自己的特点和适用场景。 其中最常用的优化器之一是梯度下降法(Gradient Descent)。梯度下降法通过计算参数的梯度,并按照其相反方向调整参数的值,以最小化训练数据的损失函数。TensorFlow中的GradientDescentOptimizer就是梯度下降法的一种实现。我们可以通过指定学习率(learning rate)来控制参数的调整速度。 除了梯度下降法外,TensorFlow还提供了其他的优化器,如Adam、Adagrad、RMSProp等。这些优化器在不同的场景下可能表现更好,具体选择哪个优化器取决于模型和数据的特点。 优化器的使用非常简单,我们可以先定义一个优化器对象,然后在训练过程中调用其minimize方法,传入损失函数和要优化的参数。优化器会自动计算梯度并更新模型参数。 除了基本的优化器,TensorFlow还提供了其他辅助来帮助优化模型。例如,tf.train.exponential_decay可以根据训练步数自动降低学习率,以提高训练效果。另外,tf.train.Checkpoint和tf.train.Saver可以用来保存和恢复模型的参数,方便模型的训练和使用。 总而言之,TensorFlow的优化器是用于优化神经网络模型的重要工具。通过选择合适的优化器和调整参数,我们能够更好地训练模型,提高预测性能。 ### 回答3: TensorFlow中的optimizer是一种用于优化神经网络模型参数的工具。在深度学习中,优化器扮演着重要的角色,它的作用是通过调整模型的权重和偏差,使模型的损失函数最小化。 TensorFlow提供了多种不同的优化器,包括随机梯度下降(SGD)、Adam、Adagrad等。这些优化器的实现基于不同的算法和原理,每个优化器都具有不同的特性和适用场景。 使用优化器有几个关键步骤。首先,需要定义一个损失函数,通常是模型的预测值与实际标签之间的差异。然后,选择一个合适的优化器,并设置适当的超参数如学习率等。接下来,通过调用optimizer的minimize或apply_gradients函数,计算和应用梯度更新。这样,模型的参数就会根据损失函数的梯度进行更新。最后,循环执行该过程,直到达到某个停止条件。 优化器的选择取决于具体的问题和数据。例如,SGD是最简单的优化器之一,适用于大规模数据集,但收敛速度相对较慢。Adam是一种基于自适应矩估计的优化器,可以在不同的学习率下自动调整梯度。Adagrad则根据参数历史梯度的平方和自动调整学习率。 总之,TensorFlow的优化器是优化神经网络模型参数的重要工具,对模型的训练和性能具有重要影响。选择合适的优化器和调整超参数是深度学习中的关键步骤,可以帮助改善模型的性能和收敛速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值