返回列表

1st Place Solution Write-up & Code

339. Recursion Cellular Image Classification | recursion-cellular-image-classification

开始: 2019-06-27 结束: 2019-09-26 药物研发 数据算法赛
第一名解决方案分享与代码

第一名解决方案分享与代码

作者:Maciej Sypetkowski
比赛:Recursion Cellular Image Classification

感谢 Recursion 和 Kaggle 主办了如此有趣的比赛,参与其中真的非常有趣。

更新:源代码在此:https://github.com/maciej-sypetkowski/kaggle-rcic-1st

数据预处理与增强

  • 加载原始图像 (512x512)
  • HUVEC-18 被移动到训练集(已知的泄漏)
  • 对于训练,所有对照图像(包括来自测试集的)都以与非对照图像相同的方式使用
  • 训练增强
    • 保持长宽比的随机缩放裁剪,尺度 ~ uniform(0.5, 1),使用最近邻插值
    • 随机水平和垂直翻转,以及 90 度旋转
    • 将每个图像通道归一化为 N(0, 1)
    • 对于每个通道:channel = channel * a + b,其中 a ~ N(1, 0.1),b ~ N(0, 0.1)
  • 测试时增强
    • 水平和垂直翻转,以及 90 度旋转

模型

模型结构图
  • 骨干网络在 ImageNet 上预训练,第一层卷积被替换为 6 通道输入卷积
  • Neck(颈部):BN + FC + ReLU + BN + FC + BN
  • Head(头部):FC

我发现不对头部输入进行归一化很重要,这就是为什么头部和 Arc Margin Product 是具有不同全连接层权重的独立层(与 bestfitting 在 Human Protein Atlas 图像分类中所做的相反)。

训练

  • Batch size: 24 (使用梯度累积为 48)
  • 优化器: Adam
  • 权重衰减: 1e-5
  • Cutmix
  • Loss = ArcFaceLoss / 2 * 0.2 + SoftmaxCrossEntropyLoss * 0.8
    (ArcFaceLoss 除以 2 以大致保持损失之间的幅度)
  • 90 个 epochs
  • 学习率: 1.5e-4,使用余弦调度

后处理

  1. 来自不同站点图像和不同测试时增强的预测通过取 logits 的平均值进行组合
  2. 对照类的预测被忽略
  3. 831 个不可能出现在给定板上的类别被标记为不可能
  4. 应用线性分配算法

使用这种配置(在数据集的所有标记部分进行训练——无验证),我获得了 0.98997 的 Private 分数和 0.95802 的 Public 分数(单模型)。将其与以相同或非常相似的方式训练的模型集成(其中大多数训练/验证拆分为 5:1)(3x DenseNet161, 2x DenseNet161 使用 mixup (代替 cutmix), 5x DenseNet201 也使用 mixup, 3x ResNeXt50 也使用 mixup)给了我 0.99540 Private 和 0.98262 Public(在 Private LB 上介于第 3-4 名之间)。

为了用单模型达到 0.997 Private 分数,我需要添加另一个技巧,我称之为:

渐进式伪标签

在我目前读过的所有文章中,伪标签方法包括迭代训练新模型并使用它们扩大训练集。在我的方法中,每个 epoch 都会将少量最自信的预测进行伪标记并添加到训练集中。具体来说,对于每个 epoch:

  1. 预测所有尚未添加到训练集的测试和验证样本(不使用 TTA,仅合并站点——使用 TTA 预测可能会导致小幅改进,但计算时间会更长)
  2. 对于每个预测,标记为不可能:
    • 对照类,
    • 不可能
同比赛其他方案