返回列表

Public 20th | Private 15th solution

612. BirdCLEF 2024 | birdclef-2024

开始: 2024-04-03 结束: 2024-06-10 生命科学 数据算法赛
公开榜单第20名 | 私有榜单第15名 解决方案

公开榜单第20名 | 私有榜单第15名 解决方案

作者:InnerVoice

发布日期:2024-06-11

公开排名:第20名

私有排名:第15名

得票数:15

感谢比赛主办方今年举办的 BirdClef 与往年相比有所不同。提供的数据使我们得以探索一些SFDA(无源域适应)方法。我最终想实现 SFDA,如Google Research 博客中所述,但未能实现。

需要使用公开排行榜分数作为交叉验证。情况不太理想,但本地交叉验证得分相当高,且测试数据存在明显的域迁移。

第一阶段

使用 XCM 数据集以及 BirdClef 2021、2022、2023 进行预训练。

使用 BirdClef 2024 数据进行训练,训练和增强方式参考Kaggle Notebook

最高公开/私有分数:0.66 / 0.63

第二阶段:伪标签

所采用的方法概述于《UNSUPERVISED DOMAIN ADAPTATION FOR SPEECH RECOGNITION VIA UNCERTAINTY DRIVEN SELF‑TRAINING》

  1. 在评估模式下生成伪标签。
  2. 在训练模式下使用 dropout(噪声)生成伪标签,并使用不同的随机种子生成 8 个样本。
  3. 计算评估模式预测和训练模式预测之间的余弦距离。
  4. 选取余弦距离小于 mean(cosine) - std(cosine) 的未标注帧(文件+起始时间)。该步骤选出了约 21K 帧用于未标注数据。
preds = []
preds1=train_fold(True)
preds.append(preds1)
for i in range(8):
    set_seed(i)
    preds2=train_fold(False)
    preds.append(preds2)
predsa=np.stack([preds],axis=3)

diffs = []
for i in range(predsa.shape[1]):
    p0 = predsa[0,i][:,0]
    darr = []
    for j in range(1,9):
        pp = predsa[j,i][:,0]
        d = cosine(p0,pp)
        darr.append(d)
    diffs.append(darr)
diffs = np.array(diffs)
soundscape_meta_df['cosine'] = diffs.sum(axis=1)
soundscape_meta_df['preds'] = [ p for p in predsa[0]]

第三阶段:使用筛选后的未标注数据、伪标签以及比赛数据

  1. 引入通过 nocall + ESC 50 生成的噪声进行数据增强。使用噪声训练并不会像之前仅使用比赛数据时那样影响排行榜分数。
  2. 使用噪声增强进行预训练。
  3. 使用噪声增强进行训练,训练了两个后端分别为 eca_nfnet_l0effnet_b0 的模型。
  4. 两模型的 ensemble 在公开/私有排行榜上获得分数 0.702 / 0.666。
公开/私有排行榜分数 1

错失机会,我本想组建另外两个模型的 ensemble,但受排行榜驱动,只选择了得分最高的 ensemble。

公开/私有排行榜分数 2

阅读讨论后,我应该使用 OpenVINO 来创建更好的 ensemble……我使用的是 PyTorch 脚本,只能使用两个模型。

同比赛其他方案