返回列表

7th Place Solution for the BirdCLEF 2024 Competition

612. BirdCLEF 2024 | birdclef-2024

开始: 2024-04-03 结束: 2024-06-10 生命科学 数据算法赛
BirdCLEF 2024 竞赛第七名方案
作者: RihanPiggy | 排名: 第七名 | 发布日期: 2024-06-11

祝贺所有的获奖者!感谢 Kaggle 和康奈尔鸟类实验室举办这场精彩的比赛。

今年的 BirdCLEF 真的非常困难。与 padded CMAP(它压制了样本极少物种的影响)不同,AUC 对每个物种都同等对待且非常敏感。

我很幸运在最终的震荡中存活下来。下面介绍一下我的方案。

感谢每一位给予我启发的参赛者。特别感谢 atsunorifujitamartynoveduardloonypenguinvladimirsydoranonamename

上下文

方案概述

我的最终提交是 2 个 SED(声音事件检测)模型和 1 个 CNN 模型的组合。训练方案与我去年的第二届方案基本相同。
我加入的新内容包括:

  • 使用 Birdnet 和 Bird‑vocalization‑classifier 从 Soundscape 中提取训练样本。
  • 去年第四名提出的知识蒸馏。
  • 去年第七名提出的 Mixup(数据增强)。
  • Int8 量化。
  • 将物种划分为多个子集(对我来说最重要的)。

赢得比赛的关键是将物种划分为若干子集并单独训练,这样模型可以更专注于每个物种。

我的最终提交是由 2 个全物种模型和 1 个仅含 66 种稀有物种的模型组成的集成。
实际上我还有一次实验,将物种划分为 3 个子集,在私有 LB 上达到 0.690440(第一名),但由于担心过拟合公开 LB,风险太大,最终没有采用。

提交细节

模型

  • SED 使用 tf_efficientnetv2_s_in21k(全部物种)
  • SED 使用 seresnext26t_32x4d(66 种稀有物种)
  • CNN 使用 resnet34d(全部物种)

额外的 xeno‑canto 数据

与去年一样,我从 xeno‑canto 收集了额外的音频,并训练了一个基线 SED v2s 模型。基线得分是 0.65。

使用 Birdnet 与 Bird‑vocalization‑classifier 从 Soundscape 提取训练样本

Birdnet 覆盖了 181/182 个物种,Bird‑vocalization‑classifier 覆盖了 180/182 个物种。我主要使用 Birdnet,并用 Bird‑vocalization‑classifier 提取了 niwpig1。我使用阈值 0.3 提取了 15 秒音频片段。

这使我的基线得分提升至 0.68。

知识蒸馏

我实现了与去年第四名相同的知识蒸馏方案,这进一步把基线得分提升至 0.70。

使用训练好的模型进一步提取训练样本

我使用自己训练的模型从 Soundscape 中进一步提取训练样本,这在 LB 上给了我小幅提升。

物种子集

BirdCLEF 2022 第三名的启发,我尝试训练一个只包含 66 种样本数较少的物种的模型,发现该模型在 66 种中的 43 种上优于全物种训练的模型。

我不确定这是否在私有 LB 上也会出现,但我还是决定在最终提交中加入 1 个基于 66 种训练的模型。

我还尝试将物种分为 3 个有部分重叠的子集,分别训练后创建了一个三子集模型集成。这在私有 LB 上达到了 0.690440(第一名),因此把鸟类划分为子集可能是获胜的关键。但这太冒险了,因为我不能确定是否只是对公开 LB 过度拟合。

Int8 量化

今年得益于未标记的 Soundscape,我们可以进行量化。

我使用 nncf 对 SED 模型的编码器进行量化。对 CNN 模型进行量化会导致 LB 分数下降 0.01,因此我没有对 CNN 进行量化。

量化将 SED v2s 模型的推理时间减少了 20 分钟(从 100 分钟降至 80 分钟)。


import nncf
import openvino as ov

nncf_dataset = nncf.Dataset(pytorch_dataset, transform_fn)
model = ov.Core().read_model(path_to_model)
quantized_model = nncf.quantize(
    model, nncf_dataset,
    target_device=nncf.TargetDevice.CPU,
    subset_size=300,
    fast_bias_correction=True,
    preset=nncf.QuantizationPreset.MIXED,
)

ov.save_model(quantized_model, quantized_model_path)

集成策略

  • 3 个模型的 logit 平均。
  • 3 个模型的 rank 平均。

无效的尝试

失败的尝试太多…

  • 将验证数据加入训练导致 LB 下降 0.01。非常奇怪,但只能接受…
  • 计算物种权重以处理标签偏移和协变量偏移。
  • 根据几何信息(纬度 8~21,经度 72.5~79)给印度的录音更多权重。
  • 显著改变采样器的权重会明显降低 LB。每个物种均匀采样的表现最好。
  • 不仅是 id,还通过 “author + primary_label” 去除 2024 训练数据重复(该方案提议的)。
  • 使用去年第六名提出的 Birdnet 与 Bird‑vocalization‑classifier 提取的特征嵌入。

参考来源

同比赛其他方案