625. RSNA 2024 Lumbar Spine Degenerative Classification | rsna-2024-lumbar-spine-degenerative-classification
感谢 Kaggle 及所有参与者举办如此有趣的比赛。我们学到了很多关于 MRI 数据以及如何为其创建强大模型的知识。
这次比赛非常有挑战性(且耗时!),因为它有 3 种底层模态(SCS, NFN, SS)和 2 个任务(椎间盘定位,严重程度分类)。
我们的解决方案是多个模型的集成,这些模型在研究或序列级别上针对每个单独的椎间盘水平进行训练。第一阶段隔离原始 MRI 的裁剪图,并使用裁剪序列预测病情的严重程度。最终结果使用直接优化比赛指标的 MLP 模型进行聚合。
团队内部使用了通用的交叉验证方法,分为四折。以下是 CV 与排行榜分数的追踪。我们在之前 RSNA 比赛的经验使我们预期会有小幅但合理的波动,因此我们更相信 CV 而不是公共排行榜。
所有数据均来自比赛数据,除了 spinenet 模型权重。我们的一些模型使用了 @brendanartley 公开分享的坐标(非常感谢!)。
对于预处理,我们主要使用最小 - 最大归一化,有时会根据 dicom 窗口宽度和窗口长度添加窗口处理。我们依赖 albumentations 进行增强,并为不同的管道使用了多种方法:
该部分管道的代码可在 github 上获取:
仅使用矢状面数据,它在私有排行榜上达到了 ~0.42 的分数。
坐标模型: 一个简单的 coatnet_rmlp_2_rw_384 在矢状图像的所有中心帧上训练,以预测与椎间盘损伤相关的 5 个 (x, y) 坐标。它使用 10 个类别的 MSE 进行训练,并用于生成裁剪图。裁剪生成是通过在预测的 ROI 中心周围选择图像大小 20% 的正方形来完成的。
分类模型: 在上述裁剪图上,我们再次训练了 CoAtNets,这次是 coatnet_1_rw_224 和 coatnet_2_rw_224,并带有 RNN 层以 Incorporate 3D 信息。
我们最初想为每种损伤训练单独的模型,因为每种图像模态都有其目标。例如,SCS 仅模型经过训练可在 Sagittal T2 图像上预测 3 个严重程度类别,通过采样堆栈中心的 5 个(或 3 个)帧。但将两种矢状面模态一起处理效果更好,甚至在 SS 任务上也显示出不错的性能。进一步的改进来自添加更多帧(5 个不足以捕捉 SCS 和 SS 信号)并使用 3 个 RNN 头,它们可以访问不同的帧 - 用于左、右和中心 (scs) 目标。我们还添加了 MixUp 并训练模型 10 个 epoch(相比之下 SCS 模型为 5 个),并使用更高的学习率(1e-3 相比之下 SCS 模型为 5e-4)。
MLP: 分类模型使用 CE 训练,并调整以最大化 AUC。MLP 模型用于聚合预测,并考虑比赛指标。令人惊讶的是,这里最有效的是独立考虑每个目标,即 scs_l1_l2 不与 scs_l2_l3 特征交互,也不与 MLP 中的 nfn_left_l1_l2 特征交互。不同级别的 logits 层权重是共享的,即模型由 3 个 MLP 组成(一个用于 SCS,一个用于 SS,一个用于 SCS)。
该部分管道的代码可在 github 上获取:
https://github.com/darraghdog/kaggle-rsna-2024-6th-place-solution-model2/
对于矢状面和轴向图像,我们在序列和单个椎间盘水平上训练严重程度分类。因此,我们需要在 dicom 中隔离每个单独的椎间盘。
轴向 xy 定位: 我们使用训练坐标文件来学习每个切片标记点的 xy 位置。使用 efficientnetv2_rw_t 骨干网络,带有线性头和 L1 损失,学习率 1e-4,训练 16 个 epoch,批大小为 16。dicom 图像调整为 384,图像单独馈送到模型。
矢状面 xy 定位: 我们使用 spinenet 预测椎间盘的左上角点。许多 spinenet 点错误地偏移了一个椎间盘。我们使用训练坐标文件来识别偏移的点并将其移动一个椎间盘。然后我们在修正后的 spinenet 预测上重新训练定位。我们从训练中排除标签离 spinenet 预测太远的序列。使用的训练模型和过程与轴向 xy 定位相同,除了我们每个椎骨都有一个 xy 标签,并且我们添加了一个掩码标签来指示没有 spinenet xy 预测的切片(在这种情况下,xy 损失被掩码)。
矢状面 z 定位: 我们使用训练坐标文件来学习 z 位置(注释的实例编号)。对于所有序列,我们预测 spinal_canal_stenosis 的注释实例以及 left 和 right neural_foraminal_narrowing 实例编号。对于 sagittal t2,我们掩码 foraminal 损失,对于 sagittal t1,我们损失 spinal canal 损失。使用 L1 损失,其中目标是实例上的注释数量,介于 0 和 5 之间。训练过程同上。
轴向 z 定位: 我们利用 M-Scan repo 中的矢状点到轴向水平映射 - 代码在此 - 将 sagittal t2 序列的 xyz 位置映射到患者轴向序列的 z 位置。这确定了哪个实例编号或切片包含哪个椎间盘。灵感来自 Ian Pan, Heng 和其他在比赛早期分享此方法的人。
轴向严重程度分类: 第 2 阶段的裁剪是通过取右到左注释的距离并向两侧延伸该距离的一半来制作的。在 z 位置上,通过找到从一个水平到下一个水平的最大距离并从水平的中心切片向两侧延伸该数量的切片来裁剪序列。因此,我们每个序列/水平使用可变数量的切片。使用 efficientnetv2_rw_t 的 2.5d 模型,带有双向单层 RNN 头(512 维)和加权 CE 损失。我们使用学习率 4e-4 训练 5 个 epoch,批大小为 8 个序列/水平,所有裁剪调整为 256 维。
我们使用两个单独的轴向模型。一个用于预测轴向 t2 严重程度,另一个用于预测矢状面 t2 严重程度。该模型在预测矢状面 t1 严重程度方面效果不佳。
矢状面严重程度分类: 第 2 阶段的裁剪是通过取一个椎骨到下一个椎骨的最大距离并从水平的中心 xy 位置向每个水平的任一方向延伸来制作的。在 z 位置上,通过排除被预测为没有 spinenet 注释的切片来裁剪序列(如上所述在矢状面 xy 定位下)。Sagittal t1 和 t2 标签和序列一起训练。
该部分管道的代码可在 github 上获取:
https://github.com/darraghdog/kaggle-rsna-2024-6th-place-solution-model2/
轴向 xy 定位: 我们使用训练坐标文件来学习每个切片标记点的 xy 位置。使用 tf_efficientnetv2_s 骨干网络,带有线性头和 L1 损失。dicom 图像调整为 384,图像单独馈送到模型。
矢状面 xy 定位: 我们使用训练坐标文件来学习每个切片标记点的 xy 位置。使用 tf_efficientnetv2_s 骨干网络,带有线性头和 L1 损失。dicom 图像调整为 384,图像单独馈送到模型。在 T1 和 T2 矢状面图像的组合数据集上训练单个模型是有益的。
轴向 z 定位: 与方法 2 相同。我们使用同一研究的 T1/ T2 矢状面 xy 定位 derived 3d 坐标来 derive 每个椎骨的轴向 z 定位。3d 坐标分别针对 T1 和 T2 derive,然后取平均。
轴向裁剪: 研究的多个轴向序列通过按 ImagePositionPatient 排序来组合。然后使用所有切片的 x1/y1 和 x2/y2 预测的中位数来为研究创建 112x224 大小的边界框。对于轴向序列的每个切片,使用最近的 derived z 坐标分配椎间盘 (IVD)。使用最大距离 20。因此,对于每个 IVD,裁剪高度 x 宽度为 112x224 且切片数量可变的 3d 边界框,并保存为 npy 文件到磁盘。
矢状面裁剪: 第 2 阶段的 3d 裁剪是通过在从第 1 阶段预测的 x/y 坐标周围裁剪原始 dicom 宽度/长度 28% 的边界框并使用所有切片来制作的。因此,使用中位数聚合序列所有切片的所有 x/y 预测以增加鲁棒性。
研究级别 IVD 模型: 对于单个研究级别 IVD,加载 3 视图 3d 裁剪(轴向 3d 裁剪,矢状面 T1 3d 裁剪,矢状面 T2 3d 裁剪)并重塑为 144x288x9, 144x144x9, 144x144x9 立方体。如果视图不可用,则用零替换。2 个矢状面视图在宽度轴上连接, resulting 一个 144x288x9 立方体,然后在高度轴上与轴向视图立方体进一步连接到单个 288x288x9 3d 图像。以 10% 的几率丢弃其中一个视图用作额外的增强。
该模型具有 2.5D 性质,具有 3 个 tf_efficientnetv2_s 骨干网络,其中每个 InvertedResidual 层的 conv_pw 已被修补以应用 3d 而不是 2d 卷积。288x288x9 3d 图像单独馈送到每个骨干网络,以使用 CrossEntropyLoss 分别预测 neural_foraminal_narrowing, spinal_canal_stenosis, subarticular_stenosis。此外,预测属于研究的 5 个 IVD 中任何一个具有严重 spinal_canal_stenosis 条件的损失。4 个损失被平均并优化为单个损失,代表比赛指标。
集成是在第 1 个管道的 MLP 中完成的。所有模型的预测 logits 被连接在一起用于这三个类别。以下是我们的最终分数:
| SCS | NFN | SS | ANY | CV | 公共排行榜 | 私有排行榜 | ||
|---|---|---|---|---|---|---|---|---|
| 损失 (Loss) | 0.260 | 0.475 | 0.538 | 0.255 | 0.382 | 0.355 | 0.401 |
感谢阅读!