489. BirdCLEF 2022 | birdclef-2022
感谢所有组织这次比赛的人。祝贺所有获得奖牌的选手。
似乎这次比赛的结果没有太大意义,因为主办方的解决方案是最好的。
简单说一下我的尝试,希望你们觉得有趣甚至有用。
我首先使用了宏观 Fb-score,这似乎适用于标签有噪声的情况。我选择了相当大的 beta 值 - 16 来提升召回率。
在阅读了主办方关于指标的一些评论后,我切换到了:
M = (1/N) * (1/21) * ∑∑( (TP/(TP+FN) + TN/(TN+FP))/2 )
对于任意数量的训练类别,指标仅基于评分类别计算:
y_true = tf.gather(y_true, indices=self.mask, axis=1)
y_pred = tf.gather(y_pred, indices=self.mask, axis=1)
输入主要使用预计算的 mel 频谱图,少数情况使用 PCEN。两者均由 Librosa 使用默认参数计算,nmels=128。因此对于 5 秒的音频,形状为 128x313。
对于 mel 频谱图,使用了原始去噪策略来减少整个文件中的平稳噪声。在推理时,同样的去噪方法被应用,但是针对 5 秒的片段级别而不是整个文件。
对于 mel-spec,在增强之后和 mixup 之前,进行了对数缩放并归一化到 0 到 1 之间。
对于 PCEN,在微小的增强之后和 mixup 之前,将其归一化到 0 到 1 之间。
稍微克服噪声标签的想法(在少数训练尝试中实现):
丢弃标准差低的时间箱(可用于 PCEN 或 log-melspectrogram):
std_over_f = pcen.std(axis=0)
pcen_f = pcen[:, std_over_f > std_over_f.mean()]
在通过 scipy.ndimage.convolve 重采样之前,可以应用一些掩码平滑。
实现了两种不同的方法:
ff1010bird 数据集也被尝试作为初始输入:在第一种方法中作为 nocall(无叫声)类别,在第二种方法中作为所有类别的缺失,而不是用于混合。
主要使用带有 noisy-student 权重的 EfficientNets(B0, B2, B3),同时也针对 mel-spec 多分类器训练了 seresnet101。
在大多数尝试中,没有使用简单的全局池化,而是使用在一个轴上的 AutoPool,随后是平均池化。
在验证集的整个文件上评估训练好的模型,并估计最佳阈值。不同方法获得的阈值进行了平均,并根据对数据集中每种鸟类数据量的了解进行了调整。
对于 7 个稀有类别,使用了最小值 0.25,只有两个物种(skylar 和 houfin)的阈值超过 0.5。
首先估算每种方法的平均预测值(mel-spec 多分类、pcen 多分类、mel-spec mixin 多标签),然后根据 LB 结果选择的系数进行最终的加权平均。
为了减少 FP(假阳性)并找出 nocall