DeepFactors 概率推断深度剖析:GTSAM ISAM2 因子图后端如何联合优化位姿与编码

📅 2026/8/24 12:10:50
DeepFactors 概率推断深度剖析:GTSAM ISAM2 因子图后端如何联合优化位姿与编码
DeepFactors 概率推断深度剖析GTSAM ISAM2 因子图后端如何联合优化位姿与编码【免费下载链接】DeepFactorsReal-Time Probabilistic Dense Monocular SLAM Using Compact Code Representation项目地址: https://gitcode.com/gh_mirrors/de/DeepFactorsDeepFactors是帝国理工推出的实时概率单目稠密 SLAM 系统其核心是用GTSAM ISAM2 增量式因子图优化器同时估计相机位姿SE3与每帧的深度编码compact code以极小的参数代价换来稠密三维重建能力。本文将从变量设计、四类自定义因子到逐帧增量更新流程带你完整看懂这套概率推断后端的工作原理适合想了解因子图 SLAM 与深度编码联合优化的新手读者。一、为什么选择 GTSAM ISAM2 做后端传统 SLAM 后端要么用批处理 BA图越来越慢要么用 EKF线性化误差累积。DeepFactors 选择了ISAM2增量平滑与映射作为中间路线增量式更新每来新帧只需局部重算而非重建整个 Hessian天然适合实时 SLAM概率推断框架所有信息都以因子观测形式加入图中位姿与编码在同一概率图里被联合优化误差自动在全图分摊选择性重线性化通过relinearizeSkip、relinearizeThreshold控制重线性化频率在精度与速度间平衡叶节点边缘化非关键帧优化完成后直接marginalizeLeaves移除图规模不随时间膨胀。ISAM2 实例在 Mapper 构造函数中创建关键参数在 deepfactors.cpp 中设置Cholesky 分解、开启findUnusedFactorSlots复用因子槽位、部分重线性化检查等。二、变量设计位姿 Key 与编码 KeyDeepFactors 在因子图中为每个关键帧定义两类变量变量Key 生成函数含义位姿PoseKey(id)/AuxPoseKey(id)关键帧 / 普通帧的 SE3 位姿6 自由度深度编码CodeKey(id)关键帧的 CS 维紧凑编码向量其中CScode size通常远小于稠密深度图维数编码经解码网络映射回稠密深度图这就是 Compact Code Representation 的精髓。普通帧只优化位姿AuxPoseKey关键帧才引入编码变量。三、四类核心因子概率推断的观测因子图封装类 FactorGraph 提供了统一的添加接口底层是gtsam::NonlinearFactorGraph。系统定义了四类因子1. 光度因子Photometric Factor⭐ 核心photometric_factor.h 绑定两个位姿 一个编码源关键帧误差是源帧图像经位姿 编码解码出的深度光流扭曲后与目标帧的逐像素光度残差扭曲与雅可比全部由 GPU 上的 SfmAligner 计算单次linearize()即返回稠密高斯因子支持图像金字塔多尺度优化pyrlevel参数先粗后细快速收敛误差函数即对数高斯似然0.5·‖h(x)−z‖²/σ²符合贝叶斯框架。2. 重投影因子Reprojection Factorreprojection_factor.h 用 BRISK 特征匹配做稀疏稀疏的稀疏-稀疏约束关键帧特征经编码深度反投影后应落在当前帧匹配点上。它提供光度因子之外的几何锚点防止位姿漂移。3. 稀疏几何因子Sparse Geometric Factorsparse_geometric_factor.h 是关键帧-关键帧约束同时绑定两个位姿和两个编码code0_key与code1_key采样数百个稀疏点做双向一致性检验用于回环与长期一致性。4. 深度先验因子Depth Prior Factordepth_prior_factor.h 将编码与深度先验训练数据的统计先验相约束防止编码在无观测区域随意游走是概率推断中先验角色的直接体现。此外初始化时会加入 位姿先验与编码零先验AddPosePrior/AddZeroCodePrior保证图在初期即有良态的贝叶斯后验。四、Work 系统多尺度优化的任务调度器因子不能一次性全部塞进图里DeepFactors 用 Work 任务系统逐层递进地管理因子生命周期InitVariables初始化关键帧位姿/编码变量并挂先验OptimizePhoto/OptimizeRep/OptimizeGeo分别管理三类因子的金字塔逐层迭代——Bookkeeping()在切换金字塔层级时移除上一层因子、加入下一层因子Update()累计迭代次数SignalNoRelinearize()当 ISAM2 本步没有变量被重线性化时WorkManager 判定当前尺度已收敛推进到更精细的层级。这让coarse-to-fine的求解策略与 ISAM2 的增量接口完美咬合。五、MappingStep一次完整的增量推断流程Mapper::MappingStep() 是后端的心脏每次调用做四件事记账BookkeepingWorkManager 汇总本轮新增因子、待移除因子索引FactorIndices与新变量初值约束键constrainedKeys将旧关键帧的位姿与编码、已边缘化帧标记为冻结——ISAM2 在优化时不改变它们只重算涉及最新关键帧的因子。这是保证增量效率的关键技巧ISAM2 更新isam_graph_-update(new_factors, var_init, remove_indices, constrainedKeys, ...)一步完成因子加入/删除、局部消除与重线性化返回ISAM2Result重算因子数、重线性化变量数等更新地图calculateEstimate()得到全图最优解UpdateMap()把位姿与编码写回关键帧同时MarginalizeFrames()通过 marginalizeLeaves 把已完成的普通帧从图中边缘化移除其信息已压缩进剩余图的先验中无信息丢失。六、关键参数速查表 ️参数默认值作用定义位置relinearize_skip1重线性化检查步长demo/main.cpprelinearize_threshold0.05触发重线性化的位移阈值同上partial_relin_checktrue是否启用部分重线性化检查同上code_prior/pose_prior1 / 0.3编码/位姿先验标准差mapper.hconnection_mode/max_back_connectionsLAST / 4关键帧回连策略同上factorizationCHOLESKY分解算法deepfactors.cpp七、总结一张图看懂联合优化DeepFactors 的概率推断后端可以概括为一句话以位姿 × 编码为变量、以光度 重投影 几何 先验四类因子为观测用 ISAM2 做冻结旧变量的增量高斯优化用 Work 系统驱动金字塔多尺度收敛用叶边缘化控制图规模。这套架构让单目 SLAM 在 GPU 光流扭曲 紧凑编码的加持下实现了实时稠密重建也是学习深度编码 因子图后端联合优化的优秀范本。调试时可借助Mapper::SaveGraphs()导出 GTSAM 因子图与贝叶斯树的 .dot 文件直观检查优化过程中每张图的演化。【免费下载链接】DeepFactorsReal-Time Probabilistic Dense Monocular SLAM Using Compact Code Representation项目地址: https://gitcode.com/gh_mirrors/de/DeepFactors创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考