495. Image Matching Challenge 2022 | image-matching-challenge-2022
感谢所有团队,特别是组织者的出色工作,举办了这次比赛,这有助于将图像匹配的性能推向极限。这是我的第一次 Kaggle 比赛,但不是第一次参加 IMC,我发现从其他参与者精彩的解决方案中学习总是令人兴奋 :)
我参加这次比赛的最初动机是测试我们最近开发的一个匹配模型。我们的模型与 LoFTR 共享类似的范式,使用 Transformer 风格的网络从原始图像对生成匹配,而无需关键点检测。由于我们的论文仍在双盲评审中,我们可能无法公开分享更多信息,但我相信代码在不久的将来应该可以发布 :)
该模型很早就提交给了 IMC,在没有任何 TTA 的情况下,在私有/公开 LB 上取得了 0.838/0.833 的惊人分数。
从最初的基线开始,我将更多强大的匹配器集成到解决方案中,这似乎总是有帮助的。结果报告如下。
| 匹配器 (Matcher) | 分数 (私有/公开) | 输入分辨率 |
|---|---|---|
| Baseline | 0.838/0.833 | (1472,832) 或 (832,1472) |
| LoFTR | 0.783/0.772 | (1400,792) 或 (792,1400) |
| SuperGlue+8k SuperPoint | 0.724/0.728 | 最长边 1600 |
| Baseline+QuadTree | 0.854/0.848 | -- |
| Baseline+QuadTree+LoFTR | 0.860/0.853 | -- |
| Baseline+QuadTree+LoFTR+SuperGlue | 0.862/0.859 | -- |
通常,LoFTR/Quadtree 对最终分数贡献很大,SG 提升了公开分数,但私有分数从中受益较少。对于所有基于 Transformer 的匹配器,我保留两种类型的固定分辨率(通过纵横比选择)以维持大致恒定的内存消耗。对于所有方法,我使用 cv2.findFundamentalMat(mkpts0, mkpts1, cv2.USAC_MAGSAC, 0.2, 0.99999, 100000) 来获得基础矩阵。
还需要澄清的是,我对基线、loftr 和 quadtree 使用了归一化位置编码,这似乎总是在没有额外成本的情况下将性能提升 0.003-0.005(有时甚至更多)。我将在下一节讨论它。
LoFTR 的原始位置编码类似于:
pe[0::4, :, :] = torch.sin(x_position * div_term),其中 x_position 是绝对像素坐标。
这种实现的一个潜在问题是,当测试分辨率偏离训练分辨率时,pe 将使用未见过的坐标进行编码,这会损害网络识别位置的能力。为了缓解这个问题,我们应用了一个简单的归一化:
pe[0::4, :, :] = torch.sin(x_position * (training_dim/test_dim) * div_term),其中 training_dim/test_dim 是一个归一化因子,用于确保所有坐标范围在训练分辨率内。例如,使用 840 分辨率训练并使用 1472 分辨率测试,那么因子将是 840/1472=0.5706。根据经验,我发现这种修改或多或少使所有基于 Transformer 的匹配器受益约 0.005。
使用语义掩码过滤掉不可匹配的对象(天空、汽车、树木、行人)。这种预处理对我来说通常成本高昂,并且没有带来一致的改进。
单应性预过滤。使用单应性假设过滤掉一些匹配,然后估计 F,这是去年 IMC 获胜团队采用的方法。一般来说,这种预过滤在理论上让我感到困惑,而且在经验上没有给我带来收益。
用 SE2-LoFTR 替换 LoFTR。在某些时候,我猜测测试集中可能存在一些轻微的旋转(大约 30-40 度),所以我尝试用 SE2-LoFTR 替换 LoFTR,但结果证明是无效的。
对所有方法使用更大的分辨率,我曾尝试扩大输入分辨率(如 >1500),但增益有限,运行时间却大幅增加。
使用 AdaLAM 过滤匹配。AdaLAM 有一些超参数