419. Rainforest Connection Species Audio Detection | rfcx-species-audio-detection
总结:
首先,这是一场有趣的比赛,也是一次很好的学习机会,就像 Kaggle 上经常发生的那样!这场比赛的一个“问题”是,测试数据的标记方法不同,而且没有提供标记测试数据的样本。这使得很难感知验证分数,并增加了过拟合公开测试结果的风险。事实上,当我意识到这种情况时,我差点放弃了这场比赛。但最终我决定回到比赛中,致力于一个简单的解决方案和一个 python 库——dl_pipeline(https://github.com/mnpinto/dl_pipeline)——我将其作为未来一般 Kaggle 比赛的通用框架。最初,dl_pipeline 的想法只是让我的代码更有条理、更可重用,但我发现分享它可能也有价值。
将所有波形文件以 32000 Hz 的采样率保存为 npy 文件,以节省时间。
def audio2npy(file, path_save:Path, sample_rate=32_000):
path_save.mkdir(exist_ok=True, parents=True)
wave, _ = librosa.load(file, sr=sample_rate)
np.save(path_save/f'{file.stem}.npy', wave)
我没有立即将音频转换为声谱图,因为我仍然希望能够在波形上使用音频增强。
注意:在应用增强之前进行裁剪比反过来做要快得多。
def audio_augment(sample_rate, p=0.25):
return Pipeline([
ClippingDistortion(sample_rate, max_percentile_threshold=10, p=p),
PitchShift(sample_rate, min_semitones=-8, max_semitones=8, p=p),
])
注意:有些增强要慢得多,例如变调和时间拉伸。当使用这些增强时,使用的概率对训练所需时间有很大影响。
我尝试了几种模型,但在公开排行榜上给我更好结果的是 densenet121,第二好是 ResNeSt50。一个特点是我对所有模型都使用了带有强 dropout 的 fastai 头部。
fastai 头部 (使用 create_head(num_features*2, num_classes, ps=0.8))。
(1): Sequential(
(0): AdaptiveConcatPool2d(
(ap): AdaptiveAvgPool2d(output_size=1)
(mp): AdaptiveMaxPool2d(output_size=1)
)
(1): Flatten(full=False)
(2): BatchNorm1d(2048, eps=1e-05, momentum=0.1, affine