Kaggle-Camera_Model_Identification 比赛记录总结[19/582(Top 4%)]

2024-06-15 18:48

本文主要是介绍Kaggle-Camera_Model_Identification 比赛记录总结[19/582(Top 4%)],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇博客记录自己在这次kaggle比赛中做的工作。成绩:19/582(Top 4%)

Kaggle比赛地址

我的代码github地址

这次比赛是给出10个相机拍摄的照片,然后给出测试图片,区分是哪个相机拍摄的。训练集中每类照片数量相同,每类都是由同一个手机拍摄的照片。测试集中,每类的照片都是来自另外一个手机,一半的图片可能被用了八种可能的操作。

总结:

1. 更多的数据。一开始只用了kaggle提供的数据,数据比较少,但是很平衡,每类只有275张,按照4:1的概率分了训练集和val集,训练集中每张图片都使用8种操作进行了data augmentation,一开始val集没有进行augmentation,所以训练的时候test准确率都特别高,差不多到1了,借鉴的意义不大了,后来对val集也进行了data aumentation,试图减小test与val之间的gap,训练的时候val的准确率到达0.98。只使用kaggle的数据时,训练得到的模型并不理想。后来,有人在Discussion分享了更多的数据,楼主找到了更多的数据,并跳出了其中与kaggle提供的数据具有相同分辨率的图片,但是由于找到的motox的图片与kaggle提供的不完全相同,所以楼主建议不用,这样数据量提升了,但是数据不平衡了,下载了这些数据之后,同样进行了data augmentation,数据量扩充到了六万多,使用这些数据训练之后,效果提升的很明显,但是数据不均衡导致model对motox的识别错误率更高,所以尝试增加motox的数据量。使用同一个博主下另外一个人提供的motox的数据,增加了motox的数据之后训练更稳定了,得到的模型比之前更好了,单个模型single crop的结果可以稳定在0.964。在数据方面,还有的问题就是没有分交叉验证集,一直保持着同一个验证集,不同模型使用完全一样的数据进行训练,模型多样性上有所缺失。

2.尝试不同的模型。使用imagenet预先训练的模型进行finetune。尝试了的模型有inceptionResnetV2、SeResneXt50、resnet50、resnet101,一开始调整参数,对于每个模型都要保证学的很好。因为数据集的原因,每次添加训练数据都需要重新训练模型,这样就重复训练了模型,花费了不少的时间。尝试了简单的调整网络结构,比如添加fc layer,设置dropout。

3.TTA,Test Time Augmentation。就是测试时的时候一张图片进行多次测试,然后得到的概率进行平均。我这里使用的同一张照片进行5次crop(四个角和center),之后mirror,也就是一张图片预测10次,最后将10次预测的结果平均。使用multi crop测试,准确率上升了0.01-0.15。

4.Ensemble。尝试了多种ensemble的方式,包括简单的对多个model预测的结果进行平均、从pooling抽取特征,重新训练fc或者使用xgb来进行分类、根据各个模型对训练数据的预测正确情况,给每个model对每类预测的结果加个权重等。从结果上看,ensemble还是有些许提升的,但是在比赛时,有的ensemble方法在public score上并没有体现出来,最终没有选择,还是比较可惜的。

5.结果分析:数据量要多,质量需要高,数据多了之后可以做更多的尝试,或者要学会利用好数据,比如val集的设置,这个很关键,这个才能比较靠谱的验证模型预测的情况,public score毕竟给出的只有小数据集的预测结果,private跟public可能有比较大的差异。设置交叉验证集,可以使用不同的数据对模型进行训练。在这次比赛中,几个成绩不错的队伍使用了pseudo-labeling的方法,给模型带来了些许的提升。还需要学习多种ensemble的方法,比如stack、blending。比赛过程中,最好成绩是第二,在前三呆了很久,最后却掉出了金牌区,还是有遗憾的吧,但是这次比赛投入的时间精力都很多,做的工作也算是比较完整了,能想到的每一步都做了尝试,虽然有些没有work。还是需要多多积累,有些方法必须用了,听说了才知道,这也是比赛中才能学到的吧。

pseudo-labeling:

第一步:使用标签数据训练模型

第二步:使用训练的模型为不加标签的数据预测标签

第三步:同时使用pseudo和标签数据集重新训练模型

在第三步中训练的最终模型用于对测试数据的最终预测。


以下是这次比赛过程中自己记录的一些东西。

  1. 处理了训练数据,traing: validation = 4:1

测试数据 将tif转为jpgquality=95(resnet50_7500 使用tif测试的效果好于jpg)

由于测试图片中,差不多一半的图片可能进行了八种(给出)操作之中的一种操作,所以对

每个测试图片都进行了这八种操作,相关于做了data augmentation (*9)(这样的话,原图与进行操作的图之间的比例变为1:8,这样的样本不均衡会有影响吗?)

有人在Discussion中给出了给多的数据,但是moto x的数据来自老的手机型号,所以没有使用。同样对获得数据进行了八种操作的扩充,得到了总共大概60k的训练数据。

后来由于数据不均衡(motox数据比其他种类的少)导致了

 

  1. Finetune resnet50 caffemodel

单个model差不多到0.85

(caffe to sensenet:data后和fc前加gather,修改conv,修改BN,删除BN下的scale

  1. crop_size = 224 所有图片用于训练
  2. Crop_size = 224 train & val
  3. Add FC layer

使用TrainAug2-2单个model可达0.964,multicrop可以到0.971

 

   3.  官方caffe显示lossaccuracy

caffe-master/tools/extra目录里的extract_seconds.py,plot_training_log.py.example, parse_log.sh

 

    4. Finetune inception V4

一开始忘了把BN的global_statue改掉,训了一段发现效果一般停了,改了prototxt

单个model目前最高(0.870)

 

  1.  Finetune inceptionResNetV2

单个model目前最高(0.893)(incepResV2_AddFC_4)

A.增加了第一阶段训练时间

B.增加fc layer(256->10),扩大了fc layers中的lr_mult

数据扩充之后,训练了inceptionResnetV2_AddFC,目前单个模型最高0.948

训练参数:

lr_policy:"multistep"

base_lr:0.01

gamma:0.2

stepvalue:20000

stepvalue:38000

stepvalue:45000

stepvalue:50000

stepvalue:55000

max_iter:60000

momentum:0.9

weight_decay:0.0005

 

stepvalue:85000

stepvalue:115000

stepvalue:145000

stepvalue:165000

stepvalue:175000

max_iter:185000

目前单个模型最高0.962inceptionResnetV2_aug_AddFC4_185000(dp=0.4,dp由0.2改为了0.4)

 

更新:

inceptionResnetV2单个模型最高0.964inceptionResnetV2_aug_164000

训练参数:

lr_policy:"multistep"

base_lr:0.01

gamma:0.2

stepvalue:68000

stepvalue:119000

stepvalue:146000

stepvalue:170000

max_iter:  190000

 

使用TrainAug2-1训练之后也达到了0.964inceptionResnetV2_aug2-1_200000

lr_policy:"multistep"

base_lr:0.01

gamma:0.2

stepvalue:70000

stepvalue:120000

stepvalue:146000

stepvalue:170000

stepvalue:190000

max_iter:200000

 

 

   6. Finetue SE-ResNeXt-50

单个model目前最高(0.871)

数据扩充之后,单个模型最高0.949SE-ResNext-50_AddFC_aug_55000

lr_policy:"multistep"

base_lr:0.01

gamma:0.2

stepvalue:20000

stepvalue:40000

stepvalue:50000

stepvalue:56000

max_iter:60000

 

使用TrainAug2_1训练,单个模型最高到0.964SE_aug2-1_200000

lr_policy:"multistep"

base_lr:0.01

gamma:0.2

stepvalue:70000

stepvalue:120000

stepvalue:146000

stepvalue:170000

stepvalue:190000

max_iter:200000

 

 

    6.Naive Ensemble

A.最终输出的概率求和然后取最大,相当于average,目前是两个model,分别是prob_0(caffe_AddFC_18000).npyprob_0(inception_ResNetV2_30000).npy如果只是简单的相加求和,发现效果并不好,但是如果把prob_0(inception_ResNetV2_30000).npy的权重改为1.5,发现稍有提升。

B.取最大,目前发现效果不好

 

     7. Finetune Resnet101

目前单个模型最优为:model_209000

base_lr:0.01

gamma:0.2

stepvalue:60000

stepvalue:120000

stepvalue:150000

stepvalue:174000

stepvalue:195000

max_iter:  210000

 

Aug2_2Res101 singlemodel可以到0.957 resnet101_aug2-2_208000

base_lr:0.01

gamma:0.1

stepvalue:100000

stepvalue:150000

stepvalue:180000

stepvalue:200000

max_iter:  210000

 

最后得到了一个应该比上面记录还好的model,比赛最后一天才训练结束,提交次数限制,没有提交测试。

 

 

      8.使用val_aug分析了0.962那个model的预测结果,发现label0预测得到的结果错误率比较高,因为0数据较少,尝试对0做augmentation

分析得到的数据:

042

17

213

33

43

51

69

710

816

93

 

01980

17839

212213

34437

45625

56471

66930

78712

86993

96903

上面10行对应的是grondtruth和错误的个数,下面10行为对应label的训练数据的数量。

本来是想通过旋转的方式来扩充MotoX的数据的,但是发现旋转之后保存的图片存储变小了,所以放弃了这种想法,直接修改训练的list,将MotoX的部分数据重复几次。将MotoX的数据扩充到6000左右(1980*3)。

 

 

       9.训练数据集:

TrainAug2.txt 使用原始训练数据加上good_jpgs

TrainAug2.txt使用原始所有数据(train+val)加上good_jpgs

BalanceTrain.txt平衡TrainAug2数据,使得每个类别的数据都为6993

TrainAug3    TrainAug2+部分重复的MotoX

TrainAug2_1.txt      TrainAug2+val_image_aug+MotoxExtraAug

TrainAug2_1.txt     TrainAug2+val_image_aug+MotoxExtraAug+MotoxExtraAug2

 

10.Multi crop test

四个角落 中间 然后mirror得到10张图,分别预测之后取平均值,预测score增加差不多0.01


这篇关于Kaggle-Camera_Model_Identification 比赛记录总结[19/582(Top 4%)]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064284

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果