返回列表

10th Place Solution

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

开始: 2025-04-01 结束: 2025-06-02 计算机视觉 数据算法赛
第十名解决方案 - Image Matching Challenge 2025
标题:第十名解决方案 (10th Place Solution)
作者:Muku
团队:team-sony-matching (tmyok1984, jooott, sugupoko, ryosukesaito)
发布时间:2025-06-03

第十名解决方案

更新:@tmyok1984这个帖子 中分享了 VGGT 的实验细节,所以也请查看一下!
(注:VGGT 未集成在下方的解决方案中)


首先,我想感谢主办团队和所有工作人员组织了如此激动人心的比赛,并在整个挑战过程中提供了出色的支持。

这是我第一次参加 IMC,但 thanks to 许多富有洞察力的过往 IMC 解决方案,我完成了这次挑战。
此外,与强大的参赛者竞争真的让我保持了动力。我真的很感谢你们所有人。

我们的方法得到了 @tmyok1984 的领导力以及广泛的实验和讨论的强力支持。
我们也从 @jooott@sugupoko 的 IMC2024 解决方案中获得了极大的启发,这影响了我们 pipeline 的核心思想。
我真的很感谢他们在这次充满挑战的比赛中的支持和团队合作。

在开发我们的解决方案时,我特别专注于在特征匹配之前高精度地选择图像对
在图像对选择之后的 pipeline 几乎没有什么特别之处——这是一个使用 ALIKED-LightGlue 进行特征匹配和使用 pycolmap 进行相机姿态估计的直接过程。
我们在私有排行榜(Private Leaderboard)上发生了一些波动,但我认为这是因为我们的配对选择策略恰好拟合得很好。

1. 关键步骤

1.1. 确定选择图像对的 Top-k(动态 Top-k)

Dynamic Top-k Diagram
  • 首先,我们为每个数据集动态调整顶部图像对的数量(top-k)
  • 在像 fbk_vineyard 这样视觉上容易混淆的场景中,我注意到经常会形成不正确的图像对,这可能导致模型中不同集群的数据混合。
    因此,对于具有高视觉相似性的场景,为了提高所选图像对的准确性,我们设置了一个非常小的 top-k 值(例如 k = 3),以严格仅选择相邻的图像对——类似于 MST(最小生成树)。相似度分数基于 DINOv2 patch 特征计算。
  • 相比之下,对于像 amy_gardens 这样的场景,图像是在不同时间或用不同相机拍摄的,同一地点可能存在多个相似图像。在这种情况下,我们使用较大的 top-k 以保持召回率(Recall)。

注意:

  • 关于上述策略,我认为使用非常小的 top-k 存在一些风险:它可能会错误地将集群分割成部分。
    例如,如果有很多来自严格相同位置的图像,它们可能只相互连接,而不与附近的视图连接。
    因此,理想情况下,我认为最好设置相似度分数的阈值而不是 top-k。
  • 然而,设置好的阈值很难且取决于数据集,所以在这个 pipeline 中,我接受了这个风险并使用了这种 top-k 方法。
  • 我还假设在像 fbk_vineyard 这样的场景中,不太可能有很多图像是从完全相同的视点拍摄的。(这是无用的行为)
    因此,我估计集群断裂的风险相对较低。
    • 但是故意包含重复或几乎相同的图像是很容易的....
    • 在这种情况下,可能需要额外的措施——例如,如果有重叠太多的图像对,则相应地增加 top-k 值。

1.2. 获取基于关键点特征相似度排名的 Top-k 图像对

Keypoint Feature Similarity
  • 其次,我们根据步骤 1 中计算的 top-k 值选择图像对。
    我们没有使用像 DINOv2 或 MegaLoc 这样的视觉特征,而是依赖基于 KeyNet-AdaLAM 的自定义相似度分数
  • 全局描述子无法区分视觉上相似的场景,然而,通过仔细观察细节,我发现相邻的图像可以被识别——就像拼在一起的拼图碎片。
    因此,我认为基于关键点的匹配被认为是提取准确图像对的更理性选择。
  • 选择 KeyNet-AdaLAM 是由于以下优势:
    • 对缩放和旋转的鲁棒性(通过 AffNet & OriNet)
    • 对所有图像对进行快速的 exhaustive 匹配
    • 比其他稀疏匹配方法(例如 ALIKED + LightGlue)具有更高的配对选择精度
  • 相似度分数是启发式设计的,基于内点的平均描述子距离和内点数量。
    使用该分数,我们可以准确地提取 fbk_vineyard 中真正的相邻对,如下方显示的前 4 个示例所确认。
    (由于数据集对相邻视图使用连续的图片文件名,所选对的正确性是显而易见的)
    Top-4 Examples
  • 通过以这种严格的方式生成图像对,我们能够相当准确地估计 fbk_vineyard 的相机姿态。
    (至于 split3,存在相反视角的图像对,很难用这个 pipeline 将它们识别为同一集群的一部分...)
    Camera Pose Estimation

注意:

  • 为了提高图像对匹配的准确性,增加 AdaLAM 中的 ransac_iters 参数也很重要(我们使用了 384)。
  • 然而,较高的值可能会导致 GPU 内存错误,所以要小心。

1.3. 通过 ALIKED 提取特征 & 通过 LightGlue 匹配

ALIKED LightGlue
  • 接下来,我们使用 ALIKED + LightGlue(resize_to: 1024, max_num_keypoints: 10000)对提取的图像对执行特征匹配。
  • 这部分没有太多的定制,但我采用了一种基于 DBSCAN 的裁剪方法,灵感来自 IMC2024 第 1 名团队的优秀解决方案
    • 我最初假设这种方法可能对像 fbk_vineyard 这样的 walkthrough 类型场景影响有限,但它在交叉验证 (CV) 和排行榜 (LB) 上都显示了一些积极效果,所以我决定将其包含在我们的 pipeline 中。(特别是,我记得它在 amy_gardens 场景上效果很好。)
  • 最后,我们组合来自完整图像和裁剪区域的匹配结果,并将其传递给最后一步。

1.4. 几何验证 & 相机姿态估计(由 pycolmap)

Geometric Verification
  • 最后,我们基于 MAGSAC++ 移除外点和低置信度对,将清理后的匹配保存到数据库,并运行 pycolmap 进行相机姿态估计。
  • 因为我们已经有了精心挑选的图像对,所以我们不使用 match_exhaustive()。
  • pycolmap 中的参数调优只带来了很小的增益,但我们发现保持较高的 ba_local_max_num_iterations 有一些好处。

IMC2025 中每个训练数据集的最终指标分数如下所示。
"stairs" 用当前的 pipeline 特别难以处理...

ETs amy_gardens fbk_vineyard stairs
得分 (%) 74.98 40.00 62.65 5.26
平均角度准确率 (%) 60.61 25.00 45.62 2.78
聚类度 (%) 100.00 100.00 100.00 50.00

2. 其他想法

2.1. 多进程处理

  • 我参考了 @tmyok1984 去年的解决方案,并应用了使用两个 GPU (T4 × 2) 的并行处理。
    理想情况下,CPU 和 GPU 任务也应该并行处理,但在我的当前解决方案中,总运行时间尚可接受,无需进一步优化。

2.2 无效的方法

  • ALIKED 以外的特征提取器(虽然 ALIKED+DISK+SIFT 在 CV 中显示了好结果,但在 LB 上完全不起作用,所以我排除了它们)
  • 旋转处理(虽然通常很重要,但在我的 pipeline 中效果不佳。我猜旋转不是今年新添加数据集的关键因素)
  • 相机姿态估计后的优化器(它与我的 pipeline 不太匹配。然而,我相信根据配置它仍然可能是有益的)

2.3 VGGT 的探索(未集成到我的 pipeline 中)

  • VGGT 潜力的探索主要由 @tmyok1984@jooott 完成,我们发现 VGGT: Visual Geometry Grounded Transformer 可以相对较好地估计"stairs"场景的相机姿态(仍然不完美)。
  • 此外,@tmyok1984 的额外测试表明,VGGT 对于具有稀疏图像覆盖区域的数据集(如 amy_gardens)以及 fbk_vineyard split3 中的相反视角对也相对工作正确
  • 另一方面,VGGT 相机姿态的绝对精度似乎不是很高,所以很难让它在 LB 上表现良好。
  • 这些实验的详细信息已由 tmyok 在 这个帖子 中分享,所以也请查看。



再次感谢所有人,如果明年举办挑战,我很乐意再次参加!

同比赛其他方案