返回列表

3rd Place Solution

420. Cassava Leaf Disease Classification | cassava-leaf-disease-classification

开始: 2020-11-19 结束: 2021-02-18 作物智能识别 数据算法赛
第三名解决方案

第三名解决方案

作者: T0m (Competition Master)
比赛: Cassava Leaf Disease Classification
排名: 第3名

致谢

感谢 Kaggle 和主办方举办这次比赛。这是我获得的第一枚金牌,我终于成为了竞赛大师 :)

摘要

[更新 2021.03.02]
我犯了一个错误,vit_base_patch16_384 的最后一层不是 multi-drop,而是简单的线性层。我在验证过程中发现了这个 bug。

我的最终提交是三个 ViT 模型的集成;总结如下。

summary.png

模型

vit_base_patch16_384

  • img_size = 384 x 384
  • 5x TTA (测试时增强)
  • Public 分数 : 0.9059
  • Private 分数 : 0.9028

这是我最好的单模型

vit_base_patch16_224 - A

  • img_size = 448 x 448
  • 5x TTA
  • 权重计算模式 A
  • Public 分数 : 0.9030
  • Private 分数 : 0.8990

为了使 vit_base_patch_224(预期图像大小为 224 x 224)适应 448 x 448 的图像,在数据增强后,将其分为四个部分并分别输入模型。然后,在注意力层使用计算出的权重对它们进行加权平均,最后通过 Multi-Dropout Linear 输出预测结果。

vit_base_patch16_224 - B

  • img_size = 448 x 448
  • 5x TTA
  • 权重计算模式 B
  • 标签平滑 (label smoothing), alpha=0.01
  • Public 分数 : 0.9034
  • Private 分数 : 0.8952

加权平均

  • Public 分数 : 0.9075
  • Private 分数 : 0.9028

尝试了很多预训练模型,但 ViT 模型在 Public LB 上效果最好。图像尺寸越大,CV 分数越高,但我认为这是过拟合。所以我早期放弃了使用大图像尺寸的 Efficient-net 和 SE-ResNeXt 等模型。

一些设置

  • 5折分层 K 折交叉验证 (5fold StratifiedKFold)
  • 使用 2020 & 2019 年数据

数据增强

我尝试了几种类型的数据增强,但最终采用了简单的一种。原因和选择不大尺寸图像一样,是因为过拟合。

if aug_ver == "base":
    return Compose([
        RandomResizedCrop(img_size, img_size),
        Transpose(p=0.5),
        HorizontalFlip(p=0.5),
        VerticalFlip(p=0.5),
        ShiftScaleRotate(p=0.5),
        Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
        ToTensorV2(),
])

学习率调度器

  • LambdaLR
self.scheduler = LambdaLR(
    self.optimizer, lr_lambda=lambda epoch: 1.0 / (1.0 + epoch)
)
lr.png

分数

scores.png
同比赛其他方案