Top5-华为云美食图片分类大赛

举报
哈哈哈*3 发表于 2020/10/28 11:45:40 2020/10/28
【摘要】 本次参加华为云美食图片分类大赛,使用的是华为云ModelArts AI市场发布的算法:图像分类-ResNeSt,并进行细微的调参。最终达到了top5的成绩,与top2精度相同。

大赛链接:爱(AI)美食·美食图片分类

概述

美食图片分类共10分类,每类500张,共5000张训练集。本次参赛使用的算法是华为云ModelArts AI市场发布ResNeSt算法:图像分类-ResNeSt,并进行细微的调参。最终达到了top5的成绩,与top2精度相同。

image.png

算法基本信息可进入ModelArts AI市场ResNeSt算法描述页查看。AI市场发布的算法是图像分类通用场景的。也适用于其他分类场景。

调参

image.png

这是从ModelArts AI市场ResNeSt算法描述界面截取的参数详情。

下面我们分别对参数做详细的解释。

do_train/do_eval_along_train

该算法支持只做训练,或者边训练边验证。

一般我们做训练都需要验证集来监控模型的精度是否得到了有效的提升,但美食大赛发布的数据只有训练集。如果对训练集做切分,导致训练集变少,可能会影响模型的精度。所以可以尝试下面两种方案:

1.  只做训练,不做验证(设置do_eval_along_train=False

不加验证集,训练作业就像黑盒子,只能查看训练集每步的loss是否正常,无法知道模型最终可以收敛到的精度,也取不到精度最高的模型,所以只能尝试多个模型。可以使用max_to_keep参数,保存中间的模型。

2.  边训练边验证(默认模式)

大赛没有提供验证集,但可以自己收集验证集来帮助监控模型的精度。这样我们就可以根据验证集的精度来选取一些较好的模型。自选的验证集和实际比赛的测试集可能会有一定的差距。精度只能作为参考。

个人建议采用第二种方案,方便选取精度高的模型。第一种方案的模型是个黑盒子,无法判断模型的好坏,需要不断尝试。

model_name

该算法总共支持4种模型,model_name=resnest50resnest101resnest200resnest269。不同的模型对应的数据输入大小(crop_size)不同,算法已经做适配,会根据用户传的model_name选择不同的crop_size(默认值分别是:224, 256, 320,416)。同时支持用户自定义crop_size。这个参数并没有暴露,用户直接添加参数即可,例如crop_size=224

一般模型越大,学到的特征越多,模型的精度也越高,当然训练速度也越慢。但精度和数据集亦息息相关,并不是模型越大,精度一定越高。在美食数据集上四个模型都尝试过,精度在resnest200基本已经饱和,再加大模型使用resnest269,很难继续提升精度。resnest50resnest101精度也基本可以稳定在98%左右。最终提交的top5精度是基于resnest200训练出的模型。

注意:resnest200V100batch_size=64会超显存,使用batch_size=32

lr

初始化学习率。在做finetuning时,学习率不宜给太大,容易导致梯度更新波动太大,影响收敛。使用分布式时,lr默认会扩大world_size(训练进程个数或者节点个数)倍。

 在训练美食数据集时,使用默认学习率lr=0.01即可。

lr_scheduler

学习率更新方式。支持stepcospoly。美食分类上调节过不同的lr_scheduler,个人觉得觉得cos更好些。

rand_aug

数据随机增强。数据预处理时,除了默认的随机压缩裁剪,随机翻转,还提供了很多随机增强的方法。包括:图片色彩变换,亮度变换,饱和度变换,仿射变换,随机遮挡等等。随机增强可以提升模型的鲁棒性。有利于提升模型的精度。

accumulation_steps

梯度累计步数。模拟大batch size。主要用于模型较大,batch_size较小时,可以累积多步的训练结果再进行梯度更新。一般来说有利于提升模型的精度,使用resnest200, resnest269,这种大模型时可以使用。

其他

其他参数包括label_smoothingmixupepochswarmup_epochs等,参考算法描述即可。最终提交的Top5模型训练参数如下:

1.  do_train=True  

2.  do_eval_along_train=False  

3.  model_name=resnest200  

4.  lr=0.01  

5.  epochs=60  

6.  batch_size=32  

7.  eval_batch_size=64  

8.  lr_scheduler=cos  

9.  lr_step=20  

10. mixup=0.2  

11. label_smoothing=0.1  

12. warmup_epochs=5  

13. rand_aug=True  

14. num_workers=8  

15. use_dali=False  

16. accumulation_steps=1  

17. do_data_cleaning=True  

18. max_to_keep=10  

附这组参数训练出的模型:

https://modelarts-example.obs.cn-north-1.myhuaweicloud.com/model/aifood/model/model.pth

如果直接使用此模型参赛还需要推理文件,可以通过以下方式获取:

订阅ModelArts AI市场ResNeSt算法,创建训练作业并修改参数:

1.  do_eval_along_train=False  

2.  epochs=0  

3.  resume_path=obs://xxx/model/model.pth (将下载的model文件上传至obs,路径根据桶名如实填写)   

即可直接导出模型,并输出推理文件。请参考 参赛发布

模型优化

DALI

DALI是英伟达开源的GPU加速的数据增强和图像加载库,用来帮助用户突破数据预处理的瓶颈,使得模型的训练和推理能够达到最高的效率。 resnest50上使用DALI,训练速度可以提升1.65倍。在resnest101上可以提升1.27倍。模型越大提升的程度越小。因为模型越大,数据预处理已经不是主要的训练瓶颈,模型本身的复杂度才是。

但是部分数据增强方法无法使用DALI,所以和不使用DALI相比精度可能也会有细微的差距。

使用DALI时,设置use_dali=True

参赛发布

训练成功后并不能立刻发布模型。 AI市场发布的算法输出格式与竞赛输出格式不一致,需要修改推理脚本与竞赛保持一致。只需要修改_postprocess的输出内容格式即可。

1.  def _postprocess(self, data):  

2.      label_to_prob = {}  

3.        

4.      for k, v in data.items():  

5.        for i, label in enumerate(self.label):  

6.          label_to_prob[label] = float(v[0][i])  

7.            

8.      return {'logits': label_to_prob}  

如果训练时修改了crop_size,训练结束后,记得同步修改推理脚本中的crop_size,如果不修改推理脚本的crop_size,可能会影响推理精度。推理脚本中的crop_size是模型默认的值,不会根据用户的训练传参同步修改。

Tips:推理时可适当增大crop_size的大小,可能会提升推理精度。

导入模型请参考:

https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0207.html

结果查询

模型发布之后,就可以等待排名结果。模型训练会有一定的随机性,不能保证每次都能达到最高的精度,所以可能需要尝试多次训练,在没有验证集的情况下可能还需要每次训练都尝试不同epoch生成的模型。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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