返回列表

3rd place solution: SED with attention on Mel frequency bands

553. BirdCLEF 2023 | birdclef-2023

开始: 2023-03-07 结束: 2023-05-24 环境监测 数据算法赛
第三名解决方案:基于梅尔频带注意力机制的SED

第三名解决方案:基于梅尔频带注意力机制的SED

作者:adsr (MASTER) | 比赛排名:第3名 | 发布日期:2023-05-31 | 最后更新:2025-07-08 | 投票数:23

首先,感谢主办方 Sohier Dane、Stefan Kahl、Tom Denton、Holger Klinck 以及所有参与的机构(Kaggle、Chemnitz University of Technology、Google Research、K. Lisa Yang Center for Conservation Bioacoustics at the Cornell Lab of Ornithology、LifeCLEF、NATURAL STATE、OekoFor GbR 和 Xeno-canto)。

今年的比赛相比以往是一个受欢迎的改变。cMAP 评估指标省去了阈值调优的需求,而推理时间限制则鼓励我们关注在准确性和速度之间取得良好平衡的高效模型。

在这篇文章中,我将简要介绍我的解决方案的一些方面。更详细的描述将在后续更新或即将发布的工作笔记中提供。

快速摘要

  • 修改后的 SED 架构,在频率带上应用注意力机制
  • 使用混响增强处理领域偏移
  • 使用冻结的 TorchScript 模型和预计算输入以加速推理
  • 在推理笔记本中设置计时器以应对不稳定的推理时间

数据集

数据准备

  • 将文件转换为 32 kHz(如有必要)
  • 将扩展的(下载的)Xeno-canto 文件转换为 FLAC 格式
  • 为每个文件添加时长信息到数据集元数据
  • 将所有 Xeno-canto 文件的前 10 秒片段加入训练集
  • 将训练集划分为 8 折(但主要仅使用其中 3 折)

模型输入

  • 5 秒音频片段的对数梅尔频谱图(n_fft=2048, hop_length=512, n_mels=128, fmin=40, fmax=15000, power=2.0, top_db=100)
  • 归一化至 0…255
  • 转换为 3 通道 RGB 图像

模型骨干/编码器架构(来自 timm

  • tf_efficientnet_b0_ns
  • tf_efficientnetv2_s_in21k

我还尝试了 resnet50、resnet152、tf_efficientnet_b2_ns、tf_efficientnet_b3_ns、tf_efficientnet_b4_ns、efficientformer_l3、tf_efficientnetv2_m_in21k、densenet121 和 eca_nfnet_l0,但这些模型均未包含在推理集成中,因为在我的情况下,它们的性能与推理时间之间的权衡不如 EffNetB0 或 EffNetV2s 好。

所有模型均使用预训练的 ImageNet 权重,并作为特征提取器与自定义分类头结合使用。作为分类器,我使用了修改后的 SED 头,在频率带上应用注意力机制,而非时间帧。其思路是,声景中的物种通常占据不同的频率带。在原始 SED 架构中,代表频率带的特征图通过均值池化进行聚合,并在代表时间帧的特征上应用注意力。如果将注意力改为应用于频率带,则有助于区分同时发声但音高不同的物种。该修改可以通过在将梅尔频谱图输入原始 SED 网络前,将其旋转 90 度来实现。

数据增强(特别是处理弱/噪声标签以及训练/测试集之间的领域偏移)

  • 在文件中随机选择 5 秒音频片段:
    • 无任何加权
    • 按信号能量(RMS)加权
    • 按主要类别概率加权(使用伪标签信息)
  • 添加最多 8 个按所选片段中概率排序的鸟类物种的硬/软伪标签
  • 随机循环移位
  • 使用随机传递函数进行滤波
  • 在时域中通过添加同物种、随机物种和 nocall/noise 的片段进行 Mixup
  • 混合前对片段的信号幅度施加随机增益
  • 对混合结果施加随机增益
  • 音高偏移和时间拉伸(时域和频域中的局部与全局)
  • 高斯/粉红/棕色噪声
  • 短噪声脉冲
  • 混响(见下文)
  • 用于频谱图缩放的不同插值滤波器
  • 色彩抖动(亮度、对比度、饱和度、色调)

在声景中,鸟类通常从远处被录制,导致声音较弱且混响较多,高频部分衰减(与大多数 Xeno-canto 文件相比,这些文件的声音通常更清晰,因为麦克风直接对准鸟类)。为了解释训练数据与测试数据之间的这种差异(领域偏移),我使用脉冲响应为训练文件添加了混响,这些脉冲响应录制自 Valhalla Vintage Verb 音频效果插件。在训练过程中,我以 20% 的概率随机选择脉冲响应,并使用干湿混合控制(范围从 0.2(几乎干信号)到 1.0(仅混响))将其与音频信号进行卷积。

我没有使用先预训练再微调的方法,而是对所有 2021 和 2023 物种以及 nocall(共 659 个类别)进行训练。背景物种的目标值为 0.3。推理时,预测结果被过滤为仅 2023 物种(264 个类别)。

加速推理并应对提交时间限制

由于运行推理笔记本的硬件和 CPU 存在差异,能够集成的模型数量也有所不同。为防止提交超时,我在笔记本中设置了一个计时器,以确保在 2 小时内完成。如果计时器达到约 118 分钟,推理将停止,并收集截至该时间点已预测的模型和文件部分的结果。未完成模型和文件部分的结果在平均预测前会被屏蔽。使用这种方法,我无法确定可以集成的确切模型数量。在早期提交中,我只能集成 3 个模型而不冒超时风险。后来,我优先考虑推理速度而非模型多样性,使用具有相同输入的模型(FFT 大小、梅尔带数量等均无变化)。现在,我可以提前为所有测试文件预计算并将梅尔频谱图图像保存到 RAM 中,供所有模型重复使用。我还将模型转换为 TorchScript。通过这些优化,我至少可以集成 7 个模型,具体取决于架构(例如,4×EfficientNetB0 + 3×EfficientNetV2s),而无需设置计时器。

我的最佳单模型使用了 EfficientNetV2s,在公开排行榜上得分为 0.83386(私有排行榜为 0.74104)。在私有排行榜上得分最高的最佳单模型使用了 ResNet50 骨干网络(私有排行榜 0.7482 / 公开排行榜 0.83288)。我在私有排行榜上的最佳集成(0.76365)由 8 个模型混合而成(5×EfficientNetB0 + 3×EfficientNetV2s),并对单模型预测结果进行简单平均。

一些我尝试过但放弃的方法,因为它们效果不够好

  • Model soup
  • MultiLabelSoftMarginLoss(替代 BCEWithLogitsLoss)
  • 知识蒸馏
  • 仅使用 2023 物种数据进行微调
  • 将模型转换为 ONNX 或 openvino 格式(仅在较小批量大小时实现加速)
  • 任何后处理(例如,增强相邻窗口或整个文件中检测到的物种的概率)

引用

同比赛其他方案