535. RSNA Screening Mammography Breast Cancer Detection | rsna-breast-cancer-detection
感谢 Kaggle、主办方和参赛者举办了这场有意义的比赛。
在下文中,我想简要总结一下我的解决方案。
与许多公开代码类似,我的流程如下:
我的预处理依赖于许多公开代码。我非常感谢这些代码的作者。
根据 DICOM 数据中的 VOILUTFunction、WindowCenter 和 WindowWidth 应用 Sigmoid/线性窗宽窗位处理。在窗宽窗位处理后,图像经过最小-最大缩放处理,并被视为 8 位图像。
我为大约 1000 张图像标注了乳腺边界框。除了这些标签外,我还使用了 @remekkinas 在 这段代码 中提供的标签(约 500 张图像),以输入尺寸 1024 训练了一个 YOLOv5n6 模型。验证集的 mAP_0.5:0.95 为 0.952。
在获得检测结果后,应用仿射变换以获得固定尺寸的裁剪图像。
当时,扩展边界框使得边界框相对于原始图像的纵横比和大小不会发生太大变化,这在一定程度上提高了本地 CV 分数。
然而,私有 LB 分数最高的提交并没有使用检测器……
我在最终提交的集成中使用了 timm 库中的 tf_efficientnet_b3.ns_jft_in1k、tf_efficientnetv2_s.in21k、eca_nfnet_l1 和 dm_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 权重获得的。
其他训练设置如下: