652. Image Matching Challenge 2025 | image-matching-challenge-2025
首先,我要衷心感谢组织者今年再次举办图像匹配挑战赛。每年你们引入的新主题都让我深受启发,我也非常享受学习和实验新技术的机会。
我的解决方案包括一个带有旋转增强的预匹配阶段,随后是使用平铺图像进行多轮匹配。旋转增强和图像平铺的核心思想也曾在 我 2023 年 IMC 的方法 中使用过。
整体流程总结如下图所示:
.png?generation=1749222583567967&alt=media)
像许多其他团队一样,我使用了 T4x2 GPU 设置进行并行处理。
我利用了基线 pipeline,使用 DINOv2 生成具有高相似度的图像对列表。我发现最佳参数是每张图像最少 50-60 对(min_pair),相似度阈值(sim_th)为 0.2。
对于每一对,我使用 ALIKED + LightGlue 进行匹配(longside 设置为 960px,max_keypoints 设置为 4096)。拥有超过 40 个内点匹配的对被视为有效。由于某些数据集包含旋转图像,我为最初匹配失败的对实施了带有旋转增强的重试机制。
对于预匹配阶段的有效对,我将每张图像均匀平铺为四个象限。然后我在这些平铺图像上进行匹配,再次使用 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 年第一名团队的解决方案,我想向他们表示感谢。
注册 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 的参数以及输入图像大小对准确性有显著影响。仔细的调优至关重要。