第20名解决方案:使用ONNX的SED + CNN集成
第20名解决方案:使用ONNX的SED + CNN集成
首先,我要感谢竞赛主办方组织这次竞赛,也要感谢各位参与者。
我要特别向我的队友 @yokuyama、@viiino、@mobykjr 和 @vupasama 表达最诚挚的感谢!!!
概述
我的最终提交是以下5个模型的集成:
- eca_nfnet_l0 (SED)
- eca_nfnet_l0 (简单CNN)
- tf_efficientnetv2_b0 (SED)
- tf_efficientnet_b0.ns (简单CNN)
- tf_mobilenetv3_large_100 (简单CNN)
这些模型使用ONNX进行了加速。
我们的方法
- 模型
- 音频处理
- 使用了Torchaudio。
- 波形处理:
- 时长:5秒
- 采样率:32000
- 使用了次要标签(以0.5的软标签使用)
- 如果音频不足5秒,则重复拼接直到超过5秒
- 验证时使用音频的前5秒
- 使用audiomentations.Normalize进行归一化
- 梅尔频谱图:
- n_fft: 2048
- win_length: 2048
- hop_length: 320
- f_min: 50
- f_max: 14000
- n_mels: 128
- top_db: 80
- 使用ImageNet的均值和标准差进行标准化
- 模型参数
- drop_rate: 0.5
- drop_path_rate: 0.2
- criterion: BCEWithLogitsLoss (标签平滑: 0.0025)
- optimizer: AdamW (lr: 1.0e-3, weight_decay: 1.0e-2)
- scheduler: OneCycleLR (pct_start: 0.1, div_factor: 1.0e+3, max_lr: 1.0e-3)
- epoch: 30
- batch_size: 32
- 数据增强
- 波形增强:
- 梅尔频谱图增强:
- 使用Torchaudio masking:
- torchaudio.transforms.FrequencyMasking(freq_mask_param=mel_specgram.shape[1] // 5)
- torchaudio.transforms.TimeMasking(time_mask_param=mel_specgram.shape[2] // 5)
- mixup (alpha = 0.5), cutmix (alpha = 0.5)
- 预训练
- 使用Birdclef 2021和2022的数据进行预训练。
- 预训练时长为15秒且不进行过采样。
- 处理不平衡数据
- 添加无呼叫数据
- 无呼叫数据使用增强时采用的背景噪声音频,所有标签设为0。
- 后处理
- 对于SED模型,输出在帧级别和片段级别进行了平均。
- 推理加速
- 使用ONNX显著快于torchscript。
- 标准化数据预处理,使同一预处理数据可输入多个模型。
- 预处理数据提前存储在字典中,采用并行处理。
- CV策略
- StratifiedKFold (n=5, stratify=primary_label)
- 所有鸟类物种都包含在训练数据中。
哪些方法有效
- 过采样
- 训练时随机截取或提取前5秒音频(各50%比例)
- 以下增强方法:
- SED模型
- 标签平滑
- 添加无呼叫数据
- 预训练中增加时长
- 集成:
- 次要标签
- 在数据加载器中设置较多numworkers → 显著提升训练速度!
哪些方法无效
- 以下增强方法:
- Focal Loss
- 在2023数据训练时使用长时长(15秒、30秒等)
- 在提交中处理前后秒音频数据:
- 使用前后各5秒共15秒创建梅尔频谱图预测 → 笔记本超时
- 移动平均、移动加权平均
- 大型模型
- 几何平均
- LSTM头
- 强dropout
- 排序集成
- 手动标注:
代码