鲸鱼识别挑战赛

奖金区的 solution 和 code 整理:
首次 Kaggle 竞赛,收货一个铜牌

数据分析
训练数据有 25,361 张,测试集有 7,960 张,共有 5004 + 1 (new_whale) 类的鲸鱼,未知身份的鲸鱼统一标记为 new_whale。在训练集中,属于 new_whale 的图像有 9,664 张,只有一张图像的类别有 2,073 类,数据的类别分布极不均衡,仅有单一图像的类别太多,这是一个 one-shot 的识别问题,使用分类来做不会得到较好的结果,需要使用度量学习,不过也有例外,第三名就是使用分类的方法,使用了 ArcFace,加上关键点,得到了 0.97113 的准确率。

鲸鱼尾部图像样例
评价指标
Mean Average Precision @ 5 (MAP@5):
具体的指标介绍,可以看这个 kaggle kernel:https://www.kaggle.com/pestipeti/explanation-of-map5-scoring-metric
建立本地验证集
保留仅有一张图像的类别,剩下的抽取 512 个 ID,每个 ID 随机抽取 1 张,new_whale 中抽取 230 张 (根据测试集中的 new_whale 比例),共 742 张作为本地验证机,与 LB 分数相差不多
我的方法
- 分类
使用分类的方法来做,首先 new_whale 不能算为一类,应该去掉 new_whale 类,使用剩下的 5004 类进行训练,在测试集上设置一个阈值,当模型预测该张图像类别的概率低于阈值时,加入 new_whale 类。但是分类的方法无法将 new_whale 的 9664 张图像加入训练,这是巨大的浪费,另外图像数量过少的类别,即使使用了 weightSampler 和 data augmentatipn 也无法得到较好的结果。我使用这种方法仅得到了 LB/PB:0.56911/0.56356 的分数; - Siamese network
这是一个识别的问题,所以使用 Siamese 网络来进行识别,使用 kaggle kernel 训练 300 个epoch 后可以得到0.90 左右的分数,但是训练时间要 一周以上。使用 Siamese 网络的关键是进行 hard negative example mining,即挖掘难以识别的样本进行着重训练,这个 baseline 中使用 lap 库进行线性规划,挖掘 hard example,我想转化到 pytorch,但是hard negative example mining 部分没有复现成功,网络输入的图像配对策略仅为随机选取,分数仅能达到 0.7 左右; - ReID
这题的关键是将 new_whale 部分的数据加入训练,所以可以考虑使用 ReID 的方法,使用 ReID baseline 可以达到 0.87 左右的分数; - 二分类
还是那句话,这题的关键是将 new_whale 部分的数据加入训练,所以也可以使用分类的方法,但是将直接分成 5004 类转化为构建 5004 个二分类的分类器,每一个分类器判断改张图像是否属于该类,这样转化后可以将 new_whale 类加入训练,训练图像的数量增加很多,分数可以达到0.96 左右(第一名与第二名的大佬所说),但是我用这种方法仅得到了 0.9 的分数,看来还是调参不行,任重而道远;
通用的 trick
- 输入图像长宽比为 2:1 (可调)
- TTA (test time augmentation)
- data distillation: 恰好之前举行过 playground 的比赛,但是 featured 和 playground 部分的数据没有和在一起,这给了我们使用数据蒸馏的机会,可以参考 Data Distillation: Towards Omni-Supervised Learning,将 playground 和 test 中的数据加如训练
- ensemble:模型集成,特征层面的集成,结果的集成,甚至是直接结果文件的集成
- 将图像进行水平翻转(fliplr),由于鲸鱼的尾部图像不具有对称性,所以可以将水平翻转的图像当作一个新的类别,可以极大提高分数:来自 Heng
- bounding box:bounding box 可以从这下载:https://www.kaggle.com/suicaokhoailang/resnet50-bounding-boxes-0-628-lb/data
- mask: mask 可以从这里下载 https://www.kaggle.com/c/humpback-whale-identification/discussion/78453,第一名的方案中就使用了 mask,与原图像组合在一起变成 4 通道的输入;
可视化

我的 code
github: pytorch https://github.com/xungeer29/Humpback-Whale-Identification
参赛感受
Kaggler 就是一群追求极致的人,kaggle 上的比赛就是一堆人一起将一个项目做到极致,真的是极致,每个细节都追求极致!!!
附
希望今年能拿个金牌