籍缓、陆震编译

Kaggle座头鲸识别赛,TOP10团队的解决方案分享

Kaggle的座头鲸识别挑战比赛在最近落下帷幕,全球共2131个团队参加了比赛。

这是近期Kaggle上颇受欢迎的一次竞赛,常用的分类方法无法处理大量的无标注数据,只有对传统的方法进行创新,才能够获得高分。

下面文摘菌为大家介绍比赛中排名TOP10的团队如何完成比赛,以及其他几只团队的相关经验。

注:该团队由Vladislav Shakhray,Artsiom Sanakoyeu海德堡大学的博士组成,以及Kaggle Top-5 大神Pavel Pleskov。

本文作者Vladislav Shakhray,文摘菌对其编译如下。

比赛链接: https://www.kaggle.com/c/humpback-whale-identification

问题描述

在比赛中,主要是构建算法来识别图像中的鲸鱼个体,而难点在于训练样本的严重不均衡以及存在近三分之一的无标注数据。

训练数据中的同一条鲸鱼的9张照片的示例

在超过2000个鲸鱼类别,只有一个训练样本,这使得常用的分类方法很难使用。更重要的是,无论鲸鱼是否是新的种类,这都是比赛的重要组成部分,结果证明这是非常重要的。

鲸鱼种类间照片数量差距很大

竞赛的衡量标准是MAP @ 5(平均精度为5),能够为每个测试图像提交最多5个预测。 我们在测试集上的最高成绩是0.959 MAP @ 5。

验证和初始设置

在本次比赛前几个月,同一比赛的另一个版本在Kaggle上举行,但是,正如竞赛发起人所指出的那样,现在的版本包含更多清洁的数据。我们决定以多种方式利用之前比赛的成果和数据:

1.使用之前竞争对手的数据,我们使用image hashing来收集超过2000个验证样本。 当我们稍后验证我们的成果时,这一方法非常重要。

2.我们从训练数据集中删除了new_whale类,因为它不在其元素之间共享任何逻辑图像特征。

3.有些图像根本没有对齐。 幸运的是,在之前一版kaggle比赛的成功解决方案中有一个公开可用的预训练边界框模型。我们用它来检测鲸鱼周围的精确边界框并相应地裁剪图像。

4.由于图像的颜色不同,所有数据在训练前都转换为灰色。

方法1:孪生神经网络Siamese Networks(Vladislav)

我们的第一个架构是一个具有众多分支架构和自定义损失的孪生神经网络(Siamese Networks),其中包括许多卷积和密集层。 我们使用的分支架构包括:

  • ResNet-18, ResNet-34, Resnet-50

  • SE-ResNeXt-50

  • Martin Piotte公开分享的类似ResNet的自定义分支

我们通过在每4个时期的分数矩阵上求解线性分配问题来使用显著阴性(hard-negative mining)和显著阳性挖掘(hard- positive mining)。 在矩阵中添加了一些随机化以简化训练过程。

使用渐进式学习(Progressive learning),分辨率策略为229x229 - > 384x384 - > 512x512。 也就是说,我们首先在229x229图像上训练我们的网络,几乎没有用正则化和更大的学习率。 在收敛之后,我们重置学习速率并增加正则化,从而再次对更高分辨率的图像(例如384×484)训练网络。

此外,由于数据的性质,使用了大量增强,包括随机亮度,高斯噪声,随机剪裁和随机模糊。

此外,我们采用智能翻转增强策略,极大地帮助创建了更多的训练数据。 具体地,对于属于相同的鲸鱼X,Y的每对训练图像,我们创建了另外一个训练对翻转(X),翻转(Y)。 另一方面,对于每对不同的鲸鱼,我们创建了另外三个例子:翻转(X),Y,Y,翻转(X)和翻转(X),翻转(Y)。

一个显示随机翻转策略不适用于一对相同鲸鱼照片的例子。 请注意当我们翻转图片时,两张图片的翻转效果不同,因为我们关心鲸鱼尾部的寄生藻的位置。

使用Adam优化器优化模型,初始学习率为1e-4,接近训练结束时减少5倍。 批量大小设置为64。

模型是用Keras编写的。在单个2080Ti上花费2-3天(取决于图像分辨率),训练模型大约400-600个周期。

使用ResNet-50性能最佳的单一模型得分为0.929 LB。

方法2:度量学习Metric Learning(Artsiom)

我们使用的另一种方法是使用保证金损失进行度量学习。 我们使用了许多ImageNet预训练的架构,其中包括:

  • ResNet-50, ResNet-101, ResNet-152

  • DenseNet-121, DenseNet-169

这些网络主要由448x448 - > 672x672策略逐步训练。

我们使用了Adam优化器,在100个训练周期后将学习率降低了10倍。 我们还为整个训练使用批量大小为96的训练方法。

由Sanakoyeu,Tschernezki等人开发的度量学习(metric learning)方法能够让成绩迅速提升。

度量学习在CVPR 2019上发布,它所做的是每个周期它将训练数据以及嵌入层分成簇。在训练组块和学习者之间建立双射之后,模型分别训练它们,同时累积分支网络的梯度。

代码及文章链接:https://github.com/CompVis/metric-learning-divide-and-conquer

由于巨大的种类数量不平衡,我们使用了大量的增强,包括随机翻转,旋转,变焦,模糊,光照,对比度,饱和度变化。 之后,计算查询特征向量和列车库特征向量之间的点积,并且选择具有最高点积值的类作为TOP-1预测。 隐含地帮助类不平衡的另一个技巧是对属于相同鲸鱼id的火车图像的特征向量进行平均。

这些模型使用PyTorch实现,需要单个Titan Xp 2-4天(取决于图像分辨率)来训练。 值得一提的是,具有DenseNet-169架构表现最佳的单一模型得分为0.931LB。

方法3:特征分类(Artsiom)

当我和Artsiom联手时,我们做的第一件事就是使用从我们所有模型中提取并连接(应用PCA分析)的特征来训练分类模型。

分类的主要部分由两个密集的层组成,其间会删失信息。由于我们使用了预先计算的特征,因此模型训练得非常快。

通过这种方法我们获得了0.924 LB,并让整个集合更富多样性。

方法4:新鲸鱼分类(Pavel)

本次比赛最复杂的部分之一是正确分类新鲸鱼(大约30%的图像属于新类别鲸鱼)。

解决这个问题的流行策略是使用一个简单的阈值。也就是说,如果给定的图像X属于某个已知类别鲸鱼的最大概率小于阈值,则将其归类为新鲸鱼。然而,我们认为可能有更好的方法来解决这个问题。

对于每个表现最佳的模型和集合,我们选取了TOP-4预测,按降序排序。然后,对于其他的每个模型,我们将他们的概率用于所选择的这4个类。目标是根据这些特征来预测鲸鱼是否属于新类别。

Pavel创建了一个非常强大的包含LogRegression,SVM,几个k-NN模型和LightGBM的混合模型。这个混合模型在交叉验证中给出了0.9655 的ROC-AUC值,并且将LB得分提高了2%。

综合

由我们的模型构建混合模型相当不容易。难度在于我的模型的输出是非标准化概率矩阵(从0到1),而Artsiom提供的输出矩阵由欧几里德距离组成(范围从0到无穷大)。

我们尝试了许多方法将Artsiom的矩阵转换为概率,其中包括:

1、类似tSNE的转换:

2、Softmax

3、通过应用函数 1 / (1 + distances)简单地反转范围

4、其他可以反转矩阵范围的函数

不幸的是,前两种方法根本不起作用,而使用大多数函数将范围剪切至[0,1]的结果大致相同。我们最终选择在验证集上具有最高mAP @ 5的函数。

令人惊讶的是,最好的是1 / (1 + log(1 + log(1 + distances)))。

其他团队使用的方法

大卫现在是Kaggle Grandmaster(等级为12),在Private LB上排名第四,并在Kaggle Discussions论坛上分享了他的解决方案。

https://www.kaggle.com/c/humpback-whale-identification/discussion/82356

他使用全分辨率图像并使用传统的关键点匹配技术,利用SIFT和ROOTSIFT。为了解决假阳性问题,大卫训练了一个U-Net从背景分割鲸鱼。有趣的是,他使用后期处理给只有一个训练样本的类别更多的机会跻身TOP-1预测。

我们也考虑过尝试基于SIFT的方法,但我们确信它肯定会比顶级神经网络表现得差。

在我看来,我们能从中学会的是,永远不应被深度学习的力量所蒙蔽,从而低估了传统方法的能力。

单纯分类

由Dmytro Mishkin,Anastasiia Mishchuk和Igor Krashenyi组成的Pure Magic thanks radek团队(第7名),追求将metric learning(triplet loss)和分类结合起来,正如Dmytro在他的文章中描述的那样。

在训练分类模型一段时间时,他们尝试使用Center Loss来减少过拟合,并在应用softmax之前进行temperature scaling。在使用的众多主干架构中,最好的是SE-ResNeXt-50,它能够达到0.955LB。

temperature scaling:https://arxiv.org/pdf/1706.04599.pdf

他们的解决方案比这更加多样化,我强烈建议你参考原文。

正如Ivan Sosin在文章中(他的团队BratanNet在本次比赛中排名第9)所述,他们使用了CosFace和ArcFace方法。下面是来自于原文:

Cosface和Arcface作为面部识别任务新近发现的SOTA脱颖而出。其主要思想是在余弦相似空间中将同类的例子相互拉近并分开不同的类别。通常是分类任务使用cosface或arcface,因此最终的损失函数是CrossEntropy

当使用像InceptionV3或SE-ResNeXt-50这样的较大主干网络时,他们注意到了过拟合,因而他们切换到较轻量的网络,如ResNet-34,BN-Inception和DenseNet-121。

文章链接:https://www.kaggle.com/c/humpback-whale-identification/discussion/82427

该团队还使用了精心挑选的扩充和众多网络修正方法,如CoordConv和GapNet。

他们方法中特别有趣的是他们处理新类别鲸鱼的方式。下面是原文:

一开始我们就意识到必须对新鲸鱼做一些处理,以便将它们纳入训练中。简单的方法是给每个新鲸鱼分配一个1/5004的可能属于每一类别的概率。在加权采样方法的帮助下,它带来了一些提升。

但后来我们意识到可以使用softmax预测来自于训练集中的新鲸鱼。所以我们想到了distillation。我们选择distillation代替伪标签,因为新鲸鱼的标签应该与训练的标签不同,虽然它可能不是真的。

为了进一步提升模型性能,我们将带有伪标签的测试图片添加到训练集中。最终,我们的单一模型可以通过snapshot ensembling达到0.958。不幸的是,以这种方式训练的ensembling并没有在分数上有任何的提高。也许是因为伪标签和distillation造成的多样性减少。

最后的思考

最后的排名

令人惊讶的是,尽管私人测试集占到全部测试集的近80%,但是最终结果几乎没有大的改变。我相信比赛的主办方已经提供了一个非常有趣的问题,以及经过很好地处理的数据。

这是我参加的第一场Kaggle比赛,毫无疑问,它表现出了Kaggle比赛的有趣,迷人,激励和教育性。我要祝贺由于这次比赛而成为Expert,Master和Grandmaster的人。我还要感谢ODS.ai社区提供的精彩讨论和支持。

最后,我要再一次特别感谢我的队友Artsiom Sanakoyeu和Pavel Pleskov,为我带来了一次难忘的Kaggle比赛经历。

相关报道:

https://towardsdatascience.com/a-gold-winning-solution-review-of-kaggle-humpback-whale-identification-challenge-53b0e3ba1e84

秉承“普及数据思维,传播数据文化,助⼒产业发展”的企业⽂化,我们专注于数据领域的资讯、案例、技术,形成了“媒体+教育+⼈才服务”的良性⽣态,致⼒于打造精准数据科学社区。

工程Kaggle图像识别度量学习
4
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

假阳性技术

假阳性是指模型因为种种原因把不应该分类成特定情况的人/物错误地分类到了该分类的情况。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

CoordConv技术

一种神经网络层,用于代替卷积,由 Uber 提出。

验证集技术

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

度量学习技术

即学习一个度量空间,在该空间中的学习异常高效,这种方法多用于小样本分类。直观来看,如果我们的目标是从少量样本图像中学习,那么一个简单的方法就是对比你想进行分类的图像和已有的样本图像。但是,正如你可能想到的那样,在像素空间里进行图像对比的效果并不好。不过,你可以训练一个 Siamese 网络或在学习的度量空间里进行图像对比。与前一个方法类似,元学习通过梯度下降(或者其他神经网络优化器)来进行,而学习者对应对比机制,即在元学习度量空间里对比最近邻。这些方法用于小样本分类时效果很好,不过度量学习方法的效果尚未在回归或强化学习等其他元学习领域中验证。

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

查询技术

一般来说,查询是询问的一种形式。它在不同的学科里涵义有所不同。在信息检索领域,查询指的是数据库和信息系统对信息检索的精确要求

正则化技术

当模型的复杂度增大时,训练误差会逐渐减小并趋向于0;而测试误差会先减小,达到最小值后又增大。当选择的模型复杂度过大时,过拟合现象就会发生。这样,在学习时就要防止过拟合。进行最优模型的选择,即选择复杂度适当的模型,以达到使测试误差最小的学习目的。

交叉验证技术

交叉验证,有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证的目标是定义一个数据集到“测试”的模型在训练阶段,以便减少像过拟合的问题,得到该模型将如何衍生到一个独立的数据集的提示。

Adam优化器技术

自适应矩估计(Adam)优化器是计算每个参数的自适应学习率的另一种方法。 除了存储像Adadelta和RMSprop之类的过去平方梯度vtvt的指数衰减平均数之外,Adam也保持了过去梯度mtmt的指数衰减平均值,类似于动量:

暂无评论
暂无评论~