458. Google Landmark Retrieval 2021 | landmark-retrieval-2021
首先,非常感谢 Kaggle 和主办方举办了如此有趣的比赛,并祝贺所有获奖者。特别感谢我的队友 @takuok 和 @tascj0。
我们使用了 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。
我们使用的模型与识别任务中的模型几乎相同。我们将下文展示的模型的嵌入向量连接起来,然后用它们计算相似度。
我使用了与去年第一名团队几乎相同的架构。ViT 主干 -> Dense(1024) -> ArcFace,并使用了类别权重。我选择 ViT 主干是因为它在 FGVC 任务(细粒度图像分类)上表现良好。我曾考虑使用 FGVC 技巧来获取局部和全局特征,但我没有足够的时间。
我还遇到了使用 fp16 学习时损失变为 nan 的现象。我通过 grad_clip(梯度裁剪)和使用 fp32 计算注意力层解决了这个问题。
基础设置:
BeiT-large: 2轮@(train_clean) -> 8轮@(train4.1m)
Swin-base: 30轮@(train_clean) -> 6轮@(train4.1m)
遗憾的是,我的 Swin 模型的第二部分效果不佳。
我遵循去年的顶级解决方案使用了数据增强、损失函数(子中心 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)
架构采用去年第三名团队使用的带有动态边距的子中心 ArcFace。主干网络 -> Dense(512) -> 子中心 Arc。训练策略如下:
第一阶段
数据: 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)
调度器: 余弦退火
第一阶段
数据: train4.1m
图像大小: 256
轮数: 10
批次大小: 32 x 8 steps (冻结 BN)
调度器: 余弦退火
第二阶段
数据: train3.2m