返回列表

[6th place] Solution Overview: 3D CNN + TD-CNN

513. RSNA 2022 Cervical Spine Fracture Detection | rsna-2022-cervical-spine-fracture-detection

开始: 2022-07-28 结束: 2022-10-27 医学影像分析 数据算法赛
[第6名] 解决方案概述:3D CNN + TD-CNN

[第6名] 解决方案概述:3D CNN + TD-CNN

作者:Ian Pan (Grandmaster)
比赛:RSNA 2022 Cervical Spine Fracture Detection

感谢主办方组织了这场有趣的比赛,也祝贺所有参赛者的努力。我很高兴在 Private LB 上没有出现排名大幅波动。成为 Grandmaster 后,我的目标之一是用少于10次提交赢得金牌,我很高兴在这个挑战中实现了这一点。以下是我的解决方案简要概述。

摘要

  • 3D 颈椎分割
  • 单个椎骨提取
  • 第一阶段模型:用于椎骨级骨折分类的 3D CNN 和 TD-CNN
  • 第二阶段模型:使用从第一阶段模型提取的特征进行最终检查级分类的 Transformers

分割

我使用了带有 X3D 3D CNN 主干网络的 3D DeepLabV3+ 编码器-解码器架构(链接),在 192x192x192 分辨率下进行训练,以生成 C1-C7 的分割掩码。

模型首先在组织者提供的 87 个语义分割标签上进行训练。然后,我用这些模型对其余的研究进行伪标签标记,并在整个数据集上重新训练。

利用分割模型的输出,可以提取包含感兴趣椎骨的立方体。不可避免地,由于扫描中椎骨的方向,会与其他椎骨层面发生一些重叠。

第一阶段:3D CNN

为每个椎骨提取一个立方体后,我训练了一个 X3D-L 3D CNN 来对每个层面进行二元骨折分类。将每个椎骨映射到二元标签非常简单,因为我们为每项研究提供了骨折层面。每个椎骨的输入大小为 64x288x288。我还修改了模型,使所有层的 z-stride 为 1。因此,第一维度(64)直到最终池化之前都没有被下采样。

训练 3D 分类模型后,从每个椎骨提取特征(432维)。因此,每项研究由一个 7x432 的序列表示。

第二阶段:TD-CNN

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,为数据集中的每张图像生成伪标签。我没有使用提供的图像级标签进行训练。

分步训练如下:

  • 1) 在伪标签(288x288)上将 2D CNN 特征提取器作为二元分类器进行训练
  • 2) 添加 Transformer 头,冻结特征提取器,训练头
  • 3) 端到端微调整个模型(32x288x288)

与 3D CNN 模型类似,训练后为每个椎骨提取一个特征(256维),从而为每个椎骨生成一个 7x256 的序列。

第二阶段:Transformers

现在我们已经基本上将每项研究转换为一个序列,我们可以使用 Transformers 对最终输出(C1-C7 骨折和整体骨折)进行建模。

我使用了一个 3 层 Transformer,并在 3 个单独的输入上进行了训练:

  • 1) 来自 3D CNN 的 7x432 输入(5折 CV:0.3205)
同比赛其他方案