返回列表

5th place solution

363. Bengali.AI Handwritten Grapheme Classification | bengaliai-cv19

开始: 2019-12-19 结束: 2020-03-16 计算机视觉 数据算法赛
第5名解决方案

第5名解决方案

作者:Dieter (Grandmaster)
比赛:Bengali.ai CV19
排名:第5名

感谢 Bengali.ai 和 Kaggle 举办了这场有趣的比赛,因为它不仅仅是简单的计算机视觉模型集成。感谢 pytorch、pytorch-lightning、apex 和 pytorchcv 的作者和贡献者,让我的生活更轻松。

致谢 & 关于 Grandmaster 的笔记

我很荣幸终于成为了竞赛 Grandmaster。在过去的两年里,我学到了大量的技巧,如果没有大家慷慨分享的顶级解决方案以及我一路上有幸遇到的才华横溢的队友,这一切都不可能实现。

简短总结

我的解决方案是同一个模型(seresnext50 配合自定义头)的简单 bagging(不同的随机种子)。LB 分数的大幅提升来自于对辅音变音目标的重新设计。LB 的微小提升来自于后处理调整,如阈值处理和寻找最接近的训练样本。

预处理

我没有调整图像大小,我唯一做的是用每张图像的均值和标准差对其进行归一化,因为我在之前的比赛中体验到了这种做法带来的良好正则化效果。

架构 & 训练

骨干网络
我使用了一个普通的 seresnext50,但调整了第一层以替换图像缩放并适应单通道输入。我通过更改输入单元并将步幅从 (2,2) 减小到 (1,2) 来实现这一点。

from pytorchcv.model_provider import get_model as ptcv_get_model

backbone = ptcv_get_model('seresnext50_32x4d', pretrained=True)
backbone = backbone.features
backbone.init_block.conv = nn.Conv2d(1, 64, kernel_size=(7, 7), stride=(1, 2))

颈部网络

与 maciejsypetkowski 的解决方案相同 https://www.kaggle.com/c/recursion-cellular-image-classification/discussion/110543

头部网络

  • 3个头,分别用于辅音、元音和词根
  • 用于字素的辅助头,配合 arccos loss

所以我使用的整体架构如下所示:

Architecture Diagram

训练

  • 在所有数据上训练
  • 4个周期的余弦退火,伴随数据增强强度的增加
    • 周期 1 & 2:cutmix
    • 周期 3 & 4:cutmix, cutout, scale, translate, rotate
  • Adam 优化器

损失函数

  • 词根损失:CrossEntropy
  • 辅音损失:多标签二元交叉熵
  • 元音损失:CrossEntropy
  • 字素损失:ArcCos + CrossEntropy
  • 总损失 = 词根损失 + 辅音损失 + 元音损失 + 字素损失

魔法

现在谈谈我解决方案的关键方面。我意识到所有模型在辅音变音 3(下文缩写为 cons3)上的表现都很差,尤其是容易将其与 cons4 混淆。所谓“差”,我是指决定性的差:召回率仅为 89%,而其他辅音类别为 99%。起初,我只是在治标不治本,就像其他几个团队所做的那样,例如,将低置信度的预测从高频类 cons4 转移到低频类 cons3,从而利用宏召回率指标的定义,这带来了不错的 LB 提升(0.9900 ->

同比赛其他方案