鲸鱼和海豚识别竞赛解析:上分思路
数据
backfin:只保留目标的背鳍特征(通过检测的方法得到的),有点类似人脸关键点的作用。
数据增强使用:
颜色增强:
random_hue
random_saturation
random_contrast
random_brightness
几何增强:
random_flip_left_right
离线增强:
使用显著性目标检测去掉背景,得到无背景(背景变为白色)图片。统计这些图片中白色背景占比,并将占比低于某个阈值的图片取出来,添加到训练集中。
模型
- EfficientNet-B5/6/7
效果相比ConvNext和SwinTransformer要好一些,且b7>b6=b5
修改:将低层特征与高层特征分别做全局平均池化,将得到的特征向量拼接在一起,作为输入图片编码后的特征向量。
- ConvNext-Large/Xlarge
效果其次
- SwinTransformer
效果一般。图像尺寸最大限制为384,可能是这个原因
损失函数
ArcFace(s=15,m=0.3)+SoftMax,s和m这俩参数对于最终结果影响挺大的
训练策略
将数据集划分为5个fold
对于每个fold,训练过程分为两个阶段,第一个阶段使用较小的分辨率(384)和较大的batch szie,第二个阶段加载第一个阶段的训练权重文件,使用较大的分辨率(640)和较小的batch szie,并冻结BN层。
学习率预热
在小数据集上调参,在完整数据集上训练
融合策略
- 特征层面融合
将相同模型的不同fold进行融合(5个fold的embedding求平均),作为每个模型的结果,再将不同模型的结果进行融合(concat后做normalize),得到每张图片编码后的特征向量
- 硬投票融合
对每个模型的预测结果进行加权融合
这种方法使用public score作为投票权重,一定程度上可能会过拟合public dataset,然而,在这个比赛中,似乎public和private dataset分布相差
好用但没使用的方法
使用伪标签,提分就像滚雪球一样
使用更大的分辨率(但显存是个问题)
融合更多的模型,比如第一名融了100多个模型(不同数据集,不同骨干网络,不同的分辨率等)
对不同的embedding做加权融合时,使用贝叶斯优化寻找合适的权重(没有了解过)