399. Cornell Birdcall Identification | birdsong-recognition
非常感谢 HOSTKEY 提供一台配备 2x1080Ti 的机器作为赞助。你可以在这里查看他们的服务:https://www.hostkey.com/gpu-servers#/。HOSTKEY 服务器比 AWS 和 Google Cloud 更便宜,而且他们正在接受搭载 RTX 3080 的服务器的预订。
本次比赛的目标是根据非景观录音,预测景观录音中鸟类的物种。基本上,他们会给你一段在森林中录制的 5 秒片段,你需要判断其中有哪些鸟类。总共有 264 个物种需要预测。
本次比赛的难点在于:
很明显,训练数据与测试数据存在极大差异。我注意到,在训练集 20% 验证集上的验证损失改善,在隐藏测试集的排行榜上却导致了较弱的结果。
随后,我决定训练更多的 epoch,超过了验证损失的最佳点。结果在排行榜上的表现反而更好。因此我得出结论,训练更多 epoch = 更好的分数,即使我认为这在局部已经过拟合了。
为了解决难点 #1,我随机增强了训练片段。我添加了不同音量的粉红噪音和随机的景观录音(最多 3 个,音量不同)。我还随机应用了巴特沃斯滤波器(随机低通、高通、带通、带阻)和随机截止频率。我还使用了 Cutout 增强,随机将片段的某个区域替换为噪声像素。我还随机使用 ColorJitter 来改变饱和度、色调、亮度和对比度。你可以看到我非常频繁地使用“随机”这个词——我真的想确保我的提交非常稳健。这些想法很多都受到了之前 Birdclef 解决方案的启发:http://ceur-ws.org/Vol-2125/paper_140.pdf
为了解决难点 #2,我从训练片段中随机采样 5 秒的片段。如果片段少于 5 秒,则在片段的开头/结尾随机添加 0。
我希望模型能自己应对难点 #3。
为了解决难点 #4 中长时间没有鸟叫的问题,我移除了训练片段中绝对信号幅度未超过 99.9% 分位数的连续片段(>= 4 秒)。这有效地移除了长时间的连续静音,使我的模型能更专注于鸟叫声,而不是鸟的缺失。我没有使用单个片段中不同鸟类的“secondary_labels”,因为我发现许多片段中这些标签是空的或不一致的。
为了解决难点 #5,我还添加了花栗鼠/昆虫的例子作为背景噪音,告诉模型这代表没有鸟。
所有模型都将 5 秒的训练片段转换为 Melspectrogram(梅尔频谱图),这是一种表示声音外观的 2D“图片”。一些模型随后使用 Power_to_Db 函数将功率频谱图转换为分贝单位;这被称为 Log-Melspectrogram(对数梅尔频谱图)。其他模型使用了 PCEN,这是一种新颖的变换,已被证明优于 Log-Melspectrograms (链接)。
我训练了一个 Efficientnet-B1,两个 Efficientnet-B2,一个 Efficientnet-B3 (链接),一个 Resnest50 (链接),两个 Inceptionv4 (链接),和一个 SE-Resnext (链接)。我还训练了 Efficientnet-B5 和更多的 Resnest50/101,但无法在运行时间内使用这些模型。我还训练了一个 1D 卷积网络,但它不够强。所有模型都使用预训练的 imagenet 权重进行初始化。有些模型使用了 mixup,有些使用了标签平滑以增加多样性。
为了在运行时间内容纳所有这些模型,我将所有模型转换为 ONNX 格式,这带来了显著的加速。