556. Image Matching Challenge 2023 | image-matching-challenge-2023
(6月21日:添加了额外的解释。)
首先,我想向主办方和Kaggle工作人员表示感谢,感谢他们组织了IMC 2023竞赛。这个任务既令人兴奋又充满挑战,让我在过去两个月中享受其中。
SuperPoint/SuperGlue被证明是异常准确和快速的。我的代码部分结合了主办方提供的基线代码和Chankhavu在IMC 2022的笔记。我对两者表示感谢。
考虑到大量的图像组合,需要一个有效的筛选方法。我注意到当图像对不适合立体匹配时,SG产生的匹配数量显著较低(<10)。因此,我决定在SG(长边=1200)产生的匹配数低于某个阈值(本例中为30个匹配)时跳过处理。该策略显著减少了处理时间,使在有限时间内尝试更多图像对成为可能,带来了明显的改进(LB:+0.08)。
从具有无序图像方向的图像对(如塞浦路斯的图像)中获取有意义的匹配具有挑战性。因此,我在筛选过程中加入了旋转处理,进一步提升了效果(LB:+0.04)。
每张图像被分割为四个部分,每个部分生成自己的关键点集,然后对所有图像对组合(4x4=16对)执行匹配(SP/SG,长边=1400)。图像分割后,关键点数量几乎增加到原来的3倍,且这不依赖于图像的原始尺寸。仅仅增加图像输入尺寸无法实现这种效果。我在其他场景也获得了类似收益。该方法被证明比我之前使用的传统TTA更有效且省时(LB:+0.01~0.02)。
在比较多个模型后,DKM v3成为与SG配合使用的相对轻量且有效的选择(LB:+0.01~0.04)。在下图所示的图像对中,SuperGlue无法在楼梯区域(黄色区域)产生正确的匹配,但在其他物体(如拱门和柱子)上表现良好。而DKM可以检测到楼梯的正确对应点,表明这两种匹配器具有互补性。
匹配和建图/重建都是计算密集型任务。但前者同时使用GPU和单个CPU,而后者仅需要CPU资源。因此,使用队列库实现并行处理使时间效率提高了约20-30%。这个概念受到IMC 2022金奖解决方案的启发。
记住设置< code>mapper_options.num_threads = 1,这有助于避免重建过程中的内存溢出(OOM)。
| 场景 | 图像数量 | 图像对数量 | mAA | mAA_q | mAA_t |
|---|---|---|---|---|---|
| urban / kyiv-puppet-theater | 26 | 325 | 0.921538 | 0.987385 | 0.921538 |
| urban | - | - | 0.921538 | - | - |
| heritage / dioscuri | 174 | 15051 | 0.594950 | 0.689662 | 0.602279 |
| heritage / cyprus | 30 | 435 | 0.706437 | 0.727126 | 0.724828 |
| heritage / wall | 43 | 903 | 0.805980 | 0.935105 | 0.824917 |
| heritage | - | - | 0.702456 | - | - |
| haiper / bike | 15 | 105 | 0.933333 | 0.999048 | 0.933333 |
| haiper / chairs | 16 | 120 | 0.981667 | 0.999167 | 0.981667 |
| haiper / fountain | 23 | 253 | 0.999605 | 1.000000 | 0.999605 |
| haiper | - | - | 0.971535 | - | - |
最终指标 → mAA=0.865176
Public LB: 0.471
Private LB: 0.534
值得注意的是,该提交在本地、公开榜单和私有榜单中都获得了我的提交中的最高分。虽然我曾与Colmap的随机性斗争,但现在认识到该数据集很有用,并作为 aiming for the correct goal 的宝贵参考。