513. RSNA 2022 Cervical Spine Fracture Detection | rsna-2022-cervical-spine-fracture-detection
感谢所有组织者收集并标注了这组丰富的颈椎CT数据,也祝贺所有获奖者精彩的工作。我还要感谢我的队友 @braderickson 提供的所有临床和技术见解;没有他,这个解决方案是不可能完成的。
这是我第一次认真参加 Kaggle 比赛,虽然犯了一些大错误,但我非常享受这个过程,希望我能在未来的比赛中吸取教训[更多内容见文末]。
从一开始,我们就决定专注于 3D 流程,因为每个切片中存在一些提示(如营养管),这可能会干扰 2D 模型(这只是我们最初的想法)。我们的流程非常简单:分割 C1-C7 椎骨,然后使用一个 3D 分类器获取每个椎骨体积并预测其是否骨折。
这有点挑战性;只有 87 个样本具有椎骨分割掩码,根据 VerSe 挑战赛的相关文献,这不足以训练一个稳健的分割模型。我们使用了 VerSe 挑战赛数据集以及 CTSpine1K 数据集来训练一个 3D SwinUNETR 模型(来自 MONAI)。对于分割任务,我们使用了大小为 [128, 128, 128]、像素间距为 [1, 1, 1] 的图块,并将掩码上采样到图像的原始尺寸。我们使用这 87 张标注图像作为测试集来评估模型的稳健性。该模型在测试集上达到了约 0.90 的平均 DSC,使其成为可用作独立模型的可行选项(分割任务未使用交叉验证)。
我们做的一件事是旋转椎骨,使前后质心对齐在一条水平线上;这有助于修正部分患者颈部过度屈曲的体位问题。
掩码后处理包括连续的闭运算和膨胀运算(以去除杂散像素),并获取 7 个最大的连通分量,每个椎骨一个。在此阶段,我们能够获得干净的椎骨体积。但正如其他人提到的,存在一些重叠,两个连续的椎骨可能会出现在体积的顶部或底部。为了克服这个问题,我们将其他椎骨涂黑。例如,在下图的 C1 椎骨中,我们将 C2 椎骨的齿状突涂黑。在我们的实验中,与其他方法相比,这种方法效果最好。

包括所有的重采样、掩码上采样和后处理,此阶段占总运行时间的约 4.5 小时。
我们获取了每个椎骨的体积尺寸,发现 >90% 的样本体积小于 256x256x64。因此我们选择此尺寸作为 3D 分类器的输入。流程中最具挑战性的部分是训练一个稳健的 3D 分类器。MONAI 提供了出色的 API,用于创建著名 2D 模型(如 EfficientNets (仅限 v1s)、DensNets 和 ResNeXts)的 3D 版本。我们最终决定使用 EfficientNetB4 和 DenseNet209 模型的集成,因为它们在我们的 CV 中表现最好,并在 CV 上达到了 >0.90 的 AUC。我们添加了水平翻转作为 TTA(测试时增强),这帮助提升了 0.02 的性能。
为了计算患者的整体标签,我们使用了最高三个骨折概率的条件概率(因为超过 95% 的样本骨折数 <=3)。与将最大值设为患者整体标签相比,这带来了 0.02 的分数提升。我们将 <0.05 和 >0.90 的概率分别舍入为零和一,因为这确实帮助公榜分数提高了 0.02。这是我们要犯的最大错误!比赛结束后,我们在没有此阈值处理的情况下运行模型,公榜分数达到了 0.25(提高了 0.03)。
这 10 个分类器运行了约 2.5 小时,速度相当快。
以下是我第一次参加 Kaggle 比赛的一些心得,希望能对他人有所帮助: