440. iWildcam 2021 - FGVC8 | iwildcam2021-fgvc8
我创建了一个具有与原始数据集相同类别比例的小型数据集(占原始数据集的10%),并进行了大量实验以便在比赛中快速推进。
在我的初步实验中,我发现与其直接裁剪和调整检测框的大小,不如使用反射填充来裁剪和填充检测框,这样可以提高分数。因此,我的最终解决方案在训练和测试中都使用了反射填充。我的预处理流程如下:
裁剪检测框 -> 反射填充 -> 数据增强 -> 标准化
在我的实验中,添加任何类型的数据增强都会降低我的验证分数。因此,我保留了强度非常低的简单增强。我使用的增强方法如下:
我是这样处理不平衡问题的:https://www.kaggle.com/c/iwildcam2021-fgvc8/discussion/242455
对于我的小型数据集,我实验了 EfficientNet B2 Noisy Student。对于最终提交,我使用了 EfficientNet B5 Noisy Student。我没有使用 ImageNet 预训练权重。
在一个公开的内核中,我看到了“最大计数逻辑”。在这种逻辑中,序列中图像的最大检测数量(最大计数)被视为该序列的预测值。我修改了这个逻辑,同时也考虑了最大频率。例如——在一个只有一种动物的9张图像序列中,每张图像的检测数量为 [1,1,1,1,2,2,2,4,2]。最大计数逻辑将预测为4,而最大计数 + 最大频率逻辑将预测为2。很有可能存在误检,因此检测到4个目标的第8张图像(其中可能包含2个误检)会被消除。1和2的频率相同,因此将考虑最大计数,即2。我看到使用最大计数 + 最大频率逻辑后,验证准确率和公开分数都有所提升,因此在最终提交中使用了该方法。
此外,更高的 MegaDetector 检测置信度阈值效果更好,因此我在最终提交流程中使用了 0.7 作为检测置信度。
我尝试了混合精度训练,但不使用混合精度的训练对我来说效果更好。我在小型数据集实验中没有使用任何学习率调度器。但在最终训练 EfficientNet B5 Noisy Student 时,我使用了“平台期降低”。我低估了 EfficientNet B5 Noisy Student 所需的训练时间。我在最后一周耗尽了剩余的26小时 GPU 时间来训练 EfficientNet B5 Noisy Student,但它仍然有点欠拟合,验证准确率约78%,训练准确率82%。在耗尽我的 Kaggle GPU 配额后,我切换到 Colab 继续训练。这次我更改了一些超参数,如批次大小和学习率,但由于时间不足(截止日期临近),我只能达到82%的验证准确率和85%的训练准确率。但我无法使用 Colab 进行提交,因为我后来意识到测试集有30GB,而在 Colab 上我只有28GB的磁盘空间。我甚至无法在那里下载压缩包。所以我的最终模型仍然欠拟合(即它需要更多的训练)。