PaddleClas是百度为工业界和学术界所准备的一个图像分类工具集,使用此工具便可以简单实现高精度分类任务。
本文使用AIStudio计算平台建立一个实践项目,来演示PaddleClas的使用。项目使用的数据集为公开数据集Oxford 102 Flowers Dataset。
一、AI Studio平台建立项目
首先登录百度AI Studio,创建项目,网址为:https://aistudio.baidu.com/aistudio/projectoverview/public
点击【创建项目】。
选择Notebook类型项目。
?目前的百度AI开发框架的版本已经全面迁移到2.x,项目框架选择2.x即可。
?填写项目描述,项目标签中,选择建立项目的特征即可。此处选择【添加数据集】,从百度AI平台上搜索是否有flowers102数据集(见下图示)。
如果有,可以省去从国外网站下载数据包的时间。如果没有,可以从flowers102官网下载,然后在AI Studio平台创建自己的数据集,再在本步骤添加数据集到项目中。
如果数据文件小于150M,可不通过数据集方式添加到项目,可以在建立项目并启动后,上传到项目目录中。
本项目使用的数据网址:
https://www.robots.ox.ac.uk/~vgg/data/flowers/102/102flowers.tgz
https://www.robots.ox.ac.uk/~vgg/data/flowers/102/imagelabels.mat
https://www.robots.ox.ac.uk/~vgg/data/flowers/102/setid.mat
点击【添加】,将数据集添加到建立的Notebook项目中。
选择上一步的【创建】按钮,弹出如下界面:
?点击【查看】,即可打开创建的项目。
?点击【启动环境】,即可进入建立的项目镜像。
?启动环境时,有两个选项,因为要进行大数据训练,选择【高级版】(目前百度每天免费提供10小时算力)。
?当你看到上面界面的时候,表示已经建立成功,可以进行第二步安装PaddleClas包了。
*AI Studio使用说明
https://ai.baidu.com/ai-doc/AISTUDIO/
*目录说明:
work目录(完整路径为/home/aistudio/work),一般放代码及工作过程文件 ;
data目录中(完整路径为/home/aistudio/data),放挂载的数据集。
本次实验只使用搜索到数据集中的3个文件。
?
*注意事项:
每个项目,相当于一个docker镜像环境,环境中操作系统为linux,paddle的基本运行环境预先已经安装好;
启动项目后,默认是在/home/aistudio下,就是linux的用户目录 ~;
/home/aistudio/data 目录中的修改,下次再启动项目时自动恢复
/home/aistudio/work 目录中的修改,会持续保存,注意使用空间不断增大,启动时会很慢
*如果要保持自己安装的第三方库,可以采用下面方式
!mkdir /home/aistudio/mylib
!pip install beautifulsoup4 -t /home/aistudio/mylib
每次重新启动Notebook kernel时,只要运行如下代码,即可将安装的库添加到搜索路径
import sys
sys.path.append('/home/aistudio/mylib')
二、安装PaddleClas包
本实验建立时选择了项目框架PaddlePaddle 2.x,此时启动的项目环境中已经预先安装有PaddlePaddle基础环境。
如果是在自己计算机的linux操作系统下使用,需要先安装PaddlePaddle(默认推荐使用GPU版本,快速训练): pip install paddlepaddle-gpu
回到启动的AI Studio项目,选择【终端-1】(相当于linux中的终端窗口,可以执行任何命令),下面的操作都是在终端中进行。
?执行pwd,检测当前是否在/home/aistudio下。执行ls命令,此位置下有data、work目录及一个.ipynb(notebook文件,可以在此文件编写python代码),具体目录用途参考上文说明。
本项目将PaddleClas安装到work目录下:
cd work
git clone https://gitee.com/paddlepaddle/PaddleClas/ 从码云下载PaddleClas
cd PaddleClas
pip install -r requirements.txt
*PaddleClas主要目录说明:
configs/ 配置文件存放位置,每种模型的配置文件放一个子目录
dataset/ 数据集存放位置,推荐每个数据集一个子目录
deploy/ 部署相关的程序
ppcls/ PaddleClas的主体库代码
tools/ 模型下载、训练、评估、预测的工具脚本存放位置
三、PaddleClas快速训练
1.准备数据
假定当前在PaddleClas目录中。
本项目使用的数据集在data/data64337目录下面,只需要其中的3个文件(见第一部分中的图示),拷贝3个文件到 dataset/flowers102下,解压102flowers.tgz。
cd dataset/flowers102
cp ~/data/data64337/*.* .
tar -xf 102flowers.tgz
制作标签文件
python generate_flowers102_list.py jpg train > train.txt
python generate_flowers102_list.py jpg valid > val.txt
python generate_flowers102_list.py jpg test > test.txt
cat train.txt test.txt > train_test.txtcd ~/work/PaddleClas/ 返回PaddleClas目录
2.下载预训练模型参数
继续之前,先把PaddleClas目录添加到python运行搜索路径中:
export PYTHONPATH=./:$PYTHONPATH
预训练模型保存了在其他数据集上训练好的模型参数,可以作为后续训练的起点,实现迁移学习。实验中下载3个预训练模型:
ResNet50、ResNet带蒸馏、MobileNetv3。下载到pretrained目录,并解压。
python tools/download.py -a ResNet50_vd -p ./pretrained -d True
python tools/download.py -a ResNet50_vd_ssld -p ./pretrained -d True
python tools/download.py -a MobileNetV3_large_x1_0 -p ./pretrained -d True
3.模型训练
*AI Studio的免费GPU环境提供的是单卡,在训练前需要先指明单卡:
export CUDA_VISIBLE_DEVICES=0
*配置文件列表
本实验使用的配置文件在configs/quick_start/中,选用其中部分进行演示:
ResNet50_vd.yaml ResNet50模型,不加载预训练参数
ResNet50_vd_finetune.yaml ResNet50模型,加载预训练参数(就是上一步下载的ResNet50_vd参数)
ResNet50_vd_ssld_finetune.yaml ResNet50模型,加载预训练参数+单模型蒸馏特性(就是上一步下载的ResNet50_vd_ssld参数)
MobileNetV3_large_x1_0_finetune.yaml MobileNetV3模型,加载预训练参数(就是上一步下载的MobileNetV3_large_x1_0参数)
ResNet50_vd_ssld_random_erasing_finetune.yaml ResNet50模型,加载预训练参数+单模型蒸馏特性+随机擦除数据增强(就是上一步下载的ResNet50_vd_ssld参数)
R50_vd_distill_MV3_large_x1_0.yaml ResNet50模型+MobileNetV3模型,双模型蒸馏
*修改配置文件
例如下图打开【a.不加载预训练模型的训练】用到的ResNet50_vd.yaml 配置文件,根据【1、准备数据】中的标签文件名,修改配置。
!!!别忘记保存修改
?a、ResNet50模型不加载预训练参数的训练
python -m paddle.distributed.launch \
--selected_gpus="0" \
tools/train.py \
-c ./configs/quick_start/ResNet50_vd.yaml
在终端-1中执行上面的训练语句,训练结束,best精度为:top1 acc 0.27255
b、ResNet50模型加载预训练参数
python -m paddle.distributed.launch \
--selected_gpus="0" \
tools/train.py \
-c ./configs/quick_start/ResNet50_vd_finetune.yaml
训练结果,best精度: top1 acc 0.94118
?c、ResNet50模型加载通过知识蒸馏获得的参数
python -m paddle.distributed.launch \
--selected_gpus="0" \
tools/train.py \
-c ./configs/quick_start/ResNet50_vd_ssld_finetune.yaml
配置文件中,推荐使用相对较小的网络中间层学习率。
ARCHITECTURE:
name: 'ResNet50_vd'
params:
lr_mult_list: [0.1, 0.1, 0.2, 0.2, 0.3]
pretrained_model: "./pretrained/ResNet50_vd_ssld_pretrained"
训练结果,best精度为:top1 acc 0.93235 (精度反而不如b中。因为训练使用的是20轮,可以考虑调整其他参数,继续训练。官方给出的信息为加蒸馏特性后,应该好于b)
?d、MobileNetV3加载预训练模型
python -m paddle.distributed.launch \
--selected_gpus="0" \
tools/train.py \
-c ./configs/quick_start/MobileNetV3_large_x1_0_finetune.yaml
训练结果,best精度为:top1 acc 0.89902
?e、ResNet50模型加载参数并使用RandomErasing数据增广
python -m paddle.distributed.launch \
--selected_gpus="0" \
tools/train.py \
-c ./configs/quick_start/ResNet50_vd_ssld_random_erasing_finetune.yaml
训练结果,best精度为:top1 acc 0.92451 (精度反而不如b、c训练。因为训练使用的是20轮,可以考虑调整其他参数,继续训练。官方给出的信息为好于b、c)
?f、实验知识蒸馏
使用e训练中,在flowers102数据集上训练的结果为教师模型,使用MobileNetV3_large_x1_0预训练模型(是在ImageNet1k数据集上训练)为学生模型。
cp -r output/ResNet50_vd/19/ ./pretrained/flowers102_R50_vd_final/ 拷贝e训练的最后结果到预训练模型目录下备用(作为教师模型)
修改配置文件 configs/quick_start/R50_vd_distill_MV3_large_x1_0.yaml
python -m paddle.distributed.launch \
--selected_gpus="0" \
tools/train.py \
-c ./configs/quick_start/R50_vd_distill_MV3_large_x1_0.yaml
训练结果,best精度为:top1 acc 0.93627
下图为PaddleClas官方给出的结果精度,与实验结果略有差距。也许因为配置参数有其他修改或运行环境有差异。有兴趣的读者可以尝试验证。
本文介绍了快速上手PaddleClas图像分类库的过程,不必编程,命令行+配置参数,即可实现多种组合的训练。PaddleClas中还有很多内容可以挖掘,这里只是打开了大门。
相关的几个网址发一下,可以自行学习:
https://paddleclas.readthedocs.io/zh_CN/latest/tutorials/
https://gitee.com/paddlepaddle/PaddleClas/
https://github.com/PaddlePaddle/PaddleClas
本文由老牛实验室原创,转帖请注明。
对人工智能及相关领域感兴趣的读者,可以关注本账号。本账号头条、CSDN同名:老牛实验室。
本文暂时没有评论,来添加一个吧(●'◡'●)