返回列表

13th place solution

338. APTOS 2019 Blindness Detection | aptos2019-blindness-detection

开始: 2019-06-28 结束: 2019-09-07 医学影像分析 数据算法赛
第13名解决方案

第13名解决方案

作者: Camaro (bamps53)
发布时间: 2019-09-08

恭喜所有获奖者以及所有进入金牌区的选手!我非常想感谢我优秀的队友 @mhiro2@yasufuminakama,我很确定如果只有我一个人,我无法获得金牌...

这是我第一次写解决方案,但我会尽可能公开我们所做的一切。

概览

  • 集成4个模型,2个 SeResNext101 和 2个 EfficientNet B5
  • 两种伪标签方法
  • 使用旧比赛数据

挑战

  • 图像尺寸严重泄露
  • 训练集与测试集分布差异
  • 不稳定的评估指标 QWK

详细内容

预处理

这次比赛最重要的部分是预处理。正如大家所意识到的,这次比赛存在严重的图像尺寸和形状泄露。起初我尝试了多种预处理方法(例如缩放、圆形裁剪或切角等)来消除这种泄露,但几乎都失败了。当我确信训练图像和测试图像看起来非常相似时,LB分数却显著下降。只有旋转对我有效,但非常不稳定。(例如我使用了120度。如果改为90或180度,LB分数会显著下降。)

最有趣的图像形状是 (480,640),它占测试集的70%以上。这让我产生了以下假设:

在管理员制作数据集后,他们意识到图像尺寸/形状与诊断分数之间存在很强的相关性。他们想阻止所有Kagglers提交仅使用图像元特征的LGBM模型。但他们也希望模型能够检测视网膜病变,所以他们决定只裁剪公共测试集的一部分...

这意味着图像尺寸和形状信息仍然有用,所以我不再专注于预处理。在查看了私有分数后,我现在确信这个想法在某种程度上是正确的,因为它比之前的比赛高出惊人的多。你可以在这个伟大的Kernel的私有分数中看到证据。

我们使用的预处理方法如下。我相信这种预处理上的差异可能使我们的模型多样化。

# 针对 SeResNext
Compose([
    BensCrop(img_size), # 来自 2015 年的解决方案
    RandomHorizontalFlip(),
    RandomVerticalFlip(),
    RandomRotation((-120, 120)),
]),

# 针对 EfficientNet B5
Compose([
    Resize(img_size),
    HorizontalFlip(),
    VerticalFlip(),
    Rotate(),
    RandomContrast(0.5),
    IAAAdditiveGaussianNoise(p=0.25),
])

数据集

我们结果的第二个重要部分是如何划分和选择数据集。我尝试了很多组合,最后发现以下设置对我很有效:

  1. 通过分层K折将当前训练数据集分为5折。
  2. 在 4/5 的训练集和之前的比赛训练集上进行训练。
  3. 验证 1/5 的训练集。

当我在2015年数据集上进行预训练并在2019年数据集上进行微调时,我的单模(SeResNext)得分是 LB0.811,但在改为上述方法后,我的分数提升到了 LB0.827。

模型和训练方法

我们使用了两种模型,SeResNext101 和 EfficientNet B5。每种模型使用了不同的训练方法。

对于 SeResNext101

  • 图像尺寸:320
  • 损失函数:RMSE
  • 在 2015 数据集 + 4/5折的 2019 数据集上训练(用 1/5 的 2019 数据集验证)

对于 EfficientNet B5

  • 图像尺寸:256 -> 320
  • 损失函数:MSE
  • 两步训练
    1. 在 4/5折的 2015 数据集上预训练(用 2019 数据集验证)(img_size=256)
    2. 在 1/5折的 2015 数据集 + 4/5折的 2019 数据集上微调(用 1/5折验证)(img_size=320)

同比赛其他方案