sfm-disambiguation-colmap

sfm-disambiguation-colmap

改进结构运动恢复算法 应对场景对称性和重复结构

该项目实现并集成了多种先进算法到COLMAP中,以解决结构运动恢复中场景对称性和重复结构的问题。它重新实现了Yan、Cui和Kataria等人提出的方法。通过广泛实验分析发现,没有一种方法能在所有数据集上表现一致,大规模场景的参数调整仍具挑战性。该研究为进一步探索这一问题奠定了基础。

SfMCOLMAP图像匹配3D重建数据集Github开源项目

使用COLMAP进行SfM消歧

关于

当场景中存在对称性和重复结构时,Structure-from-Motion通常会失败。在这个仓库中,我们实现了几种旨在解决这个问题的最先进算法,将它们集成到COLMAP中,并对它们的性能进行了广泛分析。我们希望这项工作能够促进这个问题的进一步研究。

我们专注于在SfM之前过滤掉图像之间的不正确匹配。过滤过程通过重新实现Yan等人(CVPR 2017)的《区分不可区分的:通过测地线上下文探索结构歧义》和Cui等人(ICCV 2015)的《通过相似性平均的全局Structure-from-Motion》中的思想来完成。我们还包括了基于他们的实现的Kataria等人(3DV 2020)的《通过可靠重定位改进Structure from Motion》的实验结果。我们分别将这三篇论文称为Yan的方法、Cui的方法和Kataria的方法。本仓库使用COLMAPhloc进行特征提取和匹配,使用COLMAP进行几何验证和稀疏重建。

总结:没有一种方法能在所有数据集上使用单一的超参数集consistently表现良好。对于所有三种方法来说,为大型场景调整参数都是困难且耗时的。

如果你对这个问题感兴趣并想交流,请发邮件给Lixin Xue!

<p align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/a5d2bb14-1b23-48b1-a605-b99bb79b6cf8.gif" alt="teaser"> <br /><em>亚历山大·涅夫斯基大教堂数据集上的结果</em> </p>

结论

根据我们的实验,我们有以下观察:

  • 图像中的重复结构往往会导致过多的图像匹配和不收敛的光束法平差。这将显著延长重建时间。移除错误匹配或正确初始化位姿可以显著加快重建过程。
  • 即使有正确的初始图像对和完美的下一视图选择,colmap可能仍会输出一个包含许多错误注册图像的重建结果。即使是Kataria的方法基于可靠匹配来初始化位姿,对某些数据集的消歧仍然不足。因此,一个噪声更少的位姿图对于正确重建是必要的。
  • Yan的方法和Cui的方法都需要一些特定于场景的参数调整。Kataria的方法具有更好的泛化能力,尽管我们为它调整了参数,但在几个数据集上仍然失败。没有一种方法能在所有数据集上使用单一的参数集consistently表现良好。对于某些场景(特别是大规模场景)来说,为所有三种方法调整参数都是困难且耗时的。

安装

<details> <summary>[点击展开]</summary>
# 需要python 3.7,因为在笔记本中使用了`subprocess.run`的'capture_output'关键字
# 这个关键字只在python 3.7及以上版本中可用
conda create -n sfm python=3.7 -y

# 安装[colmap](https://colmap.github.io/install.html)
# 安装[hloc](https://github.com/cvg/Hierarchical-Localization#installation)

# 用于绘制匹配图的库
sudo apt-get install graphviz graphviz-dev
pip install pygraphviz
conda install -c anaconda networkx -y
# 用于在笔记本中交互式控制参数
conda install -c conda-forge jupyterlab ipywidgets -y
# 如果使用colmap可视化3D模型可以跳过这一步
conda install -c open3d-admin -c conda-forge open3d -y

# 以开发模式安装此库以便进一步修改
python -m pip install -e .

我们还通过谷歌云盘提供了我们使用的数据集。请下载并在datasets文件夹下解压,以获得以下布局:

|---datasets
    |---heinly2014
        |---...
    |---yan2017
        |---...
</details>

流程

<details> <summary>[点击展开]</summary>

我们提供了两个jupyter笔记本作为Yan方法和Cui方法完整流程的示例。这两种方法共享类似的流程,首先计算每对图像的分数,然后根据分数移除错误匹配。之后,将过滤后的匹配传递给增量重建阶段。在Yan的方法中,他们使用原始匹配来计算轨迹,并使用两幅图像之间共享的唯一轨迹的百分比作为图像对的分数。而在Cui的方法中,他们对每幅图像进行局部重建,并使用缺失对应的思想为每对图像创建一个分数。

<p align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/f7a5f057-a708-40c3-a087-41434270f8b6.png" alt="pipeline yan"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/52cba4d1-adb2-41df-8124-6c9a8489e011.png" alt="pipeline cui"> <br /><em>Yan方法和Cui方法的类似流程</em> </p>

1. 对应关系

首先,我们可以使用colmaphloc从图像中提取特征。我们提供以下特征,括号中为相应的关键字:

  1. 使用默认参数的colmap SIFT (sift_default)
  2. 将第一个八度设置为0的colmap稀疏SIFT特征 (sift_sparse)
  3. SuperPoint (superpoint)
  4. D2-Net (d2net)
  5. R2D2 (r2d2)
  6. DISK (disk, 仍是hloc中的一个拉取请求)

对于由colmap提取的SIFT特征,我们使用colmap提供的穷举最近邻匹配。

对于由hloc提取的学习特征,我们使用hloc提供的穷举最近邻匹配。特别是对于SuperPoint特征,我们还可以使用训练好的SuperGlue模型进行匹配。

然后,我们使用colmap matches_importer以不同的RANSAC参数执行几何验证(从匹配计算两视图几何)(查看options/matching_options.py中的colmap_matching_options)。

2. 消歧

接下来,我们可以使用Yan的方法或Cui的方法计算所有匹配的分数。之后,我们可以选择使用阈值过滤器、前k个过滤器或百分位数过滤器来移除可疑匹配。我们用过滤后的匹配创建一个新的数据库并重新计算两视图几何。

我们选择预先过滤匹配,而不是像Heinly等人的论文《在稀疏3D重建中纠正重复场景结构》中那样对重建后的模型进行后处理,这是基于结论部分所述的观察。

3. 重建

最后,我们使用colmap mapper以增量方式重建整个场景。根据数据集,你可以选择是否从EXIF固定内参(查看options/mapper_options.py)。

</details>

Yan方法概述

<details> <summary>[点击展开]</summary>

《区分不可区分的:通过测地线上下文探索结构歧义》。CVPR 2017。

作者:Qingan Yan, Long Yang, Ling Zhang, Chunxia Xiao。

基本步骤

关键思想是,捕捉重复结构同一实例的测地线邻居通常比不同实例的图像共享更多匹配。基于这一思想,他们:

  1. 从原始匹配生成轨迹;
  2. 选择具有代表性的图像集来概括整个场景,通过最大化一个目标函数来实现。该函数倾向于完整性(观察到的轨迹数量)并惩罚重复性(出现在多张图像中的轨迹数量);
  3. 将代表性图像集覆盖的轨迹分为两部分:仅出现在代表性集合中一张图像的轨迹定义为唯一轨迹,而在代表性集合的多张图像中出现的其他轨迹定义为混淆轨迹。
  4. 定义匹配得分为match_ij: len(unique_ij) / max(len(unique_i), len(unique_j)),即两张图像共享的唯一轨迹的百分比。

原始实现与论文之间的差异

我们的实现遵循作者分享的原始实现。然而,作者的代码与论文之间存在一些差异:

  1. 在实际实现中,非代表性图像也被用作路径网络的骨架。因此,匹配图并不是"节点分别为代表性图像和非代表性图像的二分图"。构建代表性集合仅用于构建唯一轨迹和混淆轨迹。
  2. 在原始论文中,只要两张图像共享足够的唯一轨迹,就会保留匹配。然而,在实现中,唯一轨迹的百分比也被用来筛选匹配。
  3. 公式(3)中的$\alpha$在代码中被设置为0,而在论文中要求大于0。因此,构建代表性集合的停止标准不同:在论文中,一旦添加任何一张图像都不会增加目标函数(3),代表性集合就会固定。相反,作者提供了一个coverage threshold,一旦目标大于这个阈值就停止扩展代表性集合。这个改变是必要的,因为当$\alpha = 0$时,目标函数会单调递增。

参数调优

原始实现有两个参数(coverage_thresscore_thres)需要调整。以下是作者的评论:

coverage控制将选择多少代表性图像。对于小规模室内场景,建议使用0.7到0.9之间的大值;对于大规模非结构化数据集,0.6左右的值就足够了。

参数score_thres定义图像对是否可接受。同样,对于小规模场景,建议使用较大的阈值(约0.3);对于大规模户外场景,score_thres在0.04到0.1之间是个不错的选择。

例如,对于Alexander Nevsky Cathedral数据集,我们使用coverage = 0.6和score_thres = 0.1来获得良好注册的3D点云。

在我们的实现中,我们公开了另外4个参数进行调整:

  • track_degree:要考虑的轨迹的最小长度。增加它将丢弃更多短轨迹。
  • alpha:论文公式(3)中的$\alpha$。增加它将要求代表性集合中的图像更具有区别性。
  • minimal_views:匹配有效所需的最小共享轨迹数。增加它意味着更少的匹配将有效。
  • ds:用于存储匹配列表的数据结构。你可以保持不变(默认largearray),因为默认值是速度和内存之间的良好折衷。对于包含数千张图像的大型数据集,如berliner_dom(1618张图像),有必要使用smallarray数据结构或限制图像中的最大关键点数量。在这种情况下,由于图像数量众多和数据结构效率低下,处理速度会非常慢(berliner_dom需要超过8小时)。
<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/7e83548f-4d79-44a1-9100-915bc2006f9b.gif" width="49%", alt="书籍数据集"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/35e1cbc2-cc34-4008-8e3b-625afc80d5af.gif" width="49%", alt="书籍COLMAP"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/7efdb728-7e6f-4f1e-8cdf-a10482df4f10.gif" width="49%", alt="书籍Yan方法"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/1d031eae-4c35-4ea3-beb0-433707327197.gif" width="49%", alt="书籍Cui方法"> </p>

麦片

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/510e95fb-57d6-4f94-b012-b718b77746e4.gif" width="49%", alt="麦片数据集"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/c6323404-2400-47a8-a7e2-c86c008deb9d.gif" width="49%", alt="麦片COLMAP"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/cacb6712-6c7e-4c7e-89dc-ca3f339532c8.gif" width="49%", alt="麦片Yan方法"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/76ead9f6-def9-4914-b1f8-c67c3f337dc1.gif" width="49%", alt="麦片Cui方法"> </p>

杯子

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/fd2acc7b-7316-4fe2-9503-e37c01fed0ec.gif" width="49%", alt="杯子数据集"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/6586936e-c144-4506-a6eb-176d48ac4762.gif" width="49%", alt="杯子COLMAP"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/0b270167-f130-42f0-a750-8134b3b6ea0e.gif" width="49%", alt="杯子Yan方法"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/17ba5085-6c2d-4f37-af71-b33fe5f0ae19.gif" width="49%", alt="杯子Cui方法"> </p>

书桌

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/5fe0bd23-245b-4ee1-a7d3-5a7cabe38103.gif" width="49%", alt="书桌数据集"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/fb2b4338-8643-402d-a1d5-0a9ad364dccb.gif" width="49%", alt="书桌COLMAP"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/aa165465-8262-490c-9e0a-3cca18f1b388.gif" width="49%", alt="书桌Yan方法"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/fd9e3606-33b2-423c-90ae-38b4494811f5.gif" width="49%", alt="书桌Cui方法"> </p>

(最左侧的图像在colmap中错误对齐,而在其他两种方法中得到了纠正)

燕麦

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/9a6f433a-6485-48c1-b63b-c18cfd1e8d01.gif" width="49%", alt="燕麦数据集"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/dbfd4124-d1b6-4e30-95f0-6c33cedfc3d7.gif" width="49%", alt="燕麦COLMAP"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/8a48b472-04b4-423c-96fa-646528bd001f.gif" width="49%", alt="燕麦Yan方法"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/dcaad828-40f7-4493-ade9-a26b9ef8951f.gif" width="49%", alt="燕麦Cui方法"> </p>

(两种方法都失败了,因为真实情况应该是一个序列,而不是两个并行的序列)

街道

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/6d8ae752-423a-45f8-b832-dbec8572f5a6.gif" width="49%", alt="街道数据集"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/a43fde84-dff5-4fbe-84c1-407b95902002.gif" width="49%", alt="街道COLMAP"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/56a0bd8b-208c-4126-b2f9-60179aadf864.gif" width="49%", alt="街道Yan方法"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/d8b5b55c-e469-4c8b-8722-fbe453ea4c3d.gif" width="49%", alt="街道Cui方法"> </p>

天坛

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/24e1cf42-57c9-48aa-81b4-be0c7f56557f.gif" width="49%", alt="天坛数据集"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/0d6c7e88-23a7-4159-8f0a-b0e6cc3b5cb6.gif" width="49%", alt="天坛COLMAP"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/0458f3e6-0685-4099-a282-a5c49037162a.gif" width="49%", alt="天坛Yan方法"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/ff357034-50de-4b9d-b38b-b6198417807c.gif" width="49%", alt="天坛Cui方法"> </p>

亚历山大·涅夫斯基大教堂

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/426016b3-a858-4923-8572-79a277302ac7.gif" width="49%", alt="亚历山大·涅夫斯基大教堂数据集"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/5ec9e3f8-f65c-4c29-b66e-d32273b86d15.gif" width="49%", alt="亚历山大·涅夫斯基大教堂COLMAP"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/6336eb0b-c4f5-40ab-b6dd-039776ba4243.gif" width="49%", alt="亚历山大·涅夫斯基大教堂Yan方法"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/9902a66c-b98b-4cc9-92f7-a0243ab8fb86.gif" width="49%", alt="亚历山大·涅夫斯基大教堂Cui方法"> </p>

相同参数

为了研究一组参数在多大程度上适用于所有数据集,我们将为亚历山大·涅夫斯基大教堂数据集调整的参数应用于其他互联网图像集合。

凯旋门

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/9d074130-66d9-4236-8b4c-053ebcf0a1d6.jpg" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/f36d2ccf-2b8a-4d6b-92dc-063752f95c44.jpg" width="49%"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/26d9e5e7-f312-49e6-9b30-9ebad803d1b7.png" width="100%"> </p>

柏林大教堂

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/9ffeb3b9-7b1d-4c02-863b-88d845b68ac6.jpg" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/7fd4f3a2-d8ea-4383-9144-9415c8f3a31a.jpg" width="49%"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/f0c1598b-8232-4d53-b99c-4568526629d7.png" width="100%"> </p>

大本钟

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/b83ea03a-e7d2-4a38-a6ee-17f3692f66ad.jpg" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/476ff573-5b4d-4b15-89cf-e45b8c083b5a.jpg" width="49%"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/686f6f85-5343-4e30-a7bf-68dbe8ad4a64.png" width="100%"> </p>

勃兰登堡门

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/d93fb0ce-996f-45e7-9ad2-f683ee0b17e2.jpg" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/6b2bdd2c-fda2-4e66-ad76-680c3fc6cf76.jpg" width="49%"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/7182907d-5947-440a-a3cd-9b08435b31d5.png" width="100%"> </p>

(通过适当选择阈值,我们可以将模型分解为几个部分。)

滴血救世主教堂

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/f1453028-a2f4-44ae-a526-c6cdbe55e034.jpg" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/0223d9fc-101e-4d50-bb18-374469e4bb82.jpg" width="49%"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/afe5ffe6-9b5e-4128-aa2b-19934ba684d0.png" width="100%"> </p>

(通过适当选择阈值,我们可以将模型分解为几个部分。)

拉德克利夫图书馆

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/33d29f1c-c7d0-4f48-8380-11805b586879.jpg" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/032e1c03-45ab-40ae-bbb4-f4b7b0d2ed6a.jpg" width="49%"> </p> <p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/b84ff63b-56c6-4fab-898f-0debed679447.png" width="100%"> </p>

(由于缺少过渡性的相机视角,正确的重建被分成了两部分)

Kataria的方法

在这里,我们还想展示Rajbir Kataria、Joseph DeGol和Derek Hoiem的论文《利用可靠重定位改进运动结构》中的结果。更多详情,请参考作者提供的代码库。以下我们将这种方法称为Kataria方法。

基于长轨迹更可能包含错误匹配的观察,作者提出使用经过轨迹长度调整的匹配数量作为下一个视图选择的标准。更重要的是,待注册图像的初始姿态将仅依赖于可靠图像的3D点,而不是所有三角测量点。这一点很重要,因为我们的实验表明,正确的注册顺序并不一定导致正确的重建。这种方法只包含两个需要设置的参数:轨迹长度折扣因子λ和可靠图像阈值τ。更重要的是,同一组参数可以适用于许多不同的场景,极大地减少了为上述两种方法调整参数的负担。

为了公平比较,我们研究了原始代码库中更改的文件,并将它们与当前版本的colmap进行了小幅修改的集成。我们运行exhaustive_matcher而不是vocab_tree_matcher,这与之前的方法相同。由于作者提供的参数是为OpenSfm调整的,我们也尝试为colmap在杯子和燕麦数据集上调整参数(λ从0.5改为0.3,τ从2.0改为1.3)。结果如下所示:

杯子

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/0cc0a7b4-8205-4dac-965d-2db0a42aa543.png" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/9a22be8a-7f9c-4691-9cda-8d1623fb6bee.png" width="49%"> </p> (左侧的重建使用作者提供的参数,右侧的重建使用我们调整的参数)

燕麦

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/8c4cd76e-a375-452c-a542-2239745bee5d.png" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/e75d8063-1c74-4b4d-a0b3-af079d953ef8.png" width="49%"> </p> (左侧的重建使用作者提供的参数,右侧的重建使用我们调整的参数。请注意,我们没有找到一组适合Yan或Cui方法的参数来消除这个场景的歧义)

大规模数据集的结果

然而,当我们在Heinly等人提供的大规模互联网数据集上使用这两组参数时,两组参数给我们的重建结果相似,而且在某种程度上不如我们从Yan或Cui方法中得到的结果:

亚历山大·涅夫斯基大教堂

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/3d2f6a7a-5245-4766-8751-c86902bb64da.png" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/551bf853-bef9-4c32-b764-8033be597794.png" width="49%"> </p>

(在左侧重建中,一些错误注册的相机应该放置在蓝色圆圈内,以创建像右侧那样的正确重建)

大本钟

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/fe534b24-c744-44a0-a040-42864748ac42.png" width="49%"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/5d98acb8-d0db-4345-9233-e890e781a63a.png" width="49%"> </p>

(注意左侧重建中蓝色圆圈内可疑的墙壁,它应该是一条空旷的街道,如右侧重建所示)

Radcliffe Camera

<p float="left"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/63db063e-fe3a-4df8-97d8-44f13e28bc36.png" width="100%"> </p>

(Kataria方法的这组参数无法区分Radcliffe Camera的两侧,而Yan的方法和Cui的方法可以)

复现

为了复现上述Kataria方法的结果,我们将修改/新增的文件放在了reliable_resectioning文件夹中。您可以将此目录中的所有文件与colmap的源代码合并,然后进行编译。我们还提供了一个bash脚本示例,用于使用新编译的colmap生成稀疏重建。

-->

代码库结构

<details> <summary>[点击展开]</summary>
|---datasets
    |---heinly2014
        |---...
    |---yan2017
        |---...
|---disambiguation
    |---geodesic_consistency        # Yan方法的代码
    |---mmissing_correspondences    # Cui方法的代码
    |---options     # 特征/匹配/映射的参数
    |---utils       # 一些辅助函数
    |---calculate_geodesic_consistency_scores.py        # 基于Yan方法计算匹配分数的接口
    |---calculate_missing_correspondences_scores.py     # 基于Cui方法计算匹配分数的接口
    |---extract_match_features.py                       # 提取和匹配特征的接口
|---reliable_resectioning
    |---src         # Kataria方法的修改后的colmap源文件
|---results
    |---${dataset_name}
        |---${feature_type}_${matching_type}_${geometric_verification_type}
            |---plots_${parameters}             # Cui方法中缺失对应关系的图表
            |---sparse                          # 不使用消歧的colmap重建
            |---sparse_yan_${parameters}        # 使用Yan方法的重建
            |---sparse_cui_${parameters}        # 使用Cui方法的重建
            |---db_yan_${parameters}.db         # 存储使用Yan方法过滤后的匹配
            |---db_cui_${parameters}.db         # 存储使用Cui方法过滤后的匹配
            |---${dataset_name}.db              # 存储未过滤的匹配
            |---scores_yan_${parameters}.npy    # 使用Yan方法的匹配分数
            |---scores_cui_${parameters}.npy    # 使用Cui方法的匹配分数
            |---...
|---notebooks
    |---$steet_${method_name}.ipynb   # 在街道数据集上运行代码库和调整参数的示例
|---scripts
    |---disambiguate_yan.py     # 使用Yan方法计算分数的示例
    |---disambiguate_cui.py     # 使用Cui方法计算分数的示例
    |---filter_matches.py       # 基于分数过滤匹配的示例
    |---match_features.py       # 提取和匹配特征的示例
</details>

数据集

<details> <summary>[点击展开]</summary>

我们主要使用来自Yan的仓库Heinly的网站的数据集,其中包含一些来自Roberts等人Jiang等人的数据集。我们将这些数据集的整理版本(重命名图像并移除特征)打包成一个zip文件供下载。

要尝试其他数据集,您可以将新数据集放在yan2017heinly2014下,结构如下:

|---datasets
    |---heinly2014
        |---${your_dataset_name}
            |---images
                |--- *.[jpg/png/...]

然后您可以使用${your_dataset_name}作为参数dataset_name来在新数据集上运行代码。

</details>

文献综述

<details> <summary>[点击展开]</summary>

以下是一些相关论文及其摘要:

</details>

致谢

本工作由苏黎世联邦理工学院的硕士生Lixin XuePaul‑Edouard SarlinMihai Dusmanu的指导下完成。我们要感谢Qingan Yan分享了原始实现和数据集,感谢Jared Heinly分享了数据集,以及感谢Rajbir Kataria协助设置他的工作。

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多