返回列表

6th place solution

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

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

第6名解决方案

作者: Inoichan, takuoko, tascj
比赛: Landmark Retrieval 2021

首先,非常感谢 Kaggle 和主办方举办了如此有趣的比赛,并祝贺所有获奖者。特别感谢我的队友 @takuok@tascj0

数据定义

  • train_clean: 包含 160 万张训练图像和 8.1 万个类别。
  • train3.2m: 包含 320 万张图像,属于 train_clean 中的 8.1 万个类别。
  • train4.1m: GLDv2 中的所有训练数据,即 410 万张图像。
  • train4.9m: GLDv2 中的所有训练数据以及 2019 年比赛的索引图像。

检索技巧

我们使用了 2019 年 GLR 冠军 smlyaka 团队提出的重排序技术。
Github: https://github.com/lyakaap/Landmark2019-1st-and-3rd-Place-Solution
论文: https://arxiv.org/abs/2003.11211

该方法包含两个步骤:排序步骤和插入步骤。首先,使用 train4.9m 确定索引集和查询集的 landmark_id 和分数。然后,在排序步骤中,根据检索到的索引结果与查询图像的标签相似度对其进行排序。在插入步骤中,我们添加了那些未通过图像相似度检索到但与查询图像具有相同 landmark_id 的样本。

这将基础分数从公开/私有 0.31324/0.32614 提高到了 0.39905/0.43219。

模型

我们使用的模型与识别任务中的模型几乎相同。我们将下文展示的模型的嵌入向量连接起来,然后用它们计算相似度。

takuoko 部分

我使用了与去年第一名团队几乎相同的架构。ViT 主干 -> Dense(1024) -> ArcFace,并使用了类别权重。我选择 ViT 主干是因为它在 FGVC 任务(细粒度图像分类)上表现良好。我曾考虑使用 FGVC 技巧来获取局部和全局特征,但我没有足够的时间。

我还遇到了使用 fp16 学习时损失变为 nan 的现象。我通过 grad_clip(梯度裁剪)和使用 fp32 计算注意力层解决了这个问题。

基础设置:

  • 图像大小: 384
  • 优化器: AdamW
  • 调度器: 带预热的余弦退火
  • 批次大小: 16 * 2 GPU
  • 使用 fp16

BeiT-large: 2轮@(train_clean) -> 8轮@(train4.1m)
Swin-base: 30轮@(train_clean) -> 6轮@(train4.1m)
遗憾的是,我的 Swin 模型的第二部分效果不佳。

tascj 部分

我遵循去年的顶级解决方案使用了数据增强、损失函数(子中心 ArcFace, sub-center ArcFace)和训练策略。

b4: 10轮@(train_clean, 512) -> 6轮@(train4.9m, 512)
b6: 10轮@(train_clean, 256) -> 6轮@(train4.9m, 512) -> 2轮@(train4.9m, 640)
xcit_small_24_p16_384: 6轮@(train_clean, 384) -> 6轮@(train4.9m, 384)

inoichan 部分

架构采用去年第三名团队使用的带有动态边距的子中心 ArcFace。主干网络 -> Dense(512) -> 子中心 Arc。训练策略如下:

efficientnet v2m

第一阶段
数据: train_clean
图像大小: 从 300 裁剪为 256
轮数: 15
批次大小: 64
调度器: 预热

第二阶段
数据: train4.1m
图像大小: 从 600 裁剪为 512
轮数: 15
批次大小: 8 x 16 steps (冻结 BN)
调度器: 余弦退火

第三阶段
数据: train4.1m
图像大小: 从 720 裁剪为 640
轮数: 3
批次大小: 4 x 64 steps (冻结 BN)
调度器: 余弦退火

efficientnet b5

第一阶段
数据: train4.1m
图像大小: 256
轮数: 10
批次大小: 32 x 8 steps (冻结 BN)
调度器: 余弦退火

第二阶段
数据: train3.2m

同比赛其他方案