第十名解决方案 - Image Matching Challenge 2025
第十名解决方案
更新:@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)
- 首先,我们为每个数据集动态调整顶部图像对的数量(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 图像对
- 其次,我们根据步骤 1 中计算的 top-k 值选择图像对。
我们没有使用像 DINOv2 或 MegaLoc 这样的视觉特征,而是依赖基于 KeyNet-AdaLAM 的自定义相似度分数。
- 全局描述子无法区分视觉上相似的场景,然而,通过仔细观察细节,我发现相邻的图像可以被识别——就像拼在一起的拼图碎片。
因此,我认为基于关键点的匹配被认为是提取准确图像对的更理性选择。
- 选择 KeyNet-AdaLAM 是由于以下优势:
- 对缩放和旋转的鲁棒性(通过 AffNet & OriNet)
- 对所有图像对进行快速的 exhaustive 匹配
- 比其他稀疏匹配方法(例如 ALIKED + LightGlue)具有更高的配对选择精度
- 相似度分数是启发式设计的,基于内点的平均描述子距离和内点数量。
使用该分数,我们可以准确地提取 fbk_vineyard 中真正的相邻对,如下方显示的前 4 个示例所确认。
(由于数据集对相邻视图使用连续的图片文件名,所选对的正确性是显而易见的)
- 通过以这种严格的方式生成图像对,我们能够相当准确地估计 fbk_vineyard 的相机姿态。
(至于 split3,存在相反视角的图像对,很难用这个 pipeline 将它们识别为同一集群的一部分...)
注意:
- 为了提高图像对匹配的准确性,增加 AdaLAM 中的
ransac_iters 参数也很重要(我们使用了 384)。
- 然而,较高的值可能会导致 GPU 内存错误,所以要小心。
1.3. 通过 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)
- 最后,我们基于 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 中)
再次感谢所有人,如果明年举办挑战,我很乐意再次参加!