华为云人工智能创新应用大赛季军方案分享_goodgame团队

举报
HWCloudAI 发表于 2020/06/10 18:24:42 2020/06/10
【摘要】 一、导语这是我们第一次参加图像分类的比赛,很幸运的拿到了季军的名次,这得益于给力的队友和前人宝贵的经验。说实话,我们的很多办法都是借鉴上一届的华为云垃圾分类比赛的优秀团队们的经验。这里也向这些团队的无私分享表示万分感谢。我们的整个思路就是不断的降低过拟合,同时又让模型学到更多关键特征。两个目标之间不断的寻找新的平衡。一方面:数据扩充、增强更简单的模型dropout另一方面:调整图片尺寸更复杂...

一、导语

这是我们第一次参加图像分类的比赛,很幸运的拿到了季军的名次,这得益于给力的队友和前人宝贵的经验。说实话,我们的很多办法都是借鉴上一届的华为云垃圾分类比赛的优秀团队们的经验。这里也向这些团队的无私分享表示万分感谢。

我们的整个思路就是不断的降低过拟合,同时又让模型学到更多关键特征。两个目标之间不断的寻找新的平衡。

一方面:

  • 数据扩充、增强

  • 更简单的模型

  • dropout

另一方面:

  • 调整图片尺寸

  • 更复杂的结构

  • fc层改造

二、数据分析与扩充

拿到官方数据集后,我们先随便跑通了一个baseline。然后就开始了数据的分析和扩充。首先利用爬虫爬取百度图片,然后开始了辛苦的人工筛选。

这里关于图片扩充,想补充些:上一届垃圾分类团队,有利用弱监督的方式提取图片,即利用baseline模型分类爬取图片贴上伪标签,通过一定的置信度阈值来筛选,把这个筛选的数据和他们的伪标签当做扩充数据加入原有数据。这个方法的效果好不好说不准(我个人认为这像是学生在给自己出卷子考试,模型这个学生只会不断的巩固认识自己已经知道的,而不能识别更多没见过的特征,不知道理解的对不对),不过后来出现的noisy student的训练方法使得efficient系列框架在ImageNet上取得了最高识别精度,使之成为图片分类领域里的扛把子,这个方法又让我有了更多的思考。(noisy student简单来说,即基于上面的弱监督扩充数据的办法,不断的训练、扩充、训练、扩充,当然还引入了一些噪声)。

数据扩充后共计 10852张图片(初始3829张),57个类别。然后统计了一下类别分布,发觉可能存在潜在的类别不平衡问题。尝试了过采样和欠采样让分布平衡点,但结果表明,这种数据数量下的这种不平衡不是什么大问题,反而是过采样后模型精度还下降了(过拟合了)

image-20200526224420381image-20200526224420381.png

然后还统计了图片的尺寸,主要是想确定输入的图片resize到多大的尺寸会比较合适(太小,容易丢失过多特征,太大容易增加训练成本,且易过拟合)

image-20200526224837886image-20200526224837886.png

统计了图片比例,也是为确定输入图片尺寸比例。

image-20200526225018445image-20200526225018445.png

决赛过程中,新增的一些类别间相似度很高,出现了细粒度分类的问题。(尝试添加注意力机制去解决,可是效果并不好)

image-20200526231103521image-20200526231103521.png

三、数据增强

尝试过多种数据增强方法后,最终的方案中,用了一下几种增强策略

基础增强: 包括裁剪、旋转、翻转、图像变换等等各种操作

random erasing:随机擦除方法会在原图随机选择一个矩形区域,将该区域的像素替换为随机值。

cutout:利用固定大小的矩形对图像进行遮挡,在矩形范围内,所有的值都被设置为0,或者其他纯色值。

mixup:mixup是一种特殊的数据增强方法,利用线性插值的方式构建新的训练样本和标签。

auto-augment:利用强化学习策略在指定数据集上进行数据增强策略(变换方式和强度)的搜索,并且在大数据集上进行搜索的结果策略可适用于相关领域小数据集,即策略可迁移,具有通用性。缺点是需要耗费大量的计算资源。我们把在ImageNet上强化学习来的增强策略,直接移植到我的增强策略中,效果很不错。

四、模型选择与改造

选用的ResNeXt-101 WSL系列的框架和预训练模型,初赛用的16d,决赛用8d。从16d到8d思路还是为了降低过拟合。

迁移学习策略就是冻结layer4之前的参数,让前面大半部分作为低级特征提取器,比赛数据拿来微调layer4及其之后部分。然后在fc之前添加dropout,继续降低过拟合。

image-20200526232926632image-20200526232926632.png

五、超参调优

初始lr:我们训练的初始参数比较小,0.0001,调太大会出现精度上的反复震荡,且最终收敛精度不高。

dropout:结合其他参数调整,在初赛阶段选用16d模型,dropout增大至0.8,显著提高泛化性能。决赛阶段:使用8d模型,结合数据增强,dropout太大出现性能瓶颈,降低dropout至0.3达到最佳性能

输入尺寸:最终输入尺寸:512*512,还是如前所述,过小,丢失更多特征,验证精度无法上升,过大,增加计算时间和内存,且易过拟合

Lr scheduler:动态学习率这块,一开始我们是用的step,后来用Reduce_on_Plateau,效果更好,收敛更快。我们设置的是5个epoch后,test loss未下降则lr*0.2

optimizer:adam

Loss:cross entrophy

六、结果汇总

初赛:基础参数 16d,step_lr

image.png

决赛:基础参数lr0.0001,step_lr

image.png

七、其他失败尝试

Efficient:也尝试过冻结尾部的MBblock,但收敛精度始终达不到resNext的效果

双层fc:将结尾的分类fc改成双层,尝试加入非线性映射,初赛有点效果,决赛中还是出现了过拟合情况。

分类头-head:与上一条类似,将fc层改造成一个网络适配头,参考的上一届垃圾分类团队的想法,同样出现了过拟合问题。

注意力:需要所有层都有所体现,单独在迁移部分添加没有效果,然而迁移学习又只能改动finetune的部分

Capsnet:尾部高级特征池化后,很难捕捉空间特征

Knn:上一届冠军团队的方法,先训练好模型。然后将fc层去掉,把训练数据都跑一遍模型,把池化层出来的每一条特征拼接成特征矩阵,预测的时候就把预测图片生成的向量和特征矩阵中的每一条特征向量求余弦距离,用kNN方法找出特征最相近的数据的标签,即为预测标签。但实验结果发现,这个方法与fc层效果类似,当dropout设置得当,两者没什么差别。

还有其他的比如Smooth,Rand-augment,Cutmix,随机加权平均等等都没达到理想效果。

八、应用作品

大赛的展示程序也是最终评分的一部分,考虑到开发的难度和时间,我们最终选择开发了web应用。前端采用了仿手机APP的设计风格,主要用来展示西安的一些名胜风景和特产,包括一些详细的介绍等等以及最主要的图像分类功能。后端采用了基础的java web进行开发,主要的交互就是用户上传图片运行推理并展示检测结果,还包括用户token的获取与验证等等,都采用了servlet的方式实现。最终部署在云端的轻量级服务器上,访问的效果如图:

image.pngimage.pngimage.png143349fhq1bcnqowmzghug.png143405jp37snksf3l2gtzn.png143439l4awotgem3ryaonl.png

这个web应用的demo,一方面可以滑动图片点击进去,查看西安当地的民俗风景的信息,另一方面可以通过拍照识别西安的各种特色(后台神经网络模型在华为云上跑着),当然如果有机会,还可以加入地图信息,大众点评链接,旅游推荐等等。访问这个web也非常方便,直接用手机扫描二维码即可进入页面,这样的二维码可以印在各种门票或者旅游册子上,游客可以非常方面的使用和访问这个页面。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。