第一名解决方案
第一名解决方案
作者: DungNB (Grandmaster)
首先,我要感谢 Kaggle、SIIM、FISABIO 和 RSNA 举办了这场精彩的比赛,也要感谢所有在这里分享了精彩讨论和代码的人。祝贺所有的获胜者!
方案总结:
https://drive.google.com/file/d/1TaFsZKXfJVwVhognM3lNIxU7FpVCUltt/view?usp=sharing
交叉验证
按患者 ID 将训练集分为 5 折。
多任务分类 + 分割
- 使用 Chexpert + Chest14 数据集预训练编码器。
- 使用 RSNA 肺炎数据集训练分类(正常/肺炎)+ 分割(不透明框转掩码)。
- 使用 SIIM COVID 数据集训练分类(4 类:阴性、典型、不确定、非典型)+ 分割(框转掩码),加载 RSNA 肺炎检查点的权重。
- 预测 SIIM-COVID 测试集,使用 SIIM COVID 训练集 + 伪标签测试集训练模型,加载上一个检查点的权重。
- 数据增强:RandomResizedCrop, ShiftScaleRotate, HorizontalFlip, VerticalFlip, Blur, CLAHE, IAASharpen, IAAEmboss, RandomBrightnessContrast, Cutout。
- 衰减为 0.997 的指数移动平均 [LB 分数增加 +0.001~0.002]。
- 损失函数:辅助损失 = 0.6加权BCE + 0.4Dice,加权BCE的权重:0.2阴性 + 0.2典型 + 0.3不确定 + 0.3非典型,重点关注 2 个弱类(不确定和非典型)。[CV 和 LB 均增加约 0.002]。
- 优化器:Adam,初始学习率 0.0001。
- 学习率调度器:CosineAnnealingLR。
- 测试时增强(TTA):8TTA(原图、中心裁剪 80%)->缩放->(无、水平翻转、垂直翻转、水平+垂直翻转),8TTA 使 CV 和公共 LB 均增加 +0.003~0.004。在最终提交中,我使用肺部检测器模型代替中心裁剪 80%。
- 最终提交包含 4 个模型,具有不同的编码器、解码器和输入尺寸:
SeResnet152-Unet 512, EfficientnetB5-DeeplabV3+ 512, EfficientnetB6-Linknet 448, EfficientnetB7-Unet++ 512
加权融合:0.3[eb5/deeplabv3] + 0.2[eb6/linknet] + 0.2[eb7/unet++] + 0.3[sr152/unet]。
肺部检测器 - YoloV5
我使用 https://github.com/tzutalin/labelImg 工具标注了训练数据(6334 张图像),并利用边界框构建了一个肺部定位器。我注意到增加输入图像尺寸可以提高模型性能,肺部检测器有助于模型减少背景噪声。与简单的中心裁剪 80% 相比,单折肺部检测器使 LB 增加了 +0.003。
检测
使用加权框融合(IoU 0.6)集成 4 个模型(Yolov5X6 输入尺寸 768 + EfficientDet D7 输入尺寸 768 + FasterRNN FPN resnet101 输入尺寸 1024 + FasterRNN FPN resnet200 输入尺寸 768)。
- 使用 Chexpert + Chest14 预训练 FasterRCNN FPN 的主干网络。
- 使用 RSNA 肺炎框训练模型。
- 使用 SIIM COVID 训练集训练模型,加载 RSNA 检查点的权重。
- 预测 SIIM COVID 测试集 + 外部数据集(padchest, pneumothorax + vin)。
保留满足条件的图像:阴性预测 < 0.3 且(典型、不确定、非典型)最大预测值 > 0.7。然后为每张图像选择置信度最高的 2 个框作为伪标签。
- 使用 RSNA 肺炎标签 + 外部伪标签(SIIM COVID 测试集 + padchest, pneumothorax + vin)训练模型。
- 使用 SIIM COVID 训练集训练模型,加载伪标签阶段检查点的权重。
- 数据增强:Scale, RandomResizedCrop, Rotate(maximum 10 degrees), HorizontalFlip, VerticalFlip, Blur, CLAHE, IAASharpen, IAAEmboss, RandomBrightnessContrast,