Power Bundle Adjustment for Large-Scale 3D Reconstruction

日期

2023.6

论文标题

Power Bundle Adjustment for Large-Scale 3D Reconstruction

摘要

We introduce Power Bundle Adjustment as an expansion type algorithm for solving large-scale bundle adjustment problems. It is based on the power series expansion of the inverse Schur complement and constitutes a new family of solvers that we call inverse expansion methods. We theoretically justify the use of power series and we prove the convergence of our approach. Using the real-world BAL dataset we show that the proposed solver challenges the state-of-the-art iterative methods and significantly accelerates the solution of the normal equation, even for reaching a very high accuracy. This easy-to-implement solver can also complement a recently presented distributed bundle adjustment framework. We demonstrate that employing the proposed Power Bundle Adjustment as a sub-problem solver significantly improves speed and accuracy of the distributed optimization.

引用信息(BibTeX格式)

@misc{weber2023power,
title={Power Bundle Adjustment for Large-Scale 3D Reconstruction},
author={Simon Weber and Nikolaus Demmel and Tin Chon Chan and Daniel Cremers},
year={2023},
eprint={2204.12834},
archivePrefix={arXiv},
primaryClass={cs.CV}
}

本论文解决什么问题

大场景BA优化的问题

已有方法的优缺点

Bundle adjustment (BA) 是一个典型的计算机视觉问题,它最小化非线性重投影误差来联合估计相机参数和三维信息。the Normal Equation 是 BA 最耗费时间的步骤。the Schur complement trick 用来形成简化的相机系统 the reduced camera system (RCS),该线性系统只涉及姿态参数,它的大小可以通过使用QR分解进一步减小,只得到RCS的矩阵平方根,然后转化为代数求解问题。然而无论是RCS 还是均方根方程都是通过迭代方法解决,如针对大尺寸的预条件共轭梯度算法或是针对小场景的Cholesky 分解方法。

本文采用什么方法及其优缺点

以the power series expansion of the inverse Schur complement 逆舒尔补的幂级数展开为基础,构成了一类新的求解方法,称之为逆展开法。还可以补充最近提出的distributed BA优化方法。

BA能量方程:

在这里插入图片描述
model 与observation 之间差异的所有残差。

Least Squares Problem

采用Levenberg-Marquardt (LM) 算法,是一种基于一阶泰勒展开方法,加入一个约束项进行收敛
在这里插入图片描述

Schur Complement

求解系统矩阵H 的逆对于大规模问题需要耗费很大算力和时间,因此通常使用Schur 来减少算力和时间。
在这里插入图片描述

Power Bundle Adjustment

分块矩阵Uλ分解式

在这里插入图片描述

导致将逆舒尔补表述为

在这里插入图片描述
为了将展开为Lemma .1 中详述的幂级数,我们需要限定

在这里插入图片描述

谱半径限定为1。

通过利用BA问题的特殊结构,我们证明了两个结果:
在这里插入图片描述
在这里插入图片描述

幂级数展开式是迭代导出的,必须有终止规则。通过类比 inexact Newton methods,使得 conjugate gradients algorithm 共轭梯度算法设置了一个停止准则

在这里插入图片描述
该准则通过将逆Schur补展开为补阶来保证在位姿更新的细化时幂级数展开停止,在这里插入图片描述
在达到相同阶数时,是否比平均细化小得多

在这里插入图片描述

使用的数据集和性能度量

the BAL dataset 中 97个BA优化问题

传感器:Ladybug

威尼斯、特拉法加和杜布罗夫尼克的图片来自Flickr.com,被作为skeletal sets

精度:

在这里插入图片描述

Memory:
在这里插入图片描述

两个大小不同的BAL问题的收敛曲线
在这里插入图片描述
精度:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Bundle Adjustment 是一种用于同时估计多个相机位置,姿态和三维点云的优化算法。下面是一个用Python编写的简单的Bundle Adjustment玩具程序: ```python import numpy as np import scipy.sparse as sp import scipy.sparse.linalg as splinalg # 生成测试数据 num_cameras = 3 num_points = 5 num_observations = 10 noise_scale = 0.1 # 相机的位置和姿态 camera_positions = np.random.randn(num_cameras, 3) camera_orientations = np.random.randn(num_cameras, 3) # 三维点云 points_3d = np.random.randn(num_points, 3) # 观测到的2D点 observed_points = np.zeros((num_observations, 2)) camera_indices = np.zeros(num_observations, dtype=int) point_indices = np.zeros(num_observations, dtype=int) for i in range(num_observations): camera_idx = np.random.randint(num_cameras) point_idx = np.random.randint(num_points) observed_points[i] = np.random.randn(2) + \ np.dot(camera_orientations[camera_idx], points_3d[point_idx]) + \ camera_positions[camera_idx] observed_points[i] += np.random.randn(2) * noise_scale camera_indices[i] = camera_idx point_indices[i] = point_idx # 构建稀疏矩阵 A = sp.lil_matrix((num_observations * 2, num_cameras * 6 + num_points * 3)) b = np.zeros(num_observations * 2) for i in range(num_observations): camera_idx = camera_indices[i] point_idx = point_indices[i] point_3d = points_3d[point_idx] camera_pos = camera_positions[camera_idx] camera_orient = camera_orientations[camera_idx] # 计算重投影误差 projected_point = np.dot(camera_orient, point_3d) + camera_pos projected_point /= projected_point[2] projected_point = projected_point[:2] error = observed_points[i] - projected_point # 构建雅可比矩阵 J_camera = np.hstack((point_3d, np.zeros(3), np.eye(3))) J_point = np.hstack((np.zeros(2), camera_orient[:2].reshape(2, 1) * point_3d.reshape(1, 3))) J = np.vstack((J_camera, J_point)) A[i * 2: (i+1) * 2, camera_idx * 6: (camera_idx+1) * 6] = J[:, :6] A[i * 2: (i+1) * 2, num_cameras * 6 + point_idx * 3: num_cameras * 6 + (point_idx+1) * 3] = J[:, 6:] b[i * 2: (i+1) * 2] = error # 优化 x0 = np.hstack((camera_positions.ravel(), camera_orientations.ravel(), points_3d.ravel())) res = splinalg.lsmr(A, b, x0=x0) optimized_positions = res[0][:num_cameras * 3].reshape(num_cameras, 3) optimized_orientations = res[0][num_cameras * 3: num_cameras * 6].reshape(num_cameras, 3) optimized_points_3d = res[0][num_cameras * 6:].reshape(num_points, 3) print("Original Camera Positions:\n", camera_positions) print("Original Camera Orientations:\n", camera_orientations) print("Original 3D Points:\n", points_3d) print("Optimized Camera Positions:\n", optimized_positions) print("Optimized Camera Orientations:\n", optimized_orientations) print("Optimized 3D Points:\n", optimized_points_3d) ``` 这个程序生成了一些随机的相机位置、姿态和三维点云,然后随机生成了一些观测到的2D点,并添加了一些高斯噪声。程序使用Bundle Adjustment来估计相机和3D点云的位置,并输出优化后的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值