返回列表

24th place solution - pre-training & single model (5 folds ensemble with ONNX)

553. BirdCLEF 2023 | birdclef-2023

开始: 2023-03-07 结束: 2023-05-24 环境监测 数据算法赛
作者: HyeongChan Kim (kozistr) | 排名: 第24名 | 点赞: 12 | 发布时间: 2023-05-26

第24名解决方案 - 预训练与单模型(使用ONNX进行5折集成)

大家好!

首先,感谢康奈尔鸟类学实验室和Kaggle团队主办这场比赛。同时,也祝贺所有获奖者和参与者。

简要总结

我在比赛结束前约2周加入,由于日常工作繁忙,只有大约7天时间参与。这对我来说是一个很好的机会,挑战在短时间内构建模型。因此,我必须专注于在最少的尝试中找到最有效的方案。

幸运的是,有很多高质量的资源,比如以往比赛 top 解决方案。我开始跟进这些方案,并总结出通用的有效方法。(过去参加BirdCLEF 2020的经验也帮助很大)

经过一系列尝试和一些运气,我想我构建了一个不错的模型 : )

架构

以下是训练流程。

  1. 在2020、2021、2022年以及xeno-canto数据集上进行预训练
  2. 基于预训练权重在2023年数据集上进行微调
    • 样本数≤5的少数类别被包含在所有折中

我在每个步骤中应用了相同的训练方法(如数据增强、损失函数等)。

交叉验证

(虽然基于我的少量实验)我的CV分数与LB/PB有一定的相关性。

实验 CV LB PB 备注
effnetb0 0.7720 0.82438 0.73641 多损失函数,5折
effnetb0 0.7693 0.82402 0.73604 片段级损失,5折
eca_nfnet_l0 0.7753 0.80731 0.71845 片段级损失,单折

模型

我使用了带有efficientnet_b0骨干网络的SED架构。我也测试了eca_nfnet_l0骨干网络,它的CV分数更好,但由于延迟问题无法使用。

训练方法

  • [重要] 预训练
  • [重要] 数据增强
    • 波形级别
      • [重要] 在原始波形上进行mixup
      • 高斯与均匀噪声
      • 音高偏移
      • [重要] 背景噪声
    • 频谱图级别
      • 频谱增强
  • 对数梅尔频谱图
    • n_fft与窗口大小1024,hop size 320,最小/最大频率20/14000,num_mels 256,top_db 80(实际上,我本想设置n_fft为2048,但错误地设为了1024)
  • 在5秒片段上进行训练
  • 分层K折(5折,基于primary_label)
  • 标签平滑 0.1
  • 多损失函数(来自birdclef 2021 top 5
    • 片段级输出的BCE损失,权重1.0
    • 段级输出最大值的BCE损失,权重0.5
  • fp32
  • AdamW + 余弦退火(无预热)
    • 50个epoch(通常在40-50 epoch之间收敛)

推理

使用Pytorch我可以集成最多4个模型(耗时近2小时)。为了集成更多模型,我使用了ONNX并进行图优化,这使得可以再增加一个模型!最终,我成功集成了5个模型(单模型的5折)。此外,为了充分利用CPU,我还进行了多进程处理。

未生效的方法(也许我理解有误)

  • 次要标签(硬标签和软标签如0.3、0.5)
  • Focal损失
  • 更长的片段(如15秒)
  • 后处理(在BirdCLEF 2021和2022比赛中提出的方法)
    • 聚合前后段的概率
    • 如果某只鸟的概率超过阈值,则将该鸟所有段的概率乘以常数

希望这些内容能对大家有帮助!

谢谢 : )

同比赛其他方案