返回列表

14th Place Solution & Code

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

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

第14名解决方案及代码

作者: Nikita Kozodoi (MASTER)
比赛排名: 第14名

总结

首先,我要感谢我的队友 @lizzzi1 的出色工作,以及 Kaggle 组织这次比赛。这是一次非常有趣的学习经历。我们投入了大量时间构建了一个全面的 PyTorch GPU/TPU 流水线,并使用 Neptune 来构建我们的实验结构。

我们的最终解决方案是不同 CNN 和 ViT 模型的堆叠集成,请参见下图。由于标签噪声和评估指标的原因,信任 CV(交叉验证)对于在排名波动中生存下来至关重要。下面我将更详细地概述我们解决方案的要点。

cassava

代码

数据

  • 使用分层 5 折交叉验证(stratified 5-fold CV)在 2020 年数据上进行验证
  • 使用以下数据增强训练折:
    • 2019 年已标注数据
    • 最多 20% 的 2019 年未标注数据(使用最佳模型进行伪标注)
  • 基于哈希值和图像嵌入的 DBSCAN 聚类从训练折中移除重复项
  • 翻转标签或移除多达 10% 的错误图像以处理标签噪声(基于 OOF 预测)

数据增强

- RandomResizedCrop(随机调整大小裁剪)
- RandomGridShuffle(随机网格打乱)
- HorizontalFlip, VerticalFlip, Transpose(水平翻转、垂直翻转、转置)
- ShiftScaleRotate(平移缩放旋转)
- HueSaturationValue(色调饱和度亮度)
- RandomBrightnessContrast(随机亮度对比度)
- CLAHE(对比度受限的自适应直方图均衡化)
- Cutout(遮挡)
- Cutmix
  • TTA(测试时增强):对 4 张图像进行平均(包含翻转和转置)
  • 图像尺寸:在 384 到 600 之间

训练

  • 10 个 epoch 的完整训练 + 2 个 epoch 的最后一层微调
  • 使用梯度累积以实现 32 的批量大小
  • 调度器:1 个 epoch 的预热 + 随后的余弦退火
  • 损失函数:Taylor 或 OHEM loss,标签平滑 = 0.2

模型架构

我们在集成中使用了多种架构:

  • swsl_resnext50_32x4d - x14
  • tf_efficientnet_b4_ns - x8
  • tf_efficientnet_b5_ns- x7
  • vit_base_patch32_384 - x1
  • deit_base_patch16_384 - x1
  • tf_efficientnet_b6_ns - x1
  • tf_efficientnet_b8 - x1

ResNext 和 EfficientNet 表现最好,但 Transformer 模型对改进集成效果非常重要。两个 EfficientNet 模型还包含一个自定义注意力模块。一些模型在 PlantVillage 数据集上进行了预训练,其他的则从 ImageNet 权重开始。

模型集成

大量的实验让我们能够在集成中注入大量的多样性。我们最佳的单模型得分为 0.8995 CV。所有模型的简单多数投票得分为 0.9040 CV,但我们想更进一步并探索了堆叠。

堆叠是通过在相同 CV 折的 OOF 预测结果上

同比赛其他方案