513. RSNA 2022 Cervical Spine Fracture Detection | rsna-2022-cervical-spine-fracture-detection
感谢主办方组织了这场有趣的比赛,也祝贺所有参赛者的努力。我很高兴在 Private LB 上没有出现排名大幅波动。成为 Grandmaster 后,我的目标之一是用少于10次提交赢得金牌,我很高兴在这个挑战中实现了这一点。以下是我的解决方案简要概述。
我使用了带有 X3D 3D CNN 主干网络的 3D DeepLabV3+ 编码器-解码器架构(链接),在 192x192x192 分辨率下进行训练,以生成 C1-C7 的分割掩码。
模型首先在组织者提供的 87 个语义分割标签上进行训练。然后,我用这些模型对其余的研究进行伪标签标记,并在整个数据集上重新训练。
利用分割模型的输出,可以提取包含感兴趣椎骨的立方体。不可避免地,由于扫描中椎骨的方向,会与其他椎骨层面发生一些重叠。
为每个椎骨提取一个立方体后,我训练了一个 X3D-L 3D CNN 来对每个层面进行二元骨折分类。将每个椎骨映射到二元标签非常简单,因为我们为每项研究提供了骨折层面。每个椎骨的输入大小为 64x288x288。我还修改了模型,使所有层的 z-stride 为 1。因此,第一维度(64)直到最终池化之前都没有被下采样。
训练 3D 分类模型后,从每个椎骨提取特征(432维)。因此,每项研究由一个 7x432 的序列表示。
TD-CNN 只是一个带有序列模型头的 2D CNN 特征提取器。在我的例子中,我使用了一个 2 层 Transformer。对于给定的体积 NxHxW,2D CNN 为体积中的每张单独图像(HxW)提取 D 维特征,然后将其输入(NxD)到序列模型头。最终,模型进行端到端训练。
我分三部分训练了这个模型。首先,我训练了一个 TF-EfficientNetV2-S 模型作为 2D CNN 特征提取器。
为了训练这个模型,我需要图像级标签。虽然数据集的一个子集确实有这些标签,但我能够通过一种我称之为“类激活序列”的方法对整个数据集进行伪标签标记。
使用 3D CNN 骨折分类模型,我可以通过移除池化层和分类层,然后使用分类层权重获得 3D 特征图的加权平均值,从而为每个椎骨生成 3D 类激活图。对于 3D 特征图中的每张 z 轴图像,取最大值,将 3D 特征图转换为一维序列。然后将该序列重新缩放到 [0, 1],并重新采样回原始切片数,以便每个切片对应一个值。
例如:(64, 288, 288) -> (432, 64, 9, 9) -> (64, 9, 9) -> (64, ) -> (原始切片数, )
因为一个椎骨级输入通常包含不止一个层面,这些序列之间存在重叠。为了解决这个问题,我只是取了重叠值的平均值。
我将数值阈值设为 0.5,为数据集中的每张图像生成伪标签。我没有使用提供的图像级标签进行训练。
分步训练如下:
与 3D CNN 模型类似,训练后为每个椎骨提取一个特征(256维),从而为每个椎骨生成一个 7x256 的序列。
现在我们已经基本上将每项研究转换为一个序列,我们可以使用 Transformers 对最终输出(C1-C7 骨折和整体骨折)进行建模。
我使用了一个 3 层 Transformer,并在 3 个单独的输入上进行了训练: