返回列表

1st place solution with code

404. RSNA STR Pulmonary Embolism Detection | rsna-str-pulmonary-embolism-detection

开始: 2020-09-10 结束: 2020-10-26 医学影像分析 数据算法赛
第一名解决方案(附代码)

第一名解决方案(附代码)

作者:Guanshuo Xu | 排名:第1名

恭喜所有的获奖者!感谢 Kaggle 和 RSNA 主办这次比赛并向我们展示了这个有趣的问题。数据量很大且质量很高,而且没有排名波动。我很高兴能赢得这次比赛,在这个过程中我学到了很多东西。

特别感谢 @vaillant 提供的主题介绍和有用的输入处理代码。同时,功劳也应归功于去年 RSNA 的获胜者,我的解决方案中融入了他们的许多想法。

预处理

在参加这次比赛后不久,我注意到将输入图像大小从 512x512 增加到 640x640 可以提高模型性能。通过浏览训练图像,我进一步注意到肺部并没有占据图像中很大且一致的部分。这是低效的,因为我们知道输入大小很重要,在图像中不相关的事物上浪费计算时间是不值得的,这也可能给模型学习大尺度和位移不变性带来不必要的困难。因此,有必要拥有一个高质量的肺部定位器。网上有一些现有的预训练肺部定位器,我没有尝试它们,因为根据我的观察,只要我们有肺部的边界框标签,CNN 很容易从图像中准确定位肺部区域。所以,我标注了训练数据,并使用边界框和 Efficientnet-b0 作为主干构建了一个肺部定位器。为简单起见,我每个研究只标注了四张图像。为了节省时间,训练和预测过程也仅针对每个研究的四张图像进行。下面给出了此预处理的一些示例。即使在某些相对困难的条件下,定位器也非常稳健。预处理输入的想法部分灵感来自去年的第二名解决方案。

Preprocessing Example

训练/验证集划分

由于提供的数据量大且质量高,我们不需要进行交叉验证,单次训练/验证集划分就足够可靠了。在这次比赛中,我随机留出了 1000 个研究用于验证,并使用其余的 6200+ 个研究进行训练和超参数调整。对于最终的 LB 提交,我使用完整的训练集和优化后的超参数重新训练了我的模型。

图像级建模

我使用了与去年 RSNA 比赛相同的两阶段训练策略。对于图像级建模,3 通道输入是当前图像及其两个直接相邻图像的 PE 窗。使用相邻图像已被证明在去年的第一名和第三名解决方案中是有效的。我的实验也证实,这种输入设置优于具有 3 种类型窗的单张图像。

除了预测图像级标签外,今年我们还获得了各种研究级标签。乍一看,我认为由于研究级模型的输入是图像嵌入,我们需要在图像级建模期间使用这些研究级标签,以便后续的研究级模型能够有足够的知识来建模和预测它们。但是,在我尝试了它们的多种组合和各种损失掩码技巧后,在图像级和研究级阶段表现最好的模型仍然是仅使用图像级标签训练的模型。我有点困惑,当图像级模型没有使用任何这些标签进行训练时,图像嵌入是如何用研究级标签(例如,确切位置标签(中心、左侧、右侧)和更细化的急性和慢性)编码的。

训练损失是带有线性学习率调度器的普通 BCE 损失。没有应用特殊的数据采样。我发现对于我的设置,遍历训练数据单个 epoch 是最佳的。最好的增强方式是:

albumentations.RandomContrast(limit=0.2, p=1.0),
albumentations.ShiftScaleRotate(shift_limit=0.2, scale_limit=0.2, rotate_limit=20, border_mode=cv2.BORDER_CONSTANT,