399. Cornell Birdcall Identification | birdsong-recognition
首先感谢主办方举办了这次充满挑战且引人入胜的比赛。
我非常感激在讨论区得到的相对迅速的答复(关于外部数据、领域知识等),这无疑非常有帮助。
特别感谢:
七年前,我曾参加过 Kaggle 上的鸟鸣检测挑战。
那时我们只有几百段 10 秒的录音用于训练,虽然是类似的多类别多标签问题,但只有 19 个物种。
当时我通过计算机视觉模板匹配和随机森林赢得了那场比赛。
我本以为利用现有的 4 万段鸟类录音和所有可用的预训练 ImageNet 模型,能轻松快速地超越当年的成绩。
事实证明并非如此。
可能的原因:
在比赛初期,我无法提交有意义的结果,所以我试图更好地了解北美鸟类种群。
如果假设鸟类分布均匀,仅提交单个鸟类物种,预期的 LB 分数大约是 ~0.001。
我利用 ebird.org 的观测数据,根据过去两年的独特观测记录对 264 个物种进行了排名。
这不一定能反映公开/私有测试集中的分布,但我发现这比单纯看 XC 录音的数量要好。
例如:
将所有音频重采样至 32kHz,并将每段录音的前 2 分钟切分为 10 秒时长的块,保存为 .npy 数组。
我使用了扩展数据集。
采用了 4 折交叉验证,按作者创建时间分层,以尽量避免同一只鸟出现在不同的折中。
对于早停,我根据 XC 验证集和 BirdCLEF 验证集保存了最佳权重。
我只使用了加性噪声。
也许我也应该尝试合成噪声生成。
我最终采用了稍作修改的 CNN14(128 个 mel bins,均值/标准差标准化)。
在 Nvidia Tesla T4 上训练相对较快,训练单个模型需要 3-8 小时。
我尝试了 PANN ResNet38、Cnn14_DecisionLevelAtt 或 ImageNet 预训练的 ResNet50,但由于没有合适的验证,结果参差不齐……
数据加载器处理了波形的加性增强:
GPU 为批次生成频谱图。
在最后一个周末,我修复了整个训练流程,并租用了 V100 重新训练几个最终模型并进行一些额外的实验。
周日晚上,我提交了我的第一个融合模型,公开排行榜分数为 0.570,这让我相当失望。
实际上,这个分数足以让我最终获得第 10 名(私有分数 0.649)。
在最后两天,我做了一些孤注一掷的提交,使用了更多模型,并调整了阈值
(例如,提高西海岸鸟类的阈值,降低常见鸟类的阈值)。
这些操作确实提高了我的公开 LB 分数,幸运的是,它们既没有提高也没有损害私有分数。
如果再多提交几次,我可能就会开始过拟合了……