返回列表

3rd Place Solution

625. RSNA 2024 Lumbar Spine Degenerative Classification | rsna-2024-lumbar-spine-degenerative-classification

开始: 2024-05-17 结束: 2024-10-08 医学影像分析 数据算法赛
第三名解决方案 - RSNA 2024

比赛: RSNA 2024 腰椎退行性分类

排名: 第 3 名

作者: Moyashii, suguuuuu, tkmn

发布日期: 2024-10-09

更新日期: 2024-10-28

第三名解决方案

首先,我们要向 Kaggle 和比赛组织者表示最深深的感谢,感谢他们提供了这个绝佳的机会。我们也要感谢所有的参与者,让这次比赛变得引人入胜且富有洞察力。

总结

我们构建了一个通用的两阶段流程:

  • 第一阶段:在每个椎间盘级别裁剪矢状面图像,并使用椎间盘级别分配和椎管位置裁剪轴状面图像。
  • 第二阶段:使用中心分类器对椎管狭窄的严重程度进行分类,使用侧面分类器对神经孔狭窄和关节下狭窄的严重程度进行分类。
流程概述

我们将在下面详细解释每个过程。

第一阶段

第一阶段的责任是从输入数据中提取估计疾病严重程度所需的信息。

1. 椎间盘级别关键点检测器 (CenterNet)

我们构建了一个基于 CenterNet 的 2D 关键点检测器,使用 EfficientNetB6 作为骨干网络,FPN 作为颈部网络。通过输入身体中心附近的矢状面图像,我们估计每个椎间盘级别的坐标。对于训练数据,我们使用了 RSNA2024 中在所有级别都有椎管狭窄坐标的矢状面图像,以及 坐标预训练数据集。通过使用训练好的模型在未使用的 RSNA2024 数据上生成伪标签,我们最终利用了所有 RSNA2024 数据。认识到从几次讨论中存在标签噪声,我们手动审查了所有注释并手动纠正了错误的标签。

2. 裁剪级别

我们在每个椎间盘级别裁剪了矢状面图像。为了确保输入数据的多样性,我们采用了多种裁剪设置。由于裁剪设置导致的准确性几乎没有差异。

矢状面裁剪

3. 分配级别

使用椎间盘级别关键点检测器的输出,我们将任意椎间盘级别分配给轴状面切片。处理流程如下:

  1. 将椎间盘级别的图像坐标转换为现实世界坐标。
  2. 从每个椎间盘级别的中点(例如 L1/L2, L2/L3 等)估计 L1, L2, ..., S1 的椎骨位置。由于我们无法获得 T12/L1 和 S1/S2 的坐标,我们伪计算了 L1 和 S1 的坐标。
  3. 计算连接相邻椎骨的线段与轴状面之间的交点,并分配相应的椎间盘级别。

4. 椎管关键点检测器 (CenterNet)

我们构建了一个基于 CenterNet 的 2D 关键点检测器,使用 EfficientNetB4 作为骨干网络,FPN 作为颈部网络。通过输入轴状面图像,我们估计椎管的坐标。由于 Y 坐标可以从椎间盘级别关键点检测器的结果中准确估计,但估计 X 坐标具有挑战性,我们引入了这个检测器。对于训练数据,我们使用了 RSNA2024 中具有椎管狭窄坐标的轴状面图像。

5. 裁剪椎管

使用椎管关键点检测器的输出,我们裁剪以椎管为中心的 necessary 区域。为了确保输入数据的多样性,我们以多种尺寸进行裁剪。由于裁剪方法导致的准确性几乎没有差异。

轴状面裁剪

第二阶段

第二阶段的责任是使用第一阶段的输出估计每种状况的严重程度。

6. 中心分类器 (2D-Encoder + Attention)

我们创建了一个分类模型,用于从矢状面 T1、矢状面 T2/STIR 和轴状面 T2 图像估计椎管狭窄的严重程度。对于矢状面 T1 和矢状面 T2/STIR,我们将 15 个等间隔的切片输入编码器,为每个切片生成特征表示。对于轴状面 T2,我们输入 10 个等间隔的切片。然后将这些切片特征输入注意力机制以学习切片之间的关系。为了确保模型多样性,我们创建了两个具有不同头部结构的模型。为了提高准确性,我们使用了辅助损失,如其他条件的严重程度和切片级预测。此外,由于指标规格,增加重度类别的损失权重是有效的。通过翻转轴状面图像进行的测试时增强 (TTA) 也提高了 leaderboard 分数。

分类器

在验证了模型的各种输入 - 输出组合模式后,我们发现最有效的方法是输入任意椎间盘级别的矢状面 T1、矢状面 T2 和轴状面 T2 切片组,以估计椎管狭窄的严重程度。在训练期间,我们将每组切片视为独立的数据点,而不依赖于椎间盘级别。换句话说,该模型旨在始终从任何椎间盘级别的切片组中学习椎管狭窄的特征,并基于这些特征预测严重程度,而不专注于任何特定的椎间盘级别。这使我们每个条件获得了五倍的数据量,我们认为这有助于提高准确性。

我们使用了以下编码器:

  • ResNet18 (160x160, 224x224)
  • MNasNet-S (224x224)
  • EfficientNet-B4 (224x224)
  • EfficientNetV2-RW (224x224)
  • EfficientNetV2-S (224x224)
  • ConvNeXt-N (224x224, 320x320)
  • ConvNeXt-T (224x224, 320x320)
  • MaxViT-N (256x256)

训练

基本训练设置如下:

  • 10–20 个 epoch
  • AdamW,学习率 lr=0.000025,OneCycleLR 调度器(总步骤的前 3/10 进行 Warmup)
  • Batch size: 2–8
  • 交叉熵权重:[1.0, 2.0, 4.0]
  • drop_path_rate = 0.2 或 0.3
  • 数据增强:
    • RandomBrightnessContrast
    • Blur
    • Distortion
    • ShiftScaleRotate
    • CoarseDropout
    • Mixup (可选)

7. 左右分割 (Split LR)

我们为侧面分类器的训练和推理设计了预处理步骤。我们将矢状面和轴状面图像分割为身体的左侧和右侧。对于右侧数据,我们反转了矢状面切片的顺序并水平翻转了轴状面图像。这使我们能够统一处理左侧和右侧,并有效地使可用于训练的数据量增加了一倍。

8. 侧面分类器 (2D-Encoder + Attention)

我们创建了一个分类模型,用于从矢状面 T1、矢状面 T2/STIR 和轴状面 T2 图像估计神经孔狭窄和关节下狭窄的严重程度。模型结构和输入切片数量与中心分类器相同。

在验证了模型的各种输入 - 输出组合模式后,我们发现最有效的方法是输入任意椎间盘级别和任意侧(左或右)的矢状面 T1、矢状面 T2 和轴状面 T2 切片组,以估计神经孔狭窄和关节下狭窄的严重程度。通过应用左右分割预处理并翻转右侧图像以增加数据,预测准确性得到了提高。在训练期间,我们将每组切片视为独立的数据点,而不区分椎间盘级别或身体侧面。换句话说,该模型旨在从输入切片组中学习这些条件的特征,无论椎间盘级别或侧面如何,并基于这些特征估计严重程度。这使我们每个条件获得了十倍的数据量,我们认为这有助于提高准确性。

团队验证策略

伪标签

对于没有 ground truth 标签的项目,我们使用训练模型的预测作为软标签。由于是否存在伪标签导致的准确性变化并不显著,但我们引入伪标签的使用作为确保模型多样性的选项。

集成

单个模型的最高 CV 分数为 0.3858,由中心分类器 (Type B) ConvNeXt-T 和侧面分类器 (Type B) ConvNeXt-N 组合实现。

集成 CV 分数为 0.3643,通过简单平均 30 个模型(15 个中心模型和 15 个侧面模型)获得,这些模型在输入图像类型、模型架构、数据增强、辅助损失、伪标签等方面具有多样性。

后处理

我们对椎管狭窄的 logits 应用了温度为 0.91 的温度缩放 (Temperature Scaling),锐化了预测概率。

温度缩放

无效的方法

  • 单阶段解决方案
  • 多级多疾病模型
  • 多级单疾病模型
  • 专注于每个椎间盘级别的模型
  • 专注于身体每侧的模型
  • 3D-CNN
  • 2.5D-CNN + Attention
  • 2D-CNN + LSTM
  • Focal Loss
  • 长 epochs
同比赛其他方案