返回列表

18th place solution

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

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

第18名方案

作者: Naoki Kato
比赛排名: 18th

感谢 Kaggle、主办方和参赛者举办了这场有意义的比赛。

在下文中,我想简要总结一下我的解决方案。

概述

与许多公开代码类似,我的流程如下:

  1. 检测每张图像的乳腺区域并裁剪该区域
  2. 使用各种主干网络进行图像级别的癌症预测
  3. 聚合图像级别的预测结果并应用阈值处理,以获得每个目标的最终预测

预处理

我的预处理依赖于许多公开代码。我非常感谢这些代码的作者。

根据 DICOM 数据中的 VOILUTFunctionWindowCenterWindowWidth 应用 Sigmoid/线性窗宽窗位处理。在窗宽窗位处理后,图像经过最小-最大缩放处理,并被视为 8 位图像。

乳腺检测器

我为大约 1000 张图像标注了乳腺边界框。除了这些标签外,我还使用了 @remekkinas这段代码 中提供的标签(约 500 张图像),以输入尺寸 1024 训练了一个 YOLOv5n6 模型。验证集的 mAP_0.5:0.95 为 0.952。

在获得检测结果后,应用仿射变换以获得固定尺寸的裁剪图像。

当时,扩展边界框使得边界框相对于原始图像的纵横比和大小不会发生太大变化,这在一定程度上提高了本地 CV 分数。

然而,私有 LB 分数最高的提交并没有使用检测器……

癌症模型

我在最终提交的集成中使用了 timm 库中的 tf_efficientnet_b3.ns_jft_in1ktf_efficientnetv2_s.in21keca_nfnet_l1dm_nfnet_f0。每个模型使用不同的输入尺寸(800×1200 到 1024×1536)、学习率和训练轮数进行训练。

全局池化使用了固定 p 值的 GeM 池化。

数据增强

我使用了以下通过 imgaug 实现的数据增强列表。

iaa.Sometimes(
    0.5,
    iaa.Affine(
        rotate=(-15, 15),
        shear=(-3, 3),
        scale={'x': scale_x, 'y': scale_y},
        translate_percent={'x': shift_x, 'y': shift_y},
    ),
),
iaa.Resize({"width": image_size[0], "height": image_size[1]},
           interpolation=cv2.INTER_LINEAR),
iaa.Fliplr(0.5),
iaa.Flipud(0.1 if row['view'] == 'CC' else 0.01),
iaa.Sequential([
    iaa.Sometimes(0.1, iaa.SomeOf(1, [
        iaa.GaussianBlur(sigma=(0, 1.5)),
        iaa.AdditiveGaussianNoise(scale=(1.0, 4.0)),
    ])),
    iaa.Sometimes(0.3, iaa.Multiply((0.95, 1.05))),
    iaa.Sometimes(0.3, iaa.LinearContrast((0.90, 1.10))),
], random_order=True),

训练设置

我对正样本应用了 BCE 损失,对负样本应用了 Focal 损失,因为我认为正确识别困难负样本将有助于提高 pF1 分数。

作为辅助损失,采用了用于分类浸润性癌症的 Focal 损失。

为了缓解过拟合,我采用了带有预热 的模型权重指数移动平均 (EMA),其中衰减率为 1 + t / 10 + t,t 为训练迭代次数。

最终模型权重是通过平均正常训练的权重和在验证集上具有最高 pF1 的 EMA 权重获得的。

其他训练设置如下:

  • 优化器:AdamW,权重衰减为 1e-3
  • 调度器:OneCycleLR
  • 根据主干网络的不同,训练 6~8 个轮次

后处理

  • 翻转测试 被用作 T
同比赛其他方案