kaggle-Bengali.AI Handwritten Grapheme Classification总结

比赛链接:https://www.kaggle.com/c/bengaliai-cv19

1 赛题解析

  • 孟加拉语字符识别。

  • 每一个字符由3部分组成:grapheme root (共168类),vowel diacritics (共11类),consonant diacritics (共7类)。

  • 需要对这3个部分的类别进行预测。
  • public leaderboard的结果较高,且与大部分本地交叉验证结果一致;private leaderboard与public leaderboard的排名由很大差异,主要是由于数据的分布不一致,出现了之前未曾出现的组合。

2 第1名的方案

模型总览

考虑了所有的$168\times 11\times 8=14784$种情况。

包含了4个模型,第1个用于判断图像的类别是seen还是unseen,第二个用于对seen作分类,第3、4个用于处理unseen类别。

集成的时候,根据第1和第3、4个模型判断是属于seen还是unseen,如果是seen则用第2个模型分类,否则用第3、4个模型分类。

2.1 数据划分

字符的三个元素分别有168、11和8类,所有的情况就是14784类。这14784类中,在训练数据中出现的有1295类,称为”seen”,剩余的称为”unseen”。

如果将这1295类的训练集再进行随机划分,则可以得到如下的划分:

数据划分

2.2 第1个模型:判断seen和unseen

第1个模型的作用是判断输入图片的类别是seen还是unseen。

该模型的输出神经元数目为1295,最后的激活函数为sigmoid。如果这1295个神经元的输出至少有一个大于阈值,则认为输入图像为seen,否则为unseen。

2.3 第2个模型:分类seen

第2个模型的作用是对seen进行分类,这就是一个使用softmax分类器的1295类的分类器,输入图像,输出1295类”seen”各自的概率值。模型采用efficientnet-b7。

2.4 第3、4个模型:处理unseen

这两个模型起的作用是一样的,都是用于处理unseen,输出会进行集成。

每一个模型包含两个子模型,一个是14784类的分类器,输入生成的图像,输出14784类各自的概率;另一个是CycleGAN,用来做图像风格转换,其生成器输入手写字符图像,生成所需的data-like图像。

在预测的时候,输入测试集中的手写字符图像,先进行风格转换,然后使用分类器进行分类。

2.5 小结

  1. 考虑了所有可能的情况;
  2. 按照类别是否在训练数据中出现,分成了seen和unseen,两种类别用不同模型处理;
  3. 使用CycleGAN生成数据,主要用来处理unseen。

3 第2名的方案

  1. 使用一个3-head模型做分类。注意到CV和LB的gap主要来自grapheme_root和consonant_diacritic,在数据中添加一些consonant_diacritic。
  2. 预测单个字素;使用Fmix而非cutmix。
  3. 为root和consonant单独使用模型进行预测;对consonant使用生成的数据。
  4. 多模型混合,对7个模型结果加权求和。

4 第3名的方案

第3名的方案overview

先用计算距离的方式判断输入图像是seen还是unseen,然后跳转到对应的分支。

4.1 训练

  • 所有模型用增强后的数据集预训练。
  • 对于seen分支,在预训练数据集上训练对seen的分类,然后在原始数据集上finetune。
  • 对于unseen和arcface,在原始数据集上对预训练模型进行训练。

4.2 推理

  • 对于arcface,计算训练数据和测试数据之间的最小的余弦相似度,用于判断是seen还是unseen;阈值采用的是训练和验证的embedding feature的最小的余弦相似度。
  • 如果判断结果是seen,使用共享特征用于seen分支的分类。
  • 如果是unseen,需要用另外的模型提取特征用于分类。

5 第4名的方案

该方案将前述的seen称为ID (in-dictionary),unseen称为OOD(out-of-dictionary)。首先是用一个arcface模型计算ID的中心,从而判别测试图像是属于ID还是OOD。对于ID,使用arcface模型进行分类。对于OOD,训练另外的1-head和3-head模型进行分类。

6 第5名的方案

3-head模型,辅助head用arc cos损失

第5名的方案

7 个人总结

  1. 这种训练数据未覆盖所有类别的情况,在测试数据变化时比较容易翻车。
  2. 直接用一个3-head模型容易过拟合,对于unseen的分类效果不会好。
  3. 这几个方案较多的是先判断是seen还是unseen、再分别处理。判断seen还是unseen比较多的是用arcface模型、计算二者之间的距离;第一名的方案是直接用sigmoid计算1295类的概率、然后用阈值判断。
  4. 模型、损失、数据三者都对性能提升有很大作用,个人认为只有对数据的理解到位了,才能在模型和损失上作出有效的改进。
  5. top级选手是真的强,让人大开眼界。