457. Google Landmark Recognition 2021 | landmark-recognition-2021
恭喜获奖者,非常感谢 Kaggle 和 Google 每年组织这场精彩的 landmark 识别比赛。这对我们来说是一次很棒的团队合作,我们在这里简要讨论一下我们的解决方案。
我们可能是 LB(排行榜)上提交次数最多的团队(200 多次提交),原因是我们一开始就在独立探索不同的方法,直到截止日期前的最后一周才合并。我们从一开始就探索了许多不同的想法,但我们的最终集成流程与最初尝试的有很大不同。
可能像大多数其他人一样,我们在意识到以下两点之前浪费了不少提交机会:1) 推理期间提供的私有测试图像至少有 20K 张,而不是测试文件夹中的 10K 张;2) 私有训练集中存在除清理后的 81313 个版本以外的 landmark ID。
我们的最终模型包括两组——检索模型和分类模型。我们的解决方案可以概括如下:
拼接与检索 (Concat & Retrieval) ->
分类 logits 调整 ->
干扰项分数调整 ->
Top 1 分类分数
我们在最终流程中有 7 个检索模型:
我们发现,仅在 3M(81313 个 landmarks)数据集上训练模型,其检索性能优于在完整 4M 数据集上微调,或者至少相当。我们单个最好的检索模型——Swin-l——在 Public LB 上的纯检索性能达到了 0.4。其他如 B7、V2、B5 在单独检索性能上要弱很多(大约 0.29 ~ 0.33)。
我们所有的模型都输出 512 维特征,在最终流程中,我们简单地将它们拼接起来,形成最终的嵌入向量(512 x 6),用于从私有训练集中检索 Top K 匹配的训练图像。我们使用 K = 7。
我们发现使用动态 margin(或自适应 margins)实际上有助于改进训练,感谢 Qishen 去年的出色方案!
我们发现使用分类 logits 来支持预测至关重要。从一开始,我就设法将完整的 4M 数据集拆分为训练集和验证集,当我意识到私有训练集可能包含未清理的 landmark ID 时,验证集的 mean_gap 可以可靠地用作分类性能的衡量标准,这也与 LB 一致。
事实证明这很重要。由于使用了具有代表性的验证集,回到完整的 20 万个 landmark ID 训练集(400 万张图像)上微调模型相对容易。最后,我们发现我的 B5 在 LB 上的 Top 1 纯分类准确率约为 0.39+,而 Swin 约为 0.34。我们决定使用我训练的所有 4 个 EfficientNet(B5 512 & 768, B6 512 & 768)作为我们第 2) 阶段以及后面第 4) 阶段的主要分类模型。
在第 2) 阶段,我们已经从第 1) 阶段获得了 Top 7 检索到的训练图像。因此,对于这 7 张图像中的每一张,我们从所有选定的 4 个模型(B5 512&768, B6 512&768)中查找其分类 logits,并简单地将平均 logit 加到其对应的余弦分数上作为调整。
与 Dieter 去年的做法类似,我们使用 2019 年测试集的非 landmark 图像作为索引,对于每张训练图像(4M),我们找到其 Top 3 匹配分数并简单地取其平均值作为其干扰项分数。我们在字典中生成了每个 4M 训练图像 ID 到其分数的映射,并上传到 Kaggle 以便在提交中使用。
然后,我们从第 2) 阶段得到的每个调整后的余弦分数中减去干扰项分数。简而言之,第 1) - 3) 阶段可以看作:
余弦分数 + 分类 logit - 干扰项分数
我们发现使用来自我们