返回列表

5th place solution

535. RSNA Screening Mammography Breast Cancer Detection | rsna-breast-cancer-detection

开始: 2022-11-28 结束: 2023-02-27 医学影像分析 数据算法赛
第5名解决方案

第5名解决方案

作者: NguyenThanhNhan (Grandmaster)
比赛: RSNA Breast Cancer Detection

恭喜所有获奖者和新晋竞赛 Grandmaster。感谢 Kaggle 团队、竞赛主办方以及所有积极参与论坛讨论的 Kagglers。我们团队的部分解决方案灵感来自于阅读大家慷慨分享的想法 💯

我对其他获奖团队的解决方案印象深刻,特别是那些使用多图像、多视角模型的方案。我们团队未能通过这些架构获得好的分数,因此选择了一条更简单的路线。
我们最终的提交是基于 10 个单图像模型的平均聚合结果(5 折交叉验证 × 2 个主干网络,分别为 efficientnetv2_s 和 efficientnet_b5_ns)。

训练过程

训练过程分为两个阶段:

  1. 在 VinDR 数据上进行预训练
  2. 在 Kaggle + DDSM 数据上进行微调

预处理

所有 Kaggle 数据和外部数据都进行了类似的预处理:

  • 原始图像调整大小,长边为 1536
  • 训练 YOLOX(输入尺寸 640x640)以推断乳腺边界框
  • 裁剪乳腺区域,然后调整大小至 1536x1024

预训练

我们将 VinDR 的病灶边界框标注转换为每张图像的多个病灶标签,同时舍弃了坐标。随后,两个主干网络进行了为期 20 个 epoch 的多任务预训练,任务包括 BI-RADS 分类、乳腺密度分类和病灶分类。

model = timm.create_model(backbone_name)
model.reset_classifier(0, "")
model.birads_fc = nn.Linear(model.num_features, 5)
model.density_fc = nn.Linear(model.num_features, 4)
model.lesions_fc = nn.Linear(model.num_features,  11)

...

loss = cross_entropy(birads_logits, birads_labels) + cross_entropy(density_logits, density_labels) + binary_cross_entropy(lesions_logits, lesions_labels)

微调

我们加载了第一阶段的最后一个 epoch 的检查点,并在 Kaggle+DDSM 数据上继续微调模型 10 个 epoch。确切的架构可以在我们的推理 notebook 中找到。这是一个深度监督模型,在 EffNet 的早期块上具有辅助损失。

由于数据极度不平衡,有许多重要的技巧对微调部分有很大帮助:

  • 平衡批次采样器。最佳比例在不同模型之间差异很大。
    • efficientnetv2_s:1 个正样本 - 7 个负样本。
    • efficientnet_b5:1 个正样本 - 3 个负样本。
  • 数据增强
    • 乳腺区域的平移、缩放、旋转
    • 水平翻转 / 垂直翻转 / 亮度对比度调整
    • CoarseDropout
  • 简单的 BCE 损失效果最好。加权 BCE 和 Focal Loss 效果差得多,或者导致发散。

对我们无效的方法

  • 针对每侧乳房,我们通过不同模型聚合图像概率并计算平均值、最小值、最大值概率。将这些与图像的嵌入拼接并输入到 xgboost/MLP 中。
  • 多图像 Transformer
  • MVCCL 模型
同比赛其他方案