返回列表

4th place solution

433. HuBMAP - Hacking the Kidney | hubmap-kidney-segmentation

开始: 2020-11-16 结束: 2021-05-10 医学影像分析 数据算法赛
第4名解决方案

第4名解决方案

作者:Iafoss, Optimo, Theo Viel
比赛:HubMAP Kidney Segmentation

请参考以下链接: 详细方案代码。下面我只提供一个简短的描述。

关键点:

  • 正确区分健康和不健康的肾小球,并信任交叉验证(CV)
  • 双类别方法
  • 对数据进行适当的标注
  • 在查看排行榜(LB)时要小心处理 d488c759a 图像

简介

我们的团队感谢组织者和 Kaggle 让这次比赛成为可能。非常感谢我的队友 @theoviel@optimo,感谢他们在比赛中的辛勤付出,并将所有内容整理成文以角逐评委奖。另外,@optimo 在本次比赛中获得了他的第一枚金牌,祝贺他!最后,祝贺本次挑战赛的所有参与者。

对于我们中的一些人来说,这是一段漫长的旅程,因为比赛始于 2020 年。我们需要克服许多挑战,也有许多学习机会。对于我以及一些参与者来说,这是一个学习标注医疗数据的机会。这可能听起来很有趣,但在做这项工作时,我意识到了组织者为这次挑战赛所投入的工作量。

我们的方法

我们方法的核心是对健康和不健康肾小球的正确处理。
简而言之,我们很快意识到带有 FC(完全硬化/不健康)标注的 d488c759a 图像正在破坏 LB 的稳定性,并在 CV 和 LB 之间造成了差距。使用带有此标注的外部数据虽然提高了 LB,但对 CV 没有影响甚至使其恶化。解释很简单:该数据包含健康和不健康肾小球的标注(至少是很大一部分),而训练集仅包含健康肾小球的标注。那么我们要如何让模型预测 FC:在包含 FC 的图像上训练它……但这并不是正确的做法:组织者只寻找健康的肾小球,除了 d488c759a 之外的所有图像都没有在标注中包含 FC。因此,使用带有共享手工标注的外部数据是危险的,我预计有些人因此在比赛结束时受到了排名波动的影响。

我们的策略是对 这个外部数据集 进行适当的双手工标注,分为两类:健康和不健康的肾小球。不健康的肾小球有很多种,但我们决定简化事情,将它们合并为一个类别。我们还手工标注了测试图像中的不健康肾小球类别,结合健康肾小球的伪标签(PL),用于我们的训练流程。我们还使用了 Zenodo 数据集,它自然包含两个类别。然而,有不少遗漏的肾小球,特别是在图像边缘,我们对此进行了手工标注。最后,我们使用了来自 HuBMAP 门户的 2 张图像(未包含在训练/测试数据集中),并使用我们的模型生成的 PL(包括健康和不健康)。使用多个数据源帮助我们确保模型能够很好地泛化到新情况。我们还使用了一种结合人工+AI 引导的方法来向训练数据添加缺失的标注(虽然只有少数几个实例)。

秘密武器:在 LB 评估中忽略 d488c759a。 在该图像上修正预测后的 LB 与 CV 相关性非常好。

从模型的角度来看,没有什么特别之处,EfficientNet,Unet……虽然我们尝试了更高级的东西,如 BoT 中间层、Swin transformer 主干、FPN 跳跃连接,但没有带来任何明显的好处。这次比赛真的不在于此。有帮助的是在训练期间使用 2 个类别。肾小球的损伤程度是一个连续的尺度。因此,我们没有通过提供几乎相同但被包含/排除在掩码之外的肾小球来混淆模型,而是让模型学习不健康的肾小球也是肾小球,最后由模型决定特定实例是否足够健康。老实说,这次比赛与其说是关于分割,不如说是关于分类。模型预测中是否包含特定肾小球的不确定性是降低模型性能的主要因素。

我们最好的提交(两个模型的集成)获得了 0.9439 CV,0.941 LB(包含 d488c759a 图像的不健康肾小球的手工标注),以及 0.950 私有 LB。最后一天提交时遇到了一些技术困难,所以我们无法提交所有最终模型。