网络资源

  • Bundle Adjustment on the GPU
  • Siddharth Choudhary主页
  • Multicore Bundle Adjustment
  • BA笔记
  • Parralel Bundle Adjustment
  • RPBA, Robust Parallel Bundle Adjustment
  • ceres solver学习之bundle adjustment
  • Tutorial BA
  • ORB_SLAM2学习之源码分析三-优化
  • Bundle Adjustment简述
  • sba : A Generic Sparse Bundle Adjustment C/C++ Package Based on the Levenberg-Marquardt Algorithm
  • Gaussian Belief Propagation for Bundle Adjustment and SLAM
  • Poplar Implementation of Bundle Adjustment using Gaussian Belief Propagation on Graphcore’s IPU
  • HKUST, Lei Zhou (周磊)
  • visualSFM : A Visual Structure from Motion System
  • Clustering Views for Multi-view Stereo (CMVS)
  • 三维重建系统

矩阵结构

优化器设计

采用LevenbergMarquardt优化器,主要计算部分在目标函数线性化和RCS(Reduced Cameras System)矩阵构建和求解, 等同于Schur Complement步骤,先求解姿态修正量,之后求解空间点的修正量。首先对所有投影测量排序,第一关键字是空间点下标,第二关键字是相机下标,并确定每个空间点在排序后的整体测量中对应的起始和结束位置(相当于构建Visibility矩阵, 空间点看相机)。

  • 对所有空间点并行进行残差和Jacobian计算{e,Jp,Jc}\{e,J_p,J_c\}{e,Jp​,Jc​},每个点对应的{Vi,Wi}\{V_i,W_i\}{Vi​,Wi​}可以并行计算, ViV_iVi​相当于∑JpT∗Jp\sum{J_p}^T*J_p∑Jp​T∗Jp​, WiW_iWi​相当于{JpT∗Jc}\{J_p^T*J_c\}{JpT​∗Jc​}横向stack在一起 ,矩阵U是块状对角阵,只需要保存对角块即可,每个线程有私有U, 线程只更新本线程U矩阵,当计算遍历完所有空间点后,会将每个线程私有U更新到全局U矩阵上(使用omp critical section临界区规约求和)
  • RCS矩阵计算S=U−WV−1WT=U−∑WiVi−1WiTS=U-WV^{-1}W^T=U-\sum{W_iV_i^{-1}W_i^T}S=U−WV−1WT=U−∑Wi​Vi−1​WiT​对ViV_iVi​进行LLTLLTLLT分解Vi=Li∗LiTV_i=L_i*L_i^TVi​=Li​∗LiT​变为S=U−∑(Li−1Wi)T(Li−1Wi)S=U-\sum{(L_i^{-1}W_i)^T(L_i^{-1}W_i)}S=U−∑(Li−1​Wi​)T(Li−1​Wi​)并行计算策略,此处不能简单对空间点并行划分,因可能有多个点对矩阵SSS的相同子块进行更新,这里采用对SSS的子块进行并行更新,对于某个子块Si,jS_{i,j}Si,j​, 需要遍历所有空间点,如果空间点所包含的测量同时含有i,ji,ji,j相机,那么本空间点就会对子块Si,jS_{i,j}Si,j​有贡献,SSS的各个子块之间更新不相关,可并行处理,更适合GPU上计算(CPU上需要三重循环,所有空间点的遍历位于最里面,增加较多冗余计算,对于姿态较少问题,采用遍历所有空间点的串行方式效率更高)
  • RCS矩阵方程右手边向量ηrhs=ϵa−∑WiVi−1ϵb,i=U−∑(Li−1Wi)T(Li−1ϵb,i)\eta_{rhs}=\epsilon_a-\sum{W_iV_i^{-1}\epsilon_{b,i}}=U-\sum{(L_i^{-1}W_i)^T(L_i^{-1}\epsilon_{b,i})}ηrhs​=ϵa​−∑Wi​Vi−1​ϵb,i​=U−∑(Li−1​Wi​)T(Li−1​ϵb,i​)所以计算RCS方程,只需要计算(Li−1Wi)(L_i^{-1}W_i)(Li−1​Wi​)和(Li−1ϵb,i)(L_i^{-1}\epsilon_{b,i})(Li−1​ϵb,i​),可以并行计算
  • RCS方程S∗δa=ηrhsS*\delta_a=\eta_{rhs}S∗δa​=ηrhs​进而计算出δb=V−1(ϵb−W∗δa)\delta_b=V^{-1}(\epsilon_b-W*\delta_a)δb​=V−1(ϵb​−W∗δa​)根据VVV的性质,得到δb,i=Li−T((Li−1ϵb,i)−(Li−1Wi)∗δa)\delta_{b,i}=L_i^{-T}((L_i^{-1}\epsilon_{b,i})-(L_i^{-1}W_i)*\delta_a)δb,i​=Li−T​((Li−1​ϵb,i​)−(Li−1​Wi​)∗δa​)其中ViV_iVi​和LiL_iLi​都是3×33\times33×3矩阵,ϵb,i\epsilon_{b,i}ϵb,i​和δb,i\delta_{b,i}δb,i​都是3×13\times13×1向量, 每个WiW_iWi​都是块状稀疏矩阵,每一块大小3×Nc3\times Nc3×Nc

RCS方程S∗δa=ηrhsS*\delta_a=\eta_{rhs}S∗δa​=ηrhs​求解策略

  • 直接用Cholesky分解SSS. 对于稠密问题用稠密分解方式,对于大规模稀疏问题用稀疏分解(参考Eigen库),在分解前可用Ordering methods (AMD, CAMD, COLAMD, and CCOLAMD)进行Reordering,提高分解效率。矩阵SSS的Sparsity Pattern是固定的,Reordering只需要计算一次。
  • PCG(Preconditioned Conjugate Gradient)迭代求解器。M−1S∗δa=M−1ηrhsM^{-1}S*\delta_a=M^{-1}\eta_{rhs}M−1S∗δa​=M−1ηrhs​需要提供Preconditioner矩阵M−1M^{-1}M−1, 可以取SSS的对角块,还需要提供SxSxSx矩阵向量计算,依据SSS的形式,不需要显式构造出SSS, 利用Sx=Ux−∑WiVi−1WiTxSx=Ux-\sum{W_iV_i^{-1}W_i^T}xSx=Ux−∑Wi​Vi−1​WiT​x可多线程并行(CPU上可采用OpenMP多线程形式,GPU上按线程块划分计算)

性能比较

  • 依据minisam中的BA例子。49个相机姿态,7000多个点,3万多个观测
  • minisam实现: factor graph
  • RCS直接Cholesky分解。针对本问题RCS矩阵SSS是小规模接近稠密矩阵,主要耗时发生在线性化和SSS构造上,基本耗时Ttotal=Tlinear+Ts+Tlu+TδbT_{total}=T_{linear}+T_{s}+T_{lu}+T_{\delta_b}Ttotal​=Tlinear​+Ts​+Tlu​+Tδb​​
  • PCG。 多次迭代(100次左右),主要耗时发生在SxSxSx计算上,求解M−1xM^{-1}xM−1x较为简单高效. 可采用较为复杂矩阵MMM形式(比如取SSS的块状三对角矩阵),提高收敛性,或 MMM可采用更大的对角块! 基本耗时Ttotal=Tlinear+Nitr×TpcgT_{total}=T_{linear}+N_{itr}\times T_{pcg}Ttotal​=Tlinear​+Nitr​×Tpcg​ 其中 Tpcg≈TMy=b+TSx≈TSxT_{pcg}\approx T_{My=b}+T_{Sx} \approx T_{Sx} Tpcg​≈TMy=b​+TSx​≈TSx​

Bundle-Adjustment并行求解器相关推荐

  1. [论文笔记|VIO]ICE-BA: Incremental, Consistent and Efficient Bundle Adjustment for Visual-Inertial SLAM

    文章目录 摘要 1. 介绍 2. Related Work 3. Framework 3.1. Constraint Functions 3.2. Local and Global Optimizat ...

  2. 2020年ECCV论文DeepSFM: Structure From Motion Via Deep Bundle Adjustment阅读笔记

      这篇博客分享的是2020年发表于ECCV上的一篇论文<DeepSFM: Structure From Motion Via Deep Bundle Adjustment>. 论文地址: ...

  3. SLAM笔记(五)光束平差法(Bundle Adjustment)

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

  4. Bundle Adjustment原理及应用(附实战代码)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 虽然现在的轮子很多,但我们在使用过程中会碰到很多问题,而我们经常不知道从哪里下手,说明轮子不是你造的你 ...

  5. ORB_SLAM2代码阅读(5)——Bundle Adjustment

    ORB_SLAM2代码阅读(5)--Bundle Adjustment 1. 说明 2. Bundle Adjustment(BA)的物理意义 3. BA的数学表达 4. BA的求解方法 4.1 最速 ...

  6. 为什么lp的最优解是一个概率_什么时候应该用概率图模型、消息传递替代传统组合优化求解器?未来工作?(持续更新)...

    相关基础:概率图模型中的推断https://zhuanlan.zhihu.com/p/252169479 英文原文:https://tspace.library.utoronto.ca/bitstre ...

  7. 矩阵求逆c语言实现_[V-SLAM] Bundle Adjustment 实现

    SLAM问题的后端有主要有滤波和优化两种方案.目前,普遍认为优化的方法在精度上要超过滤波方法,因为它可以进行多次的线性化.近年来出现的SLAM算法也大都是基于优化的算法(如ORB-SLAM.DSO等) ...

  8. 史上最简SLAM零基础解读(7) - Jacobian matrix(雅可比矩阵) → 理论分析与应用详解(Bundle Adjustment)

    本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始   文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \co ...

  9. 赛桨PaddleScience v1.0 Beta:基于飞桨核心框架的科学计算通用求解器

    近年来,关于AI for Science的主题被广泛讨论,重点领域包含使用AI方法加速设计并发现新材料,助力高能物理及天文领域的新问题探索,以及加速智慧工业实时设备数据与模型的"数字孪生&q ...

  10. OpenCV实现SfM(四):Bundle Adjustment

    http://blog.csdn.net/AIchipmunk/article/details/52433884 OpenCV实现SfM(四):Bundle Adjustment 标签: opencv ...

最新文章

  1. 五年级上册计算机课如何拉表格,川教版小学信息技术五年级上册第八课 调整表格...
  2. github命令行操作
  3. VMware网络配置详解
  4. android7.1 动态申请权限改为默认授权,修改PackageManagerService.java下的grantPermissions为true
  5. 缓存DNS域名解析服务器的制作方法
  6. 实现主成分分析和白化
  7. [android] No resource found that matches the given name 'Theme.AppCompat.Light'
  8. 爬虫项目之爬取页面并按界面样式导入excel表格
  9. 苹果怎么关闭系统自动更新_你知道怎么用安卓手机更省电吗?学会这样做,不难...
  10. 百度搜索关键词纠错机制研究
  11. 【综述论文】2020年最新深度学习自然语言处理进展综述论文!!!
  12. 查询英语单词 - 有道官方(一)
  13. MAC修改.bashrc/.bash_profile无效,默认的用户配置文件是.zshrc,
  14. 传智播客-刘意-java深入浅出精华版学习笔记Day02
  15. 基于Java、Jsp实现购物车的功能
  16. Blob转换二进制流下载文件
  17. 什么是http服务器
  18. 阿里云,AWS,HTTPS和企业支付宝配置
  19. D. Pythagorean Triples(1487D)(打表找规律 + 二分)
  20. 哔哩哔哩2020校园招聘前端笔试题(卷一)

热门文章

  1. 1年时间,年薪增加10万,前端小兵的我是如何做到的?
  2. SaaS和和PaaS的概念
  3. 增长黑客理论(AARRR)模型
  4. SSD的priorbox层
  5. layui form.js select的扩展插件(转自Author:@贤心)
  6. Problem A: 小学生的算术题
  7. 电脑上怎么录制视频 电脑实用快捷键
  8. MSDN我告诉你 一个没有人注意的工具站
  9. 从软件工程师到有赞新零售技术负责人,34岁李星专访
  10. 如何理解零知识 zkSNARK应用中的Nullifier Hash攻击?