返回列表

18th place solution private 0.515 public 0.514

434. Human Protein Atlas - Single Cell Classification | hpa-single-cell-image-classification

开始: 2021-01-26 结束: 2021-05-11 生命科学 数据算法赛
第18名方案:Private 0.515 Public 0.514

第18名方案:Private 0.515 Public 0.514

作者: yuvaramsingh (Master)
比赛排名: 第18名

感谢 Kaggle 和主办方组织了这场关于弱监督学习方法的比赛。我从这次经历中学到了很多。

方案概述

由于这是一个弱监督学习任务,且 HPA 细胞分割模型能够提供实例掩码,我选择在这里使用多示例学习(MIL)方法。这是合理的,因为图像级别的标签并不精确,且通过讨论可以清楚地了解到,图像中可能存在属于负类但在图像级别标签中未被提及的细胞。

阶段 0 模型

在这里,我使用 Effb4 和 resnest50 作为 CNN 骨干网络。训练设置包括从图像中提取单个细胞,并随机选择 16 个细胞(最大数量,否则重采样以凑齐 16 个)作为图像包使用。目标与图像级别标签相同。这里我使用 16 个细胞只是为了确保我至少有一些对应标签的细胞实例。(在阶段 0,我们无法确定细胞标签)

  • CNN 特征提取器: Effb4, resnest 50
  • 每张图像使用的细胞数: 16
  • 池化层(每个细胞): GAP(全局平均池化)
  • 注意力池化层(每张图像,16个细胞)
  • 图像级别标签
  • Focal loss(焦点损失)
  • 时间: 每个轮次约 1 小时

该方法的魔力在于注意力池化层,它通过根据单个细胞对图像级别标签的贡献提供重要性分数,来对 16 个细胞特征嵌入进行加权。这使我能够训练一个模型,该模型可以通过查看图像级别标签来找到合适的细胞级别标签。

阶段 1 模型

在训练了阶段 0 模型后,我们现在有了一个能够提供细胞级别蛋白分数的模型,可以提交给比赛。与此同时,我们还有一个训练良好的注意力层,可以作为一个模块来对单个细胞进行评分。这可以用作伪标签生成器。我使用这种方法在图像中找到缺失的细胞标签,并将其附加到图像级别标签上。这有助于找到包含负类但未正确标记的图像。这也有助于减少每张图像的细胞数量,因为现在我们对图像上存在的细胞类别更加确定。

  • CNN 特征提取器: Effb4, resnest 50
  • 每张图像使用的细胞数: 8
  • 池化层(每个细胞): 基于Transformer的注意力池化
  • 注意力池化层(每张图像,8个细胞)
  • 图像级别标签 + 伪标签
  • Focal loss
  • 时间: 每个轮次约 20 分钟

我们可以清楚地看到,由于减少了细胞数量,训练时间是如何下降的。

最终推理

我的最终推理包含 5 个模型,其中使用了 3 个阶段 0 模型和 2 个阶段 1 模型。我确实使用了 4 次 TTA(测试时增强)来使我的模型预测更加稳健。

我很高兴我的这次提交的公开分数和私有分数没有太大变化,Private 0.515,Public 0.514。我确实因为 GPU 硬件的变化而遭受了精度下降。我在 Volta 架构的 GPU 上训练了我的模型,而 Kaggle 使用的是 P100 (Pascal)。通过从 Volta GPU 生成提交文件,我在公开数据集上获得了 0.524 的分数。这对我来说是个惊喜。我确实尝试计算 GPU 提交文件之间的差异均值,并用它来修正我的最终提交分数。这确实帮了我一点忙,但我仅仅因为硬件差异就损失了很多分数。

最终感想

总的来说,我在处理弱监督学习问题方面获得了很好的经验。再次感谢。