419. Rainforest Connection Species Audio Detection | rfcx-species-audio-detection
这是一场非常精彩的比赛。我将主要从我的角度记录我们的历程,我的队友 @jpison、@amezet、@pavelgonchar 可能会补充更多细节……
我们的解决方案是两种模型的排名集成,主要(97%)使用下述架构,另外 3% 是 SED(声音事件检测)模型的集成。下述架构是在最后 7 天完成的……我在 8 天前才提交了第一个(相当糟糕的)结果,我在团队合并截止日期前刚加入团队,所有的想法都在大约 7 天内完成/实现……
单个 5 折模型达到了 0.961 的 Private 分数和 0.956 的 Public 分数;详情如下:
这可能是关键所在。我们提取每个 TP(真阳性)或 FP(假阳性),在生成声谱图(注意不是 MEL 频谱图,因为 MEL 是为了模拟人类听觉设计的,而雨林物种并没有像人类听觉那样进化)后,根据每个类别的固定大小在时间和频率维度上进行裁剪。例如,对于类别 0:最小频率是 5906.25 Hz,最大是 8250 Hz,时间上我们取该类别 TP 中最长的时间长度,即类别 0 为 1.29 秒。
通过上述采样,声谱图生成如下图像:

该 TP 的真值 标签将是:
tensor([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 1., nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]))
像其他参赛者一样,我们将类别从 24 个扩展到 26 个,以便区分有两种歌声的物种。
另一个样本:

tensor([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 1., nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]))
请注意,图像大小是相同的,因此相对于网络看到的实际内容,时间和频率实际上被拉伸了,但我认为只要网络有足够的感受野(它们确实有),这就没问题。
这样做的原因是我们需要以某种方式注入时间和频率限制作为归纳偏置,这看起来是个不错的方法。
这只是一个输出 26 个 logits 的图像分类器,仅此而已。唯一的亮点是在频率轴上添加了相对位置信息(类似于 coordconv),所以模型简单得令人尴尬:
class TropicModel(Module):
def __init__(self):
self.trunk = timm.create_model(a.arch,pretrained=True,num_classes=n_species,in_chans=1+a.coord)
self.do = nn.Dropout2d(a.do)
def forward(self,x):
bs,_,freq_bins,time_bins = x.size()
coord = torch.linspace(-1,1,freq_bins,dtype=x.dtype,device=x.device).view(1,1,-1,1).expand(bs,1,-1,time_bins)
if a.coord: x = torch.cat((x,coord),dim=1)
x = self.do(x)
return self.trunk(x)
只是带掩码的 Focal Loss。实际上这是个错误,因为 Focal Loss 是一个废弃测试的遗留物,我(意外地)把它留在了那里,我原以为(直到我现在检查代码写