返回列表

10th Place Solution

399. Cornell Birdcall Identification | birdsong-recognition

开始: 2020-06-15 结束: 2020-09-15 环境监测 数据算法赛
第10名解决方案

第10名解决方案

作者:beluga (Grandmaster)
比赛排名:第10名

致谢

首先感谢主办方举办了这次充满挑战且引人入胜的比赛。
我非常感激在讨论区得到的相对迅速的答复(关于外部数据、领域知识等),这无疑非常有帮助。

特别感谢:

  • Hidehisa Arai 展示了如何有效地使用 PANNS
  • Qiuqiang Kong 等人提供的 PANNS 代码库和预训练模型
  • Vopani 抓取并维护了外部的 XenoCanto 数据集
  • Jan Schlüter 和 Mario Lasseck 撰写的过往 BirdCLEF 获奖论文

开端

七年前,我曾参加过 Kaggle 上的鸟鸣检测挑战。
那时我们只有几百段 10 秒的录音用于训练,虽然是类似的多类别多标签问题,但只有 19 个物种。
当时我通过计算机视觉模板匹配和随机森林赢得了那场比赛。
我本以为利用现有的 4 万段鸟类录音和所有可用的预训练 ImageNet 模型,能轻松快速地超越当年的成绩。
事实证明并非如此。

可能的原因:

  • 采样率不同(16kHz 对比 32kHz)
  • 景观录音 对比 XenoCanto 数据
  • MLSP 的训练-测试划分是在景观录音中随机划分的,这导致可能对同一段录音过拟合(例如,听到蟋蟀声和雨声 -> 预测为 Hermit Warbler)
  • 频谱图/噪声分布不同

鸟类学与 LB 探测

在比赛初期,我无法提交有意义的结果,所以我试图更好地了解北美鸟类种群。
如果假设鸟类分布均匀,仅提交单个鸟类物种,预期的 LB 分数大约是 ~0.001。
我利用 ebird.org 的观测数据,根据过去两年的独特观测记录对 264 个物种进行了排名。
这不一定能反映公开/私有测试集中的分布,但我发现这比单纯看 XC 录音的数量要好。

例如:

  • Red Crossbill(红交嘴雀):1223 条 XC 录音,8.4万次观测,LB 分数 0.000
  • White-crowned Sparrow(白冠带鹀):474 条 XC 录音,110万次观测,LB 分数 0.1(!)

数据准备

将所有音频重采样至 32kHz,并将每段录音的前 2 分钟切分为 10 秒时长的块,保存为 .npy 数组。
我使用了扩展数据集。
采用了 4 折交叉验证,按作者创建时间分层,以尽量避免同一只鸟出现在不同的折中。
对于早停,我根据 XC 验证集和 BirdCLEF 验证集保存了最佳权重。

数据增强

我只使用了加性噪声。

  • freefield1010
  • warblrb10k
  • BirdVox-DCASE-20k
  • 柏林自然博物馆发布的动物声音档案

也许我也应该尝试合成噪声生成。

架构

我最终采用了稍作修改的 CNN14(128 个 mel bins,均值/标准差标准化)。
在 Nvidia Tesla T4 上训练相对较快,训练单个模型需要 3-8 小时。
我尝试了 PANN ResNet38、Cnn14_DecisionLevelAtt 或 ImageNet 预训练的 ResNet50,但由于没有合适的验证,结果参差不齐……

数据加载器处理了波形的加性增强:

  • 在多类别设置中添加可能的 1-2-3 种鸟
  • 添加同类别的音频块
  • 添加噪声
  • 添加动物声音

GPU 为批次生成频谱图。

模型融合

在最后一个周末,我修复了整个训练流程,并租用了 V100 重新训练几个最终模型并进行一些额外的实验。
周日晚上,我提交了我的第一个融合模型,公开排行榜分数为 0.570,这让我相当失望。
实际上,这个分数足以让我最终获得第 10 名(私有分数 0.649)。

在最后两天,我做了一些孤注一掷的提交,使用了更多模型,并调整了阈值
(例如,提高西海岸鸟类的阈值,降低常见鸟类的阈值)。
这些操作确实提高了我的公开 LB 分数,幸运的是,它们既没有提高也没有损害私有分数。
如果再多提交几次,我可能就会开始过拟合了……

同比赛其他方案