返回列表

8th Place Solution

399. Cornell Birdcall Identification | birdsong-recognition

开始: 2020-06-15 结束: 2020-09-15 环境监测 数据算法赛
第8名解决方案
作者:R Guo (Grandmaster) | 排名:第8名 | 发布时间:2020-09-16

第8名解决方案

感谢比赛主办方和Kaggle团队举办这次比赛,并祝贺所有获奖者。同时感谢 @ttahara 提供重采样的训练数据,感谢 @rohanrao 提供外部数据。还要感谢 @hidehisaarai1213 提供了很好的基准模型以及对SED(声音事件检测)的介绍。我很激动能获得我的第一枚个人金牌。

训练

比赛主办方提供的标签噪声非常大。甚至有一个40分钟的音频只有一个标签。我认为如何使用次要标签(secondary label)在本次比赛中至关重要。在我的测试中,仅使用主要标签只能预测出很少的鸟叫声,并且会产生很多“无叫声”的预测结果。

混合声音(Mix sound)

为了生成更多的样本并获得包含多种鸟类(且标签良好)的片段,我选择混合那些没有次要标签的音频片段。我使用“或”运算来生成混合片段的标签,声音混合方式如下:

mixed_sound=sound1*uniform(0.8,1.2)+sound2*uniform(0.8,1.2)+sound3*uniform(0.8,1.2)

生成伪强标签(Generate pseudo strong labels)

我尝试用SED方法生成伪强标签。我用10秒的片段训练SED模型,并对整个音频进行预测。然而,生成的伪标签仍然充满噪声且不可靠,存在太多的假阳性。最终,我用它们来修正带有次要标签的那些音频的标签。

训练细节

我使用Logmel频谱图作为输入,并从中随机裁剪5秒的片段。然后,对没有次要标签的音频应用混合声音增强,而带有次要标签的音频标签将根据伪强标签进行调整。

在本次比赛中制作一个好的验证集非常困难,因为没有可靠的“无叫声”样本,且单个片段可能包含多种鸟叫声。我选择使用与测试集中site_3音频类似的机制,并计算录音级别的F1分数。

预处理流程:MelSpectrogram(梅尔频谱图)-> ToDB -> Normalize(归一化) -> Resize(调整大小)

数据增强:GaussianNoise(高斯噪声), BackgroundNoise(背景噪声), Shift(平移), Drop(丢弃), Clipping(削波)

主干网络:Resnest50, Regnety_040

单折分数:0.654/0.591/CV 0.75

集成与TTA(测试时增强)

在我最好的提交中,模型包括:5折 resnest50d(256x512) + 5折 resnest50d(320x768)+ 4折 regnety_040 (224x512)。

我使用了两个移位版本的声音片段作为TTA,两者都采用了半跳跃长度。然而,无论是在LB(排行榜)还是我的CV上,它们都没有带来任何改变。

有效的方法

使用次要标签,录音级别的F1分数提高了,但片段级别的F1分数下降了。

更长时间的训练使结果更稳定。训练40个Epoch也能获得不错的分数,但分数波动很大。训练80个Epoch带来了更高的CV分数和LB上稳定的分数。

无效的方法

模拟“无叫声”声音并训练一个二分类器。模拟数据与真实数据之间存在巨大的领域差距。分类器只是找到了一条捷径。我的分类器在比赛数据上的预测几乎全是正样本。

测试集似乎经过了额外的MP3压缩。我尝试在压缩后的音频上进行微调。这提高了Public LB的分数,但对Private LB没有帮助。

Mixup让我的结果变差了。

使用更多的Mel bins可以提高本地CV分数,但会损害LB分数。

同比赛其他方案