Bundle-Adjustment并行求解器
网络资源
- 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∑JpT∗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−∑WiVi−1WiT对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−1Wi)T(Li−1Wi)并行计算策略,此处不能简单对空间点并行划分,因可能有多个点对矩阵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−∑WiVi−1ϵb,i=U−∑(Li−1Wi)T(Li−1ϵb,i)所以计算RCS方程,只需要计算(Li−1Wi)(L_i^{-1}W_i)(Li−1Wi)和(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−1Wi)∗δ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−∑WiVi−1WiTx可多线程并行(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并行求解器相关推荐
- [论文笔记|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 ...
- 2020年ECCV论文DeepSFM: Structure From Motion Via Deep Bundle Adjustment阅读笔记
这篇博客分享的是2020年发表于ECCV上的一篇论文<DeepSFM: Structure From Motion Via Deep Bundle Adjustment>. 论文地址: ...
- SLAM笔记(五)光束平差法(Bundle Adjustment)
1.什么是光束平差法 前边的八点法,五点法等可以求出闭式解的前提是已经知道确切的点对.但实际情况中往往存在大量的噪声,点与点不是精确地对应甚至出现一些错误匹配. 光束平差法由Bundle Adjus ...
- Bundle Adjustment原理及应用(附实战代码)
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 虽然现在的轮子很多,但我们在使用过程中会碰到很多问题,而我们经常不知道从哪里下手,说明轮子不是你造的你 ...
- ORB_SLAM2代码阅读(5)——Bundle Adjustment
ORB_SLAM2代码阅读(5)--Bundle Adjustment 1. 说明 2. Bundle Adjustment(BA)的物理意义 3. BA的数学表达 4. BA的求解方法 4.1 最速 ...
- 为什么lp的最优解是一个概率_什么时候应该用概率图模型、消息传递替代传统组合优化求解器?未来工作?(持续更新)...
相关基础:概率图模型中的推断https://zhuanlan.zhihu.com/p/252169479 英文原文:https://tspace.library.utoronto.ca/bitstre ...
- 矩阵求逆c语言实现_[V-SLAM] Bundle Adjustment 实现
SLAM问题的后端有主要有滤波和优化两种方案.目前,普遍认为优化的方法在精度上要超过滤波方法,因为它可以进行多次的线性化.近年来出现的SLAM算法也大都是基于优化的算法(如ORB-SLAM.DSO等) ...
- 史上最简SLAM零基础解读(7) - Jacobian matrix(雅可比矩阵) → 理论分析与应用详解(Bundle Adjustment)
本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \co ...
- 赛桨PaddleScience v1.0 Beta:基于飞桨核心框架的科学计算通用求解器
近年来,关于AI for Science的主题被广泛讨论,重点领域包含使用AI方法加速设计并发现新材料,助力高能物理及天文领域的新问题探索,以及加速智慧工业实时设备数据与模型的"数字孪生&q ...
- OpenCV实现SfM(四):Bundle Adjustment
http://blog.csdn.net/AIchipmunk/article/details/52433884 OpenCV实现SfM(四):Bundle Adjustment 标签: opencv ...
最新文章
- 五年级上册计算机课如何拉表格,川教版小学信息技术五年级上册第八课 调整表格...
- github命令行操作
- VMware网络配置详解
- android7.1 动态申请权限改为默认授权,修改PackageManagerService.java下的grantPermissions为true
- 缓存DNS域名解析服务器的制作方法
- 实现主成分分析和白化
- [android] No resource found that matches the given name 'Theme.AppCompat.Light'
- 爬虫项目之爬取页面并按界面样式导入excel表格
- 苹果怎么关闭系统自动更新_你知道怎么用安卓手机更省电吗?学会这样做,不难...
- 百度搜索关键词纠错机制研究
- 【综述论文】2020年最新深度学习自然语言处理进展综述论文!!!
- 查询英语单词 - 有道官方(一)
- MAC修改.bashrc/.bash_profile无效,默认的用户配置文件是.zshrc,
- 传智播客-刘意-java深入浅出精华版学习笔记Day02
- 基于Java、Jsp实现购物车的功能
- Blob转换二进制流下载文件
- 什么是http服务器
- 阿里云,AWS,HTTPS和企业支付宝配置
- D. Pythagorean Triples(1487D)(打表找规律 + 二分)
- 哔哩哔哩2020校园招聘前端笔试题(卷一)