第10名方案
第10名方案
作者: moritake04
比赛排名: 第10名
首先,我要感谢比赛主办方组织了这场比赛,也要感谢各位参赛者。
非常高兴能在 Kaggle 赢得我的第一枚金牌!
概述
我的模型是一个非常简单的单输入模型,流程也很简单。(所以我没指望能拿金牌。)
我的最终模型是以下3个模型的简单平均集成。(模型名称来自 timm)
- tf_efficientnetv2_s(无辅助损失)
- tf_efficientnetv2_s(使用辅助损失)
- maxvit_tiny_tf_384.in1k(使用辅助损失)
基线是我自己搭建的,但与 @vslaykovsky 的方案 类似,实际上我也参考了它。
解决方案
- 交叉验证策略
- StratifiedGroupKFold (n=4, groups=patient_id)
- 数据与预处理
- 未使用外部数据。
- 使用基于规则的方法进行 ROI 提取(参考:链接)。
- 使用 nvJPEG2000 实现快速加载(参考:链接)。
- 分辨率设置为:EfficientNet 为 1536x960,MaxViT 为 1536x768。
- 通道数设置为 3(为了使用预训练模型)。
- 应用了 Min-max 缩放 (-1.0 ~ 1.0)。
- 应用了 VOI LUT。
- 8 位深度。
- 注意确保训练和推理之间的预处理流程保持一致。
- 处理数据不平衡
- Batch size 为 8。调整每个 batch 中多数类(非癌症)与少数类(癌症)的比例为 7:1。这本质上是一种过采样。
- 数据增强
- 我使用了 albumentations(一个数据增强库)。
import albumentations as A
A.HorizontalFlip(p=0.5)
A.VerticalFlip(p=0.5)
A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.2, rotate_limit=45, p=0.8)
A.OneOf([
A.RandomGamma(gamma_limit=(50, 150), p=0.5),
A.RandomBrightnessContrast(brightness_limit=0.5, contrast_limit=0.5, p=0.5)
], p=0.5)
A.CoarseDropout(max_height=8, max_width=8, p=0.5)
- 模型参数
- drop_rate: 0.8
- drop_path_rate: 0.2
- criterion: BCEWithLogitsLoss
- optimizer: Adam (lr: 1.0e-4)
- scheduler: OneCycleLR (pct_start: 0.1, div_factor: 1.0e+3, max_lr: 1.0e-4)
- epoch: 5
- batch_size: 8 (accumulate_grad_batches=4, 所以实际为 8*4=32)
- fp16 (训练和推理)
- 辅助损失 (Aux loss)
- 辅助目标: site_id, laterality, view, implant, biopsy, invasive, BIRADS, density, difficult_negative_case, age