返回列表

1st placed solution with code

349. Understanding Clouds from Satellite Images | understanding_cloud_organization

开始: 2019-08-16 结束: 2019-11-18 气象预报 数据算法赛
第一名解决方案及代码

更新:代码已在 GitHub 上发布

https://github.com/pudae/kaggle-understanding-clouds


恭喜所有获胜者以及在榜单波动中幸存下来的参赛者。感谢 Kaggle 和主办方团队带来这场有趣的比赛。

除了一些技巧之外,几乎所有的提升都是通过模型集成实现的。因此,在这篇文章中,我将简要描述最后一周的分数提升轨迹。详细内容将通过代码分享。

通用设置

网络类型

  • 模型 A:带有分类头的 UNet
  • 模型 B:FPN 或 UNet,不带分类头

主干网络

  • resnet34, efficientnet-b1, resnext101_32x8d_wsl, resnext101_32x16d_wsl

数据集

  • 划分:训练集 vs 验证集 = 9 vs 2
  • 模型 A:所有标签
  • 模型 B:非空标签

损失函数

  • 分类部分:BCE
  • 分割部分:BCE * 0.75 + DICE * 0.25

优化器

  • AdamW,权重衰减 0.01
  • 编码器学习率 0.000025
  • 解码器学习率 0.00025
  • OneCycle 调度器,浅层模型 30 个 epoch,深层模型 15 个 epoch

数据增强

  • 通用:水平翻转,垂直翻转,平移/缩放/旋转,网格畸变,通道混洗,反转,灰度化
  • 模型 A:随机裁剪,尺寸 384
  • 模型 B:全尺寸,尺寸 384, 544, 576, 768

分数提升轨迹

训练单模型

起初,我尝试训练一个好的单一网络。我花了两个星期努力提高和稳定 LB 分数,但失败了。

  • TTA3:CV 0.6517 / Public LB 0.66951 / Private LB 0.65828

添加分割模型

我认为 LB 分数不稳定的原因是分割性能较差。如果我们能有一个更强大的分割模型,就能减少分类性能较差的影响。

因此,我开始尝试训练好的纯分割模型。因为我可以使用分类模型过滤掉负样本预测,所以只需要正标签来训练。

从这时起,CV 和 LB 的相关性变得很好。我训练了几个具有不同主干网络、图像尺寸等的分割模型。

  • TTA4, 1 seg with cls + 1 seg: CV 0.6560, Public LB 0.67395, Private LB 0.66495
  • TTA4, 1 seg with cls + 3 seg: CV 0.6582, Public LB 0.67482, Private LB 0.66501
  • TTA4, 1 seg with cls + 4 seg: CV 0.6587, Public LB 0.67551, Private LB 0.66604
  • TTA4, 1 seg with cls + 7 seg: CV 0.6594, Public LB 0.67596, Private LB 0.66663

添加更多带分类头的模型

现在,分割部分已经足够好了。所以,我又增加了两个带分类头的模型。

  • TTA4, 3 seg with cls + 7 seg: CV 0.6625, Public LB 0.67678, Private LB 0.66746

将分割模型用作分类器

为了利用分割模型的性能,我使用了前 K 个像素概率的平均值作为分类概率。

cls_probabilities = np.sort(mask_probabilities.reshape(4, -1), axis=1)
cls_probabilities = np.mean(cls_probabilities[:,-17500:], axis=1)
  • TTA4, 3 seg with cls + 7
同比赛其他方案