Place 38 | 0.902 AUC 分数 - BirdCLEF 2025 竞赛总结
第 38 名 | 0.902 AUC 分数
这是我的提交代码:https://www.kaggle.com/code/maxmelichov/bird25-0-902-auc
长话短说:我在 BirdCLEF+ 2025 Kaggle 竞赛的 2,162 支队伍中获得了第 41 名。
非常感谢 Ariel 一路以来的支持和建议!
以下是实际有效的方法概述(幕后其实有很多失败的实验):
数据与挑战
- train_audio/:短录音,每条录音仅包含单一鸟类、两栖动物、哺乳动物或昆虫物种。
- train_soundscapes/:来自与测试数据相同录音地点的未标记音频,但通常包含多个重叠物种。
- 关键区别: 测试数据每条录音包含多个物种,而大多数训练数据仅包含一个。
步骤 1:预处理
- 使用
snakers4/silero-vad 进行语音活动检测 (VAD),以去除训练数据中的人声。
模型 1:带有重度增强的 EfficientNet-B0 CNN
-
频谱图设置:
N_FFT=1024, HOP_LENGTH=64, N_MELS=148, FMIN=20, FMAX=16000
-
增强方法:
- 时间掩蔽 (Time masking),频率掩蔽 (frequency masking)
- 随机亮度/对比度
- 高频增强
- 动态范围压缩/扩展
- 频移 (Frequency shift)
- 细微背景噪声(宽带和中频)
- 时间方向轻微模糊,混合原始版本和模糊版本
-
训练设置:
- EfficientNet-B0 骨干网络
- Mixup (α = 0.15)
- BCE 损失 (主要标签 = 1, 次要 = 0.75),多标签/多分类
- 在每个剪辑的中间 5 秒进行训练(尝试过基于能量和随机片段,但表现较差)
-
结果:
- 0.817 AUC (曲线下面积;模型将真实标签排名高于虚假标签的能力)
-
伪标签 (Pseudo-labeling):
- 对所有
train_soundscapes 进行推理(分成 5 秒块,平均预测,用作新标签)
- 性能提升至 0.835 AUC
- 将骨干网络切换到 EfficientNetV2-S 达到 0.843,但最佳伪标签结果仍来自 EfficientNet-B0。
模型 2:增强的池化和 Mixup
-
架构:
- EfficientNet-B0 骨干网络
- 在第 3 层和第 4 层的特征上添加 GeM 池化层
- Mixup α = 0.5
-
替代实验:
- 尝试了自适应池化、去噪增强和更高级的方法(NatureLM-audio 片段提取、3 通道 Mels、cutmix、教师 - 学生),但没有额外的改进。
-
最佳模型 2 结果: 0.855 AUC
集成 (Ensembling)
结合了我最好的三个 CNN 模型:
- GeM 池化(无去噪器)
- GeM 池化带去噪器
- 自适应池化(无去噪器)
在此之后,大多数进一步的调整(更大的骨干网络、更多的 mixup 策略、新的伪标签技术、更重的增强)都无法提高验证结果。我遇到了瓶颈,曾考虑放弃。
探索 SED (声音事件检测):我的第一步
在这两个月竞赛的最后三周,基于 SED 的方法开始出现在 Kaggle 论坛上。这是我第一次尝试 SED 模型。由于学习曲线陡峭且时间有限,我无法将自己的 SED 模型提高到 0.841 AUC 以上。
为了继续前进,我利用了论坛上其他人分享的顶级 SED 模型预测:
- 使用了单个 SED 模型结果(NFNet 骨干网络,0.86 AUC)和一个三重 SED 集成(0.85 AUC,带有低秩功率调整),来自公共 Kaggle 内核和帖子。
- 使用 Quantile-Mix 集成 (α = 0.5) 将这些模型与我的三个 CNN 模型结合,将分数推高至 0.893 AUC。
最后冲刺:在 BirdCLEF 2021–2024 上预训练
- 在所有三个 CNN 模型上使用 2021–2024 年的 BirdCLEF 数据进行预训练,然后在 2025 数据上进行微调。
- 结果: 单模型 AUC 从 0.855 提高到 0.868。
- 最终集成(3 个 CNN + SEDs)在公共 leaderboard 上得分 0.894 AUC(第 45 名)。
- 在最终私人 leaderboard 上:0.902 AUC,位于第 41 名。
- 作为参考,第 1 名 finished at 0.930 AUC—仅差 3%!
关键收获:
- 强大的预处理(VAD, MelSpectrogram, 重度增强)至关重要。
- 如果片段选择谨慎,对未标记的声音景观进行伪标签可以提供显著提升。
- 池化策略和标签权重调整可以为 CNN 带来几分提升。
- SED 是多物种数据的强大方法,但如果你是新手(像我一样!),会有学习曲线。
- 在历史 BirdCLEF 数据上预训练真的很有帮助。
- Kaggle 社区是一个不可思议的资源——利用公共笔记本和共享解决方案非常有价值,尤其是在时间紧迫时。
在这次竞赛中我学到了很多——关于音频建模、新架构以及克服瓶颈。再次感谢 Ariel、论坛中的每个人以及所有分享代码和内核的人。我已经期待明年,希望能进入前 10 名!
如果你想聊聊技术细节、查看代码或询问关于流程的任何问题,请随时联系我!