625. RSNA 2024 Lumbar Spine Degenerative Classification | rsna-2024-lumbar-spine-degenerative-classification
非常感谢大家,特别是组织者和分享见解的人们。这是一段漫长、充满压力但也很愉快的经历。有很多内容需要评论和解释,但目前先对整个流程做一个总结。
https://www.kaggle.com/code/abhinavsuri/anatomy-image-visualization-overview-rsna-raids
这个 Notebook 完美地向我介绍了这个问题,并从我第一次接触开始就奠定了我方法的基础。通常,专业人士基于以下分析进行诊断:用于椎间孔(foraminal)的 2D 矢状面 T1 分析,用于关节突下(subarticular)的 2D 轴位 T2 分析,以及用于椎管(spinal)的 2D 矢状面 T2 和轴位 T2 分析。
主要问题是切片之间无法完美对齐,至少在没有元数据的情况下是这样。所以我决定使用一种灵活的架构来处理它们:Transformer。
https://www.kaggle.com/code/sacuscreed/sagittal-t1-sagittal-level-segmentation
https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation
https://www.kaggle.com/code/sacuscreed/axial-t2-axial-side-segmentation
这些坐标共同允许我定位矢状面 T1 中的骨干切片、矢状面 T2 中的脊柱切片,并为轴位 T2 切片分配水平。特别感谢 @hengck23 提供的 DICOM 的 2D 到 3D 投影。
值得一提的是,我只使用了竞赛数据。通过数据处理,我能够推算出未标记切片的坐标。对于椎间孔,推算左右标签之间的所有切片;对于椎管,推算 D//5 范围内的所有相邻切片;对于关节突下,推算相邻切片。这显著增加了可用数据量。我还通过正确翻转图像和坐标来复制了轴位 T2 切片。
起初,我开始向 Transformer 输入对应水平或侧别的“全切片堆叠(full-slice sandwiches)”。
@sergiosaharovskiy:“所以这意味着在你的流程中,你不寻找质心,而是获取整个轴位切片,从而获得 0.47 的 LB 总分 :D?”这正是我所做的。
但由于上述评论以及有效下采样大 MRI 这一未解决的问题(可能导致有价值的信息丢失),我开始尝试在作物切片中也寻找 ROI。
https://www.kaggle.com/code/sacuscreed/sagittal-t1-foramina-discriminator
https://www.kaggle.com/code/sacuscreed/sagittal-t2-spine-discriminator
同样,朴素但合理的标签推算是关键。明确标记的作物被直接信任。直接邻居被排除。其余作物被标记为负样本。
起初的想法是直接选择每个“堆叠”中感兴趣的作物,但结果不一致,所以我最终决定通过 MRI 之间的 DICOM 对应关系来近似 ROI,并将这些判别器用作 Transformer 的起始编码器。这使得训练过程 considerably smoother(更加平滑)。
https://www.kaggle.com/code/sacuscreed/getting-true-axial-levels
这是从 [ver.1] demo workflow: 2-stage approach 的直接实现。我一直在致力于一个不那么字面的改编。但时间不够了,而这个方法完美运作。轴位 T2 切片被分配到水平,作为中间矢状面切片中各自水平坐标的最近平面。
https://www.kaggle.com/code/sacuscreed/sagittal-t1-foraminal-prediction
https://www.kaggle.com/code/sacuscreed/sagittal-t2-spinal-prediction
https://www.kaggle.com/code/sacuscreed/axial-t2-subarticular-prediction
https://www.kaggle.com/code/sacuscreed/axial-t2-spinal-prediction-1-4
https://www.kaggle.com/code/sacuscreed/axial-t2-spinal-prediction-5
最后,我训练了五个折交叉验证的 ViT,使用 ResNet18 作为编码器,向 Transformer 输入不同序列的作物。
用于椎间孔预测的矢状面 T1 作物:
用于椎管预测来源之一的矢状面 T2 作物:
用于关节突下预测的轴位 T2 作物:
用于椎管预测第二来源的轴位 T2 作物:
我一直在不同病理之间循环工作,试图将我从每一次中学到的东西转移到下一次。试图统一架构。主要结构是用于每个水平/侧别作物的 Transformer, followed by 一个用于水平和侧别之间的第二个 Transformer。我尝试了不同的位置编码:
我想说最好的方法是绝对编码作物,使用不可学习的位置编码,并且不区分侧别。也就是说,将第二个 Transformer 分组为 10 个序列(每个水平 2 个),因为侧别应该是等效的。诊断不应取决于哪一侧。我已经为矢状面 T1 和 T2 预测更新了这个方案。但我未能将其转化为轴位 T2 预测。在这种情况下,虽然原始训练非常不稳定,但它们最终取得了更好的性能。所以我保留了它们。
https://www.kaggle.com/code/sacuscreed/rsna-private-submission-v2
https://www.kaggle.com/code/sacuscreed/old-axial-t2-axial-side-segmentation
https://www.kaggle.com/code/sacuscreed/old-sagittal-t2-segmentation
https://www.kaggle.com/code/sacuscreed/sagittal-t1-direction-training
https://www.kaggle.com/code/sacuscreed/sagittal-t1-axial-side-segmentation
https://www.kaggle.com/code/sacuscreed/sagittal-t2-axial-spine-segmentation