513. RSNA 2022 Cervical Spine Fracture Detection | rsna-2022-cervical-spine-fracture-detection
我不确定这是否值得写下来,但既然我们似乎做了一些不同的事情,而且并不是每个人都使用了边界框标注,我想我们可以分享一些见解。
硬件 - 3090ti - 感谢 UT 提供这个……也许与外面的其他硬件相比微不足道,但对于我个人现在老化的 1080tis 来说是一个巨大的升级(也要感谢加密货币崩盘让这成为可能 😊)
在 totalsegmentator 上预训练的 3D nnUnet。我最初对 3D 犹豫不决,主要是因为我以前从未训练过 3D 模型,而且我的电脑 32GB 内存总是因为超过一定大小的数据加载而出问题。我的队友 Yee 在 3D 方面展示了一些很好的成果,这最终激励我克服了这种恐惧。我还最终使用了一个名为 rising 的库(https://rising.readthedocs.io/en/stable/transforms.html),这让 GPU 上的增强变得更容易。我为它写了一个 3D 版本的 cutout(3D 黑色立方体),但除此之外,只是按原样使用该库进行标准的旋转和随机裁剪。
示例(输入、真实分割掩码、预测分割掩码)-
然后所有 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 通道分割掩码 - 红色是边界框,白色是如果为阳性的