Image Matching Benchmark

相关链接

benchmark:为了度量不同算法的好坏,需要控制变量,在同一个数据集上进行评估。这个数据集就是benchmark。所以,通常来说benchmark和dataset同时出现,作为不同算法的衡量标准。指如何评估方法的好坏,一般跟dataset一起出现,也就是构成基准数据集benchmark dataset。

baseline:baseline则是证明所提出模型好坏的一个基准。是papaer中要对比的各种方法

IMC是CVPR 2021上对局部特征(如SIFT、Superpoint等)、匹配方法(SuperGlue等)和鲁棒几何估计(如RANSAC)的基准与挑战。目标是让研究人员能够评估局部特征提取和匹配的方法,使用下游指标,如最终姿态的准确性,在标准化的基准上,对照传统图像匹配流程的每个阶段的最先进的方法。

运行基准需要编写配置文件,通常需要提供预先计算好的特征(和匹配)。我们提供了一个包含三个序列的验证集。该版本有以下帮助:

  1. 在模块化框架中集中特征提取和匹配的方法

  1. 在验证集上找到正确的超参数

  1. 提供内省工具

更多的链接:

  • Parsing the training data: see example on

example/training_data/parse_data.ipynb

动机

局部特征是计算机视觉中大量应用的基础,并且(可以说)仍然是三维重建和重新定位中的技术水平。新方法历来是在小型的、去中心化的数据集上进行评估的,有中间指标,特别是局部特征,如关键点重复性或描述符匹配得分。这可能误导了实际的性能,并阻碍了新技术的发展。显然需要新的、大规模的、具有综合评价协议和基线的基准。该代码库在一个模块化的框架中包含了几十种最先进的提取和匹配本地特征的方法的封装。

我们依靠丰富的摄影旅游数据。我们的 (pseudo-) ground truth伪真值来自于大规模的SfM重建,该重建使用Colmap和穷举匹配获得,这产生了准确的6自由度姿态。这种解决方法使我们能够考虑具有交大视角和光度差异的图像。

这个基准背后的核心假设是,我们可以再对这些子集进行抽样,使问题变得更加困难。测试集包含10个场景,每个场景有100张图片。我们为每个场景提取特征,详尽地匹配它们(在一个场景内),并将结果反馈给多个任务,如宽基线立体匹配或多视图重建的小图像子集(5、10、25张图像)。目前正在开发更多的任务。

安装

Ground truth data(真值)和基准应放在同一文件夹中

在运行时,将在这一层级创建另外两个文件夹。所有结果(特征、匹配、立体等)都将放在benchmark-results。自动可视化(下面的例子)将被放在benchmark-visualizations里面

克隆(在cmd下):

gh repo clone ubc-vision/image-matching-benchmark

下载third-party modules:

git submodule update --init

需要OpenCV。一些特征方法不是免费的,必须从OpenCV contrib repository中安装:当你想提取这些特征的时候可以这样做。

该代码库需要大量的计算,并且是高度并行化的,依赖于Slurm作业调度器。我们在这里提供了在谷歌云平台(GCP)上建立一个可扩展的按需集群的说明,作为一个例子:记住,GCP为新用户提供300美元的免费信用。另外,也可以用 --run_mode=interactive标志在单线程上运行。

该代码库是用Python 3编写的。处理dependencies最简单的方法是通过conda。

然后你可以创建一个包含所有依赖项的环境。可以根据具体设置进行一些调整。

Colmap应该单独安装,并且其二进制文件在系统路径中可见。你可以遵循这个 this documentation

对于立体匹配,我们提供了围绕OpenCV RANSAC的封装器,并不是SOTA。我们还提供了GC-RANSAC、DEGENSAC和MAGSAC的封装器。请注意,如果你想直接提供最终的匹配集,绕过标准的稳健估计,你可能不需要这些。你可以按一下方式将它们安装到你的conda环境中。

  • DEGENSAC

pip install pydegensac
  • MAGSAC

pip install git+https://github.com/ducha-aiki/pymagsac
  • GC-RANSAC

pip install git+https://github.com/danini/graph-cut-ransac@benchmark-version

配置

元数据和超参数是通过以JSON格式编写的配置文件指定的。

例子在example/configs中

原数据只有在提交挑战时才需要。congfig_common中的字段在所有任务和数据集中是通用的。特征的数量(任何一张图片的最大特征数,而不是平均数)和描述符的维度将决定提交的挑战赛的类别。

然后您可以为每个任务指定不同的配置,例如以下:

(...)
  "config_phototourism_stereo": {
      "use_custom_matches": false,
      "matcher": {
          "method": "nn",
          "distance": "L2",
          "flann": true,
          "num_nn": 1,
          "filtering": {
              "type": "snn_ratio_pairwise",
              "threshold": 0.9
          },
          "symmetric": {
              "enabled": true,
              "reduce": "both"
          }
      },
      "outlier_filter": {
          "method": "none"
      },
      "geom": {
          "method": "cmp-degensac-f",
          "threshold": 0.5,
          "confidence": 0.999999,
          "max_iter": 100000,
          "error_type": "sampson",
          "degeneracy_check": true
      }
  },
  "config_phototourism_multiview": {
      "use_custom_matches": false,
      "matcher": {
          "method": "nn",
          "distance": "L2",
          "flann": true,
          "num_nn": 1,
          "filtering": {
              "type": "snn_ratio_pairwise",
              "threshold": 0.9
          },
          "symmetric": {
              "enabled": true,
              "reduce": "both"
          }
      },
      "outlier_filter": {
          "method": "none"
      },
      "colmap": {}
  }
  (...)

双目任务支持matcher中的特征匹配器、outlier_filter中可选的外点滤除器以及geom中的稳健估计器。多视角任务支持matcher和outlier_filter;colmap字段目前应该是空的,因为我们没有传递任何选项。关于这些选项的细节,请参考源代码。关于合理的默认值,请参考json/method上的例子或我们的论文(WIP)。如果你不想处理一个特定的任务,你可以删除该字段或将其留空。字符串是不区分大小写的。

对于matcher字段:

  • method:目前所有的选项都在methods/feature_matching/nn.py中实现

  • distancel2 or hamming

  • flann:启用它以加快用OpenCV的匹配(对于二进制特征必须关闭)

  • num_nn:用于建立匹配列表的最近邻个数(通常为1)

  • filtering:包括 比率测试 选项

  • type:推荐在标准比率测试中使用snn_ratio_pairwise,否则no

  • threshold:比率测试的阈值

  • symmetric:使图像A与B匹配,B与A匹配

  • reduceboth取两个列表的交集;either取它们的并集(去除重复项)。

outlier_filter字段可以用来指定一个可选的outlier滤除器,在RANSAC或Colmap之前运行。We have implemented our prior work on outlier filtering with deep networks, which has been retrained on more data. More options will be added in the future. Please note that the goal of this option is to make it easier to compute baselines: we expect comprehensive submissions to provide matches explicitly.

geom字段用于指定立体匹配中使用的稳健估计器:

  • method:请参考methods/geom_models的选项。

  • threshold:内点率:必须为每个特征类型分别设置。

  • confidence:停止迭代的置信度:我们将其设为0.999999,我们建议使用这个值。

  • max_iter:RANSAC迭代的最大次数,在支持的方法上。

colmap字段目前没有使用。对于一个全面的选项列表,请参考源代码。请注意,不同的轨道对普通任务有不同的设置,因为最优值可能不同。例如,立体声和多视图任务的最佳比率测试通常是不同的。

最终,这个配置文件应该被写成一个列表,你可以用它在一个文件中指定不同的配置。

[
   { <method_1> },
   { <method_2> },
   { <method_3> }
]

例子:https://www.cs.ubc.ca/research/image-matching-challenge/current/leaderboard/

导入你自己的特征点和匹配

来自OpenCV的局部特征(如SIFT或ORB)可以直接从benchmark中计算出来:关于它们的选项,参考methods/local_feature中的文件。

其他方法应该单独提取特征并通过HDF5文件导入。我们在在这里提供了一个简单的例子,用于说明,并在一个单独的资源库中提供了几个方法的包装器:请自由添加你自己的方法。然后你可以用import_features.py脚本将它们导入到benchmark中。

@article{Jin2020,
    author={Yuhe Jin and Dmytro Mishkin and Anastasiia Mishchuk and Jiri Matas and Pascal Fua and Kwang Moo Yi and Eduard Trulls},
    title={{Image Matching across Wide Baselines: From Paper to Practice}},
    journal={International Journal of Computer Vision},
    year={2020}
}

https://github.com/vcg-uvic/image-matching-benchmark-baselines

概要

这个资源库包含为 Image Matching Benchmark 及其相关挑战提取本地特征的实用程序。详情请参考 website

数据

数据可以在 here下载:你可能想下载图像进行验证和测试。大多数脚本假定图像在.../imw-2020(假定文件夹)中,如下所示。

$ ~/image-matching-benchmark-baselines $ ls ../imw-2020/
british_museum           lincoln_memorial_statue  milan_cathedral  piazza_san_marco  sacre_coeur      st_pauls_cathedral  united_states_capitol
florence_cathedral_side  london_bridge            mount_rushmore   reichstag         sagrada_familia  st_peters_square

$ ~/image-matching-benchmark-baselines $ ls ../imw-2020/british_museum/
00350405_2611802704.jpg  26237164_4796395587.jpg  45839934_4117745134.jpg  [...]

你可能需要以这种方式对验证集进行格式化。

安装

git submodule update --init

支持以下方法:

已经预先封装好了conda环境。可以通过以下命令安装环境:

conda env create -f system/<environment>.yml

切换环境使用以下命令:

conda deactivate
conda activate <environment>

基于图像块的描述符

许多学习型描述符需要预先生成图像块。这个功能本身很有用,所以我们把它移到了一个单独的包里。可以用pip install extract_patches安装它(请注意,这需要 python 3.6,因为这个包是通过 nbdev 生成的)。你可以用system/r2d2-python3.6.yml环境来做(由于格式化的字符串字面,它也需要3.6),或者创建一个不同的环境。

要提取默认配置的图像块到../benchmark-patches-8k,运行:

python detect_sift_keypoints_and_extract_patches.py

将会产生HDF5文件。

你也可以用--force_upright=no-dups-more-points提取固定方向的图像块:该选项将过滤掉重复的方向,并增加更多的点,直到达到关键点的预算(如果可能的话)。

python detect_sift_keypoints_and_extract_patches.py --force_upright=no-dups-more-points --folder_outp=../benchmark-patches-8k-upright-no-dups

这些设置在每张图片上产生了大约(最多)8k个特征,这需要降低SIFT检测阈值。如果你想要更少的特征(~2k),你可能像使用默认的检测阈值,这样结果通常略好。

python detect_sift_keypoints_and_extract_patches.py --n_keypoints 2048 --folder_outp=../benchmark-patches-default --lower_sift_threshold=False
python detect_sift_keypoints_and_extract_patches.py --n_keypoints 2048 --force_upright=no-dups-more-points --folder_outp=../benchmark-patches-default-upright-no-dups --lower_sift_threshold=False

然后可以用run_<method>.sh,或按照下面说明提取特征。shell脚本使用了合理的默认值:请参考每个单独的封装器的进一步设置。

从预先生成的图像块中提取描述符

对于HardNet(环境hardnet):

python extract_descriptors_hardnet.py

对于SOSNet(环境hardnet):

python extract_descriptors_sosnet.py

对于L2Net(环境hardnet):

python extract_descriptors_l2net.py

Log-Polar描述符(环境hardnet)需要获取原始影像。对于对数极模型,使用

python extract_descriptors_logpolar.py --config_file=third_party/log_polar_descriptors/configs/init_one_example_ptn_96.yml --method_name=sift8k_8000_logpolar96

对于笛卡尔模型,使用

python extract_descriptors_logpolar.py --config_file=third_party/log_polar_descriptors/configs/init_one_example_stn_16.yml --method_name=sift8k_8000_cartesian16

对于Geodesc(环境geodesc):

wget http://home.cse.ust.hk/~zluoag/data/geodesc.pb -O third_party/geodesc/model/ geodesc.pb
python extract_descriptors_geodesc.py

端到端的方法

Superpoint

(环境hardnet)关键点按得分排序,只保留最高的num_kp。你可以通过以下方式提取默认参数的特征。

python third_party/superpoint_forked/superpoint.py --cuda --num_kp=2048 --method_name=superpoint_default_2048

可以降低检测阈值以提取更多的特征,并将图像的大小调整为一个固定的尺寸(在最大的维度上),例如:

Pipeline流程管道

将每个场景的N=100张图像作为输入。特征提取模块从每个图像中计算出多达K个特征。特征匹配模块为每对影像生成一个假定的匹配列表对这些匹配可以选择由离群点预剔除模块处理。然后送入立体匹配和多视角sfM重建任务。

实现

整个提交过程包括编写设置环境、编写处理脚本以及调整匹配和RANSAC以获得最佳性能。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值