第23名方案
第23名方案
作者: Ahmed Samir (专家) | 团队成员: Kolya Forrat (大师), Artem Toporov (大师)
发布时间: 2022-07-15
首先,我要感谢我的队友 @kolyaforrat 和 @artemtprv。他们非常乐于助人且友好,在我们合并后的短短时间内,我从他们身上学到了很多东西。
我们的最终解决方案是 2.5D 模型和 3D 模型的融合。
2.5D 方法
使用混合精度训练,在通过分层分组分割的训练集的 5 个折上训练了 5 个模型。
- 架构: Unet++
- 主干网络: regnety_160(使用 ImageNet 权重)
- 数据: (-2, 0,+2) 2.5D 切片 - (192, 192) 随机裁剪自 (320, 384) 填充切片,并使用 MixUp
- 增强: 水平翻转、弹性变换、网格畸变、平移缩放旋转、粗粒度丢弃、随机亮度对比度、随机 Gamma、锐化
- 损失函数: Unet++ 架构上四层的深度监督损失 (2*Dice + 3*Focal + BCE)
- 轮数: 100
- 优化器: Adam
- 学习率: 6e-3,采用 one cycle 策略
- 推理: TTA(仅水平翻转)以及最小的后处理,移除任何不包含注释的切片的预测
我没有太关注后处理策略或训练采样策略,事后看来,我本应该关注的。但无论如何,我的流程就是这么简单,单个模型在公共 LB 上达到了 0.883,5 折达到了 0.884。
注意事项
- 使用更大的裁剪进行训练并没有提高性能,只是增加了训练时间
- 深度监督损失在流程中起到了关键作用,显著改善了本地 CV 和公共 LB 分数(0.865 → 0.878)
- MixUp 帮助突破了本地 CV 和公共 LB 指标分数的瓶颈(0.878 → 0.883)
- RandomResizedCrops 效果不如普通的 RandomCrops
- 在 RTX 5000 上训练一折的最终流程大约需要 12 小时。
3D 流程
我们使用了 MONAI Unet 多标签模型。3 折 + 全量训练
- 通道数: (56, 112, 224, 448, 896)
- 损失函数: DiceLoss
- 优化器: AdamW
- 学习率模式: 每 100 个 epoch 进行 warmup_restart
在原始数据上进行训练,随机裁剪尺寸为 160, 160, 80
对整个 case_day 进行推理,长度 =80;对于长度 =144 的情况,将其裁剪为 124,并使用滑动窗口进行 3 次独立推理,步长 =20,roi_size=(288,288,80),重叠率 =0.9
增强:
RandFlipd, RandAffined, RandGridDistortiond, RandScaleIntensityd, RandShiftIntensity
在 3D 模型中无效的方法:
- 深度监督损失
- MixUp
- 数据清洗
- 对低指标样本进行伪标签标记
- 仅针对每种尺寸在训练集中有掩码的区域进行训练
后处理方面,我们使用了一些技术:
- 删除不可能项: 删除训练集中没有任何掩码的所有切片
- 填充缺失项: 如果 s-1 和 s+1 非空,则通过最近邻填充切片
- 聚类: 在训练集中,每个掩码出现在某个切片上并在另一个切片上消失。我们为每个 case_day 找到了最大的簇,并删除不在簇中的所有内容
- 删除最后 N 个: 删除 Z 维 = 144 和 80 的 case_days 的最后 n、m 个掩码。最佳值 m = n = 2