kaggle:iMet Collection 2019 - FGVC6

1 评估指标

f2 score=

2 训练集与109237 张,测试集分为两个阶段,第一个阶段7443 张,第二阶段是unseen的,大小5.2 倍于test1.

3 数据分析

3.1 类别总数:1103 类,其中culture 有398 类,tag 有705 类

3.2 每张图像所含类别个数:1~11 ,大多数图像含有2-3个标签,但是有张图像含有11个。

3.3 前20的label 中的culture 和tag 分别占了整个数据集的0.72%和1.83% ,这说明大多数label 是所出现次数是非常少的。

3.4 图像尺寸: 数据集中图像尺寸分布特别不均衡,由KED plot,width中最大的大5000,height最大的到7000.

总结: 由于以上几点可知,该数据集由于在图像尺寸,图像所含的标签个数以及每种标签所出现得次数差距均较大,因此该数据集也是极度不平衡的,由于共有1103 类,从而进一步增大了分类的难度。

4 数据预处理和数据增强

由第一部分可知,该比赛数据严重不均衡,所以做了以下尝试。

4.1 resize_padding_resize: 我们设置了一个阈值aspect_ratio,用来处理那些尺寸极度不均衡的图像,具体的做法是先判断图像的宽高比,如果大于阈值,则先把短边resize 成原来的2倍,然后在把resize 后的短边padding 大长边的大小,最后在把padding后的图像resize 成300*300 。直接对原图resize 成300*300,出来的图像就会损失太多的信息,而且由人看的话,也会把之前的毛笔误认为梳子,所以从理论上来说这一步应该对结果有提升,但是LB却没有任何提升。

4.2 MultScaleCrop : 为了增加图像的多尺度性,采用不同的scale 因子(1,0.875,0.75,0.66),在原图上随机crop,然后将crop 后的图像resize 成300*300。 效果: LB与直接在原图上RandomCrop 差不多,所以后面训练模型是对训练集额处理采用的是RandomCrop。

4.3 对测试集进行FiveCrop: 在想出这个方案之前,一直用的是centerCrop 对测试集进行预处理,然后在TTA: 后面仔细分析了一下,如果该任务是multi-label,如果有的label 在图像的边缘,进行CenterCrop 的话就有可能会丢失该label的信息。因此我们做了FiveCrop 。

4.4 data augment :

训练集: 包含了 RandomErasing 和mix up 的增强手段

测试集:5 倍的TTA,采用FiveCrop 的预处理手段

4.5 列出获奖队的data augment 方法:

top1 : 采用CropIfNedeed +Resize 预处理,并对处理后的图像进一步增强。

top9:采用了 RandomResizedCropV2 的预处理

5 模型选择和设计

将训练集分成6折,然后使用第一折的数据进行单模型的训练和验证,从而确定不同种类模型的性能。由于kernel-only的规则,kaggle 官方kernel 运行时间不能超过9小时,所以就选择的是复杂度适中的模型,但有人实验证明,网络越深,其效果越好。

5.1 backbone

resnet50,cbam_resnet50,seresnext50,airnext50,resnet101 ,densenet121,inceptionv3 对这些模型做过测试后,基于运行时间和网络性能选择了最终的三个backbone 分别是带有attention 机制的cbam_resnet50 ,seresnext50,airnext50 

5.2 backbone 的改进-引入multiScale 机制

受SSD的启发,我们引入了multiScale 机制,即将网络中间层的feature map 经过global average pooling 后concat 到最后的全连接层,这样做能使得feature map 得到更好的复用。这一操作使得CV 和LB 均提高了0.005 左右。

5.3 label correlation : 引入图卷积网络GCN

由于该比赛是一个multi-label classification,所以不同类别之间具有一定的相关性,具体来说有的类别一旦出现,另一个类别有很大概率也会出现,所以为了让网络能学到这种相关性,我们参考了ML-GCN ,然后设计了基于该任务的GCN 网络。但是得到的效果却没有提升,我们分析了原因可能是类别基数太大(1103类),而ML-GCN 所采用的数据集coco 和voc 分别是80类和20类,这样生成的adjacent-matrix 太过于稀疏,我们分别统计了一下三种数据集adjacent-matrix 的稀疏程度,计算方式是用矩阵中非零值的元素个数(阈值τ设置的0.2) 除以矩阵的大小,结果如下:

voc:21/(20*20)=5.25%

coco: 311/(80*80)=4.86%

imet:649/(1103*1103)=0.05%

因此GCN 网络对这种太过于稀疏的adjacent matrix  ,并不能学到类别间的相关性。

5.4 Culture and tags separately

由于所有的类别都基于这两大类,所以一个最直观的想法是在用CNN 提取完特征后,设立两路的fc层,一路用来识别culture 的398类,另一路用来识别tag的705 类,然后就能得到两种loss: culture loss 和tag loss,将这两种loss 加权后就能得到最终的loss。但是效果与单路fc 层效果差不多。

6 训练

由第三部分可知,一共选择了三个模型:cbam_resnet50,airnext50和seresnext50 进行fine tuning,引入了 multiScale 机制,并进行6折交叉验证.。 在三个模型中:

相同的训练策略有:

crop的image size:288 (试过320的没效果)

loss function: bce loss( 试过 focal loss 与bce loss 性能相当)

optimizer: Adam

init_lr:0.0001

学习率衰减策略: 当验证集的f2 score 连续4 次都不在提高时,就把学习率衰减为原来的0.2

fine tuning 机制: 第一个epoch 只训练fc 层,之后在将前面的卷积层unfreeze 

框架:pytorch

不同的训练的策略有:

batch size : cbam_resnext50(48),airnext50(36),seresnext50(42)

其他的训练策略:

采用multi image size 的训练技巧,即将image size 设置了 三种大小: 160,228,288。

6 测试

1 训练完全部的单模型

没种模型训练了6 折,一共有3种模型,因此总共有18 个模型

2 ensemble 机制

先分别将每种模型的6折结果进行融合(即对结果取平均),这样就有三种融合后的结果,然后再将这三种结果进行融合(即对结果取平均) 便得到了最终的结果。

7心得:

7.1  选择合适的baseline 模型:一个好的baseline 可以进入前top20%;

7.2 多了解一些训练技巧

7.3  简单实用的package: 预训练的模型。

7.4 善用模型融合

7.5 相信自己本地的CV 验证集,每天再kaggle 的提交次数是有限的,因此要设置好离线验证集,不断探索好的参数,不要过分相信kaggle 的线上得分。

7.6 了解了 multi-task 任务和multi-label 的区别。

 

你可能感兴趣的:(项目-深度学习,机器学习)