第8名解决方案(含代码 - 最小版本)
第8名解决方案(含代码 - 最小版本)
作者: Qishen Ha (Grandmaster) | 排名: 第8名
大家好,
首先,我要感谢 Kaggle 和主办方举办这次比赛。
祝贺所有的获胜者!
我的流程示意图。它包含2个模型:已见模型和未见模型。
摘要
- 未使用外部数据
- 我在流程中使用了2阶段预测,如上图所示,它包含一组2个模型(已见模型 和 未见模型)。
- 我使用 Arcface 来区分未见的字素。就像区分未见过的人脸一样 ;)
- 如果检测到图像是“已见”的,我直接使用已见模型的输出作为预测结果。如果检测到图像是“未见”的,我会将其传递给未见模型以获得预测结果。
- 已见模型和未见模型之间的不同点如下:
- 已见模型仅使用非常少的数据增强,以确保它能“过拟合”已见字素;而未见模型使用大量数据增强,使其泛化到未见字素。
- 已见模型有5个输出头,包括 Arcface 输出。而未见模型有正常的4个输出头。
- 除了输出头的数量外,顶部的架构也略有不同。
- 当预测由已见模型做出时,我将预测的字素分解为3个组件;而当预测由未见模型做出时,我直接使用预测的3个组件。
代码
我已经在 Kaggle Kernel 上发布了我的训练和测试流程的最小版本,如下所示:
这个最小版本使用了两个 EfficientNet-b1,在 128x128 分辨率下训练 30 个 epochs,可以在 Public LB 上获得 0.985+ 或在 Private LB 上获得 0.935+ 的成绩。
如果您觉得我的笔记本有帮助,请点赞支持!
要在 Public 或 Private LB 上获得超过 0.993+ 或 0.950+ 的成绩,您只需要简单地:
- 将主干网络更改为 EfficientNet-b5 / b6 / b7 / b8
- 在 224x224 分辨率下训练
- 训练 60~90 个 epochs
- 集成更多的已见和未见模型
如果您有任何问题,请随时给我留言。
谢谢!