513. RSNA 2022 Cervical Spine Fracture Detection | rsna-2022-cervical-spine-fracture-detection
感谢 Kaggle 和赞助商组织了这场有趣且无数据泄露的竞赛,比赛有很多不同的角度值得探索。我们刚结束 DFL 比赛就来参加这个,而且加入得比较晚,我们特意寻求这种“冲刺”的感觉,挑战自己在短短 11 天内得出一个优秀的解决方案。因此我们的队名为:Speedrun(@philippsinger, @ilu000, @christofhenkel)。我们可以借鉴之前 3D-RSNA 竞赛分享的想法以及我们以前做过的比赛,我们很自豪能在这么短的时间内获得第 5 名。我们还要感谢各种 GitHub 库的作者,他们使我们能够快速迭代和尝试想法,例如 timm、albumentations 和 segmentation models pytorch。
我们的解决方案是两个非常相似的方法的集成,它们遵循一个 3 阶段的范式:
下图总结了解决方案概览:
我们方法的第一阶段仅使用了提供了 3D 分割掩码的 87 个研究。我们利用 3D 分割标签为给定的 2D 切片推导出两类标签。一方面,我们为每个 2D 切片创建了 7 维二进制标签(如果某个椎骨可见则为 1),并训练了一个 EfficientNet-B5(模型 S1A)。另一方面,我们为每个 2D 切片使用椎骨分割掩码训练了一个 EfficientNet-B3-UNet(模型 S1B)。
使用模型 S1A,我们使用 0.5 的阈值预测训练集中所有 2000 个研究中椎骨是否可见。然后,我们通过将预测结果与整体研究标签(如果椎骨骨折)相乘,将目标标签从研究级映射到 2D。这样创建的伪标签将在第二阶段使用。此外,S1B 用于预测分割掩码(如果任何椎骨可见),并从中为每个 2D 切片推导出边界框(x_min, x_max, y_min, y_max)。我们使用 x_min 和 y_min 的 0.05 分位数以及 x_max 和 y_max 的 0.95 分位数聚合每个研究的所有边界框,以获得每个研究的单个框,这将在第二阶段用于裁剪感兴趣区域。
对于第二阶段模型,我们的目标是直接预测七块颈椎中每一块的骨折概率。每个切片的标签由我们的第一阶段模型构建。
第二阶段的所有模型都遵循 2.5D + 3D 模式。输入是一个具有 3 个通道的 2.5D 切片,其中中心通道是感兴趣的 z 维度,两个相邻切片形成其他通道。然后通过 2D 主干网络运行,主干网络的最后一层转换为 3D 卷积层,并在切片间进行平均池化。对于 3D 部分,我们采取步长为 5,并且每个方向只取两个额外的切片。
因此,对于索引为 15 的样本输入帧,我们首先堆叠通道 14、15、16,然后添加位置 -5 和 +5 的帧,这些帧也堆叠了 3 个通道,所以我们添加堆叠的通道 9、10、11 和 19、20、21。输入维度为 (3, 3, height, width)。
我们训练了两种类型的第二阶段模型:
这数据很容易过拟合,所以我们应用了重度的正则化,其中一些最重要的包括:
我们所有的模型都是非常轻量级的 efficientnetv2 模型。在推理过程中,将图像放大至少 1.125 倍有时还应用中心裁剪对我们非常有帮助。
由于我们的第二阶段模型是在单个切片上训练的