第14名解决方案
第14名解决方案
作者:Naoki Kato
比赛排名:第14名
感谢主办方举办这场有趣的比赛,并祝贺所有获奖者。比赛很艰难,但对我来说是一次很棒的经历。
数据集
分别训练了三个Yolov5模型来检测全身和背鳍。
通过改变数据集,分数有了很大提高:原始图像 -> Detic裁剪 -> 全身裁剪 -> 全身/背鳍裁剪。
模型
- ArcFace模型分别使用全身裁剪(640×640)和背鳍裁剪(448×448)进行训练。ArcFace的参数设置为scale = 25,margin = 0.5(在我的情况下,改进的数据集配合大margin效果很好)。嵌入大小为2048。
- 还使用了用于物种分类的Focal loss(损失权重 = 0.1)。
- 骨干网络:Efficientnet-b7 和 ConvNeXt-L
- 为了使嵌入更具判别力,将特征图乘以以GAP特征作为查询计算出的注意力权重。这仅在Efficientnet上有效。
- 伪标签:取大约30%的顶部预测(使用更多数据和多次迭代可能会更好)。
- 蒸馏:使用教师模型的特征作为软目标并计算MSE。这在训练早期极大地提高了性能,但对最终分数的贡献似乎没有那么大,因此采用余弦调度将最终权重设置为0。
数据增强
使用了平均模糊、运动模糊、高斯噪声、饱和度、亮度、对比度、灰度以及仿射变换(翻转、旋转、剪切、缩放和平移)。
训练细节
- 超参数:AdamW,权重衰减 = 0.05,基础学习率 = 2e-4,带线性预热的余弦调度,批次大小 = 24,配合梯度累积。
- 使用PyTorch,在单张A100 GPU上训练30个epoch,全身模型大约需要30小时,背鳍模型需要15小时。
- 最佳单全身模型的Private LB分数为0.781。
后处理
- 使用测试图像的特征和每个模型的ArcFace权重计算个体的余弦相似度矩阵。
- 然后平均这些矩阵,集成八个全身/背鳍模型。
- 使用固定阈值插入new_individual(本应该为每个物种更改阈值)。
- 最后,基于余弦相似度的差异和类别平衡的顶部分配程度,切换相邻的顶部预测。
无效尝试
以下方法在我的情况下没有奏效:
- Elasticface
- Magface
- 基于损失幅度设置样本级margin
- 三元组损失
- 使用DINO自蒸馏损失的半监督学习(有些效果,但采用了伪标签)
- 在输入中添加SOD掩码通道
- 在输入中添加注意力权重通道
感谢阅读。