第31名解决方案(含GitHub代码)
第31名解决方案(含GitHub代码)
团队: [ods.ai] stainless
成员: Insaf Ashrapov, Igor Krashenyi, Pavel Pleskov, Anton Zakharenkov, Nikolai Popov
模型
我们尝试了 qubvel 分割模型库中的几乎所有模型类型——包括 UNet、FPN、PSPNet,编码器从 ResNet 到 SENet152 不等。其中,带有 SE-ResNeXt50 编码器的 FPN 表现优于其他模型。较轻量的模型(如 ResNet34)表现虽然不够好,但在最终的模型融合中很有用。如果有更多的时间进行训练,SE-ResNeXt101 的表现可能会好得多,但我们没有对此进行测试。
数据增强与预处理
来自 Albumentations 库:
使用了水平翻转、垂直翻转、随机亮度对比度——由于训练速度不是很快,这些基础增强的效果已经足够好了。此外,我们在训练时使用了大尺寸的裁剪,或者在完整图像尺寸上进行微调,因为图像任务中的注意力机制模块在训练和推理阶段依赖于相同的输入尺寸。
训练
- 我们同时使用了纯 PyTorch 和 Catalyst 框架进行训练。
- 损失函数: BCE 和 BCE+Dice 的表现相当不错,但在验证集和 Public LB 分数上,Lovasz 损失明显优于它们。然而,与分类模型结合使用时,BCE+Dice 给出了更好的结果,这可能是因为 Lovasz 损失帮助模型过滤掉了假阳性掩码。由于标签质量不是很好,Focal Loss 的表现相当差。
- 优化器: Adam 配合 RAdam。LookAHead 和 Over9000 效果不佳,未被采用。
- 带有掩码的裁剪,以及 Catalyst 库中上采样模式下的 BalanceClassSampler 显著提高了训练速度。梯度累积也同样有效。
- 我们尝试了自己的分类模型(带有 CBAM 的 ResNet34),目标是提高每个类别的 F1 分数。最佳阈值令人失望地不稳定,但我们达到了平均 95.1+ 的 F1 分数。最终,我们使用了 Cheng 的分类方法。
- 验证: 10 折交叉验证(10-fold)。尽管存在排名波动,但本地、Public 和 Private 分数的相关性好得惊人。
- 伪标签: 我们进行了两轮伪标签训练,即在最好的 Public 提交结果上训练,并在 Out-of-Fold 上验证。第三次尝试没有成功,但前两轮带来了巨大的提升。
- 后处理: 填充孔洞,通过阈值移除小掩码。我们尝试通过连通分量移除小物体,但没有带来提升。
- 硬件: 一堆 NVIDIA 显卡。
模型集成
简单的分割模型平均,使用不同的编码器,将 FPN 和 UNet 应用于被分类为有掩码的图像。其中一个未被选中的提交本可以让我们获得第 16 名。