401. Google Landmark Recognition 2020 | landmark-recognition-2020
首先,祝贺大家在这场充满挑战的比赛中经历了有趣的旅程,特别是祝贺顶尖团队和所有从比赛中获益匪浅的人。同时,感谢谷歌组织了第三届地标识别比赛。
对我来说,通过参加 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
比赛结束后,我从顶级团队的公开解决方案中学到了很多,并发现了我在检索任务中可以改进的一些地方:
虽然起初我在 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,并进一步