返回列表

[21st place] - My solution to 2 silver medals in GL 2020

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

开始: 2020-07-29 结束: 2020-09-29 计算机视觉 数据算法赛
[第21名] - 我在 GL 2020 斩获2枚银牌的解决方案

[第21名] - 我在 GL 2020 斩获2枚银牌的解决方案

作者: Khoa Ngo
原文发布时间: 2020年9月30日

首先,祝贺大家在这场充满挑战的比赛中经历了有趣的旅程,特别是祝贺顶尖团队和所有从比赛中获益匪浅的人。同时,感谢谷歌组织了第三届地标识别比赛。

对我来说,通过参加 Google Landmark 2020 的两场比赛,我确实学到了大量的知识,并且想出了许多主意来应对这些严酷的竞争。以下是我所做的工作。

检索比赛

其实,起初我并不认为这场比赛适合我,因为我在 tensorflow 方面还是个新手 :))。然而,在 Global Wheat Detection 挑战赛中表现不佳后,我决定在比赛还剩 13 天时认真加入进来。

架构

首先,我尝试从 tf delf 训练 delf 模型,结果远不及主办方的基线内核(仅为 0.12-0.13,而主办方基线为 0.271),所以我很快放弃了这条路。

幸运的是,onnx 内核发布了,这对于像我这样的 pytorch 用户来说是一个巨大的机会,我可以开发自己的模型。从自上而下的角度来看,我的最终模型是 4 个模型的集成,可以表示如下:

net_1 -> feature_1 |
...                |--[concat]--> [fc 4096]--> final_feature
net_4 -> feature_4 |

其中 net_i 的结构为:

CNN backbone --> GeM pooling --> fc --> batchnorm --> arcface/cosface

更详细的信息:

net_1: efficientnet-b2, fc 1024
net_2: efficientnet-b3, fc 512
net_3: efficientnet-b3, fc 1024
net_4: efficientnet-b4, fc 512

根据我的结果,在集成网络上再训练一个 fc 层,相比简单的拼接,最终得分提高了 0.02。
我使用的输入图像大小为 256x256,这可能真的影响了我的分数(相比于使用大尺寸图像的顶级解决方案),而且仅使用 GLDv2 clean 进行训练。另外,虽然我总是使用 RAdam 优化器,但我意识到几乎所有顶级团队都使用 SGD,也许将来我应该改用 SGD?

结果

最佳单模型分数: 0.270 - 0.233 (efficientnet-b3, fc 512)
最佳集成模型分数: 0.293 - 0.260

比赛结束后,我从顶级团队的公开解决方案中学到了很多,并发现了我在检索任务中可以改进的一些地方:

  • 更大的图像尺寸
  • 使用类别权重处理数据集不平衡问题
  • 在扩展数据集上训练:GLDv1, GLDv2 full。

虽然起初我在 tf 模型提交类型上很挣扎,但最后对我来说非常幸运,因为我不必关心后处理阶段,如局部特征、重评分和重排序、ransac 等。

识别比赛

也许我在检索比赛中很幸运,但最终来到识别挑战赛时,我必须处理所有事情 :).

全局特征提取

我使用了与检索任务中完全不同的一组骨干网络:

net_1: resnest200, fc 512
net_2: resnest200, fc 1024
net_3: resnest269, fc 512
net_4: resnest269, fc 1024
net_5: resnet152, fc 512

根据我的结果,resnest 和 resnet152 的性能明显优于 efficientnet(甚至是 b7)。我使用 GLDv1 + GLDv2 clean 的 224x224 图像进行训练,并使用 GLDv2 clean 的 448x448 图像进行微调,采用 arcface 损失函数。

局部特征提取

我再次用 tf delf 训练了 delg 和 delf,并进一步

同比赛其他方案