返回列表

Public 20th / Private 26th Solution LB: 0.908

654. BirdCLEF+ 2025 | birdclef-2025

开始: 2025-03-10 结束: 2025-06-05 环境监测 数据算法赛
Public 20th / Private 26th Solution LB: 0.908

公开榜第 20 名 / 私有榜第 26 名 解决方案 LB: 0.908

作者: Salman Ahmed
发布时间: 2025 年 6 月 6 日
竞赛: BirdCLEF 2025

感谢大家参与这场有趣的比赛,祝贺获胜者!我很高兴作为一个社区,我们能够如此准确地检测这些物种。

概述

我的解决方案是一个简单的两阶段方案。

第一阶段模型

  • 使用以下设置,我能够取得 LB 0.865 到 0.872 的成绩。我训练了 3 个 CNN 和 1 个 SED,集成后 achieved LB 0.886。
  • 在这个阶段,我像其他人一样过滤了训练数据中的人类声音,但以 50% 的概率随机用 30% 的人类声音增强 CSA 录音。
  • 另一个对我来说重要的事情是使用以下设置:
    {'sample_rate': 32000, 'n_mels': 384, 'f_min': 0, 'f_max': 16000, 'n_fft': 3072, 'normalized': True, 'hop_length': 420}
    {'sample_rate': 32000, 'n_mels': 448, 'f_min': 50, 'f_max': 16000, 'n_fft': 4096, 'normalized': True, 'hop_length': 334}
  • 应用 AmplitudeToDB 后,我必须将值裁剪在 0 到 -80 之间。
  • 在训练期间,我通过 RMS 采样从完整音频文件中选取 15 秒的音频块,然后将其分为 3 x 5 秒的片段。模型预测 3 x 5 秒录音的 logits,即 3 x 206,然后我选取这 3 段录音的最大值,并对这 3 段的最大 logits 进行反向传播。
BS, K, C, H, W = spec.size()
spec = spec.view(BS * K, C, H, W)
logits = model(spec)
logits = logits.view(BS, K, 206)
logits, _ = torch.max(logits, dim=1)
  • 对我来说,RMS 采样的效果比随机采样好得多。
  • Loss: FocalBCE
  • 数据增强:Mixup (p=1), LocalGlobal Stretch, 时间/频率移位,时间/频率掩蔽,高斯噪声。[均在频谱图上进行]
  • Batch Size 为 32。
  • Model Soup 从 12 到 15 epochs。

第二阶段模型

  • 使用第二阶段模型,我取得了 公开榜 LB 0.909 / 私有榜 LB 0.908 的成绩。
  • 我为所有训练音频的 5 秒片段生成了概率,如果片段的最大概率与该音频的主要标签匹配,则进行过滤。
  • 我还生成了训练片段的伪标签。
  • 我用这些分段音频块训练了 4 个 CNN,其中训练音频片段的 Batch Size 为 96,训练音景的 Batch Size 为 5 = (5 x 12)。
  • 这 4 个 CNN 随后仅在伪标签上进一步微调了 7 个 epochs。

不足之处

  • 当我在第一阶段训练中加入 No Call 时,模型的公开榜性能受到了影响,我尝试了多种方法但没有成功。现在我在私有榜上看到,我的单阶段 1 模型加入 No Call 后能够达到 0.885,我认为加入该设置并进行微调应该能改善结果。
同比赛其他方案