399. Cornell Birdcall Identification | birdsong-recognition
这是一段伟大的旅程,感谢主办方!现在每当我四处走动时,都能听到更多的鸟叫声 :) 几年前我从语音处理开始了我的机器学习之旅,很高兴能再次接触它。再次感谢并提及 @hidehisaarai1213,是他带领我们走出了这里的黑暗。
从一开始,我就明白这个问题可以分解为两个主要问题:
解决这两个问题需要一个在信噪比(SNR)和“无叫声”分布方面尽可能接近目标分布的验证/测试集。
信不信由你,利用来自这里的6条记录和2个示例音频,尽管只包含500-800个片段,我也能够获得与LB(Public Leaderboard)的一定相关性。但更重要的是,我能够控制“无叫声”的百分比并根据它们选择正确的阈值。最后两天,我将这些片段分成了三个测试集,分别包含50%、60%、80%的“无叫声”,以查看私有排行榜上可能出现的场景(感谢主办方,私有排名几乎等于公共排名),并用我的第二次提交来确保分数。
作为目标指标,我使用了 @cpmp 指出的 average="samples" 的 F1 分数。最后,我还监控了验证集(默认CV分割)的主要+次要 F1 分数,作为我的另一个决策指标。仅靠主要 F1 或 mAP 是不够的。
添加单独的“无叫声”类对我来说不知为何不起作用。
是的,我也相信排行榜。
假设我们没有过渡问题,这可能仅通过增强即可解决。我在这方面花了太多时间,现在我明白那是没有效率的。我的最终模型包含不同的增强配置:
由于主办方通知我们可以基于两个测试样本进行训练,我尝试从中收集Batch Norm统计数据作为一种域适应技术,但效果不佳。
这是我最喜欢的部分!
我们在这里面临的情况是——每次我们裁剪5秒的片段时,都有可能裁剪出一个“无叫声”片段。所以标签变得非常嘈杂。更难的是裁剪出次要类别。简单的解决方法?标签平滑 0.2。我不记得我是什么时候成为标签平滑的粉丝的,但在实践中它对有噪声的标签很有效。但这并不够严谨。
这里的人们通过基于能量的切割来解决这个问题。而且确实有效。所以我尝试了两种方法:软方法和硬方法。软方法是指基于能量的随机采样,硬方法是指去除低于归一化能量阈值的所有内容。
但是,如果我们可以用我们的模型来提取这些标签呢?拥有 avg/map pooling 头有机会获得免费的分割:
你可以将其用作软标签或硬二值化标签。这些方法对于主要标签显示出了非常棒的性能。对于次要标签,我保留了标签平滑 :)
我发现 SED 模型在5秒片段上训练相对较弱,但当我在更长的片段(10-30秒)上训练它们时,我注意到由于标签噪声的减少,它们显示出更好的训练损失/mAP。此外,可以在5秒片段上运行推理并获得不错的性能。所以我采用了 B4 EffNet,添加了同样的 Attention �