Fork me on GitHub

图像分类模型训练实践

以下文章来源于 https://zhuanlan.zhihu.com/p/623801240

导读: 图像分类模型是最简单的,也是最基础的计算机视觉任务,应用非常广泛。本文将介绍手把手零基础训练图像分类模型的实践过程。文章主要介绍如何在标注好的数据集基础上进行微调,使模型能够在新的数据上重新适配一个新的分类任务。

阅读完本文,你将了解如何使用 ViT 模型在 14 种花朵数据集上进行分类的微调训练, 进而了解大部分分类任务的微调过程。


分享嘉宾|谭伟 阿里巴巴 算法专家

编辑整理|雪梨 古联

出品社区|DataFun


首先,打开 ModelScope 的官网(https://www.modelscope.cn/home),进入模型库。



模型库页面可以看到有很多不同的模型,我们选择:计算机视觉 - 视觉分类 -- 通用分类。模型库中有很多通用模型,这些模型都比较经典,有些是目前比较火的一些开源模型,大家都可以在上面进行尝试。本文主要以 ViT 图像分类-中文-日常物品这个模型为示例,演示如何进行分类任务的微调。



首先打开计算机视觉---ViT 图像分类-中文-日常物品模型。因为之后要用 Notebook 进行训练,所以需要登录一下。新用户注册会送 100 个小时的 GPU 算力。



任务中首先介绍了整个模型的基本情况:有关于日常物体分类模型的概要介绍,模型的简单描述,以及推理的示例代码。



示例代码的使用十分简单,除了引用依赖包之外,只需两行代码就可以调用模型进行分类任务的测试。页面右上方也有在线模型的体验,可视化了推理的过程。可以选择自己上传图片或者用示例图片进行测试,点击执行测试就可以看到结果。刚开始执行的时候会稍微有些慢,因为要下载模型,之后就会快一些。



此外,还有一些模型数据的简介、模型训练流程、数据评估及结果。



接下来是模型训练的示例代码,也是本文的重点。示例代码中用的是一个稍小的具有100 个分类的数据集 mini_imagenet100 进行 fine-tune 训练的示例,对演示来说还是比较大的。所以我们会在这个代码的基础上进行修改,来适配更小的数据集,稍后会对模型中的参数进行更为详细的讲解。



这里是模型评估的示例代码,展示模型如何对数据集中的校验集进行评估,稍后也会进行详细的讲解。这就是整个任务页面的大致内容。



上面的在线体验已经得到了一个测试结果,这里显示了 top5 的结果,排名第一的是柴犬,所以这张图片的分类结果就是柴犬。



为了方便实验,我们首先把 Notebook 打开。Notebook 有两种选择,一种是 PAI-DSW,一种是阿里云弹性计算。我们选择第二种,用免费的 GPU 资源进行计算。选择后点击快速启动。这个启动会稍微久一些,可以让它在后台启动。

接下来我们来讲解模型的一些基本情况。ViT 模型,是自然语言领域中的 Transformer 模型在计算机视觉上的一个开山之作。ModelScope 上的模型采用的是基于 Transformer 的 ViT-Base 结构,并在此基础上加入了蒸馏 token 进行知识蒸馏,也就是采用了 DeiT 的知识蒸馏的训练方式。

我们的训练数据是从海量的开源数据中进行搜索和整理的,保留了出现频率较高的一些常见的物体,大概包含 1300 多种日常物品,比如有一些常见的动物、植物、家具和食品等。目前模型可以识别 1300 多种日常物品,大家可以通过模型链接查看开源代码,还可以通过论文的链接去详细查看论文。



大家还可以在我们官网的文档中心 -- 模型详解 -- 计算机视觉模型中找到我们对应的模型文件,这里有非常详细的介绍,包括论文的详解等。这是我们今天要用来做实验的 ViT 模型的简介,在此不做详细介绍。



另外关于我们要用的数据集,可以通过点击上方菜单栏中的数据集-图像-图像分类,就会看到很多可以用来做实验的数据集。



这里我们用的数据集是花朵分类数据集。这个数据集包含了 14 种类型的花朵图像,如风吟草、蒲公英、菊花等常见的花朵类型。整个数据只有 200MB,比较小,适合我们线上微调过程的演示:用 14 种花朵的小数据集去重新 fine-tune 刚才介绍的 ViT 模型,使模型能够识别这 14 种花朵。



数据集的格式主要分为训练集和验证集,这里有相关的描述:是按照 train 和 valid 文件夹进行分类,共有 2 个文件夹,同类别标签的图片在同一个文件夹下,图片格式都为 JPG 格式,还有一个标签文件是 classname.txt。



在数据预览里面可以看到数据的标注情况。比如在校验集中,左边是数据图片,右边是对应的标签。训练集也是一样的。



这是整个数据集的文件,其中包含了 CSV 格式的校验集标签文件、训练集的标签文件、还有包含了以数据集名为文件名的 json 文件 Flowers14.json。



Flowers14.json 文件里面描述了数据之间的关系,比如在训练集中,meta 就是标签文件,file 就是用来训练的图片的压缩文件,校验集也是一样。classname.txt 文件中将标签对应的类别名称按顺序列了出来,这就是类别标签对应的类别名称。



在数据文件里面是数据的压缩文件。



数据集的加载也非常简单,一行代码即可。我们引入依赖包之后,load 数据集。加载数据集需要填入训练集名称和命名空间,就是对应数据名称下面的小字部分 。



Flowers14 对应数据集名称,tany0699 对应命名空间。加载训练集时 split 选择 train,加载校验集时 split 选择 validation。这就是数据集的一些基本情况。

回到模型训练页面,打开之前启动的 Notebook。

跳转后需要登录 ModelScope 和阿里云绑定的账号。



打开一个 Python3 的文件,可以选择对文件进行重命名,我们主要是为了对新的数据集重新进行训练。回到刚才的模型界面,把 fine-tune 的示例代码拷贝过来。



代码拷贝过来之后,我们对这些参数进行修改。首先引入 ModelScope 的依赖包,如果大家本地有 GPU 的话,也可以在本地做训练。在本地训练要预先安装好 ModelScope的安装包,官方文档有介绍如何安装。

我们这里通过线上免费的 notebook 来进行训练。首先 model_id 对应的是模型在 Model Hub 上的地址,对于我们这个任务来说是没有变化的。之后是加载数据集,分别是加载训练集和校验集,数据加载方式之前已经介绍过了。将我们新的数据集的数据加载方式的示例代码拷贝过来替换掉就可以。

接下来是修改模型的配置文件。配置文件中会包含多种配置内容,主要需要修改的只有几项。首先是 batch-size 的大小,主要根据训练数据的大小和 GPU 显存的大小来设置;第二行是加载数据集的 worker 数量;最大训练的 epoch 数,就是对整个数据集迭代的次数,这里设置为 1,主要是因为时间关系,只训练一次迭代。下面三行是分类数目,要把它改为数据集对应的分类数目,所以这里都改为 14。学习率这里,因为我们只迭代一次,为了更好更快的收敛,可以把它改的稍微大一点。大家可以根据自己实际的训练次数来修改这个超参。预训练次数也设置为 1;评估指标,对于分类任务来说,我们现在用的是精度来评估,精度中有 top1 和 top5,这两个指标都要重新进行评估。

接下来构建训练器。训练器是用 build_trainer 的接口;name 是分类的类型,这里是 image_classification,是图像分类的意思。我们需要改的主要是参数 kwargs。参数主要有 model_id,就是之前提到的模型地址;word_dir,工作目录,就是训练后产生的模型权重保存的目录。示例中用的是一个临时目录,这里可以改为真实目录,比如改为 vit_base_flower;train_dataset 设置的是加载后的训练集;eval_dataset 设置的是加载后的验证集;cfg_modify_fn 是配置文件的回调函数;model_revision 模型的版本,可以对应到模型文件(master 按钮)里面,可以随意选一个版本,比如 1.0.2,这样模型的训练器就构建好了。

之后使用 trainer.train() 就可以进行训练。训练完成后即可使用 trainer.evaluate() 进行评估,评估后将结果打印出来。然后按下 shift + enter 键运行代码,让模型开始训练。



刚开始会比较慢,因为需要先下载数据集和模型预训练的权重。



再来看一下模型文件。模型文件也比较简单,主要有两部分,一部分是预训练的权重,名字是固定的(pytorch_model.pt);另一部分就是整个模型的配置文件(configuration.json),主要是定义整个模型如何配置,如何训练和如何评估的。



配置文件中,因为是基于 PyTorch 进行训练,所以架构保持不变。任务是图像分类,Pipeline 的名称也保持不变,定义模型类型保持不变。mm_model 是兼容 mm classification 的模型的配置文件,backbone 定义的是 VisionTransformer,结构是 deit-base,输入图像大小是 224,patch_size 大小是16 等等这些参数都保持不变。Head 是VisionTransformerClsHead,num_classes 类别数默认的是 1296,是日常物品的分类数目,这里我们需要改为 14,因为新的数据集分类是 14 种。Loss 用的是 LabelSmoothLoss。还有一些初始化的参数都可以进行修改。训练使用的增强方式是 Mixup 和 CutMix,这些参数也可以进行设置。



回到训练过程,log 显示了 epoch 数,当前学习率,还有预计剩余时间,用的显存大小和 loss 的情况都可以打印出来。



回到配置文件。

预处理器中的类型不变;训练过程,如加载图片,随机缩放和裁剪尺寸 224,随机翻转和数据增强等都可以在文件中进行设置,最后是归一化;校验集同理,裁剪图片,resize 到 256,然后做一个 crop 到 224,最后进行归一化。

训练过程中用到的 batch_size 的数目,worker 的数目,最大迭代次数,以及评估的时候每间隔几次迭代就进行评估(这里是 1 次),使用 accuracy 进行评估,间隔 1 次迭代保存一次模型权重,最多保存权重数量 20,优化器里的设置,包括优化类型,学习率等参数都可以在文件里进行修改。学习率的策略可以用 CosineAnnealing,以及一些相关参数也可以进行定义。最后是评估的配置也可以进行设置,比如评估时 batch_size 的大小,worker 数目,用的 accuracy 的方式进行评估,以及选择是 top1 还是 top5 的评估方式。



训练已经完成,可以看到结果已经打印出来:top1 的精度是 87.75,top5的精度是 98.97。训练一次,大概需要 3 分钟左右。



刚才训练的权重已经保存在了工作目录中。目录下有两个 log 文件,是训练过程的 log,和刚才打印的结果完全一样。有一个模型的配置文件,和刚才讲过的配置文件是一模一样的。比如我们刚才改过的类别数,现在已经改为了 14,因为刚才用的是回调函数,直接修改参数也被保存到了文件中。还有每个 epoch 保存的权重,现在只训练了一次,所以只有一个 epoch_1。还有最后保存的权重的软连接,以及一个在训练过程中,保存在校验集上精度最好的模型权重。



模型训练好之后,需要对它进行评估。可以评估训练好的模型在校验集上的性能。我们可以把模型评估的示例代码直接拷贝过来,同样的,数据集可以修改成刚才实验加载过的校验集,这是对新的校验集的评估。之前的 model_id 是 Model Hub中的模型,现在改为训练保存的工作目录。但要注意,模型目录下的模型权重文件名称是固定的 pytorch_model.pt,所以需要将权重文件重命名为 pytorch_model.pt。工作目录可以用临时工作目录,校验集就是需要评估的数据集。训练器构建完成后,调用 trainer.evaluate() 进行评估,评估后将结果打印出来。按下 shift + enter 键运行代码,开始评估。



评估过程比较快,从打印出来的结果可以看到 top1 的结果是 87.75,top5 是 98.97,和训练结果完全相同。



模型训练好后,可以进行推理,推理代码可以直接从模型页面拷贝过来。

要用训练好的模型,首先要加载依赖包,然后用 pipeline 构建推理的 pipeline。这里输入的任务类型保持不变,模型改为刚才训练好的模型路径:vit_base_flower。图片地址可以是一个可访问的 url,也可以是一个本地的图片路径。现在可以随便下载一张图片,比如向日葵的图片,命名为 test.webp。本地下载好之后,可以直接将图片拖进界面中进行上传,然后将图片名称拷贝过来。将图片地址改为本地路径 ./test.webp,就可以对这张图片进行分类测试了。



推理结果中显示 top5 的结果,排第一的是向日葵,那么对这张图片分类预测的结果就是向日葵。但是对应的概率都很低,说明训练不是特别充分。因为只训练了一次迭代,所以还有很大的改进空间。大家可以去调整超参,尝试训练,比如最大 epoch 数可以调大一些,学习率可以调小一点,多训练一些可能会有更好的效果。



整个分类模型的预训练过程就到此结束了。

ModelScope 中还有很多其他的分类模型,其他模型的训练流程和今天训练的任务流程是差不多的。比如 ViT 图像分类-通用模型和刚才训练的模型是完全一样的,只是预训练的数据集是不一样的。日常物品模型用的是我们自建的数据集,通用模型是用的公开的 ImageNet 1k 的数据集。除此以外,还有比较实用的实时分类 NextViT 模型,比较适用于工业,因为速度快,分类效果也不错。其他模型,比如垃圾分类,大家也可以看一下。还有最近比较火的 BEiT,是 v2 版本,大家也可以 fine-tune 一下。每个任务都会有模型简介、模型描述、以及一些论文、开源代码的链接,还有推理代码、微调训练代码以及评估代码,可以直接复制直接后微调和推理。

图像分类的微调训练教程就到此为止,大家如果感兴趣,可以到 ModelScope 官网去进一步了解和尝试。

今天的分享就到这里,谢谢大家。




▌2023数据智能创新与实践大会


  • 4大体系,专业解构数据智能
  • 16个主题论坛,覆盖当下热点与趋势
  • 40+演讲,兼具创新与最佳实践
  • 1000+专业观众,内行人的技术盛会

第四届DataFunCon数据智能创新与实践大会将于⏰ 7月21-22日在北京召开,会议主题为新基建·新征程,聚焦数据智能四大体系:数据架构数据效能算法创新智能应用 。在这里,你将领略到数据智能技术实践最前沿的景观

欢迎大家点击下方链接获取大会门票~
DataFunCon2023(北京站):数据智能创新与实践大会



本文地址:https://www.6aiq.com/article/1682073308679
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出