返回列表

18th place solution

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

开始: 2020-09-10 结束: 2020-10-26 医学影像分析 数据算法赛
第18名方案

第18名方案

作者:Theo Viel
比赛排名:第18名

其实我很惊讶自己能在这次比赛中取得这样的成绩,我加入得太晚了,而且训练的模型非常少。我只有一个选定的提交,幸运的是没有超时。这是一个基于 EfficientNet-B3 的 5 折模型,后面接了一个基于其特征的 5 折序列模型。

简介

我的解决方案包含一个两步流程,类似于那个“强力基线”:

  • 图像级别的 EfficientNet-B3,训练用于分类图像是否存在肺栓塞(PE)。该模型随后用于提取 CT 扫描每一层的特征。
  • 在 CNN 提取的特征上训练一个序列模型,它同时预测图像和检查级别的标签,并直接优化比赛指标。

我在比赛结束前 9 天才加入,总体动力是想做些类似于上一届 RSNA 比赛获胜者所做的事情。
我很快搭建好了 CNN 流程,并开始训练一些模型。问题在于这些模型在我的硬件(1x RTX 2080Ti)上训练时间太长,所以我必须随机应变。

接着,就是快速构建流程的第二部分和推理代码,这绝非易事。

在我加入后不久,那个“强力基线”发布了。我最终并没有真正使用其中的任何组件,但这成为了我继续推进的额外动力。
我在截止日期前一天完成了第一次提交,不知怎么地在公共排行榜上排到了第 23 名。

数据

由于我的电脑无法容纳 900GB 的数据集,我完全依赖 @vaillant 提取的 256x256 jpg 图片
非常感谢您让像我这样的人也能参加比赛。

因此,我完全没有对窗宽窗位进行实验,仅仅是加载数据就占用了我运行时间的很大一部分。

第一级:卷积神经网络

欠采样

从 CT 扫描构建的 2D 图像存在的问题是图像非常相似。因此,不使用患者的每一张切片是有道理的。
由于平均每位患者约有 400 张切片,一个 epoch 将耗费大量时间,这不是我想走的路。
因此,我在每个 epoch 对每位患者只使用 30 张图像,这是通过自定义采样器完成的。

完成后,我可以在大约 9 小时内训练模型 20 个 epoch,使用按患者分组的 5 折验证。

模型

模型作为经典的二分类问题进行训练,使用二元交叉熵损失。
最初的实验使用 ResNeXt-50 模型,因为它通常是一个可靠的基线。
然后我尝试切换到更大的 ResNext-101,但结果并没有变好,所以我很快放弃了大型架构。
我训练的最后一个模型是 EfficientNet-B3,选择它是因为我的 GPU 可以容纳 32 的批量大小。
它的表现稍好一些,所以我坚持使用这个模型,而且我也没时间训练其他模型了。

EfficientNet 训练了 15 个 epoch,使用线性学习率调度,预热比例为 0.05。

数据增强

- albu.HorizontalFlip(p=0.5)
- albu.VerticalFlip(p=0.5)
- albu.ShiftScaleRotate(shift_limit=0.1, rotate_limit=45, p=0.5)
- albu.OneOf([albu.RandomGamma(always_apply=True), albu.RandomBrightnessContrast(always_apply=True),], p=0.5)
- albu.ElasticTransform(alpha=1, sigma=5, alpha_affine=10, border_mode=cv2.BORDER_CONSTANT, p=0.5)

第二级

模型

我使用的模型是 MLP + 双向 LSTM,它使用 CNN 提取的特征作为输入,同时预测图像和检查目标。
两个 2 层分类器连接在 MLP 输出和 LSTM 输出的拼接结果上。
对于检查级别的目标,我使用了平均池化和最大池化的拼接结果。
此外,使用了多样本 dropout 以改善收敛。

训练

模型使用与指标匹配的损失函数进行训练。
我在最后几个 epoch 使用了

同比赛其他方案