返回列表

6th place solution: BirdNET embedding + CNN

553. BirdCLEF 2023 | birdclef-2023

开始: 2023-03-07 结束: 2023-05-24 环境监测 数据算法赛
第六名解决方案:BirdNET嵌入 + CNN
作者:anonamename | 排名:第6名 | 发布日期:2023年5月25日

第六名解决方案:BirdNET嵌入 + CNN

感谢主办方和Kaggle组织本次竞赛。

我的解决方案结合了BirdNET-Analyzer V2.2的嵌入向量和BirdCLEF 2021第二名解决方案的CNN模型。

模型结构(BirdNET嵌入 + CNN)

为了利用BirdNET的特征,我们将BirdNET的嵌入向量与BirdCLEF 2021第二名解决方案的CNN输出进行拼接。

模型结构图

BirdNET嵌入

使用BirdNET V2.2 embeddings.py生成嵌入向量。我修改了BirdNET V2.2 audio.py,当音频数据长度短于BirdNET采样率(48000)时,将数据填充以输出至少1秒的嵌入向量。使用V2.2版本而非最新的BirdNET V2.3,略微提升了交叉验证得分。

CNN网络

CNN骨干网络采用timm库的eca_nfnet_l1seresnext26t_32x4d

训练策略

在使用BirdCLEF 2021 + BirdCLEF 2022数据进行预训练后,使用BirdCLEF 2023数据训练CNN和其他线性层(BirdNET部分不训练)。

训练输入为30秒音频数据。由于BirdNET每3秒输出一次嵌入向量,我将30秒内的嵌入向量取平均值。

在大多数实验中,最终epoch的交叉验证得分最高,因此我将所有数据都包含在训练集中。

主要训练参数如下:

  • 损失函数:BCEWithLogitsLoss
  • 梅尔频谱图
    • 采样率:32000,窗口大小:1024,跳数:320,fmin:0,fmax:14000,梅尔频带:128,功率:2,top_db=None
  • 标签设置:主标签=0.9995,副标签=0.4或0.5(参考BirdCLEF 2022第三名方案),标签平滑=0.01
  • 交叉验证:主标签StratifiedKFold(n_splits=5)
  • 优化器:AdamW(weight_decay=1e-4)
  • 学习率调度:热身0-3epoch(lr=3e-6→3e-4) + 余弦退火3-70epoch(lr=3e-4→3e-6)

数据增强

与前两届竞赛一样,数据增强至关重要。我结合了以下增强方法:

过采样策略

实施了以下过采样方法,但效果有限:

  • 对每个类别进行过采样,确保每类至少有20个样本
  • 将具有两个或更多副标签的训练数据数量加倍(因为这类数据的验证损失较差)
  • 参考BirdCLEF 2022第五名方案,为少数类生成混响/回声效果文件并加入训练集
  • 对过采样数据应用强增强

推理过程

CNN输入为5秒音频数据,BirdNET输入为前3秒音频数据。

  • 为在2小时内完成提交,将每个模型转换为ONNX格式
  • 参考此笔记本,使用ThreadPoolExecutor加速推理

模型集成

将两个不同CNN骨干网络(eca_nfnet_l1seresnext26t_32x4d)的输出结果简单平均。

未生效的改进

  • 添加背景噪声(参考BirdCLEF 2021第二名方案
  • 后处理(参考BirdCLEF 2022第二名方案
  • 使用OpenVINO加速推理
    • 即使转换为OpenVINO格式,推理时间与ONNX差异不大,可能使用方式有误
  • 使用MFCC作为输入(参考此论文
  • 使用CQT作为输入
  • 使用eBird_Taxonomy_v2021.csv中的FAMILY等字段进行预测(参考此论文

排行榜历史

模型名称 私有分数 公开分数
BirdCLEF 2021第二名CNN(使用BirdCLEF 2021+2022预训练) 0.71 0.80
BirdCLEF 2021第二名CNN + 数据增强 + BirdNET嵌入 0.74 0.82
BirdCLEF 2021第二名CNN + 数据增强 + BirdNET嵌入 + 过采样 + 模型集成 0.75 0.83
同比赛其他方案