513. RSNA 2022 Cervical Spine Fracture Detection | rsna-2022-cervical-spine-fracture-detection
感谢主办方举办了数据如此丰富多样的 RSNA 2022 比赛,有很多方法值得学习。
非常祝贺获胜者以及所有达成目标的参与者。对我来说,我的目标是获得我的第一枚金牌,成为单人金牌得主。
[注意]:我互换使用“vertebrae(椎骨)”和“bone(骨骼)”这两个词
我在矢状位视图上训练了一个 Unet-B1 二元分割模型,0 代表背景,1 代表骨骼。利用该模型的预训练权重,我在相同数据上训练了另一个模型,类别 0 为背景,类别 1 为 C1……类别 7 为 C7,类别 8 为 C1-C7 以外的任何骨骼。
我用它预测了整个数据集,以将骨骼分配给切片。
我在切片上训练了一个 Unet-B1 分割模型(权重并非来自矢状位模型),这次是在轴向视图上,同样有 8 个类别。
我预测了整个数据集,并获得了每个切片的 ROI 边界框。
在进入切片级分类之前,我们必须注意一个数据技巧,这使得这种方法成为可能,但被大多数人忽略了,这更多是一个假设,因为主办方尚未确认这一点:
每一个有骨折边界框标注的切片都是骨折的,而对于该特定患者,其他所有切片都是非骨折的……
现在,为了平衡数据集等等,长话短说,我将 train_bounding_boxes.csv 中的所有切片标记为 fractured=1,该患者的其他所有切片标记为 fractured=0,另外 280 名没有任何骨折的患者意味着他们的所有切片也是 fractured=0。
然后,我冒昧地通过删除所有标签为 0 或 8 的非骨折切片(在矢状位分割中较早提到)来清理数据。
现在我们有了一个包含 515 名患者和超过 100,000 个切片的数据集,其中只有约 7% 被标记为骨折。
我训练了一个二元分类 EfficientNet B5 模型,图像大小为 456x456。
我对切片使用了 2.5D 方法,将 [slice-1, slice, slice+1] 作为 3 个通道,裁剪骨骼 ROI 并完美调整了增强参数,我在增强方面做的有趣的事情是使用以下代码调整大小以保持纵横比:
A.Compose([
A.LongestMaxSize(CFG.SZ_H),
A.PadIfNeeded(CFG.SZ_H, CFG.SZ_W, border_mode=0, p=1),
])
现在输入看起来像这样,这张图像被标记为骨折:
通过这样做,我达到了 0.916 的切片级 AUC,然后我对数据集的其余部分进行了伪标签处理以达到超过 0.94 的 AUC。我在伪标签处理上尝试了许多不同的方法,最终大多数都达到了略高于 0.94 的 AUC,所以我不会详述我最终确定了哪种方式,因为不需要非常具体,需要记住的一点是,并非所有剩余的约 1500 名患者都适合作为伪标签,不要浪费资源对甚至没有骨折潜力的图像进行伪标签处理,你可以从比赛的 train.csv 文件中了解到这一点。
现在,在推理过程中预测患者的所有图像,然后使用此链接的方法并进行修改,我达到了 0.26 的公开分数,在私有榜单上得分为 0.27(虽然我的大多数其他 0.26 公开分数并没有这么稳健)。