返回列表

7th place solution - Beluga & Peter

419. Rainforest Connection Species Audio Detection | rfcx-species-audio-detection

开始: 2020-11-17 结束: 2021-02-17 环境监测 数据算法赛
第7名方案 - Beluga & Peter

第7名方案 - Beluga & Peter

作者: Peter (Grandmaster) & beluga (Grandmaster) | 比赛排名: 第7名

感谢 Kaggle 和 RFCx 举办了这场音频竞赛,特别感谢我的队友 @gaborfodor。如果没有他,我可能早就放弃了,当时成绩还停留在 0.8xx 左右。

数据准备

将所有音频重采样至 32kHz,并将音频文件切分为 3 秒的片段。我们使用了步长为 1 秒的滑动窗口。

收集更多标签

我们成绩的关键在于 Beluga 手动收集了大量的训练样本。他开发了一个很棒的标注应用,详情请见这里包含源代码

在第一批手动标注的样本加入后,我们通过集成不同数量的 PANN (cnn14) 模型,很快达到了 0.93x 的分数。

输入

我们使用梅尔频谱图作为输入,采用了不同的 n_bin (128, 192, 256, 288)。Beluga 训练了单通道输入的 PANN-cnn14 模型。对于其他主干网络,我使用了一个简单的技巧来实现三通道输入:

  • 我为每个通道使用了不同的 n_meln_fft 设置。例如 n_mel=(128, 192, 256), n_fft=(1024, 1594, 2048)。这会产生不同高度的图像,因此需要将它们调整为相同的尺寸。

我们都使用了 torchlibrosa 来生成梅尔频谱图。

数据增强

我们使用了三种简单的增强方法,并设置了不同的概率:

滚动
np.roll(y, shift=np.random.randint(0, len(y)))
音频混合
w = np.random.uniform(0.3, 0.7)
mixed = (audio_chunk + rnd_audio_chunk * w) / (1 + w)
label = (label + rnd_label).clip(0, 1)
频谱增强
SpecAugmentation(time_drop_width=16, time_stripes_num=2, freq_drop_width=16, freq_stripes_num=2)

模型架构

  • PANN - cnn14
  • EfficientNet B0, B1, B2
  • Densenet 121
  • Resnet-50
  • Resnest-50
  • Mobilnet v3 large 100

我们训练了这些模型的多个版本,使用了不同的增强设置和训练数据。Beluga 使用了来自他的 Cornell 方案 的 PANN - cnn14 模型。

我训练了一个非常相似的架构,使用了不同的主干网络,并使用了来自 SED 的注意力头:

x = ...生成梅尔频谱图...
x = self.backbone.forward_features(x)

x = torch.mean(x, dim=2)

x1 = F.max_pool1d(x, kernel_size=3, stride=1, padding=1)
x2 = F.avg_pool1d(x, kernel_size=3, stride=1, padding=1)
x = x1 + x2

x = F.dropout(x, p=0.5, training=self.training)
x = x.transpose(1, 2)
x = F.relu_(self.fc1(x))
x = x.transpose(1, 2)
x = F.dropout(x, p=0.5, training=self.training)

(clipwise_output, norm_att