612. BirdCLEF 2024 | birdclef-2024
祝贺所有的获奖者!感谢 Kaggle 和康奈尔鸟类实验室举办这场精彩的比赛。
今年的 BirdCLEF 真的非常困难。与 padded CMAP(它压制了样本极少物种的影响)不同,AUC 对每个物种都同等对待且非常敏感。
我很幸运在最终的震荡中存活下来。下面介绍一下我的方案。
感谢每一位给予我启发的参赛者。特别感谢 atsunorifujita、martynoveduard、loonypenguin、vladimirsydor、anonamename。
我的最终提交是 2 个 SED(声音事件检测)模型和 1 个 CNN 模型的组合。训练方案与我去年的第二届方案基本相同。
我加入的新内容包括:
赢得比赛的关键是将物种划分为若干子集并单独训练,这样模型可以更专注于每个物种。
我的最终提交是由 2 个全物种模型和 1 个仅含 66 种稀有物种的模型组成的集成。
实际上我还有一次实验,将物种划分为 3 个子集,在私有 LB 上达到 0.690440(第一名),但由于担心过拟合公开 LB,风险太大,最终没有采用。
与去年一样,我从 xeno‑canto 收集了额外的音频,并训练了一个基线 SED v2s 模型。基线得分是 0.65。
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 过度拟合。
今年得益于未标记的 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)
失败的尝试太多…