返回列表

3rd Place Solution

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

开始: 2025-04-01 结束: 2025-06-02 计算机视觉 数据算法赛
第三名解决方案 - 图像匹配挑战赛 2025

第三名解决方案

作者: Roni Heka
发布时间: 2025-06-06
竞赛: Image Matching Challenge 2025

首先,我要衷心感谢组织者今年再次举办图像匹配挑战赛。每年你们引入的新主题都让我深受启发,我也非常享受学习和实验新技术的机会。

概述

我的解决方案包括一个带有旋转增强的预匹配阶段,随后是使用平铺图像进行多轮匹配。旋转增强和图像平铺的核心思想也曾在 我 2023 年 IMC 的方法 中使用过。

整体流程总结如下图所示:
解决方案流程图

像许多其他团队一样,我使用了 T4x2 GPU 设置进行并行处理。

解决方案详情

2.1. 预匹配

我利用了基线 pipeline,使用 DINOv2 生成具有高相似度的图像对列表。我发现最佳参数是每张图像最少 50-60 对(min_pair),相似度阈值(sim_th)为 0.2。

对于每一对,我使用 ALIKED + LightGlue 进行匹配(longside 设置为 960px,max_keypoints 设置为 4096)。拥有超过 40 个内点匹配的对被视为有效。由于某些数据集包含旋转图像,我为最初匹配失败的对实施了带有旋转增强的重试机制。

2.2. 基于平铺图像的匹配

对于预匹配阶段的有效对,我将每张图像均匀平铺为四个象限。然后我在这些平铺图像上进行匹配,再次使用 ALIKED + LightGlue(max_keypoints=4096)。平铺图像的最佳 longside 设置为 1024 或 1216。

我策略的一个关键部分是为匹配创建一组五张图像:四个平铺块加上缩小一半的原始图像。这导致每个原始图像对产生 25 种匹配组合(5x5),这使得在尺度和透视差异显著的情况下进行更稳健的匹配成为可能。虽然这看起来计算成本很高,但 LightGlue 的低计算成本使其在给定的时间限制内可行。
更新:我已在下方的评论部分发布了 pipeline 的实现。

以下是训练数据的代表性得分总结。最终我没能找到针对 stairs 数据集的有效方法...

heritage theather_church dioscuri_baalshamin lizard_pond piazzasanmarco amy_gardens fbk_vineyard ETs stairs 平均 公开榜 私有榜
88.13 61.39 91.73 76.16 60.25 23.91 37.88 66.67 4.3 56.71 48.97 49.05

实际上,我还没有完全验证为什么这种特定的平铺策略如此有效。然而,我相信其中一个原因是它有助于缓解关键点仅集中在图像某一部分的问题。

为了提高时间效率,我缓存了 ALIKED 特征提取的结果以供重用。匹配后,我将关键点坐标恢复至原始图像空间,使用 RANSAC 过滤异常值,然后将这些关键点与预匹配阶段的关键点结合起来。RANSAC 参数取自 2024 年第一名团队的解决方案,我想向他们表示感谢。

2.3. 其他要点

注册 pycolmap 结果: 我的 pycolmap 处理基于官方基线。然而,我注意了注册 incremental_mapping 重建结果的顺序。我对本次竞赛的理解是,场景中最大簇中注册的图像数量越多,通常会导致更好的分数(假设估计的相机姿态是正确的)。由于图像可以是多个簇的一部分,因此防止较大、较稳健簇的结果被较小簇的结果覆盖至关重要。
为了实现这一点,我在注册最终姿态之前,按注册图像数量升序对重建的地图进行了排序。这个修改似乎在 leaderboard 上产生了小幅提升。

代码如下:

map_info_list = []
for map_idx, cur_map in maps.items():
    num_registered_images = cur_map.num_registered_images()
    map_info_list.append({
        "original_map_index": map_idx,
        "map_object": cur_map,
        "num_reg_images": num_registered_images
    })
# 按注册图像数量升序排序
sorted_map_info_list = sorted(map_info_list, key=lambda x: x["num_reg_images"])
for map_info in sorted_map_info_list:
    # (注册姿态...)

参数调优: ALIKED 和 LightGlue 的参数以及输入图像大小对准确性有显著影响。仔细的调优至关重要。

本案中无效的方法

  • 使用 SIFT 代替 ALIKED: 虽然 SIFT 更快,但与 ALIKED 相比,它在大多数数据集上的得分较低。我没有机会尝试 ALIKED 和 SIFT 的集成。
  • 场景预聚类: 我尝试在包含多个场景的数据集内预聚类图像。
    我尝试基于预匹配阶段的关键点匹配数量导出的距离矩阵进行聚类,但我找不到可靠的方法来准确分割所有场景。
    即使场景被正确分割,除非后续匹配步骤能找到足够的关键点进行稳健的重建,否则这并不会导致分数显著提高(针对本次竞赛的指标)。
  • VGGT 尝试: 虽然基于 pairwise 匹配的聚类准确度较低,但我发现 VGGT 从聚类角度来看很强大,因为它似乎能在几十张图像的组中找到上下文。我尝试使用 SIFT 特征点作为 query_points,并基于超过 vis_score 和 conf_score 阈值的点数来识别目标图像的配对。这种方法比 2.1 节中的 pairwise 方法实现了更高的配对识别真阳性率,并成功聚类了许多数据集。
    然而,就 resulting 姿态准确性和最终得分而言,它在我的设置中没有显示出显著优势,可能是由于调整大小的原因。
    VGGT 的使用已被 @tmyok1984 在 这篇讨论帖 中深入探讨和讨论。我从阅读这篇帖子中学到了很多。
同比赛其他方案