返回列表

1st place solution

458. Google Landmark Retrieval 2021 | landmark-retrieval-2021

开始: 2021-08-11 结束: 2021-10-01 计算机视觉 数据算法赛
第一名解决方案

第一名解决方案

作者:Dieter
发布时间:2021-10-07

首先,我要感谢 Kaggle 工作人员和 Google 团队组织 2021 年地标竞赛。我对我的结果仍然感到不知所措和震惊,这使我成为了 Kaggle 总排行榜的 #1,这是许多 Kaggle 参赛者的终极目标。我的解决方案在模型和训练流程方面对于检索和识别任务是相似的,但在细节上略有不同,特别是在后处理,即重排序过程中。我尝试将功劳归功于那些我从去年的解决方案中借鉴了聪明想法的人。对于检索赛道,我重用了 @bestfitting 的 Google 地标识别 2020 第二名解决方案和团队 All Data Are Ext (@boliu0, @haqishen, @garybios, @alexanderliao) 的第三名解决方案中的几个想法,以及 Google 地标检索 2019 获胜团队 (smlyaka, @confirm, @lyakaap) 的后处理想法。如果我忘记了谁,请发表评论。

太长不看版 (TLDR)

我的解决方案是 DOLG 模型 [1] 和混合 Swin Transformer 的集成,这两种架构都非常擅长以单阶段方式将地标的局部和全局描述符集成到单个特征向量中。我使用 3 步方法训练模型,在每一步中扩大训练数据集和图像大小。对于后处理,我使用了 2019 年团队 smlyaka 想法的改进版本。

前言

在详细介绍之前,我想说明导致该解决方案的一些情况。首先,与去年相比,今年的比赛时间表明显更加紧张,这迫使我放弃了一些我原本的想法,专注于最有希望的想法。这尤其导致了完全不考虑使用局部描述符进行空间验证的选择,因为(至少在我看来)它的成本效益权衡很差,特别是在内核运行时间有限的大规模图像识别中。其次,由于去年迭代的顶尖团队详细发布了他们的解决方案,并且每个人都可以访问,因此超越这里的门槛相当高。为了命名一致,我对 gldv2 的子集使用以下名称:

gldv2 可在 [2] 下获得(500 万张图像,20 万个类别)
gldv2c(gldv2 的清理子集 / 今年的训练数据)(160 万张训练图像,8.1 万个类别)
gldv2x,gldv2 的未清理子集,限制为仅具有与 gldv2c 相同的 8.1 万个类别(320 万张图像)

此外,我将 GLRec 用于过去的 Google 地标识别竞赛,将 GLRet 用于检索。

交叉验证

对于交叉验证,我使用了可以在 [2]、[4] 下找到的 2019 年检索解决方案,但在每个训练周期结束时执行的验证步骤中过滤掉了“忽略”的图像以节省时间。通过这样做,我在 Public LB 和我的本地验证之间实现了非常好的相关性。

训练流程

我的训练流程遵循 2020 年 GLRec 第二名的训练数据集选择,但使用 All Data Are Ext 的一些想法进行了改进。

作为第一步,我在干净的 gldv2c 上以小图像尺寸(例如 224x224)训练模型约 10 个 epoch。然后我使用中大图像尺寸(例如 512x512)并在噪声较大的 gldv2x 上训练很长时间(30-40 个 epoch)。最后,我在大图像尺寸(例如 768x768)上微调,同样在 gldv2x 上进行几个 epoch。我在每一步都使用了 Adam 优化器和余弦退火计划。我使用了与 All Data Are Ext 相同的增强,这证明是非常有效的:

cfg.train_aug = A.Compose([
        A.HorizontalFlip(p=0.5),
        A.ImageCompression(quality_lower=99, quality_upper=100),
        A.ShiftScaleRotate(shift_limit=0.2, scale_limit=0.2, rotate_limit=10, border_mode=0, p=0.7),
        A.Resize(image_size, image_size),
        A.Cutout(max_h_size=int(image_size * 0.4), max_w_size=int(image_size