672. RSNA Intracranial Aneurysm Detection | rsna-intracranial-aneurysm-detection
感谢 Kaggle 和 RSNA 举办这场激动人心的比赛。
这是一次很棒的学习经历,很有趣看到我的计算机视觉经验有多少可以应用到医学影像中。我对结果相当失望,但我将其视为向其他团队学习的机会。
对于每个切片 t,我结合切片 t-1 和 t+1 创建一个 3 通道图像,对应 [t-1, t, t+1]。
根据我的经验,仅使用分类标签 (train.csv) 不如结合分类和定位标签 (train_localizers.csv) 准确。因此,基于主办方在 train_localizers.csv 中提供的标签,对于每个动脉瘤质心,我在 ±10 个相邻切片内搜索,并使用 LabelImg 手动标注动脉瘤的边界框。
此过程不需要专门的医学知识,因为动脉瘤质心已经提供。
2 个类别:aneurysm (模态 CTA, MRA, MRI T1post) 和 aneurysm_mri_t2 (模态 MRI T2)。
然后我使用 YOLOv11x 1280 训练了 5 个模型 (5 折):
| 指标 | Fold 0 | Fold 1 | Fold 2 | Fold 3 | Fold 4 |
|---|---|---|---|---|---|
| mAP50 | 0.705 | 0.647 | 0.766 | 0.702 | 0.691 |
| mAP50-95 | 0.460 | 0.429 | 0.504 | 0.482 | 0.449 |
对于训练集中的每个 SeriesInstanceUID,我通过平均所有切片生成单张图像。
然后,我手动标注大脑边界框,分为以下 2 类:brain (轴位视图中的大脑) 和 abnormal (其他视图中的大脑)。系列中的每个切片将根据此模型预测的边界框进行裁剪。这减少了背景噪声(尤其是包含肺部区域的切片……),使模型的准确率提高了约 0.03-0.05。
然后我使用 yolov5n 640 训练了 1 个模型:mAP50-95 = 0.948
train_transform = albu.Compose([
albu.RandomResizedCrop(size=(self.image_size, self.image_size), scale=(0.5, 1.0), ratio=(0.75, 1.3333), p=1),
albu.ShiftScaleRotate(rotate_limit=15, border_mode=0, p=0.5),
albu.OneOf([
albu.MotionBlur(blur_limit=5),
albu.MedianBlur(blur_limit=5),
albu.GaussianBlur(blur_limit=5),
albu.GaussNoise(var_limit=(5.0, 30.0)),
], p=0.5),
albu.CLAHE(clip_limit=4.0, p=0.5),
albu.HueSaturationValue(p=0.5),
albu.RandomBrightnessContrast(p=0.5),
val_transform = albu.Compose([
albu.Resize(self.image_size, self.image_size),
])
水平翻转: 这听起来可能不合理,但我对图像应用了水平翻转,并调整了标签如下:
左床突下颈内动脉 <-> 右床突下颈内动脉
左床突上颈内动脉 <-> 右床突上颈内动脉
左大脑中动脉 <-> 右大脑中动脉
左大脑前动脉 <-> 右大脑前动脉
左后交通动脉 <-> 右后交通动脉
这奏效了,我的模型准确率提高了约 0.01。
2 个多标签分类模型 (14 类),图像大小=384,在此比赛数据集上训练。对于阴性系列,我使用所有切片,而对于阳性系列,我只使用包含动脉瘤框的切片(如第 2 节所述)。每个切片的标签与 train.csv 中的系列标签相同。
vit large 384: OOF AUC = 0.8503
eva large 384: OOF AUC = 0.8551
由于时间限制,我无法使用 5 个模型 (5 折) 进行预测。我只能使用在几乎完整数据集上训练的单模型,仅使用 50 个系列进行评估,并根据公共排行榜选择最佳 epoch。
1 个模型 (mit b4 fpn),图像大小 = 384,在 RSNA 数据集上训练。与 exp2 类似,对于阴性系列我使用所有切片,而对于阳性系列我只使用包含动脉瘤框的切片。每个切片的标签与 train.csv 中的系列标签相同。对于提交,我只使用了分类任务的预测。为了创建分割任务的掩码,我使用动脉瘤边界框 (2)。
mit-b4 FPN : OOF AUC = 0.8549
我使用了比赛数据集和 2 个外部数据集:
Lausanne_TOFMRA: 链接
Royal_Brisbane_TOFMRA: 链接
对于外部数据,我使用 2 个模型的预测 (vit large exp2 + mit b4 exp3) 生成系列标签,并使用模型 exp0-动脉瘤检测的预测生成定位标签。
对于训练集中 'Aneurysm Present' 预测分数 (2 个模型 vit large exp2 + mit b4 exp3) > 0.9 的阴性系列,我将其更改为阳性,并使用模型 exp0-动脉瘤检测创建定位标签。
2 个分类模型在清洗后的 RSNA 数据集 (8) 和外部数据集 (Lausanne_TOFMRA + Royal_Brisbane_TOFMRA) 伪标签 (7) 上训练。
vit large 384: OOF AUC = 0.8558
eva large 384: OOF AUC = 0.8579
1 个模型 (mit b4 fpn),图像大小 = 384,在清洗后的 RSNA 数据集 (8) 和外部数据集 (Lausanne_TOFMRA + Royal_Brisbane_TOFMRA) 伪标签 (7) 上训练。
mit-b4 FPN 384: OOF AUC = 0.8629
最终提交是 6 个模型的集成:
Final1: OOF AUC = 0.8823, 公共排行榜 = 0.89
Final2: OOF AUC = 0.8767, 公共排行榜 = 0.89