返回列表

[2nd place] Solution

512. Google Universal Image Embedding | google-universal-image-embedding

开始: 2022-07-11 结束: 2022-10-10 计算机视觉 数据算法赛
[第二名] 解决方案

[第二名] 解决方案

作者: DiamondH | 比赛排名: 第2名

首先,非常感谢 @andrefaraujo 举办了如此有趣的比赛。我很高兴在这次比赛中最终从第3名上升到第2名(实际上 sixsixsix 的分数比我高!)。我将简要介绍我的方法。

数据集

  • Aliproducts
  • Art_MET
  • DeepFashion(Consumer-to-shop)
  • DeepFashion2(hard-triplets)
  • Fashion200K
  • ICCV 2021 LargeFineFoodAI
  • Food Recognition 2022
  • JD_Products_10K
  • Landmark2021
  • Grocery Store
  • rp2k
  • Shopee
  • Stanford_Cars
  • Stanford_Products

我使用了大量的数据,但没有做太多的筛选。

模型

  • 主干网络: open_clip_torch: Vit-H14-224-visual
  • 颈部网络: 带有 dropout rate=0.2 的全连接层
  • 头部: Arcface head。
  • 训练策略: 冻结主干网络进行微调得到了 0.662+- 的分数,翻转将其提升到了 0.666。

思路

  • 数据采样: 设置 maxnum_images_perclass=100,minnum_images_perclass=3。
  • 数据重采样: 进行轻微的重采样以平衡类别权重,设置 minnum_images_perclass=20。
  • 动态边界: (0.666->0.670):参考 Shopee 比赛的第一名方案。设置初始 m=0.1,然后 m= m+0.1 *(cur_ep-1),max_m = 0.8。
  • 分层学习率: (0.670->0.713):这是我实验中的一个巨大飞跃。为了保持预训练模型的表征能力,我将 init_lr 设置为 1e-4(这是非主干部分的学习率),而主干网络的学习率是 init_lr * lr_factor(lr_factor 相当低)。比赛结束时实验还在进行中。总之,lr_factor=0.001 是一个不错的选择,最终给了我 0.713 的分数。(使用 lr_factor=0.001 微调 2 个 epochs,然后冻结主干网络再微调 1 个 epoch,最后做翻转。)

总结

为了更高效地进行实验,我在早期阶段只采样了大约 1M 的数据进行训练。在通往 0.670 的过程中,我尝试了许多不同的架构、更复杂的颈部网络、子中心 Arcface head(在 open/clip_L_336 中效果很好)、主干网络集成等,但分数提升缓慢。所以我认为 0.670 对我来说是一个瓶颈,于是冻结主干网络,把注意力集中在非主干部分。然后,在做完所有我认为应该做的实验后,我决定转向研究主干网络,尽管我曾经失败过(我尝试解冻主干网络直接微调,分数迅速下降)。在深入思考了主干网络的工作原理,加上运气成分,我在第一次实验中成功了,得到了 0.688 的分数。由于时间限制,我只尝试了 3 种不同的 lr_factor,训练一个 epoch 大约需要 12 小时以上。性能表现:0.001(0.707) > 0.005(0.700) > 0.01。

在这里我没有过多解释为什么这样做,我还做了一些其他有趣的实验,也许能得到更高的分数。我会把这些都写在论文里,如果你感兴趣,欢迎查看完整的解决方案!🤗

这是我第一次涉足细粒度图像领域,真的非常有趣!我从这次比赛中学到了很多,对这类任务也有了更深的理解。最后,感谢所有为这次比赛做出贡献的人!

同比赛其他方案