672. RSNA Intracranial Aneurysm Detection | rsna-intracranial-aneurysm-detection
祝贺所有获奖者!感谢组织者举办如此有趣的比赛。这真的很难,但我非常享受。在这里分享我的解决方案。
我的解决方案包含 4 个阶段:
我使用了 dicom2nifti 将 dicom 文件转换为 nifti 文件,因为 TotalSegmentator 使用这个库。
我编写了一个自定义版本,将 train_localizers.csv 中的坐标和帧索引转换为与 nifti 文件对齐的新坐标。
我使用 TotalSegmentator 为所有扫描生成脑掩膜。
奇怪的是,某些 CT 扫描由 TotalSegmentator MRI 生成的脑掩膜比 TotalSegmentator CT 生成的更好。因此,我为每个扫描生成了 2 个脑掩膜,并选择了像素更多的那个。
我还过滤掉了小于 100 万像素的小掩膜。最终,我得到了 4386 个脑掩膜。
我训练了一个 3D Unet 来分割大脑。训练代码是复现自 Qishen Ha 的 RSNA2022 解决方案。
我首先使用 Zenodo 上的 CT 和 MRI 扫描对模型进行预训练,这是用于训练 TotalSegmentator 的训练数据的子集。然后,我使用 4386 个脑掩膜训练模型。模型采用 5 折训练。输入大小为 (128, 128, 128)。
我使用训练好的 3D Unet 为所有扫描生成脑掩膜并裁剪 ROI 区域。裁剪参数根据 CoWSeg 和 train_localizers.csv 进行调整,以确保裁剪区域包含 CoW 区域。
与其他竞争者不同,我没有成功训练出一个好的 3D CoW 分割模型。相反,我训练了一个带有分类头的 2.5D CoW 分割模型。该模型的目的是提取位置特征输入到最终的 RNN 模型中。根据我在 RSNA2022 的经验,位置特征提升了 CV。因此,虽然 2.5D 模型的分割损失甚至更差 (dice=0.56),但提取的特征仍然有用。
训练代码是复现自 UWMGI 的 这个惊人的 notebook。我使用的骨干网络是 tf_efficientnetv2_b0.in1k (图像大小=224)。
此外,使用来自 CoW 分割模型的 OOF 分类 logits(如同阶段 1),我过滤掉了不包含 CoW 区域的切片。
类似于 CoW 分割模型,我训练了一个带有分类头和关键点头的 2.5D 动脉瘤模型来提取特征。
成功训练此模型的关键如下:
我在这一阶段使用的骨干网络:
全数据训练使用了不同版本的数据集,硬负样本图像较少。我首先训练了一个 5 折模型,并记录了最佳 CV 的 epoch 以计算全数据训练的总训练步数。
我为每个动脉瘤模型训练了 4 种类型的 RNN 模型。模型开始很快过拟合,因此使用 EMA 和重度 mixup (mixup ratio=0.5) 来正则化训练。
对于 5 折 Coatnet:
对于 5 折 Efficientnet:
对于全数据训练 Coatnet:
这些 RNN 的集成达到了 auc=0.8909,并通过使用 OOF logits 进行自蒸馏,另一个提交达到了 auc=0.9035
为了最大化推理速度,我使用 Monai 在 GPU 上预处理图像。我使用了 2 块 T4 显卡,并将患者体积分成 2 部分以并行化 2.5D 模型的推理。对于 RNN 模型,我只是将模型分成 2 组并在 2 块 GPU 上并行运行。这就是我如何在 12 小时内完成 11 个动脉瘤模型和 45 个 RNN 模型的推理。
我在最后几天遇到了超时问题。希望 Kaggle 能修复新的评估框架。