COLMAP论文阅读笔记——sfm算法、不定期更新
文章目录
structure from motion revisited
Sfm是对三维重建算法的统称,incremental sfm则表示他是增量式的,在鲁棒性准确性方面有巨大进步;但是灵活性、完整
性以及可伸缩性仍然是打破技术壁垒的关键问题。论文后半部分讲述完整的重建流程。sfm 是一系列不同角度拍摄的图像的
投影来重建3的结构的过程。
本文探讨的增量式sfm是具有迭代重构组件的顺序处理管道(一系列工序)。通常是先进行feature提取和匹配没然后进行几何验证。生成的场景图是重建的基础,之后模型讲植入仔细选择的双视角重建(重建作为一个名词,我还不能给出具体的形式),然后再递增注册新图像之前,将对场景中的点进行三角剖分(啥是三角剖分triangulating),过滤异常值,并且使用
ba对重建进行优化。
详细介绍:
第一步 对应点搜索
首先会先在输入的图片中找到重叠(overlap)的场景。
输入的场景被定义为
I
=
{
I
i
∣
i
=
1
…
N
I
}
I = \{ I_i \quad | \quad i=1 \dots N_I\}
I={Ii∣i=1…NI}
在上述输入场景中找到重叠图像,标记相同的点的投影,输出是一组经过了几何验证的图像对以及每个点的图像投影图。
这里每个点是指对应点搜索中重叠部分的相同点
图像对被记作C
什么是几何验证——我猜测,是肉眼观察这些点确实是一个点
加粗部分为该步骤的整体概括。之后是细节步骤。
特征提取feature extraction
对于每个 Ii ,SFM都会检测到一个用以表示位置在Xj的特征集合
F
i
=
{
(
x
j
,
f
j
)
∣
j
=
1
…
N
F
i
}
F_i = \{ (x_j ,f_j) \quad | \quad j = 1\dots N_{F_i}\}
Fi={(xj,fj)∣j=1…NFi}
对这些特征有约束:对辐射和几何变化下应该是不变的,使得SFM可以在不同的图像中唯一识别他们。SIFT和其衍生特征点以及最新了解的那些特征点在鲁棒性方面是事实标准,另外,二进制特征binary feature损失部分鲁棒性提高效率。
这里提到了辐射radiometric,这也解释了之前标定的时候为什么不可以使用发光的屏幕
匹配matching
接下来,SFM会通过利用特征集合,上一步骤中的Fi来作为图像的外观描述来发现看到的相同场景部分的图像,朴素的方法会对每个图像对测试场景重叠。
他会基于Fi建立一个相似度的度量,为图像Ib中的每个特征找到在图像Ia中的最相似的特征来搜索对应的特征点,获得这个图像对的特征对应关系。并且这个方法具有计算复杂度
O
(
N
I
2
N
F
i
2
)
O(N_I^2N_{F_i}^2)
O(NI2NFi2)
且不可以用于大型图像的集合。
于是有许多方法致力于解决规模和效率的问题。(引用了七篇论文,09年-“一天之内造一个罗马城”之类的论文。
输出是一组可能重叠的图像对
C
=
{
{
I
a
,
I
b
}
∣
I
a
,
I
b
∈
I
,
a
<
b
}
C = \{ \{ I_a ,I_b\} \quad | \quad I_a,I_b \in I,\quad a<b\}
C={{Ia,Ib}∣Ia,Ib∈I,a<b}
和他们关联的特征对应关系矩阵
M
a
b
∈
F
a
×
F
b
M_{ab}\in F_a \times F_b
Mab∈Fa×Fb
几何验证geometric verification
第三部分将验证可能重叠的图像对C关联的特征对应关系(correspondences)
由于matching仅仅是基于外观的,那么不能保证相应的特征实际映射到同一场景点。因此,SFM通过尝试估计一个变换矩阵,该矩阵通过使用投影几何图形在图像对之间映射他们各自的特征点,来验证匹配。
根据图像对的空间配置,不同的映射将描述他们的几何关系。
单应性矩阵H 用以描述捕获到的平面场景的纯旋转或者纯平移的摄像机的转换
对极几何中通过本征矩阵E(essential)(已经标定)或者基础矩阵(fundamental)F(未标定)描述运动中相机的关系,并且可以通过三焦点张量扩展到三个视图。
三焦点张量——tritensor,在计算机视觉中,是一个3*3 *3 的数组阵列,并入所有投影中的三个视图的几何关系,他与三个视图中的对应点或线的坐标相关联,这与场景结构无关,并且仅仅取决于三个视图之间的相对运动,(即姿态),以及其固有的校准参数(标定的内参)。因此,三焦点张量可以看作是三视图中基础矩阵F的推广,尽管27个元素,只有18个元素是独立的。
如果有效的变换在图像对之间映射了足够多的特征,那么将这个变换视为通过了几何验证。由于来自matching的信息(correspondences)经常被异常值污染,所以会采用RANSAC这类鲁棒的估计方法。该阶段的输出是一组通过几何验证的图像对
C
ˉ
\mathcal{\bar C}
Cˉ,以及他们的关联的对应关系(correspondences)
M
ˉ
a
b
\bar M_{ab}
Mˉab,同时可选的会有一个关于他们几何关系的描述
G
a
b
G_{ab}
Gab,为了确定适当的关系,可以使用诸如GRIC的决策标准或者QDEGSAC的方法,这个阶段的输出是所谓的场景图,scene graph,其中图像作为节点,已经验证的图像对作为边缘。
增量式重建
重建阶段的输入是场景图,scene graph,输出则是被配准的图像的姿态估计,记作P
P
=
{
P
c
∈
S
E
(
3
)
∣
c
=
1
…
N
p
}
\mathcal{P} = \{ P_c\in SE(3) \quad |\quad c = 1\dots N_p\}
P={Pc∈SE(3)∣c=1…Np}
输出还包括重建的场景结构,以一组点的形式,这组点记作X
X
=
{
X
k
∈
R
3
∣
k
=
1
…
N
X
}
\mathcal{X} = \{ X_k\in R^3 | k=1\dots N_X\}
X={Xk∈R3∣k=1…NX}
初始化
SFM通过精心选择的两视图重建来初始化模型,选择适合的初始图像对十分重要,否则可能根本无法成功重建。此外,重建的鲁棒性,准确性、性能取决于增量过程的种子位置。从图像图中的稠密位置,意味着这里有很多视角有重叠的相机,开始初始化通常会导致冗余度提高,从而使鲁棒性和准确性更高,相反,由于BA处理了整个重建过程中累计的稀疏问题,因此从稀疏位置中进行初始化会降低运行时间。(我并没有理解这里的点,虽然作者好像已经说明了原因)
overall sparser problems这个问题,指的是什么呢?
图像配准
这步叫做,Image registration,(原谅我一开始一直理解成了图像注册),从度量重构开始,使用特征对应关系于已经配准的图像(2d-3d的对应)中的三角点,来解决一个PnP问题,使得新的图像可以配准至当前的模型。
PnP问题涉及姿态估计,Pc,和相机的内参(没有标定的话)。
因此,通过新配准的图像的姿势Pc来扩展集合
P
\mathcal{P}
P,这里由于2d-3d的对应关系经常被异常值污染,因此通常使用RANSAC和最小姿态求解器处理已经标定的相机,对于没标定的相机,会有各种最小求解器,作者提出了一种新颖的鲁棒的下一个最优图像选择方法,用于准确姿态估计和可靠的三角剖分。(4.2节)
强调一下,配准,register,指的是将二维图片上的点匹配到三维世界中去 。
三角剖分triangulation
新配准的图像必须观察现有已经存在的场景点,此外,他还可以通过三角剖分来扩展点集,增加场景覆盖范围。在至少一幅图像或者更多副图像,不仅覆盖了新的场景部分,并且从一个新的视角覆盖了这个场景部分,当这(些)图像被配准之后,一个新的场景点
X
k
X_k
Xk立刻就可以被三角化和增加到点集合
X
\mathcal{X}
X中。
三角剖分是sfm的关键一步,他通过冗余性增加了场景的稳定性,并且通过提供附加的2d-3d对应关系来启用新图象的配准。多视角三角剖分的方法很多,但是这些方法在sfm应用当中大多鲁棒性具有缺陷或者需要巨大的计算成本代价,作者提出了一个鲁棒且高效率的三角剖分方法(4.3节)
BA
图像配准和三角测量是独立的过程,即使他们的输出是高度相关的,相机姿态的不确定性会传播到三角测量的点,反之亦然,附加的三角测量可能会通过增加冗余度来改善相机姿态,如果没有进一步的改进,SFM通常会迅速漂移到不可恢复的状态。
BA是相机参数Pc以及场景点集合Xk的联合非线性优化,可以最大限度的减少重投影的误差E。
E
=
Σ
j
ρ
j
(
∥
π
(
P
c
,
X
k
)
−
x
j
∥
2
2
)
E = \Sigma _j\rho _j(\| \pi(\mathrm{P}_c,\mathrm{X}_k)-x_j\|_2^2)
E=Σjρj(∥π(Pc,Xk)−xj∥22)
这里的
π
\pi
π函数将场景点投影到图像空间,损失函数
ρ
j
\rho_j
ρj降低潜在异常值的权重。
Levenberg-Marquardt是解决BA问题的首选方法。BA问题中参数的特殊结构,激发了Schur补充技巧。高亮部分的方法我都不了解。其中,前者首先解决简化的相机系统,然后通过反替换来更新点。由于相机的数量通常小于点的数量,因此该方案通常更有效,解决系统有两种选择,精确和不精确的步长算法。
精确的算法将整个系统存储为空间复杂度为
O
(
N
P
2
)
O(N_P^2)
O(NP2)的稀疏或者稠密矩阵,并且方法的时间复杂度是
O
(
N
P
3
)
O(N_P^3)
O(NP3).不精确的方法近似求解该系统,使用迭代求解器(计算方法那类求正规方程),例如preconditioned conjugate gradients (PCG),时间、空间复杂度都是
O
(
N
P
)
O(N_P)
O(NP)。直接的算法是多达几百台相机的首选算法,但是在大规模的条件下代价还是巨大。尽管稀疏的直接方法在很大程度上减少了整个稀疏问题的复杂程度,但是由于通常具有更密集的连接图,因此他们对于大型非结构化照片集是禁止的。在这种情况下,可以选择间接方法。
特别是针对Internet土派年,BA将花费大量的时间来优化许多几乎重复的图片。
在4.5节,作者将讨论识别和参数化高度重叠的图像的方法,以实现提高密集情况下的BA步骤效率。
面临的挑战
一句话概括,完整性、鲁棒性难以保障。
导致原因归根于两点:
- 这可能是由于对应搜索产生了不完整的场景图,例如由于匹配近似,因此既没有为完整模型提供必要的连通性,也没有为可靠的估计提供足够的冗余度。
- 这可能是由于重建阶段由于缺少或不正确的场景结构而导致的配准图像而导致的;图像配准和三角剖分具有共生关系,即图像只能配准到现有的场景结构,而场景结构只能从配准的图像进行三角剖分[64]。
贡献
介绍了一种新算法,他改进了sfm中的主要挑战。
- 几何验证策略,增加信息来增强场景显示,随后提高了初始化和三角剖分组件的鲁棒性
- 次最优视图选择将最大化增量重建过程的鲁棒性和准确性
- 健壮的三角剖分方法,它以降低的计算成本产生了比现有技术明显更完整的场景结构
- 采用迭代BA,重新三角剖分和离群滤波策略,通过减轻漂移效应来显着提高完整性和准确性
- 通过冗余视图挖掘对密集照片集进行更有效的BA参数化,这将导致系统在健壮性和完整性方面明显优于现有技术:同时保持了效率
场景图增强
scene graph augmentation
RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。
也就是说下文中计算的inliers数量是基于ransac方法的过程中求到的?待验证
正如上文中提到的,几何验证策略,以通过几何关系来增加场景图。
首先我们要估计一个基础矩阵F,(基础矩阵F:除了包含E的信息外,还包含了两个摄像机的内参数。由于F包含了这些内参数,因此它可以在像素坐标系将两个摄像机关联起来。),一般,这里估计F是由于没有标定内参,因此估计F。
如果找到了至少NF个像素(非异常值,原文中用inliers表示,但是这个inliers是如何产生的,看到这里我还不是很理解),那么将这对图像视为通过了几何验证,接下来,我们将对统一对图像通过确定单应性的inliers数量NH,来对之前得到的变换结果进行分类
若近似模型选择方法GRIC。当
N
H
/
N
F
<
ϵ
H
F
N_H/N_F<\epsilon_{HF}
NH/NF<ϵHF,我们将这类变换情况视为这张图片到那张图片的一般场景中相机是移动的(常规)。
如果是已经标定的图像,我们估计一个本征矩阵E,以及获得他的inliers的数量NE。如果
N
E
/
N
F
>
ϵ
E
F
N_E/N_F>\epsilon_{EF}
NE/NF>ϵEF,我们将认为标定结果正确。在标定结果正确的情况下,若同时
N
H
/
N
F
<
ϵ
H
F
N_H/N_F<\epsilon_{HF}
NH/NF<ϵHF,则分解矩阵E,从inliers的对应关系的进行三角化,确定三角剖分角
α
m
\alpha_m
αm,使用这个角度值,可以将视角的转换中纯旋转(全景)和纯平移(平面)的情况。
此外,互联网照片中的水印时间戳或帧(通称WTF)会错误地连接不同地标的图像。为了检测出这种图像,我们在图像边缘处做一个相似度转换的估计,若具有Ns个内点(理解成有这么多个点可能是WTF),如
KaTeX parse error: Undefined control sequence: \or at position 22: …F>\epsilon_{SF}\̲o̲r̲ ̲N_S/N_E>\epsilo…
那么认为这对图像是一个WTF,就不会被插入到scene graph中去。
COLMAP论文阅读笔记——sfm算法、不定期更新的更多相关文章
- [论文阅读笔记] Fast Network Embedding Enhancement via High Order Proximity Approximati
[论文阅读笔记] Fast Network Embedding Enhancement via High Order Proximity Approximation 本文结构 解决问题 主要贡献 主要 ...
- [论文阅读笔记] Adversarial Mutual Information Learning for Network Embedding
[论文阅读笔记] Adversarial Mutual Information Learning for Network Embedding 本文结构 解决问题 主要贡献 算法原理 实验结果 参考文献 ...
- 论文阅读笔记 - Mesos: A Platform for Fine-Grained ResourceSharing in the Data Center
作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 更多论文阅读笔记 http:/ ...
- 论文阅读笔记 Improved Word Representation Learning with Sememes
论文阅读笔记 Improved Word Representation Learning with Sememes 一句话概括本文工作 使用词汇资源--知网--来提升词嵌入的表征能力,并提出了三种基于 ...
- [论文阅读笔记] GEMSEC,Graph Embedding with Self Clustering
[论文阅读笔记] GEMSEC: Graph Embedding with Self Clustering 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 已经有一些工作在使用学习 ...
- [论文阅读笔记] metapath2vec: Scalable Representation Learning for Heterogeneous Networks
[论文阅读笔记] metapath2vec: Scalable Representation Learning for Heterogeneous Networks 本文结构 解决问题 主要贡献 算法 ...
- [论文阅读笔记] node2vec Scalable Feature Learning for Networks
[论文阅读笔记] node2vec:Scalable Feature Learning for Networks 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 由于DeepWal ...
- [论文阅读笔记] Community aware random walk for network embedding
[论文阅读笔记] Community aware random walk for network embedding 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 先前许多算法都 ...
- [论文阅读笔记] Are Meta-Paths Necessary, Revisiting Heterogeneous Graph Embeddings
[论文阅读笔记] Are Meta-Paths Necessary? Revisiting Heterogeneous Graph Embeddings 本文结构 解决问题 主要贡献 算法原理 参考文 ...
- [论文阅读笔记] LouvainNE Hierarchical Louvain Method for High Quality and Scalable Network Embedding
[论文阅读笔记] LouvainNE: Hierarchical Louvain Method for High Quality and Scalable Network Embedding 本文结构 ...
随机推荐
- print语法
循环体 是 缩进的 :缩进是 Python 组织语句的方式.在交互式命令行里,得为每个缩输入制表符或空格.使用文本编辑器可以实现更复杂的输入方式:所有像样的文本编辑器都支持自动缩进.交互式输入复合语句 ...
- Modern C++ ——constexpr的各种用法
Modern C++ --constexpr的用法 Reference <现代C++语言核心特性解析> 为什么引入constexpr const可以定义常量,但也可以用来定义只读变量.co ...
- python实现web应用程序(1)虚拟环境与Django
前言 在这个系列博客中,我将使用python实现一个名为"OI笔记"的项目. 1 建立项目目录 第一步,我们先为自己的项目建立一个目录. 首先,打开终端. win+r键,然后输入c ...
- Excel error - the macros in this project are disabled, please refer to the online help or documentation of the host application to determine how to enable macros.
alt+F11 进入vba界面,F5运行macro后报错. Sub 合并当前工作簿下的所有工作表() Application.ScreenUpdating = False For j = 1 To S ...
- go new和make区别
new用于任何类型,返回的是指针,多用在对象,结构体 make类型只用于slice,map,channel,返回引用,为什么只这三个用make,因为它们都有要初始化的数据,参数golang 内置函数n ...
- linux 查看product_uuid,即主板id,机器识别码,需要root权限
1. 用命令 sudo dmidecode | grep UUID 或者 sudo lshw | grep uuid 2. 直接查看文件描述 sudo cat /sys/class/dmi/id/ ...
- abap screen表格控件后续增加栏位
当我们通过screen的表控件(含向导)创建完表格之后,后续想再增加栏位,要先把输入控件拖入表格控件内,再按钮控控件拖进去即可. 注:输入控件的名称和格式要和程序中的一致,否则会显示不出数据 效果图如 ...
- Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:...
大家都知道Centos8于2021年年底停止了服务,大家再在使用yum源安装时候,出现下面错误"错误:Failed to download metadata for repo 'AppStr ...
- C# Linq不同类型数组之间的转换
string[] strArray = "a,b,c,d,e,f,g".Split(new char[]{ ',' }); int[] intArray; //C# 3.0下用此句 ...
- SDCC 学习
单个led.c文件 #include <stdbool.h> __sfr __at(0xb0) P3; __sfr __at(0x88) TCON; __sfr __at(0x89) TM ...