返回列表

10th Solution

612. BirdCLEF 2024 | birdclef-2024

开始: 2024-04-03 结束: 2024-06-10 生命科学 数据算法赛
第十名方案

第十名方案

作者:Tamo
排名:第十名
发布时间:2024-06-11

摘要

我在本次比赛中采用三阶段训练方式。首先,使用2021年至2024年的全部数据进行训练。其次,仅使用2024年的数据或继续使用2021至2024年的数据,针对本次比赛的目标进行微调。最后,在第二阶段的数据基础上,加入2024年的未标记数据继续训练。第三阶段的训练显著提升了模型在公开排行榜(Public LB)和私有排行榜(Private LB)上的表现。

数据

  • 2021、2022、2023、2024年的已标记数据

模型

使用 tf_efficientnetv2_b0tf_efficientnetv2_b3(来自 timm 库),输入为单通道频谱图(single‑channel spectrogram)。

未标记数据的使用

我对未标记数据生成了伪标签,并将它们以 50% 的概率加入到已标记数据中进行训练。该方法灵感来源于 2023 年第七名方案,并参考了 GitHub 项目。实现细节如下:

  • 将每段 4 分钟的未标记音频切分为 5 秒的片段,每个未标记文件可产生 48 个片段。
  • 为每个片段生成伪标签后,选取伪标签熵最低的前 10% 片段用于训练。
  • 每个类别伪标签概率低于前 90% 的标签设为 0,保留软标签(soft label)形式。
  • 在训练时,将未标记数据(有伪标签)与已标记数据混合,以约 50% 的概率将两者叠加(通过在未标记音频上添加一定强度的已标记音频来实现),具体实现代码如下:
def __add_noise(self, tgt_wav, add_wav, db):
    tgt_rms = np.sqrt(np.mean(np.square(tgt_wav), axis=-1))
    add_rms = np.sqrt(np.mean(np.square(add_wav), axis=-1))

    noise_rms = tgt_rms / (10 ** (float(db) / 20))
    new_wav = tgt_wav + add_wav * (noise_rms / (add_rms + 1e-6))
    new_wav = np.clip(new_wav, np.min(new_wav) * 2, np.max(new_wav) * 2)
    return new_wav

该策略在排行榜上提升了约 0.04 分。

同比赛其他方案