返回列表

12th Place Solution

513. RSNA 2022 Cervical Spine Fracture Detection | rsna-2022-cervical-spine-fracture-detection

开始: 2022-07-28 结束: 2022-10-27 医学影像分析 数据算法赛
第12名解决方案

第12名解决方案

作者:Takashi Someya (Grandmaster), Tamo (Master)
比赛:RSNA 2022 颈椎骨折检测

首先,我要感谢 Kaggle 工作人员和主办方组织并举办这次比赛。
我还要感谢我的队友 @yuyuki11235。他提出并实现了许多想法,真的非常有帮助。
我们希望下次能再次努力争取金牌。

摘要

我们采用了两阶段方法:使用 CNN 模型提取图像级特征,并使用序列模型推断患者级别的骨折概率。
切片图像经过了 YOLOX 裁剪、2.5D 方法和窗口化技术的预处理。
在最终提交中,我们使用 EfficientNet-V2-L 作为特征提取器,并使用 LSTM、GRU 和 Conv1d 作为序列模型。

预处理

边界框裁剪

我们训练了 YOLOX-L 模型来检测椎骨位置。
边界框标签是根据分割掩膜的外框创建的(类似于第3名的解决方案)。
在裁剪时,我们只使用了置信度高于 0.7 的图像中置信度最高的边界框。
裁剪时在边界框上添加了 20 像素的边距。

利用相邻切片和窗口化

与之前的 RSNA 比赛一样,我们使用了利用相邻切片和窗口化技术的 2.5D 方法。
对于窗口化,我们应用了这篇论文中使用的数值。

  • 标准骨窗 (w=500, c=1800)
  • 粗略骨窗 (w=650, c=400)
  • 软组织窗 (w=300, c=80)

我们将 2.5D 和窗口化结合如下(s 表示切片索引):
ch1 : s-1 切片,使用标准骨窗
ch2 : s 切片,使用粗略骨窗
ch3 : s+1 切片,使用软组织窗

下面展示了通过预处理创建的输入图像示例。

输入图像示例

CNN 模型(第1阶段)

我们的 CNN 模型基于 @vslaykovsky公共基线
我们训练模型来推断骨折和椎骨位置。
与训练相关的主要技巧列出如下。

数据增强
  • 水平翻转
  • 高斯模糊
  • 高斯噪声
  • 平移缩放旋转
  • 粗粒度丢弃
  • 随机亮度对比度
  • OneOf([网格畸变, 弹性变换])
标签清洗

由于本次比赛没有提供每张图像的骨折和椎骨位置,我们尝试通过多个伪标签步骤创建准确的图像级标签。
这个 Notebook的标签开始,我们首先从 EfficientNet-B4 的 OOF 预测中生成骨折和椎骨位置的伪标签,并将它们用作下一次训练的标签(经过阈值处理等后处理)。
通过用更大的模型重复伪标签过程,我们获得了更好的 CV 分数。

序列模型(第2阶段)

我们使用图像级嵌入训练了患者级别的分类模型。
我们的最终集成模型包括 LSTM、GRU 和 Conv1d 模型。
主要的处理步骤如下:

  • 连接每位患者的图像级嵌入 (NxD,N:每位患者的切片数量,D:嵌入维度)
  • 应用 cv2.resize 函数固定序列长度 (MxD,M:固定序列长度)(使用了这个 Notebook 的思路)
  • 将上述特征输入到各个模型中

其他技巧如下:

  • 通过推断骨骼位置,仅遮罩 C1~C7 区域 (NxD→N'xD,N':C1~C7 的切片数量)
  • 注意力池化
  • 训练期间随机跳过切片(推理时固定跳过 3 个,见下文最终预测部分)

最终预测

  • 使用 1/3 的切片,即 df[df["Slices"] % 3 == 0]
同比赛其他方案