返回列表

14th place solution

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

开始: 2022-07-28 结束: 2022-10-27 医学影像分析 数据算法赛
第14名解决方案

第14名解决方案

作者: Jesse (专家) | 团队: UTSW | 排名: 第14名

我不确定这是否值得写下来,但既然我们似乎做了一些不同的事情,而且并不是每个人都使用了边界框标注,我想我们可以分享一些见解。

硬件 - 3090ti - 感谢 UT 提供这个……也许与外面的其他硬件相比微不足道,但对于我个人现在老化的 1080tis 来说是一个巨大的升级(也要感谢加密货币崩盘让这成为可能 😊)

第一阶段 -

在 totalsegmentator 上预训练的 3D nnUnet。我最初对 3D 犹豫不决,主要是因为我以前从未训练过 3D 模型,而且我的电脑 32GB 内存总是因为超过一定大小的数据加载而出问题。我的队友 Yee 在 3D 方面展示了一些很好的成果,这最终激励我克服了这种恐惧。我还最终使用了一个名为 rising 的库(https://rising.readthedocs.io/en/stable/transforms.html),这让 GPU 上的增强变得更容易。我为它写了一个 3D 版本的 cutout(3D 黑色立方体),但除此之外,只是按原样使用该库进行标准的旋转和随机裁剪。

  • 在 87 个分割案例上训练以预测 C1-C7
  • 训练了约 12 小时(400 个 epoch)
  • 输入 1x192x192x192
  • 修改为输出 7x192x192x192;
  • DICE + BCE 损失;DSC 为 0.95
  • 这给了我们最好的分割结果

示例(输入、真实分割掩码、预测分割掩码)-

分割示例

然后所有 2019 个案例都用分割结果进行了伪标注。颈椎总体积被裁剪为仅包含 C1-C7。

第二阶段 -

Unet-CNN 2.5D(EffB7 noisy student 主干),模型来自 SMP。图像调整为 448x448。轴向切片堆叠为 3 层,还有一个通道用于提供层级信息(通道索引除以 8,所以 C1 是 0.125,C2 是 0.25 等)。所以 CNN 输入是 4x448x448。分割输出是 2 个通道,用于 2 个独立的任务(如下)。从 Unet 中间提取了 512 维的辅助嵌入用于额外的 3 个任务。

任务 1 - 一个分割通道用于预测边界框(作为分割图),简单的 BCE,pos_weight 为 7。

任务 2 - 第二个分割通道用于预测边界框和椎体分割掩码的交集(如果根据案例的真实标签为阳性),使用 DICE + BCE(pos_weight 2)训练 - 见下图示例。

任务 3 - 辅助嵌入(512 层)输出到 1 维线性头以预测骨折 vs 无骨折,基于切片是否存在边界框。由于只有约 50% 的阳性案例标注了边界框,我们不得不排除约 250 个案例。所有来自骨折阴性案例的切片(约 1000 个案例),加上切片上没有边界框的阳性案例,仍可用作骨折阴性。我们打算训练几个边界框模型来伪标注剩下的 250 个案例,但最终在尝试其他事情上浪费了时间。BCE 损失,pos_weight 2。

任务 4 - 辅助嵌入(512 层)输出到 7 维线性头以预测切片中椎体的比例。我们将其阈值设为 1000,不确定这是否有影响。所以如果有 2000 个 C5 像素和 3000 个 C6 像素以及 500 个 C7 像素,真实标签是 [0,0,0,0,1,1,0.5] BCE 损失,pos_weight 7。

任务 5 - 辅助嵌入(512 层)输出到 7 维线性头以预测层级骨折 vs 无骨折,这是由边界框存在、层级存在决定的,并且也通过像素值进行了弱阈值处理。BCE 损失,pos_weight 7。

示例(来自 3 个切片的 3 通道输入、单通道层级分割掩码、真实 2 通道分割掩码、预测 2 通道分割掩码 - 红色是边界框,白色是如果为阳性的

同比赛其他方案