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,我认为加入该设置并进行微调应该能改善结果。