HPA 比赛第二名方案 [red.ai]
HPA 比赛第二名方案 [red.ai]
作者: sheep (Grandmaster) | 团队: red.ai (第二名)
前言
按照承诺,我们将在24小时内分享详细的解决方案。我们要感谢主办方举办了这场精彩的比赛,因为我们所有人之前都没有处理弱监督分类问题的经验,我们从其他 Kagglers 的热心分享和自我探索中学到了很多。主办方在本次比赛中非常活跃,为你们点赞。我也非常感谢我的队友,是他们让我的 Kaggle Competition Grandmaster 之旅变得顺利且令人满意。说我兴奋不已都算是轻描淡写了。闲话少说,让我们深入探讨我们的解决方案。
摘要 (TLDR)
我们的解决方案总共由 3 个简单的流程组成。我们没有使用任何论文中的高级技术,但我们努力很好地理解数据,并根据问题陈述构建我们的模型架构。这是我们最终流程的图表:
流程 1:双分支细胞模型
- 动机: 双分支(头)细胞模型的设计方式是,它以细胞图块作为输入,但能够同时进行细胞级和图像级的预测。多任务学习已被证明在改善模型学习方面是有效的。Dota2 里的强力英雄 Jakiro 也有两个头。
- 损失公式: 由于输出分为细胞级和图像级,我们需要为这两个输出分别计算损失。最终损失是细胞级损失和图像级损失的加权和。我们对细胞级和图像级都使用了基本的 BCE 损失。对于细胞级,标签并不确定,因此分配较低的权重(=0.1)是直观的。公式为:
l = 0.1*loss_cell + loss_image
- 数据: 我们使用了原始数据、Phil 分享的外部数据以及通过 API 获取的一些稀有类别样本。单个细胞的输入大小为 256。
- 训练细节: 我们获取 4 通道图像并先裁剪和调整细胞大小;然后我们随机采样 N(=16)个细胞作为网络的输入。这些细胞被展平为一个大批次,然后输入 CNN 并进行反向传播。对于数据增强,我们使用了翻转、平移、旋转、缩放、畸变、亮度对比度和 cutout。大量的数据增强使模型能够更好地泛化,因为现实中的细胞可能呈现任何形态。我们训练了 5 折,每折 20 个 epoch。在单张 RTX3090 上训练单个模型(b3, 256)大约需要 30 小时。
- 推理: 对于每张图像,池化后的特征被连接并送入最后的线性层以进行细胞级预测。我们生成图像级预测和细胞级预测,并计算它们的乘积作为我们的最终预测。
- 结果: 采用 16xTTA(随机缩放、旋转、翻转)、256 尺寸细胞图块、N=16、集成 EfficientNet B3、B5、ResNet200d 和 SE_ResNext50 骨干网络,我们的模型在公共排行榜上得分为
0.550,在私有排行榜上得分为 0.550。这个单一架构可以在本次比赛中获得第二名。
流程 2:图像级模型
- 杂项: 图像级模型类似于上一届 HPA 比赛。我们输入整张图像并进行多标签分类。可能会让你惊讶的是,这个流程是用 fastai 开发的。我们发现 fastai 的许多实现非常慢