Structure-from-Motion Revisited(COLMAP) 流程介绍

Structure-from-Motion Revisited(COLMAP)流程介绍

  • 主要贡献
  • 1 场景图增强
  • 2 下一最佳视图选择
  • 3 稳健高效的三角化
  • 4 BA
  • 5 冗余视图挖掘

Reference:

  1. Structure-from-Motion Revisited 原文
  2. COLMAP 使用教程
  3. Colmap论文——《Structure-from-Motion Revisited》论文阅读笔记
  4. 笔记:三维重建系列 COLMAP: Structure-from-Motion Revisited

相关文章:

  1. NeRF 其一:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
  2. NeRF 其二:Mip-NeRF
  3. NeRF 其三:Instant-NGP
  4. 3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering

在这里插入图片描述
原理挺简单的,但是这文章有点难啃,好多东西该讲没讲,该描述没描述。

COLMAP 的整体流程非常王道,在此不做赘述。
在这里插入图片描述

主要贡献

1 场景图增强

在前面的步骤中,得到了匹配图像对 C \mathcal{C} C,这些图像对又被称为场景图(scene graph)。为了提高 初始化 和 三角测量 模块的鲁棒性,故在此提出了一个多模型几何验证策略。

步骤如下:

  1. 估计一基础矩阵 F F F,如果内点个数大于等于 N F N_F NF,也就说明图像的匹配关系是没有问题的,这时图像就通过来几何验证;
  2. 若相机标定了,可以估计一个基础矩阵并得到它的内点个数 N E N_E NE,如果 N E / N F > ϵ E F N_E/N_F > \epsilon_{EF} NE/NF>ϵEF,算法内就认为标定参数是没有问题的;
  3. 使用该图像对计算单应矩阵的内点个数 N H N_H NH,如果满足条件 N H / N F < ϵ H F N_H/N_F < \epsilon_{HF} NH/NF<ϵHF,就认为相机是在一个常规 general 场景下移动的(而不是纯旋转 or 平面场景);
  4. 在同时满足 2.3. 步骤时,分解本质矩阵 E E E,根据内点的对应关系三角化,并得到一个中值三角化的角度 α m \alpha_m αm。使用 α m \alpha_m αm,可以用来区分纯旋转(全景panoramic)和平面场景planar(问题是,这里写的第三步不就是用来干这个的?二次筛选?);
  5. 有些网络图像存在:水印、时间戳、或第几帧的显示,这里将这些归类为(WTFs-watermarks, timestamps, and frames,这里感觉笔者故意凑这几个在玩梗,想写的是 What the Fuck),这些会导致误匹配。针对这种问题,通过估计图像间的相似变换并计算图像边缘的内点数 N S N_S NS,如果某对图像的 N S / N F > ϵ S F N_S/N_F > \epsilon_{SF} NS/NF>ϵSF 或者 N S / N E > ϵ S E N_S/N_E > \epsilon_{SE} NS/NE>ϵSE,即边缘匹配点的占比实在过大,则认为这是一对 WTF 图像,不加入到场景图中;
  6. 在筛选后,使用 general, panoramic, planar 标记场景图的模型类别,并使用 N H N_H NH N E N_E NE N F N_F NF 中最大的那个作为模型内点;
  7. 初始化重建倾向于选择非全景的、标定完美的图像对(考虑多视角多相机?)。不使用全景图像点对是为了避免退化点来增加三角化及后续图像配准的鲁棒性。

2 下一最佳视图选择

一个错误的视图选取可能会导致一连串的相机误匹配和错误的三角测量;而且,对下一最佳视图选择会极大地影响姿势估计的质量以及三角测量的完整性和准确性。因此,准确的姿态估计对于稳健的 SfM 至关重要,因为如果姿态不准确,点的三角测量可能会失败。

一种流行的方法是,找到一张能观察到最多已经三角化过的点的图像。但有实验表面,使用 PnP 的相机姿势的准确性取决于 观测点的数量 及 其在图像中的分布。因此,作者提出一种使用多尺度格网来度量匹配点分布状况的方法:
在这里插入图片描述
如上图所示,作者将图像划分成不同尺度格网,然后对不同尺度的格网点分布状况进行打分,这样可以同时考虑到点的数量与分布的影响。总的来说,点的数量越多,分布越均匀,则该图像的得分越高。上图中纵向是点分布的差异与得分差异的对比,横向是点数量与得分的对比。分数的计算方式如下所示:
S c o r e 左上 = 1 × 2 + 4 × 4 + 6 × 8 = 66 S c o r e 右上 = 1 × 2 + 4 × 4 + 16 × 8 = 146 S c o r e 左下 = 4 × 2 + 6 × 4 + 6 × 8 = 80 S c o r e 右下 = 4 × 2 + 16 × 4 + 16 × 8 = 200 \begin{aligned} Score_{\text{左上}} &= 1\times2+4\times4+6\times8=66\\ Score_{\text{右上}} &= 1\times2+4\times4+16\times8=146\\ Score_{\text{左下}} &= 4\times2+6\times4+6\times8=80\\ Score_{\text{右下}} &= 4\times2+16\times4+16\times8=200\\ \end{aligned} Score左上Score右上Score左下Score右下=1×2+4×4+6×8=66=1×2+4×4+16×8=146=4×2+6×4+6×8=80=4×2+16×4+16×8=200可见在同样点数量下,点分布越均匀得分越高。对不同匹配图像进行打分后,选择得分最高的图像作为下一最佳匹配图像。实验表明,使用该策略可以提升重建的鲁棒性和精度。

3 稳健高效的三角化

为了处理任意级别的异常值污染,作者使用 RANSAC 提出了一种高效的、基于采样和多视图的三角化方法。

考虑特征轨迹 T = { T n ∣ n = 1 ⋯ N T } \mathcal{T}=\{T_n | n=1 \cdots N_T\} T={Tnn=1NT} 为一组具有未知先验内点比率 ϵ \epsilon ϵ 的测量值。测量 T n T_n Tn 由归一化图像观测 x ˉ n ∈ R 2 \bar{\mathbf{x}}_n\in \mathbb{R}^2 xˉnR2 和 对应的相机位姿 P n ∈ S E ( 3 ) \mathbf{P}_n\in \mathbf{SE}(3) PnSE(3) 组成,其定义了从世界到相机坐标系的映射。目标是最大限度地支持符合条件良好的双视图三角测量的测量:
X a b ∼ τ ( x ˉ a , x ˉ b , P a , P b )  with  a ≠ b , \mathbf{X}_{ab}\sim\tau\left(\bar{\mathbf{x}}_a,\bar{\mathbf{x}}_b,\mathbf{P}_a,\mathbf{P}_b\right){ } \text{ with } a\neq b, Xabτ(xˉa,xˉb,Pa,Pb) with a=b,其中 τ \tau τ 指代任意一种三角化的方式,COLMAP 里用的是 DLT(Direct Linear Transform,直接线性变换) X a b \mathbf{X}_{ab} Xab 是被三角化的点。在上一节讲过,COLMAP 不会从全景图像进行三角测量,以避免由于不准确的姿态估计而导致错误的三角测量角度。

条件良好的模型满足两个约束:

  1. 一个足够大的三角化角度 α \alpha α
    cos ⁡ α = t a − X a b ∥ t a − X a b ∥ 2 ⋅ t b − X a b ∥ t b − X a b ∥ 2 . \cos\alpha=\frac{\mathbf{t}_a-\mathbf{X}_{ab}}{\left\|\mathbf{t}_a-\mathbf{X}_{ab}\right\|_2}\cdot\frac{\mathbf{t}_b-\mathbf{X}_{ab}}{\left\|\mathbf{t}_b-\mathbf{X}_{ab}\right\|_2}. cosα=taXab2taXabtbXab2tbXab.

  2. 三角化生成的三维点投影回图像上的深度值应该为正:
    d = [ p 31 p 32 p 33 p 34 ] [ X a b T 1 ] T d=\begin{bmatrix}p_{31}&p_{32}&p_{33}&p_{34}\end{bmatrix}\begin{bmatrix}\mathbf{X}_{ab}^T&1\end{bmatrix}^T d=[p31p32p33p34][XabT1]T其中 p m m p_{mm} pmm 代表 P \mathbf{P} P 的第 m m m 行第 n n n 列元素。如果测量 T n T_n Tn 有正深度 d n d_n dn 且其重投影误差:
    e n = ∥ x ˉ n − [ x ′ / z ′ y ′ / z ′ ] ∥ 2 with [ x ′ y ′ z ′ ] = P n [ X a b 1 ] \left.e_n=\left\|\bar{\mathbf{x}}_n-\begin{bmatrix}x'/z'\\y'/z'\end{bmatrix}\right.\right\|_2\text{with}\begin{bmatrix}x'\\y'\\z'\end{bmatrix}=\mathbf{P}_n\begin{bmatrix}\mathbf{X}_{ab}\\1\end{bmatrix} en= xˉn[x/zy/z] 2with xyz =Pn[Xab1]小于某个阈值 t t t

值得注意的是,三角化的过程中使用了RANSAC,即从上述特征追踪中随机选择至少两个点进行三角化,统计内点数(即,重投影误差小于阈值记为内点),选择内点数最多的那个作为三角化点。这个过程中存在一个问题就是,假如该点被追踪到了比较少的次数,此时随机采样会重复选择相同的一对点进行三角化,这样会造成不必要的资源消耗。为了不重复采点,本文使用了可产生不重复随机组的 random sampler 的方式;另外,为了能够保证以置信度为 η \eta η 的概率至少选择一对无外点的最小解集,该过程至少重复进行 K K K 次。(这里可以参考其他文献:假设内点所占总数据比率为 ϵ \epsilon ϵ,至少迭代多少次得到最佳:RANSAC基本原理)还好这一块还有点印象,论文内这一块没讲清楚,也没见其他人提到的,离谱。

4 BA

为了减少累积误差,在图像配准和三角化后执行 BA。通常不需要在每个步骤之后执行全局 BA,因为增量 SfM 只会影响局部模型。因此,COLMAP 在每次图像配准后对连接最多的图像集执行局部 BA,仅在模型增长一定百分比后才执行全局 BA,以分摊时间消耗。

  • 参数化
    • 在局部 BA 中,损失函数 ρ j \rho_j ρj 使用 Cauchy 函数以对抗外点带来的影响;
    • 几百个相机的情况下,使用稀疏直接求解器,而当相机数较多的时候,使用 PCG 求解器;
  • 过滤
    • BA 后,一些观察结果与模型不符。因此,要过滤具有较大重投影误差的观测结果;
    • 对于每个点,通过检查所有匹配的视角光线的最小三角化角度来判断这个几何关系是否比较好;
    • 全局 BA 后,还会检查退化相机,比如:由全景图或人工增强的图像引起的。通常此类相机的所有观测均为异常值,或者内参会收敛到一个虚假的最小值。因此,COLMAP 不将焦距和畸变参数限制在先验的固定范围内,而是让它们在 BA 中自由优化。由于主点校准是一个病态问题,COLMAP 将其固定在未校准相机相机的图像中级。具有异常视野或大畸变系数幅度的相机被认为是错误估计,其在全局 BA 后被过滤。
  • 重新三角测量:由于 BA 对位姿进行了优化,这使得之前由于不准确/错误位姿导致无法三角化的点有了能够被重新三角化的可能性,所以在 BA 之后执行一步重三角化(类比于BA之前的三角化)。局部 BA 的三角化点(pre-global BA RT)可能还是有一定的漂移,因此 COLMAP 不仅对局部 BA 再三角化,还对全局 BA 做再三角化(post-global BA RT)。这一步的目的是通过继续跟踪以前未能三角化的点(比如,由于不准确的位姿等)来提高重建的完整性。COLMAP 内不会增加三角化的阈值,而是继续跟踪误差低于过滤阈值的观察结果。
  • 迭代优化:由于漂移或 pre-global BA RT,通常 BA 中观测到极大量的异常值并随后被过滤掉。由于 BA 严重受到异常值的影响,因此再进行一次全局 BA 可显著提升结果。因此,文中提出执行 BA-RT-过滤 的迭代优化步骤,直到滤掉的观测数和 post-global BA RT 的点数减少。在大多数情况下,在第二次迭代后,结果会显著改善并且优化会收敛。

5 冗余视图挖掘

BA 是 SfM 的主要性能瓶颈,文中利用增量 SfM 和密集照片集合的固有特性,通过将冗余相机聚类为高场景重叠组来更有效地参数化 BA。

COLMAP 将摄像机和点划分为通过分隔变量连接的子图,具体操作如下:
图像与地图点根据重建过程中是否受到最新帧点影响分为两类。对于比较大的重建问题,大部分场景不受影响,因为模型通常在局部扩展。也就是说,最新的重建帧仅会影响其邻近的图像以及地图点,很大一部分图像/地图点并不会发生改变。文内将不受影响的那部分场景划分为一个个高度重叠图像的组 G = { G r ∣ r = 1 … N G } \mathcal{G}=\left\{G_r \mid r=1 \ldots N_G\right\} G={Grr=1NG},并参数化每个组 G r G_r Gr 为单个相机(即,将每组相机使用一个(自由)相机来代替,这样可以减少 BA 优化过程中自由参数的数量,也就降低了计算量)。受最新扩展影响的图像被独立分组,以允许对其参数进行最佳改进。

那么问题来了,什么才叫做高重合度呢? 作者提到,一个组内相机的共视区域必须高度重合。令场景中共有 N X N_X NX 个点, 那么每一张图像都可表示成一个二值向量 v i ∈ { 0 , 1 } N X \mathbf{v}_i \in\{0,1\}^{N_X} vi{0,1}NX,其中当某个地图点被观测到时为 1,否则为 0;有了以上定义之后,我们可以定义图像 a a a 与图像 b b b 之间的重合度 V a b V_{a b} Vab 为:
V a b = ∥ v a ∧ v b ∥ / ∥ v a ∨ v b ∥ V_{a b}=\left\|\mathbf{v}_a \wedge \mathbf{v}_b\right\| /\left\|\mathbf{v}_a \vee \mathbf{v}_b\right\| Vab=vavb/vavb接着对待处理帧的 K r K_r Kr 个空间最近邻的那些图像计算重合度得分并排序,若共视程度大于阈值且组内图像数量小于阈值,则将该图像加入该组,这样可以构造一组高重合度的相机集合。对于这一个相机组的 BA(Group BA) 损失被构造为如下形式:
E g = ∑ j ρ j ( ∥ π g ( G r , P c , X k ) − x j ∥ 2 2 ) E_g=\sum_j \rho_j\left(\left\|\pi_g\left(\mathbf{G}_r, \mathbf{P}_c, \mathbf{X}_k\right)-\mathbf{x}_j\right\|_2^2\right) Eg=jρj(πg(Gr,Pc,Xk)xj22)

上式中 G r ∈ S E ( 3 ) \mathbf{G}_r \in \mathbf{S E}(3) GrSE(3) 表示该组共用的外参, P c \mathbf{P}_c Pc 表示组内每张图像的位姿。在进行优化的时候,组内每张图像的位姿为 P c r = P c G r \mathbf{P}_{cr}=\mathbf{P}_c\mathbf{G}_r Pcr=PcGr,其中 P c \mathbf{P}_c Pc 在优化过程中固定不变, G r \mathbf{G}_r Gr 可变。全局的损失函数 E ˉ \bar{E} Eˉ 是所有分组代价 和 非分组代价之和。如此,BA 优化的时候,自由变量的数量就大大减少了,BA 优化的效率得到了大幅度提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/343700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS鸿蒙应用开发( 四、重磅组件List列表组件使用详解)

List列表组件&#xff0c;是一个非常常用的组件。可以说在一个应用中&#xff0c;它的身影无处不在。它包含一系列相同宽度的列表项&#xff0c;适合连续、多行呈现同类数据&#xff0c;如商品列表、图片列表和和文本列表等。ArkUI 框架采用 List 容器组件创建列表&#xff08;…

红队打靶练习:W34KN3SS: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、gobuster 5、dirsearch WEB web信息收集 目录探测 漏洞利用 openssl密钥碰撞 SSH登录 提权 get user.txt get passwd 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB…

【深度学习】初识深度学习

初识深度学习 什么是深度学习 关系&#xff1a; #mermaid-svg-7QyNQ1BBaD6vmMVi {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7QyNQ1BBaD6vmMVi .error-icon{fill:#552222;}#mermaid-svg-7QyNQ1BBaD6vmMVi .err…

HEGERLS智能物流机器人|场景为王 以存取为技术核心布局的仓储集群

随着物流需求的多样化、复杂化&#xff0c;四向穿梭车技术经过几年的蓬勃发展&#xff0c;正在各领域迎来愈加广泛的应用。河北沃克作为该领域的代表&#xff0c;凭借庞大的产品群、功能强大的软件系统以及资源丰富的生态合作伙伴体系实现了快速的发展。其中&#xff0c;海格里…

Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))

目录 AOP概念AOP底层原理AOP(JDK动态代理)使用 JDK 动态代理&#xff0c;使用 Proxy 类里面的方法创建代理对象**编写** **JDK** 动态代理代码 AOP(术语)AOP操作&#xff08;准备工作&#xff09;**AOP** **操作&#xff08;**AspectJ注解)**AOP** **操作&#xff08;**AspectJ…

【系统DFX】如何诊断占用过多 CPU、内存、IO 等的神秘进程?

热门面试问题&#xff1a;如何诊断占用过多 CPU、内存、IO 等的神秘进程&#xff1f; 下图展示了 Linux 系统中有用的工具。 &#x1f539;’vmstat’ - 报告有关进程、内存、分页、块 IO、陷阱和 CPU 活动的信息。&#x1f539;’iostat’ - 报告系统的 CPU 和输入/输出统计信…

TortoiseSVN源码安装与迁移全攻略

一、前言 随着版本控制系统的普及&#xff0c;越来越多的开发者和团队开始使用SVN&#xff08;Subversion&#xff09;来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程&#xff0c;帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装&…

# 安徽锐锋科技IDMS系统简介

IDMS 由安徽锐锋科技独立开发 该系统负责和海算以及UE\UNITY的无缝衔接并具备远程数据库访问、高速数据库的自动创建及数据存储、支持MQTT等多种物联网接口&#xff0c;支持多种算法。主要完成由于物料、人员、生产、故障、不良异常、订单异常带来的生产损失&#xff0c;通过海…

【趣味CSS3.0】粘性定位属性Position:sticky是不是真的没用了?

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

【产品交互】超全面B端设计规范总结

不知不觉已经深耕在B端这个领域3年有余&#xff0c;很多人接触过B端后会觉得乏味&#xff0c;因为B端的设计在视觉上并没有C端那么有冲击力&#xff0c;更多的是结合业务逻辑&#xff0c;设计出符合业务需求的交互&#xff0c;以及界面排版的合理性&#xff0c;达到产品的可用性…

UE5 C++ Slate独立程序的打包方法

在源码版安装目录内找到已编译通过的xxx.exe&#xff0c;&#xff08;\Engine\Binaries\Win64\xxx.exe)&#xff0c;在需要的位置新建文件夹&#xff0c;拷贝源码版Engine内的Binaries、Content、Shaders文件夹到目标文件夹内&#xff0c;将xxx.exe放入对应位置&#xff0c;删除…

npm或者pnpm或者yarn安装依赖报错ENOTFOUND解决办法

如果报错说安装依赖报错&#xff0c;大概率是因为npm源没有设置对&#xff0c;比如我这里安装protobufjs的时候报错&#xff1a;ENOTFOUND npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOUND npm ERR! network request to https://registry.cnpm…

IP地址和端口

1. IP地址&#xff1a; 简介&#xff1a; IP 协议是为计算机网络相互连接进行通信而设计的协议。在因特网中&#xff0c;它是能使连接到网上的所 有计算机网络实现相互通信的一套规则&#xff0c;规定了计算机在因特网上进行通信时应当遵守的规则。任 何厂家生产的计算机系统…

BioTech - 量子化学与分子力场

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135787607 量子化学是应用量子力学的规律和方法来研究化学问题的一门学科&#xff0c;主要关注分子的结构、性质和反应过程。 量子化学的理论方法…

Spring Boot引起的“堆外内存泄漏”排查及经验总结

Spring Boot引起的“堆外内存泄漏”排查及经验总结 背景 为了更好地实现对项目的管理&#xff0c;我们将组内一个项目迁移到MDP框架&#xff08;基于Spring Boot&#xff09;&#xff0c;随后我们就发现系统会频繁报出Swap区域使用量过高的异常。笔者被叫去帮忙查看原因&…

web安全学习笔记【05】——反弹Shell、正反向连接

思维导图 #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载均衡等 ----------------------------------- 1、APP架构-封装&原生态&H5&am…

SpringMVC 注解配置SpringMVC

文章目录 1、创建初始化类&#xff0c;代替web.xml2、创建SpringConfig配置类&#xff0c;代替spring的配置文件3、创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4、测试功能 使用配置类和注解代替web.xml和SpringMVC配置文件的功能 1、创建初始化类&#xff0c;代替…

SpringBoot3集成Zookeeper

标签&#xff1a;Zookeeper3.8 &#xff0c;Curator5.5&#xff1b; 一、简介 ZooKeeper是一个集中的服务&#xff0c;用于维护配置信息、命名、提供分布式同步、提供组服务。分布式应用程序以某种形式使用所有这些类型的服务。 二、环境搭建 1、修改配置文件 # 1、拷贝一份…

前端面试题-(浏览器内核,CSS选择器优先级,盒子模型,CSS硬件加速,CSS扩展)

前端面试题-(浏览器内核&#xff0c;CSS选择器优先级&#xff0c;盒子模型&#xff0c;CSS硬件加速&#xff0c;CSS扩展&#xff09; 常见的浏览器内核CSS选择器优先级盒子模型CSS硬件加速CSS扩展 常见的浏览器内核 内核描述Trident(IE内核)主要用在window系统中的IE浏览器中&…

云原生离线工作流编排利器 -- 分布式工作流 Argo 集群

作者&#xff1a;庄宇 在现代的软件开发和数据处理领域&#xff0c;批处理作业&#xff08;Batch&#xff09;扮演着重要的角色。它们通常用于数据处理&#xff0c;仿真计算&#xff0c;科学计算等领域&#xff0c;往往需要大规模的计算资源。随着云计算的兴起&#xff0c;阿里…