返回列表

58 place solution

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

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

第58名方案分享

作者: Borys Tymchenko (Team: ODS.ai Wonderbolts)
比赛排名: 58th

大家好,祝贺所有的参赛者!

数据

我们使用了2015年比赛的调整大小图像来预训练我们的模型。此外,我们在微调阶段将 IDRID 和 MESSIDOR 数据添加到了交叉验证中。

模型

我们从比赛一开始就尝试了很多模型,但无论是小模型(ResNet34/DenseNet121)还是超大模型(EfficientNet-B6/B7, ResNe(x)t101, DenseNet201)效果都不理想。

得分最高的模型是中等大小和中等分辨率的:

  • EfficientNet-B4: 380x380
  • EfficientNet-B5: 456x456
  • SE-ResNeXt50: 512x512
  • SE-ResNeXt50: 380x380

图像分辨率超过 512x512 后我们没有看到提升。

预处理

起初,我们使用了一段时间的圆形裁剪和 Ben 的预处理方法,但后来开始尝试紧凑裁剪和角点掩码,结果在我们尝试的每个模型上效果都变差了(CV 和 LB 都是)。

在比赛截止日期前一周,我们意识到我们丢失了太多信息,于是转而不使用预处理,而是使用强力的数据增强。

数据增强

我们使用了大量的数据增强,全部来自 Albumentations 库:

OpticalDistortion, GridDistortion, PiecewiseAffine, CLAHE, HorizontalFlip, VerticalFlip, RandomRotate90, ShiftScaleRotate, RGBShift, RandomBrightnessContrast, AdditiveGaussianNoise, GaussNoise, MotionBlur, MedianBlur, Blur, Sharpen, Emboss, RandomGamma, ToGray, CoarseDropout, Cutout。

训练

我们使用了多目标学习(分类、有序回归和回归),它们的结果通过一个线性层(初始化权重为 0.3333)转换并结合以获得回归输出。

起初,我们只在当前数据上训练,但后来转为在 2015 数据集上进行预训练。

流程如下:

  • 在 2015 数据集上预训练(20个 epoch,SGD+Nesterov+CosineLR,标签平滑)
  • 在 2019 数据、IDRID 和 MESSIDOR 组合数据上进行 5 折交叉验证训练(75个 epoch,RAdam,CosineLR,标签平滑)

每个训练阶段由三个子阶段组成:

  • 冻结模型主体和头部组合器,训练 5 个 epoch。
  • 解冻主体,训练 N 个 epoch。
  • 冻结所有层,解冻头部组合器,训练 5 个 epoch。

如果我们把所有层放在一起训练,总是会导致头部训练不均匀。

此外,我们在回归标签中添加了范围在 (-0.3, 0.3) 的随机噪声,这大大减少了过拟合。

硬件

我们使用了 FastGPU.net 提供的配有 4xV100 的服务器,这大大缩短了我们的实验周期。

模型集成

我们根据模型在 CV 和留出集上的表现来挑选模型,完全不以 LB(排行榜)为导向。

我们表现最好的方案是由 20 个模型(4 种模型 x 5 折)组成的集成,使用了 10xTTA(水平翻转、垂直翻转、转置、旋转、缩放)并结合 0.25 截尾均值。这个集成在留出集和 LB 上的表现都较差,但我们决定选择它,希望它能更好地泛化(事实证明确实如此!)。

同比赛其他方案