colmap论文学习

2023-11-08

Structure-from-Motion Revisited

该文章是colmap对应的稀疏重建论文,主要讲了稀疏重建的几个步骤。

  1. 特征提取与匹配

    colmap利用SIFT算子进行特征提取与匹配,匹配完之后就获得了两两图像之间的匹配对。但是SIFT算子的匹配仅仅是基于外观的匹配,没有考虑图像之间的几何关系,不能保证对应的特征点能映射到同一三维场景点。因此,将利用RANSAC的方法计算两两图像的基础矩阵和单应性矩阵,根据几何关系筛选出可靠性较高的匹配对pairs。剔除外点后,输出图像连接图(其实就是图像之间的匹配关系)。

  2. 增量重建

    增量重建的输入是场景图,也就是上一步的图像连接图,输出为每个相机的pos信息。增量重建包含四个过程:初始化、图像注册、三角量测和BA优化。

    1)初始化

    ​ 初始图像对的选择对于SFM来说至关重要,重建的鲁棒性、准确性和性能取决于增量过程的局部位置。由于冗余度增加,从图像图中密集的位置初始化并使用多个重叠的摄像头通常会导致更健壮、更精确的重建。相比之下,从更稀疏的位置初始化会导致更低的运行时间,因为BAs处理重建过程中累积的总体稀疏问题。

    2)图像注册

    ​ SFM系统进行初始化之后,会去寻找下一张符合条件的图片进行增量重建。通过解决PnP问题,可以将新图像注册到当前模型中,方法是使用已注册图像中三角点的特征对应(2D-3D对应)。

    3)三角量测

    ​ 一个新注册的图像必须观测到场景中存在的部分点。另外,它还可能与已注册的图像之间有未三角化的匹配点,通过三角量测,可以给场景添加新的三维点。三角量测是SfM中的一个关键步骤,因为它通过冗余增加了现有模型的稳定性,并通过提供额外的2D-3D对应关系来实现新图像的注册。

    4)BA优化

    ​ 图像注册和三角量测在pipeline里是分开的两个步骤,如果没有其他的算法约束,SFM系统将会迅速漂移到不可恢复的状态。因此,人们利用BA算法对相机的pos和三维点进行优化。BA优化分为几种:只对相机Pos进行优化,只对三维点进行优化、对相机pos和三维点同时优化、对相机内参和外参和三维点同时优化等等。虽然其变种很多,但都拥有同样的计算方式(只是雅克比矩阵形式的变化)。

    ​ LM方法是求解BA问题的首选方法。BA参数矩阵中的特殊结构可以利用Schur方法。该方法把大型的矩阵求解简化为:先求较少的相机参数,然后求解三维点。一般利用PCG算法求解方程。

本文章所做的贡献:

1. 提出了一种几何验证的策略,使用信息增强场景图,提高了初始化和三角量测的鲁棒性
2. 提出了一种次优视图的选择策略,最大限度地提高增量重建过程的鲁棒性和准确性
3. 提出了一种稳健的三角量测方法,可以再降低计算成本的情况下生成比现有技术更完整的场景结构
4. 提出了一种迭代BA、重新三角化和异常值过滤的策略,通过减少漂移效应显著提高完整性和准确性
5. 通过冗余视图挖掘,为密集照片集提供更高效的BA参数

改进细节

1.场景图增强

提出了一种多模型几何关系增强场景图,内容为:

  1. 首先将计算图像对的基础矩阵F,如果内点数大于 N F N_{F} NF,则该图像对通过几何验证
  2. 估计单应性矩阵H,统计内点数 N H N_{H} NH,如果 N H / N F < ε H F N_{H}/N_{F} < \varepsilon_{HF} NH/NF<εHF,则认为这是一个通常场景
  3. 如果是校准过(知道相机内参)的图像,估计其本质矩阵E,并计算内点数 N E N_{E} NE,如果 N E / N F > ε E F N_{E}/N_{F} > \varepsilon_{EF} NE/NF>εEF,则认为内参是准确的。
  4. 如果同时满足条件2和3,我们将分解本质矩阵E,并使用对应的内点进行三角化。
  5. 计算所有内点的三角化角度,排序后选择中值 α m \alpha_{m} αm,利用其判断是纯旋转(全景)还是平面场景(平面)
  6. 为了检测网络图像的水印、时间戳和边框(WTF)等,通过估计图像间的相似变换并计算图像边缘的内点数 N s N_{s} Ns,如果某对图像的 N s / N F > ε N F N_{s}/N_{F} > \varepsilon_{NF} Ns/NF>εNF或者 N s / N E > ε N E N_{s}/N_{E} > \varepsilon_{NE} Ns/NE>εNE,则认为这是一对WTF图像,不加入到场景图。
  7. 对于场景图中的所有图像对,将场景图的类型标记为图像对中最多的情形(一般、全景、平面)。
  8. 初始图像对倾向于选择非全景的、校准过的图像对。

2. 次优视图的选择策略

在鲁棒的SFM系统中,选择下一个最佳视角目的是为了最小化重建误差。作者认为在增量SFM中,每个次优视图的选择都会影响剩下的重建。一个错误次优视图的选择可能导致一系列的图像注册和三角量测。一种流行的策略是选择共视点最多的图像,以最大程度地减少不确定性。但是作者发现Lepetit在Epnp文章中提及 PnP的精度取决于观察点的数量和其分布。因此,作者提出了一种鲁棒的次优视图的选择策略。

作者将图像划分成不同尺度格网,然后对不同尺度的格网点分布状况进行打分,这样可以同时考虑到点的数量与分布的影响。总的来说,点的数量越多,分布越均匀,则该图像的得分越高。对不同匹配图像进行打分后,选择得分最高的图像作为下一最佳匹配图像。实验表明,使用该策略可以提升重建的鲁棒性和精度。

在这里插入图片描述

鲁棒高效的三角化

在这里插入图片描述

BA优化

作者提出的BA优化策略是:在每次增加一张新图像后,只对与该图像有最大关联的一部分图像进行局部BA。当模型增加一定比例之后,才进行一次全局BA。这样做可以减少计算的代价。

对于参数的求解方法:作者采用柯西(Cauchy)核函数来应对outliers的影响,使用ceres进行优化。对于数百张图像的情况,使用sparse方法进行求解。对于更多数量的图像,利用PCG算法求解。

**过滤:**每次BA时,将重投影误差较大的三维点过滤掉。在优化过程中,使相机焦距和畸变参数自由优化,然后在全局BA后,将视野不正常或者畸变参数大的相机视为错误估计,并进行剔除。

**再三角化(RT):**为了提高重建场景的完整性,对于先前被过滤掉的但是偏差不是很大的三维点进行再三角化。不提高三角化的阈值,只对误差低于过滤阈值的观测进行再三角化。

**迭代精化:**由于漂移(drift)或者错误的位姿估计,通常会有很大一部分三维点被错误滤除,而使用两步BA可以显著提升结果精度。因此,迭代进行BA、RT、过滤,直到被滤除的观测点和再三角化点减少。大多数场景下,在第二轮迭代过后,结果就会有显著的提升了。

冗余视图处理

BA是SfM性能的瓶颈。因此,作者针对大重叠度场景提出一种高效的相机分组优化策略,代替了昂贵的图割操作。与将很多相机聚类到一个子图上相比,作者将场景分割成很多小的、高度重叠的相机组,然后将每组相机使用一个(自由)相机来代替(这样可以减少BA优化过程中自由参数的数量)。
  通过图像之间的共视程度来决定哪幅图像归于同一组。具体的,对于一个具有n个三维点的场景,使用一个{0,1}向量来表示每张图像的观测,若观测到该三维点,则为1,否则为0。然后通过交集/并集来获得共视程度,如下式所示:
V a b = ∥ V a ⋀ V b ∥ / ∥ V a ⋁ V b ∥ V_{ab}=\parallel V_{a} \bigwedge V_{b} \parallel / \parallel V_{a} \bigvee V_{b} \parallel Vab=VaVb/VaVb
若共视程度大于阈值且组内图像数量小于阈值,则将该图像加入该组。在每组内使用局部坐标系来参数化组内的相机。针对图像组的BA损失函数如下式所示:
E g = Σ j ρ ( ∥ π g ( G r , P c , X k ) − x j ∥ 2 2 ) E_{g}=\Sigma_{j} \rho (\parallel\pi_{g}(G_{r},P_{c},X_{k})-x_{j}\parallel_{2}^{2}) Eg=Σjρ(πg(Gr,Pc,Xk)xj22)
其中,Gr是图像组共用的外参,Pc是组内每张图像的位姿。在进行优化的时候,组内每张图像的位姿为Pcr=PcGr,其中Pc在优化过程中固定不变,Gr可变。如此,BA优化时候,自由变量的数量就大大减少了。

参考:https://blog.csdn.net/weixin_44120025/article/details/123769174
https://zhuanlan.zhihu.com/p/342928560

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

colmap论文学习 的相关文章

随机推荐

  • mysql怎么子查询_在mysql中如何进行子查询?

    在mysql中 子查询是指将一个查询语句嵌套在另一个查询语句中 可以在SELECT UPDATE和 DELETE语句中配合WHERE子句进行实现 WHERE子句中语法格式为 WHERE 另一个查询语句 推荐教程 mysql视频教程 子查询是
  • gitee提交被拒绝的问题 Authentication failed for  gitee

    今天第一次用gitee 提交的时候报错 Authentication failed for gitee 可能是你的用户名密码错误了 这里告诉大家一个windows下的更改方法 按图一步一步的更改即可 如想获得更多编程支持 请扫描下方二维码关
  • C语言回调函数详解及实例

    C语言回调函数详解及实例 回调函数 函数 F1 调用函数 F2 的时候 函数 F1 通过参数给函数 F2 传递了另外一个函数 F3 的指针 在函数 F2 执行的过程中 函数F2 调用了函数 F3 这个动作就叫做回调 Callback 而先被
  • 拓展欧几里得经典例题

    LCS代表最长的公共子序列 是一个众所周知的问题 这个问题中的序列意味着一个整数列表 而序列X被认为是另一个序列Y的子序列 当序列X可以从序列Y中删除零个或多个元素而不改变其余元素的顺序时 则可以得到序列X 在这个问题中 给你两个序列 你的
  • rpm -ivh 解释

    rpm ivh解释 i install 安装软件包 v view 可视化 h hour 方便自己记忆 显示安装进度 简单来讲就是 可视化并显示进度地 安装软件 nodeps 不验证软件包的依赖 RPM 是 LINUX 下的一种软件的可执行程
  • 高效的串行数据驱动框架

    高效的串行数据驱动框架 说明 硬件平台 代码实现 测试 移植 需要注意的地方 代码仓库 说明 最近在看到一篇博文 地址 讲高效串口的实现 简单的说就是利用了DMA 空闲中断 双缓冲 循环接收方式 实际音频上面也是双缓冲这样的实现方式 只不过
  • [转载]QT框架的一个截图工具

    原文标题 Snipaste 开发了三年的截图工具 但不只是截图 原文作者 levie 一直以来都想要入门QT 但是却一直没有付诸行动 昨天在无意间发现了 这个开发者的截图工具 虽然我还没有使用 但是看上去却很能吸引目光 便重新激发了我开始学
  • VCS+MATLAB联合仿真

    原文链接 https www youtube com watch v ujSBTA3v8eA 算法工程通常会用Matlab来建模 Digital designer会将Matlab model 作为golden model 进行设计和验证 面
  • 解决在cmd中输入mongo出现‘mongo‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件的问题~

    当我想通过shell连接mongoDB时 输入mongo命令 出现下述错误 起初我以为我是忘记配置环境变量了 但检查后发现自己配置了 如果你和我是一样的问题 明明配置了环境变量 但上述问题依然没有被解决 后来我通过这篇文章完美了解决了问题
  • SelectNodes 与 XPath

    XPath 是 XML 的内容 这里 SelectNodes 是 javascript 中 XmlDocument 或 XmlNode 的一个方法 SelectNodes 使用 XPath 来选取节点 重要语法 SelectNodes it
  • 七、过滤器(Filter)、拦截器(Interceptor)、监听器(Listener)

    七 过滤器 Filter 拦截器 Interceptor 监听器 Listener 1 过滤器 Filter 依赖于Servlet容器 是JavaEE标准 是在请求进入容器之后 还未进入Servlet之前进行预处理 并且在请求结束返回给前端
  • 彻底弄懂typedef struct和struct定义结构体的区别

    1 语法 定义结构体有两种定义方式 typedef struct 结构名 类型 变量名 类型 变量名 结构别名1 结构别名2 结构名 和 结构别名 都不能直接用 因为它们是结构体这种数据类型的名称 这种方式定义的结构体使用时 需要先声明 结
  • KBQA是个啥?

    什么是KBQA KBQA的全称是基于知识库问答 Knowledge Base Question Answering 即给定自然语言问题 通过对问题进行语义理解和解析 进而利用知识库进行查询 推理得出答案 知识库是用于知识管理的一种特殊的数据
  • k8s的yaml文件格式(完整)

    apiVersion v1 必选 版本号 例如v1 kind Pod 必选 Pod metadata 必选 元数据 name string 必选 Pod名称 namespace string 必选 Pod所属的命名空间 labels 自定义
  • 鼠标悬停(点击)出现文本提示框

    下面的是鼠标点击出现文字 如果想要鼠标移动上去出现 移出消失的话 UI可以使用OnPointerEnter跟OnPointerExit方法 命名空间是UnityEngine EventSystems 如果是3D物体的话可以用OnMouseE
  • centos7 使用mount -t cifs 挂载windows共享目录方法与问题解决

    使用 域 账号 密码 访问 10 100 xx Android 的windows 共享 mount t cifs o domain test com username administrator password test123 192 1
  • ctf.show web7,8,10

    web7 查看列表文章发现 id 判断为sql注入 当有空格时会报错 用 绕过 得到注入点 盲猜flag from flag web8 测试发现过滤了空格 逗号 and 当url判断为真时有回显 数据库视角 进行盲注 substr data
  • HTTP协议——缓存

    缓存的概念 缓存这个东西真的是无处不在 有浏览器端的缓存 有服务器端的缓存 有代理服务器的缓存 有ASP NET页面缓存 对象缓存 数据库也有缓存 等等 http中具有缓存功能的是浏览器缓存 以及缓存代理服务器 http缓存的是指 当Web
  • C++的volatile

    在C 中 编译器为了提高代码的执行效率 常常会对变量进行反向优化 比如将变量缓存在寄存器中 这样可以减少对内存的访问次数 提高访问速度 然而 在某些情况下 我们希望确保每次访问变量时都能从内存中读取最新值 而不是使用缓存中的旧值 volat
  • colmap论文学习

    Structure from Motion Revisited 该文章是colmap对应的稀疏重建论文 主要讲了稀疏重建的几个步骤 特征提取与匹配 colmap利用SIFT算子进行特征提取与匹配 匹配完之后就获得了两两图像之间的匹配对 但是