419. Rainforest Connection Species Audio Detection | rfcx-species-audio-detection
首先,感谢主办方提供了又一个非常有趣的音频挑战。与之前的鸟鸣识别比赛相比,本次比赛的一个显著区别在于数据仅被部分标记。
其次,祝贺所有在公共榜单上成功突破0.95大关的选手。我在比赛截止日期前写下这篇文章时,还没能达到这个分数。我尝试了很多方法,看起来我的方法存在某种根本性的限制。
尽管如此,我的方法足以产生0.931的首次提交分数,在比赛开始两个月后直接排在第3位。
这对我来说看起来很棒。事后看来,如果我的第一次提交表现较弱,我就不会坚持使用该模型,而可能会去探索其他模型,比如SED或Transformers。
无论如何,无需抱怨,我在这个过程中学到了很多东西,比如如何高效地实现各种类型的教师-学生训练。我希望这些知识在未来能派上用场。
回到正题,我的方法极其简单:训练数据中的每一行,无论是TP(真正例)还是FP(假正例),都为相应录音的(对数梅尔)语谱图中的一个裁剪区域提供了标签。如果通常以时间轴为x轴,频率轴为y轴,那么t_min、t_max给出了x轴的边界,f_min、f_max给出了y轴的边界。
这样我们就面临一个26类的多标签分类问题(24个物种,但有两个物种有2种歌曲类型。我将每个物种/歌曲类型视为不同的类别)。这可以通过BCE损失轻松处理。
唯一的小警告是,虽然我们有26个类别(物种+歌曲类型),但每张图像我们只得到一个类别标签,0或1。我们只需要屏蔽其他类别的损失,就这样!
我在做的时候并不知道,但比赛的一些主办方在这篇论文中使用了类似的方法(不是论坛分享的那篇):https://www.sciencedirect.com/science/article/abs/pii/S0003682X20304795
另一个警告是,比赛的评估指标需要每个类别的标签。而我们在训练数据中没有这些。然而,比赛指标与每次录音的ROC AUC分数非常相似:当一对预测的顺序错误时,即正标签的预测值低于另一个负标签的预测值,指标就会降低。作为代理,我决定在我的多标签分类问题上使用ROC-AUC。与公共榜单的相关性虽然有些噪声,但足以让我在不提交的情况下取得进展。
对我来说最有效的方法是不调整裁剪图像的大小。这意味着我的模型必须从有时非常小的图像中学习。为了按批次处理,我将所有图像在x轴上填充至4秒。超过此长度的裁剪会在x轴上调整大小。较短的则用0填充。有帮助的一点是在频率轴上添加位置编码。确实,CNN擅长学习平移不变的表示,而在这里我们不希望模型与频率无关。我只是简单地在所有裁剪图像的频率轴上添加了一个线性梯度。
其余部分,我的模型与我在之前的鸟鸣识别比赛中使用并分享的完全相同:https://www.kaggle.com/c/birdsong-recognition/discussion/183219。仅使用我在那里分享的代码就几乎足以达到0.931。唯一的区别是,我像该比赛的第一名解决方案那样添加了噪声。此外,我在这里没有使用“无叫声”类别,也没有使用次要标签。
在预测阶段,我对每个测试录音的滑动裁剪区域进行预测,并取整体最大预测值。这很慢,因为我需要分别对26个类别中的每一个进行处理。这也可能是我输给其他选手的地方:我的模型无法学习长时间范围的时间模式,也无法学习类别间的相互作用。
通过上述方法,我使用EfficientNet B0模型获得了很高的排名,并在几次提交后使用EfficientNet B3提升到了0.945。然后在比赛的剩余时间里我陷入了停滞。
我曾确信半监督学习是关键,我实现了各种方法,包括Google的(Noisy Student)、Facebook的以及其他人的(Mean Student)。它们都改进了较弱的模型,但无法改进我最好的模型。
在最后几天,我寻找外部数据,希望能有所作为。整理这些数据并确定哪些物种对应于我们拥有的species_id花了一些时间,我今天才提交了用这些数据训练的模型。不幸的是,它们与之前的模型处于同一水平。如果有更多时间,我相信它可以提高分数,但我怀疑这不会很显著……
为了将物种与species_id匹配,我使用我最好的模型预测了外部数据。看看我的映射是否正确会很有趣。以下是我最终确定的结果:
| ID | 物种名称 |
|---|---|
| 0 | E. gryllus |
| 1 | Leutherodactylus brittoni |
| 2 |