返回列表

1st Place Solution

652. Image Matching Challenge 2025 | image-matching-challenge-2025

开始: 2025-04-01 结束: 2025-06-02 计算机视觉 数据算法赛
1st Place Solution - 翻译版

第一名解决方案 (1st Place Solution)

作者: ns64 (Grandmaster)
发布时间: 2025-06-04
竞赛: Image Matching Challenge 2025

感谢组织者和 Kaggle 团队举办这场激动人心的比赛。祝贺所有参赛者。虽然我早在 2022 年就首次参加了 IMC,但很高兴这次我取得了有史以来最好的成绩。

今年,我专注于利用最新的 3D 几何基础模型,如 MASt3R 和 VGGT。我对它们的潜力感到惊讶。向开发这些优秀模型的作者们致敬。

1. 概览 (Overview)

我开发了一个基于 MASt3R 的简单流程。

据我尝试,在 IMC25 上,使用 MASt3R 的局部特征头进行图像匹配,似乎比其他基于检测器的方法(如 ALIKED+LG)取得了显著更好的结果。

overview

  • 使用粗粒度 MASt3R 匹配对前 k 个邻居图像进行预聚类(图中未显示)。
  • 结合来自图像检索的多个候选列表(shortlists)提取图像对。
  • 利用 MASt3R (https://github.com/naver/mast3r) 作为匹配器。除了 MASt3R 的半稠密匹配外,还使用 MASt3R 匹配由其他关键点检测器提取的关键点。
  • 使用通用的 COLMAP 流程生成重建(基于 https://www.kaggle.com/code/eduardtrulls/imc25-submission)。

2. 解决方案 (Solution)

我观察到,基于 MASt3R 的匹配比其他方法实现了更高的精度(即更少的误匹配),因此它可以在基于检测器的方法通常失败的杂乱场景中匹配图像。
我认为以下几点可能对鲁棒匹配有用:

  • 3D 几何特征(来自 DUSt3R)
  • MASt3R 不仅使用 MegaDepth 数据集训练,还使用了几个以物体为中心的数据集

通过简单地将 MASt3R 模型用作半稠密无检测器匹配器并将其集成到通用的 COLMAP 流程中,我在公开排行榜 (PublicLB) 上取得了 42-45 的分数。此外,我发现增加图像对的数量可以提高分数,达到约 50 分。因此,我认为如何在有限的计算时间内增加图像对数量可能是一个重要的考虑因素。

2.1. 聚类 (Clustering)

我开发了一种基于 MASt3R 匹配的预聚类方法,但该方法未在最终版本中采用。事实证明,由于图像匹配主要使用 MASt3R,因此无论我使用预聚类还是来自 COLMAP 的多次重建,都没有显著差异。

预聚类(未使用)方法概述如下:

  1. 将每个图像的聚类标签初始化为 -1
  2. 使用最远点采样从场景中提取 N 个图像,并为每个图像分配唯一的聚类标签 (0, 1, ..., N-1)。
  3. 对于 N 个种子图像中的每一个(来自步骤 2),使用 MASt3R 对其他未聚类的图像运行 1 对多匹配。如果图像匹配成功,则将种子图像的聚类标签分配给匹配的图像。否则,为其分配一个新的聚类标签。
  4. 使用新匹配的图像作为下一个查询,并重复 1 对 k 匹配迭代,直到所有图像都被分配了聚类标签
  5. 将小簇视为“异常值”

2.2. 候选列表 (Shortlist)

由于 MASt3R 匹配器比基于检测器的方法计算量更大,因此匹配图像对的候选列表仍然很重要。

我通过取多个图像检索结果的邻居的并集,生成了场景中用于匹配的候选对。我使用了以下四种全局特征进行图像检索。

虽然 MASt3R-ASMK 可以提取具有足够覆盖率的图像对,但添加其他模型略微提高了分数。

特征 (Features) 参数 (Parameters)
MASt3R-ASMK n=10, k=25 (参见 MASt3R-SfM 论文)
MASt3R-SPoC topk=10
DINOv2 topk=10
ISC topk=10

注意,仅使用具有更重设置的 MASt3R-ASMK(例如 MASt3R-ASMK(n=10, k=60))也可以获得高分,但所提出的方法在获得相似分数的同时速度更快。

2.3. 成对匹配 (Pairwise matching)

首先,通过 MASt3R 计算图像对的匹配。此实现基于官方仓库代码中的 fast_reciprocal_NNs()。我使用了默认参数 subsample=8 和 pixel_tol=5。

除了半稠密匹配外,其他关键点检测器提取的关键点也被输入到 MASt3R 匹配器中(灵感来自 MP-SfM https://arxiv.org/abs/2504.20040)。这些额外的关键点可能会在区域上与 MASt3R 采样的点重叠,但与仅使用 MASt3R 匹配相比,这种方法提高了分数。

我使用了 ALIKED 和 SuperPoint 作为额外的关键点检测器。虽然我也尝试了 SIFT、GIMSuperPoint 和 DaD,但我最终采用了 ALIKED 和 SuperPoint 的组合,因为这种组合产生了最好的 LB 分数。

详细配置如下:

模型 (Model) 参数 (Parameters)
MASt3R size=512, threshold=1.001
ALIKED 检测器 size=1280, max_keypoints=4096
SuperPoint 检测器 size=1600, max_keypoints=4096, threshold=0.0005

2.4. 工程技巧 (Engineering tips)

此外,我应用了以下技术使流程更快:

  • 使用 CUDA 构建 curope (RoPE2D) 模块。
  • 将 mast3r/dust3r/croco 中使用的注意力实现替换为 torch.nn.functional.scaled_dot_product_attention
    (以启用 flash attention)
  • 修复 MASt3R 推理函数中的 use_amp 参数以正确使用。
  • 在 Kaggle 中使用 T4 x 2 环境,并在 submission.csv 中按数据集划分的场景子集上并行运行提交流程。

根据 Speedy MASt3R (https://arxiv.org/abs/2503.10017),TensorRT 可以进一步加速 MASt3R 模型。但是,我未能转换该模型。

2.5. 本地/公开/私有分数 (Local/Public/Private Score)

amy_gardens fbk_vineyard ETs stairs 公开 (Public) 私有 (Private)
最佳提交 (Best submission) 40.65 72.09 59.46 15.89 52.64 56.00
带预聚类 (w/ Pre-clustering) 37.02 47.25 59.46 20.35 50.22 50.93
  • amy_gardensfbk_vineyard 的分数似乎不稳定。
  • stairs 很难(顺便说一句,在我的本地实验中,VGGT 取得了 25.07 的最高分数)

3. 未奏效的方法 (What did not work)

  • GLOMAP:我尝试在预聚类方法中使用 GLOMAP 代替 COLMAP,但没有提高分数。
  • 粗到细匹配 (Coarse-to-Fine matching):可能我的实现中有 bug。
  • 使用单目深度估计:我尝试使用深度信息过滤不匹配的图像对。
  • VGGT:带有预提取关键点的 VGGT 跟踪头在本地测试中表现良好,但在提交时导致了 TimeoutError
同比赛其他方案