[第8名] 解决方案概述 + 代码
[第8名] 解决方案概述 + 代码
作者: Ian Pan (Grandmaster), Felipe Kitamura (Master)
比赛: SIIM-ACR Pneumothorax Segmentation
祝贺所有的获奖者和参与者。
@felipekitamura 和我很高兴分享我们的解决方案。
核心方法
- 数据划分: 保留10%用于集成,剩余90%进行10折交叉验证(CV),按气胸大小进行分层。
- 架构: DeepLabV3+
- 主干网络: 带有组归化的 ResNet50/101 和 ResNeXt50/101。
- 损失函数: 加权 BCE(在所有图像上训练)或软 Dice(仅在正样本上训练)。
- 优化器: 原始 SGD,动量 0.9。
- 训练设置: 批大小为4,分辨率 1024 x 1024;以及批大小为1,分辨率 1280 x 1280 用于纯分割(未在第二阶段重新训练)。
- 学习率策略: 余弦退火,100个周期,5个快照,初始学习率从 0.01 到 0.0001。
模型集成
- 总共12个模型(每个模型x3个快照)。
- 4个模型仅在正样本上训练,使用软 Dice 损失。
- 8个模型在所有图像上训练,使用加权 BCE 损失。
- 我使用了在所有图像上训练的4个模型作为“分类器”:
- 取最大像素值作为分类得分,并在4个模型上取平均。
- 将仅在正样本上训练的4个模型的像素级得分乘以该分类得分,然后取平均。
- 最终集成:将上述相乘后的得分与基于其他在所有图像上训练的4/8个模型的像素级得分进行平均。
- 使用了水平翻转(Hflip)测试时增强(TTA)。
后处理
- 移除总掩码大小小于 2048 或 4096 像素的图像。
无效尝试与心得
- 与 Felipe 的模型集成: 他使用 Unet 和 EfficientNetB4 内核在 512 x 512 分辨率下训练(软 Dice 损失,所有图像)达到了 0.8750 分。我们无法正确集成我们的模型,最终放弃了他的模型,转而使用我稍微好一点的集成结果。
- 架构尝试: 我个人尝试了较低的分辨率以及 Unet、LinkNet、PSPNet、EncNet、HRNet 等架构。效果都不如 DeepLab 在 1024 x 1024 分辨率下的表现。
- 全图分类器: 效果不如分割模型。
- 优化器: SGD 效果优于 Adam 和 Adabound。
- 技巧: 水平翻转 TTA + 移除小掩码有帮助。
- 损失函数: 加权 BCE 损失对我来说最稳定,Lovasz 和软 Dice 不稳定或根本不收敛。
成绩得分
| 阶段 |
得分 |
备注 |
| 本地验证 |
0.8737 |
- |
| 第一阶段公榜 |
0.8780 |
移除 4096 像素 |
| 第二阶段私榜 |
0.8627 |
移除 2048 像素
|