489. BirdCLEF 2022 | birdclef-2022
感谢团队成员和所有参与者。
我非常享受这次语音识别竞赛,
但直到最后我也没能完全掌握评估指标和公榜(LB)的行为特点。
此外,crinoid 的探索性数据分析(EDA)对制定策略非常有帮助。
详细解决方案如下:
sr = 32000
n_mels = 128
fmin = 20
fmax = 16000
n_fft = 32000//10
hop_len = 3200//4
power = 2
top_db = 80
我们使用了非常简单的 CNN 架构。
class Model(nn.Module):
def __init__(self,name,pretrained=False):
super(Model, self).__init__()
self.model = timm.create_model(name,pretrained=pretrained, in_chans=1)
self.model.reset_classifier(num_classes=0)
in_features = self.model.num_features
self.fc = nn.Linear(in_features, cfg.CLASS_NUM)
def forward(self, x):
x = self.model(x)
x = self.fc(x)
return x
我们使用的骨干网络如下:
我们在 5 秒和 7 秒的音频片段上训练模型,并使用了次要标签。
首先,我们使用 2020、2021、2022 年的数据(不包含本次比赛的计分鸟类数据)制作了预训练模型。
接下来,我们在计分鸟类数据上对预训练模型进行了微调。
我们集成了单个训练模型(前 30 秒训练,后 5 秒验证,7 秒片段)和 5 折模型(5 秒片段),并应用了 TTA:
if i <= 2:
pred = model(images).sigmoid().detach().cpu().numpy()
else:
pred1 = model(images[:,:,:,0:201]).sigmoid().detach().cpu().numpy()
pred2 = model(images[:,:,:,40:241]).sigmoid().detach().cpu().numpy()
pred3 = model(images[:,:,:,80:281]).sigmoid().detach().cpu().numpy()
pred = 0.25*pred1 + 0.5*pred2 + 0.25*pred3
模型加权
公榜分数高的模型权重较大,公榜分数低的模型权重较小。
然后我们应用了投票法:
在对模型预测结果进行加权平均后,我们根据投票分数重新调整了预测权重。投票分数的计算方法是判断每个模型的预测值是否超过了给定的阈值。通过这样做,我们的目标是获取更多稀有鸟类的真正例。
如何确定阈值
我们应用了百分位方法(参考了 2021 年第二名方案)。