使用PaddleClas完成图像多标签分类任务
一、前言
因为项目需要,最近开始研究了PaddleClas,PaddleClas是一个兼主体检测、图像分类、图像检索于一体的图像识别资源库。想详细了解的小伙伴可以访问PaddleClas的官网:
Paddleclas目前已经更新到了2.3版本,且图像多标签分类功能在这一版已经回归。因为项目只用到了该库中的图像多标签分类功能,故下面将一步步介绍如何使用paddleclas2.3完成图像多标签分类任务。
二、搭建运行环境
环境的搭建可以参考如下的官方提供的链接并按照自己机器的实际情况进行配置:
注:
因为paddleclas已经更新到了2.3,故需要在上面的安装指导内修改下载paddleclas仓库的命令,修改后的命令如下:
git clone https://github.com/PaddlePaddle/PaddleClas.git
三、数据和模型准备
官网提供的多标签demo数据集为NUS-WIDE-SCENE,其组织结构如下图所示:
NUS-WIDE-SCENE
-images/
-NUS_labels.txt
-multilabel_test_list.txt
-multilabel_train_list.txt
其中,images文件夹存放的是所有的图片数据(训练集和验证集都放在里面),如下图所示:
NUS_labels.txt存放的是数据集所有的类别名,如下图所示:
multilabel_train_list.txt和multilabel_test_list.txt文件分别存放的是图片名和对应的label,如下图所示:
在上图文件中,每一行的前半部分表示图片名,后半部分表示该图片对应的标签,长度和位置NUS_labels.txt中的类别保持一致,标签中为1表示该图片中有这个种类的物体,0表示没有。
当得知多标签分类数据集的排布规则之后,就可以将自己的数据转换成满足上面要求的数据形式了。本人使用的是labelme标注好的数据,并写了数据格式转换的脚本进行了格式转换生成满足上面多标签数据集的格式。
四、模型训练
- 修改配置文件
paddleclas中图像多标签分类的配置文件如下:
和平时的深度学习项目一致,可以根据自己的实际来修改配置文件里的内容,比如epoch,image_size, 网络模型,类别数,batchsize, 数据集路径等。
2. 执行训练脚本
如果训练的机器只有一块GPU,执行如下命令:
python tools/train.py -c ./ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
如果使用多块GPU,需指定GPU的id,参考命令如下:
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \
tools/train.py \
-c ./ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
另外,paddleclas集成了可视化训练功能,默认是关闭,可以在上面的配置文件里将use_visualdl=True。当训练开启后,需要另外开启一个teminal,输入:
visualdl --logdir ./output/vdl/
然后根据teminal中输出的链接点击即可在本地浏览器查看。
ps:由于是对骨干网络进行的微调,故模型训练速度很快。
五、模型评估
当模型训练好后,会保存到新生成的output文件夹中,执行以下命令进行评估:
python3 tools/eval.py \
-c ./ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml \
-o Arch.pretrained="./output/MobileNetV1/best_model"
得到类似下面的输出:
六、模型预测
在对验证数据进行推理时,执行以下命令:
python3 tools/infer.py \
-c ./ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml \
-o Arch.pretrained="./output/MobileNetV1/best_model"
执行之后会在teminal中打印出每一张图片的多标签预测结果。类似如下输出:
0517_2715693311.jpg: class id(s): [6, 13, 17, 23, 26, 30], score(s): [0.96, 0.56, 0.55, 0.99, 0.59, 0.79], label_name(s): []
以上就是使用paddleclas执行图像多标签任务的流程了,该文章会根据本人项目遇到的问题和新的发现进行更新~