返回列表

2nd place solution

401. Google Landmark Recognition 2020 | landmark-recognition-2020

开始: 2020-07-29 结束: 2020-09-29 计算机视觉 数据算法赛
第二名解决方案

第二名解决方案

作者:bestfitting
比赛:Google Landmark Recognition 2020

祝贺所有的获奖者,感谢 Kaggle 和 Google 举办地标检索/识别比赛。

这是我在本次比赛中的简要解决方案。

定义

  • GLD_v2c(清洗后的 GLDv2):包含 160 万张训练图像和 8.1 万个类别。所有地标测试图像都属于这些类别。
  • GLD_v2x:在 GLDv2 中,有 320 万张图像属于 GLD_v2c 中的 8.1 万个类别。我将这 320 万张图像定义为 GLD_v2x。
  • 查询图像:提交给 Kaggle 时的测试图像,或在本地验证时验证集中的图像。
  • 索引图像集:来自训练集的图像,如本次比赛数据页面所述,“子集包含与私有测试集中的地标相关的所有训练集图像”。
  • 非地标图像集:从 GLDv2 测试集中提取的 5000 张非地标图像的子集。

用于检索图像的模型

从索引图像集中准确搜索相关图像非常重要。我根据 @keetar 提供的 Landmark Retrieval 2020 比赛第一名解决方案,训练了 EfficientNet B5、B6、B7 和 Resnet152 模型。这里我只描述我的训练策略与其不同之处,详情请参考他出色的解决方案。

  1. 使用 GLD_v2c 的 448x448 图像训练 5-6 个 epoch。
  2. 在 GLD_v2x 的 448x448 图像上微调步骤 1 的模型。
  3. 在 GLD_v2x 的 512x512 图像上微调步骤 2 的模型 5-6 个 epoch。我使用的是 GLD_v2x 而不是全部 GLD_v2。
  4. 使用 640x640 分辨率训练 3-5 个 epoch。
  5. 使用 736x736 分辨率训练 2-3 个 epoch。

损失函数:使用 ArcFace 代替 AdaCos 损失。

优化器:SGD(学习率 0.01,动量 0.9,衰减 1e-5)。

推理:输入 800x800 图像提取嵌入向量。

验证集:从 GLDv2 测试集中采样 200 张图像作为验证集,并使用 Google Landmark Retrieval Competition 2019 的所有真实图像作为索引数据集。

用训练好的 EfficientNet B7 模型替换主办方提供的 baseline kernel 中的模型后,B7 模型的公开/私有分数分别为 0.5927/0.5582。

地标识别任务的验证策略

验证集第 1 部分:来自 GLDv2 测试集的 1.3k 张地标图像(排除不在 8.1k 类别中的图像)。

验证集第 2 部分:从 GLD_v2x-GLD_v2c 中采样 2.7k 张图像。

验证集的索引图像集:来自 GLD_v2c 训练集的相关地标的所有图像,并采样一些其他图像以获得 20 万张图像。

这个策略在整个比赛过程中相当稳定,但不幸的是,私有测试集的分布与我的本地 CV 和公开测试集略有不同。我应该使用所有的 GLD-v2x 图像来生成索引图像集,因为许多地标图像并未包含在 GLD-v2c 中。

SuperPoint+SuperGlue+pydegensac

这种组合优于 delf+kdtree+pydegensac。

分数从 0.5927/0.5582 提高到了 0.6146/0.5756,这可以进入排行榜前十名。

后处理

虽然我强迫自己不要在后处理、寻找魔法或逆向工程上花费太多精力,但后处理在本次比赛中如此重要,以至于我不得不花大量时间分析模型结果并在验证集上设计规则。我尝试了去年获胜解决方案的规则,以下是有效的规则:

  1. 从非地标图像集中为查询图像搜索前 3 张非地标图像,如果 top3 的相似度 > 0.3,则降低该查询图像的分数。
  2. 如果一个地标在测试集中被预测超过 20 次,则将该地标的图像视为非地标。

由于许多特征(ransac 内点、与索引图像的相似度、

同比赛其他方案