Kaggle 经典比赛 Cassava Leaf Disease Classification 高分方案解析

185 阅读7分钟

本篇文章为比赛第一名方案解析,该比赛涉及到CV-图像分割-医疗方向

介绍:参赛者的任务是将每个木薯图像分为四个疾病类别或第五个类别,表明健康的叶子。农民借此能够快速识别患病植物,在作物造成无法弥补的损害之前挽救它们。

网址:www.kaggle.com/competition…

第一名解决方案

我们的整体策略是尽可能测试尽可能多的模型,并减少在微调上的时间。目标是拥有许多多样化的模型用于集成,而不是一些高度调优的模型。

最终,我们在使用不同预训练权重(例如在 ImageNet、NoisyStudent、Plantvillage、iNaturalist 上训练的)的同时,尝试了多种不同的架构(例如,所有 EfficientNet 架构、Resnet、ResNext、Xception、ViT、DeiT、Inception 和 MobileNet),其中一些可在 Tensorflow Hub 上找到。

我们的获胜提交是一个由四个不同模型组成的集成。
Final Model

最终在公共排行榜上的得分是 91.36% ,在私有排行榜上是 91.32% 。我们选择提交这个组合,因为它在交叉验证(CV)得分上高于其他组合(有时在公共排行榜上的得分略高)。我们在排行榜(公共/私有)上分别测试了一些模型:B4: 89.4%/89.5% ,MobileNet: 89.5%/89.4%,ViT:~89.0%/88.8%

其他模型仅使用交叉验证进行评估。

总体而言,我们可以得出结论,胜利的关键在于使用 Tensorflow Hub 中的 CropNet,因为它为我们的集成带来了很多多样性。尽管作为一个独立模型,它在排行榜上的表现并不比其他模型更好,但使用这个模型的集成在排行榜上带来了显著的提升。

在此,我想感谢 hengck23,其讨论帖将此模型(以及 Tensorflow Hub 上可用的其他图像分类预训练模型)引入我们的注意。

此外,我们还要感谢所有参与者,他们通过在论坛上的贡献和发布的笔记本,帮助我们在这个比赛中学到了很多。最后,我们还要感谢比赛主办方,正是由于他们发布了数据,才使得这次激动人心的比赛成为可能。

您可以在本笔记本中找到我们的推理代码:推理笔记本

您可以在这些笔记本中找到相应的训练代码:

关于我们使用的模型配置和微调的详细信息:

我们使用了结构为“resnext50_32x4d”的ResNeXt模型,以下为其配置:

  • 图像尺寸为(512,512)
  • 交叉熵损失函数,默认参数
  • 学习率设置为 1e-4,基于平均验证损失使用“ReduceLROnPlateau”调度器(模式=’min’,因子=0.2,耐心=5,eps=1e-6)
  • 训练增强(来自 Albumentations Python 库):RandomResizedCrop,Transpose,HorizontalFlip,VerticalFlip,ShiftScaleRotate,Normalize
  • 验证增强(来自 Albumentations Python 库):调整大小、归一化
  • 5 折交叉验证,15 个 epoch(在 15 个训练 epoch 之后,我们总是选择具有最佳验证精度的模型)(与其他训练模型相同的数据划分)
  • 用于推理,我们使用了与验证相同的增强方法(即,调整大小、归一化)

我们使用了带有 ImageNet 权重的视觉 Transformer 架构(ViT-B/16)

  • 自定义顶层加线性层;图像大小为(384,384)
  • 比特调温逻辑损失(t1 = 0.8,t2 = 1.4)和标签平滑因子为 0.06
  • 我们选择了一个余弦退火重启调度器的学习率(LR = 1e-4 / 7 [7:预热因子],T0= 10,Tmult= 1,eta_min=1e-4,last_epoch=-1)。用于反向传播的批量累积,有效批量大小更大
  • 训练增强(RandomResizedCrop,转置,水平翻转和垂直翻转,平移缩放旋转,色调饱和度值,随机亮度对比度,归一化,粗略丢弃,Cutout)
  • 验证增强(水平翻转、垂直翻转、居中裁剪、调整大小、归一化)
  • 5 折交叉验证,每个折取 10 个 epoch,我们为每个折选取了最佳模型(基于验证准确率)
  • 用于推理,我们使用了以下增强方法:中心裁剪、调整大小、归一化

我们尝试了不同的 EfficientNet 架构,但最终只使用了带有 NoisyStudent 权重的B4

  • 丢弃连接率 0.4,自定义顶部带有全局平均池化和丢弃层(0.5)

  • Sigmoid Focal Loss with Label Smoothing(伽马=2.0,alpha=0.25 和标签平滑因子 0.1)

  • 学习率带有预热和余弦衰减调度器(范围从 1e-6 到最大 0.0002,然后回到 3.17e-6)

  • 增强(翻转、转置、旋转、饱和度、对比度和亮度以及一些随机裁剪)

  • 将 2020 年木薯数据集的全局均值和偏差的归一化层进行适配

  • 5 折交叉验证,20 个 epoch,带早停和回调以恢复最佳 epoch 的权重

  • 最终模型在全部竞赛数据集上训练了 14 个周期

  • 为了推理,我们使用了简单的测试时间增强(翻转、旋转、转置)。为此,我们从 .jpg 图像(800x600px)中裁剪出 4 个大小为 512x512px 的相互重叠的补丁,并对每个补丁应用 2 种增强。我们还保留了两个额外的未应用增强的中心裁剪补丁。为了得到整体预测,我们取了所有这些图像块的平均值。 最后,我们的集成模型包括 Tensorflow Hub 中预训练的作物网络(MobileNetv3) 模型:

  • 我们使用了来自 TensorFlow Hub 的预训练模型CropNet,该模型专门训练用于检测木薯叶病

  • The CropNet 模型基于 MobileNetV3 架构。我们决定不对该模型进行任何额外的微调。

  • 如描述中所述,图像必须调整到 224x224 像素,这相当小。我们不仅将 512x512 的训练图像调整大小,还首先进行了中心裁剪,从而取得了良好的效果。

  • 由于笔记本需要在无网络访问的情况下提交,因此在包含模型之前需要缓存模型。您可以在官方TF Hub 网站上找到更多相关信息,或者在此Medium帖子中找到替代信息。

对于集成,我们尝试了不同的方法,并发现在我们这个案例中,堆叠平均方法效果最佳。为此,模型返回的类别概率在多个层面上进行了平均,最终返回概率最高的类别。

我们的最终提交首先计算了 ViT 和 ResNext 预测类别的概率平均值。然后,这个平均概率向量在第二阶段与 EfficientnetB4 和 CropNet 的预测概率合并。为此,这些值被简单地相加。

另一个在排行榜上也取得了良好结果的解决方案是在计算模型均值之前通过优化找到权重。您可以在我们发布的笔记本中找到相应的代码。通常,我们对优化权重后的解决方案的稳定性感到惊讶。结果证明,它们在我们的交叉验证分数和排行榜分数之间只有很小的差异(通常为±0.1%)。

我们使用案例中未能成功的是在模型之上叠加一个额外分类器(梯度提升树)的集成方法。我们进行了多次实验,也使用了额外的特征,例如模型的预测熵,但我们未能构建出一个足够泛化的解决方案。