识别座头鲸,Kaggle竞赛第一名解决方案解读
图注:Kaggle座头鲸识别挑战赛 leaderboard
为了帮助鲸鱼保护,科学家们使用照片监视系统 (Photo Surveillance Systems) 来监视海洋活动。他们使用鲸鱼尾巴这一独一无二的标记来在连续的图像中识别鲸鱼,并对它们的活动进行细致地分析。在过去的四十年里,大部分工作基于科学家们的手工作业,这也使得大量的数据未被充分利用。
在这一竞赛中,我们是要构建算法来识别图像中的鲸鱼个体,而难点在于训练样本的严重不均衡以及存在近三分之一的无标注(new whale)数据。
1.概述
这是一个few shot learning和细粒度分类的问题。比赛初期,我们使用了softmax + 固定阈值的方法,仅对有标注的样本进行训练并通过阈值插入new whale的预测,但是没有取得很好的效果(MAP@5 < 0.9)。为了将new whale加入网络中训练,我们针对每一类鲸鱼进行二分类(如下图所示),并且使用triplet loss来做特征度量。通过大量实验,SE-resneXt154被作为最优的backbone,取得了单模型0.96的baseline,在追加了一系列tricks之后,单fold模型达到了0.969 (private LB: 0.97+ 榜上第三名)。最后,借助4 fold cross validation,以及类别平衡后处理,得到了最终public & private两榜第一名的0.973。
2.网络输入
我们使用RGB + Mask的四信道输入(Mask来源于我们训练的分割模型,通过论坛中开源的450张标注数据训练即取得了很好的效果: MAP for local cross validation: 0.96+ )。
3.鲸鱼水平翻转,并赋予新的id(+0.006~0.007)
论坛中,选手Heng CherKeng 提出“根据鲸鱼尾部不对称的特性(见下图),将其翻转可以得到新的类别”这一假设。这个假设没有得到很多的赞同票,但在我们的实验中取得了非常好的效果。赛后我们也获悉,第三名Pudae使用了同样的技巧亦提高了分数。
4. 伪标签(+0.002)
在模型得到public 0.96+的分数时,我们做了一次伪标签:将预测置信度为1的测试样本加入到训练集中。
5. 类间平衡(+0.001~0.002)
我们发现随着模型性能的提升,预测结果中top1对应的不同类别数也在增加(见下图)。所以我们用了以下策略:
假设五个预测为:class_1 class_2 class_3 class_4 class_5
如果1) class_1的置信度减去class_2的置信度 < 0.3, 2) 并且class_2没在top1中出现过,3) 而class_1在top2中多次出现,则交换class_1与class_2的位置。
最后,感谢队友们的努力:@Yiheng Wang, @Peiyuan Liao and @Thomas Tilli。感谢@ Heng CherKeng,祝贺3位新的Grandmaster!@SeuTao, @David, @Weimin Wang。
我们已经将方案代码进行了整理并开源:
- https://github.com/earhian/Humpback-Whale-Identification-1st-
英文版本可从Kaggle论坛查看:
- https://www.kaggle.com/c/humpback-whale-identification/discussion/82366