返回列表

5th place solution

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

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

第五名解决方案

作者: siwooyong (与 ahmedelfazouan 合作)

发布时间: 2024-10-09

比赛: RSNA 2024 Lumbar Spine Degenerative Classification

排名: 第 5 名

我想感谢 Kaggle 和 RSNA 组织了如此精彩的比赛。我也要感谢 @ahmedelfazouan,他再次与我组队。

总结

我们团队的方法包含以下主要组件:

  • 阶段 1 (Stage1):基于热图的检测 + 高斯扩展标签 + 外部数据集
  • 阶段 2 (Stage2):2.5D 模型 (CNN + RNN) + 逐级序列建模 + 两步训练法
  • 数据增强 (Augmentation):CutMix (p=1.0)
  • 集成 (Ensemble):多种骨干网络集成 + 类 TTA 集成

阶段 1 (Stage1)

基于热图的检测 (heatmap-based detection)

受到 关键点检测 的启发,我们开发了一个基于热图的模型来识别 25 个类别。我们需要开发 3 个模型,每个模型旨在预测各自输入对应的给定标签。

  • 矢状位 T2 (sagittal_t2) -> 椎管狭窄 (5 类)
  • 矢状位 T1 (sagittal_t1) -> 神经孔狭窄 (10 类)
  • 轴位 T2 (axial_t2) -> 关节下狭窄 (10 类)

高斯扩展标签 (gaussian-expanding-label)

在比赛早期,我们使用给定的点作为标签,但由于类别不平衡,导致训练速度较慢。为了解决这个问题,我们对 x 和 y 坐标应用了高斯滤波器,对于 z 轴,随着远离目标帧,我们乘以 0.5,有效地增加了整体标签的面积。这有助于提高模型的收敛速度和 z 轴 accuracy。

heatmap-image

外部数据集 (external-dataset)

虽然 3D UNet 的表现不错,但 2D UNet 结合序列模型在 Z 轴相关准确性上 demonstrated 更高。因此,我们最终选择了 2D UNet along with 序列模型 (Transformer, LSTM)。

对于骨干网络,EfficientNet_B5 提供了最佳性能。对于轴位 T2 (axial_t2),我们发现增加最大长度以容纳更长的序列可以提高性能。此外,利用 公开数据集 使我们能够进一步改进。

阶段 2 (Stage2)

2.5D 模型 (CNN + RNN)

我们使用从阶段 1 获得的检测坐标,沿 z 轴裁剪 ±2,x, y 轴裁剪 ±32,然后调整结果大小 (5, 64, 64) -> (5, 128, 128) 用于阶段 2。我们的模型结构类似于典型的 2.5D 模型 (CNN + RNN),但我们团队添加了一个额外的模块来建模类别之间的关系。在比赛早期,我们使用 LSTM 对 25 个类别进行建模。

逐级序列建模 (level-wise sequence modeling)

然而,在检查提供的数据标签后,我们能够做出以下分析:

当某一级别存在症状 1 时,同一级别存在症状 2 和 3 的概率很高。

因此,我们修改了方法,仅对同一级别的类别进行建模,而不是所有 25 个类别。这一调整显著提高了我们的分数。

x = x.reshape(-1, 5, 5, self.hidden_size)
x = x.permute(0, 2, 1, 3)
x = x.reshape(-1, 5, self.hidden_size)

x, _ = self.rnn2(x)

x = x.reshape(-1, 5, 5, self.hidden_size)
x = x.permute(0, 2, 1, 3)
x = x.reshape(-1, 25, self.hidden_size)

在比赛的后期,我们也尝试了连接仅在同一级别进行序列建模的结果,以及仅对同一区域进行建模。然而,这种方法的表现不如仅在同一级别进行建模的结果。此外,我们实施了诸如跳过连接 (skip connections) 之类的更改,然后将其用于我们的集成。

在 CNN 的情况下,我们尝试了 RegNet 和 EfficientNet 等模型,但 ConvNeXt 表现出最佳性能。

两步训练法 (two-step training)

在比赛早期,我们使用 closely 遵循比赛指标的损失函数训练模型。然而,这导致了对加权标签的过拟合,导致 AUC 分数较差。为了提高 AUC 同时在比赛指标上表现良好,我们团队实施了两步训练方法。

第一步(预训练)
我们专注于最大化 AUC 分数,在不使用加权损失和任何损失的情况下训练模型的整体参数。

第二步(微调)
我们采用加权损失和任何损失,冻结模型的骨干网络,仅训练头部参数以优化比赛指标。

通过这种方法,与简单地使用加权损失和任何损失训练相比,我们团队能够显著提高分数。

数据增强 (Augmentation)

CutMix (p=1.0)

在训练阶段 2 时,我们观察到模型很快开始过拟合。为了防止过拟合,我们尝试了各种方法,包括翻转 (flip)、旋转 (rotate)、亮度、对比度、模糊和 MixUp。其中,CutMix 在提高 AUC 分数方面发挥了最重要的作用。事实上,使用 p=1.0 的 CutMix 获得了最高的 AUC 分数。

此外,我们尝试了各种方法,例如在阶段 1 的 z 轴上随机添加 ±1 或翻转左右标签。然而,这些方法并未带来显著的分数改进。

集成 (Ensemble)

基于这些方法,我们开发了各种阶段 1 和阶段 2 模型并进行了集成。

多种骨干网络集成 (various backbone ensemble)

  • 阶段 1:最大长度 (max length)
  • 阶段 1:CNN 骨干网络 (RegNetY_002, EfficientNet_B5)
  • 阶段 1:是否具有固定的 (x, y) 坐标或根据 z 轴动态变化的 (x, y) 坐标。
  • 阶段 2:RNN 建模 (跳过连接,序列建模轴)
  • 阶段 2:CNN 骨干网络 (ConvNeXt_Small, ConvNeXt_Tiny, CaFormer_S18, PVT_v2_b3)

类 TTA 集成 (tta-like ensemble)

此外,在私有 leaderboard 上获得最高分数的集成方法类似于测试时增强 (TTA)。我们没有结合团队成员开发的阶段 1 模型并将其传递给阶段 2 模型,而是为每个单独的阶段 1 模型推断阶段 2 模型,然后进行集成。

无效尝试 (Not worked)

  • 将阶段 1 的掩码 (mask) 添加为阶段 2 CNN 的通道
  • 阶段 2 使用更大的 CNN 骨干网络
  • 标签平滑 (Label Smoothing)
同比赛其他方案