返回列表

16th place solution with detailed and readable code for beginner

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

开始: 2020-11-19 结束: 2021-02-18 作物智能识别 数据算法赛
第16名方案:适合新手的详细且可读性强的代码

第16名方案:适合新手的详细且可读性强的代码

作者:Hai Nam Nguyen | 比赛排名:第16名

感谢 Makerere University AI LabKaggle 组织了这次比赛。
这是我们的解决方案及代码,我们的方法基于良好的交叉验证(CV)划分策略,以及更好的数据增强、损失函数和优化方法来应对噪声标签问题

1. 数据预处理 + 数据增强

数据集:2019年 + 2020年数据(输入尺寸 512)。

训练阶段:

  • 简单增强:RandomResizedCrop(随机缩放裁剪)、Transpose(转置)、HorizontalFlip(水平翻转)、VerticalFlip(垂直翻转)、ShiftScaleRotate(平移缩放旋转)、HueSaturationValue(色调饱和度亮度)、RandomBrightnessContrast(随机亮度对比度)、Normalize(归一化)、CoarseDropout(粗丢弃)、Cutout(剪切)。我们参考了这个Kernel(非常感谢 @khyeh0719),并对 RandomResizedCrop 和 Normalize 的参数做了一些修改。
  • 高级增强:我们尝试了 mixup、cutmix、fmix 和 snapmix。对于我们的模型,snapmix 在 alpha = 5 时效果最好(我们参考了这个Kernel来实现 snapmix,非常感谢 @sachinprabhu)。

验证阶段: 我们移除了 RandomResizedCrop,改用 CenterCrop + Resize(使用 cv2.INTER_AREA)。同时也没有使用 Snapmix。我们还应用了 TTA = 5(测试时增强)。

2. 训练参数

  • 损失函数:我们尝试了 focal cosine loss、bi-tempered loss、SCE loss(当然也包括 label smoothing)。Bi-tempered loss 效果最好,参数设置为 t1 = 0.6, t2 = 1.2, label_smoothing=0.1, num_iters=5(我们参考了这个代码实现 bi-tempered loss)。

  • 优化器:我们尝试了 Adam、Ranger、SAM。SAM 在我们的 CV 上效果最好(比 Adam 高 0.2-0.3%)。然而,它在 Public LB(公开排行榜)上并没有表现出好的结果。最终,我们选择了 Adam。

  • 学习率调度器:我们使用了基于 Yolov5 代码和这篇论文技巧的 LR scheduler,初始 LR = 1e-4 -> 5e-4,lrf = 1e-2。

  • 训练策略:我们在 5 个 epoch 后解冻主干网络。总训练 epoch 为 50。

  • 主干模型:所有预训练模型都是 noisy-student 模型。我们使用 Timm 库尝试了 B0(作为基准)、B3、B4 和 resnext50。由于资源有限(最多 2x2080Ti 和 Colab Pro),在 CV 上 B4 的效果没能超过 B3。此外,我们也花了不少时间用 ViT 做实验,但没能取得任何突破。

  • 一些技巧:我们在 yolov5 上应用了 EMA(指数移动平均)并开启了 fp16。使用 fp16 帮助我们节省了大量时间和计算资源。

3. 数据划分策略

听起来很简单。我们分别将 2020 年和 2019 年的数据划分为 5 折。在每次试验后,我们将 CV 表现最好和最差的折进行混合并重新划分,直到 CV 的差距不大于 0.4%(在 Colab Pro 上使用 B0 花了 4-5 天)。这帮助我们在最后的提交中提升了成绩。

4. 实验结果

以下是我们一些主要的实验结果。

模型 备注 CV Public LB