625. RSNA 2024 Lumbar Spine Degenerative Classification | rsna-2024-lumbar-spine-degenerative-classification
我想感谢 Kaggle 和 RSNA 组织了如此精彩的比赛。我也要感谢 @ahmedelfazouan,他再次与我组队。
我们团队的方法包含以下主要组件:
受到 关键点检测 的启发,我们开发了一个基于热图的模型来识别 25 个类别。我们需要开发 3 个模型,每个模型旨在预测各自输入对应的给定标签。
在比赛早期,我们使用给定的点作为标签,但由于类别不平衡,导致训练速度较慢。为了解决这个问题,我们对 x 和 y 坐标应用了高斯滤波器,对于 z 轴,随着远离目标帧,我们乘以 0.5,有效地增加了整体标签的面积。这有助于提高模型的收敛速度和 z 轴 accuracy。
虽然 3D UNet 的表现不错,但 2D UNet 结合序列模型在 Z 轴相关准确性上 demonstrated 更高。因此,我们最终选择了 2D UNet along with 序列模型 (Transformer, LSTM)。
对于骨干网络,EfficientNet_B5 提供了最佳性能。对于轴位 T2 (axial_t2),我们发现增加最大长度以容纳更长的序列可以提高性能。此外,利用 公开数据集 使我们能够进一步改进。
我们使用从阶段 1 获得的检测坐标,沿 z 轴裁剪 ±2,x, y 轴裁剪 ±32,然后调整结果大小 (5, 64, 64) -> (5, 128, 128) 用于阶段 2。我们的模型结构类似于典型的 2.5D 模型 (CNN + RNN),但我们团队添加了一个额外的模块来建模类别之间的关系。在比赛早期,我们使用 LSTM 对 25 个类别进行建模。
然而,在检查提供的数据标签后,我们能够做出以下分析:
当某一级别存在症状 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 表现出最佳性能。
在比赛早期,我们使用 closely 遵循比赛指标的损失函数训练模型。然而,这导致了对加权标签的过拟合,导致 AUC 分数较差。为了提高 AUC 同时在比赛指标上表现良好,我们团队实施了两步训练方法。
第一步(预训练)
我们专注于最大化 AUC 分数,在不使用加权损失和任何损失的情况下训练模型的整体参数。
第二步(微调)
我们采用加权损失和任何损失,冻结模型的骨干网络,仅训练头部参数以优化比赛指标。
通过这种方法,与简单地使用加权损失和任何损失训练相比,我们团队能够显著提高分数。
在训练阶段 2 时,我们观察到模型很快开始过拟合。为了防止过拟合,我们尝试了各种方法,包括翻转 (flip)、旋转 (rotate)、亮度、对比度、模糊和 MixUp。其中,CutMix 在提高 AUC 分数方面发挥了最重要的作用。事实上,使用 p=1.0 的 CutMix 获得了最高的 AUC 分数。
此外,我们尝试了各种方法,例如在阶段 1 的 z 轴上随机添加 ±1 或翻转左右标签。然而,这些方法并未带来显著的分数改进。
基于这些方法,我们开发了各种阶段 1 和阶段 2 模型并进行了集成。
此外,在私有 leaderboard 上获得最高分数的集成方法类似于测试时增强 (TTA)。我们没有结合团队成员开发的阶段 1 模型并将其传递给阶段 2 模型,而是为每个单独的阶段 1 模型推断阶段 2 模型,然后进行集成。