写在最前:PaddleX是paddlepaddle推出的一个上手难度较低、且部署友好的仓库,接口做的比较好,它在github上有一个保姆级教程,但是因为内容过多,汇聚了分类、分割、检测模型在一块,特别容易在里面迷路。这篇教程就是为了让不太了解PaddleX的朋友能够把PaddleX用起来。
PaddleX官方仓库地址
在开始数据训练之前,需要先对使用的设备进行深度学习环境搭建,以下以ubuntu20.04系统为例。
1.显卡驱动安装教程,推荐使用软件更新中的附加驱动进行一键安装
2.cuda和cudnn安装,注意cuda和cudnn的版本一定要对应好
3.Anaconda安装
4.使用Anaconda创建一个虚拟环境
5.进入刚创建的虚拟环境,开始安装paddlepaddle,注意cuda版本和操作系统一定要选择和刚刚安装的一样的,推荐使用换过源的pip进行安装
6.安装PaddleX
pip install paddlex==2.1.0 -i https://mirror.baidu.com/pypi/simple
paddlepaddle已集成pycocotools包,但也有pycocotools无法随paddlepaddle成功安装的情况。因PaddleX依赖pycocotools包,如遇到pycocotools安装失败,可参照如下方式安装pycocotools:
pip install cython
pip install pycocotools
至此,环境已经基本搭建完成。
训练图像分类模型时,需要将数据集按ImageNet的格式准备好,格式要求如下,有N个类别就使用N个文件夹:
dataset/ # 图像分类数据集根目录
|--dog/ # 当前文件夹所有图片属于dog类别
| |--d1.jpg
| |--d2.jpg
| |--...
| |--...
|
|--...
|
|--snake/ # 当前文件夹所有图片属于snake类别
| |--s1.jpg
| |--s2.jpg
| |--...
| |--...
使用PaddleX命令即可将数据集随机划分成70%训练集,20%验证集和10%测试集;–dataset_dir这里是相对路径,如果报错找不到文件夹,建议使用绝对路径;–val_value 0.2和–test_value 0.1可以根据自己的思路进行适当调整。
paddlex --split_dataset --format ImageNet --dataset_dir dataset --val_value 0.2 --test_value 0.1
在dataset/同级目录下新建一个train.py,将下述代码复制进去;接着运行python train.py即可开始训练。
import paddlex as pdx
from paddlex import transforms as T
# 定义训练和验证时的transforms
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md
train_transforms = T.Compose(
[T.RandomCrop(crop_size=224), T.RandomHorizontalFlip(), T.Normalize()])
eval_transforms = T.Compose([
T.ResizeByShort(short_size=256), T.CenterCrop(crop_size=224), T.Normalize()
])
# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md
train_dataset = pdx.datasets.ImageNet(
data_dir='dataset',
file_list='dataset/train_list.txt',
label_list='dataset/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.ImageNet(
data_dir='dataset',
file_list='dataset/val_list.txt',
label_list='dataset/labels.txt',
transforms=eval_transforms)
# 初始化模型,并进行训练
num_classes = len(train_dataset.labels)
model = pdx.cls.MobileNetV3_small(num_classes=num_classes)
# 模型训练参数
# 各参数介绍与调整说明:https://github.com/PaddlePaddle/PaddleX/tree/develop/docs/parameters.md
model.train(
num_epochs=200,
train_dataset=train_dataset,
train_batch_size=32,
eval_dataset=eval_dataset,
lr_decay_epochs=[130, 160, 180],
learning_rate=0.01,
save_dir='output/mobilenetv3_small',
use_vdl=True)
若需使用多张GPU卡进行训练,例如使用2张卡时执行:
python -m paddle.distributed.launch --gpus 0,1 train.py
训练代码中,use_vdl设为True,则训练过程会自动将训练日志以VisualDL的格式打点在save_dir(用户自己指定的路径)下的vdl_log目录,用户可以使用如下命令启动VisualDL服务,查看可视化指标
visualdl --logdir output/mobilenetv3_small/vdl_log --port 6001
服务启动后,使用浏览器打开 https://0.0.0.0:6001 或 https://localhost:6001
使用PaddleX内置的预测接口预测结果
import paddlex as pdx
test_jpg = 'test.jpg'
model = pdx.load_model('output/mobilenetv3_small/best_model')
result = model.predict(test_jpg)
print("Predict Result: ", result)
训练模型格式
在使用PaddleX训练保存的模型文件夹中,主要包含四个文件:
model.pdopt,训练模型参数的优化器
model.pdparams,模型参数
model.yml,模型的配置文件(包括预处理参数、模型定义等)
eval_details.json,模型评估时的预测结果和真值
需要注意的是,训练保存的模型不能直接用于部署,需要导出成部署格式后才能用于部署。
在命令行终端使用如下命令将训练好的模型导出为部署所需格式:
paddlex --export_inference --model_dir=./output/mobilenetv3_small/best_model/ --save_dir=./inference_model
部署模型格式
在服务端部署模型时需要将训练过程中保存的模型导出为inference格式模型,使用PaddleX 2.0导出的inference格式模型包括五个文件:
model.pdmodel,模型网络结构
model.pdiparams,模型权重
model.pdiparams.info,模型权重名称
model.yml,模型的配置文件(包括预处理参数、模型定义等)
pipeline.yml,可用于PaddleX Manufacture SDK的流程配置文件
完成部署模型的导出后,即可使用PaddleX高性能推理接口进行部署,代码如下:
import paddlex as pdx
predictor = pdx.deploy.Predictor('./inference_model')
result = predictor.predict(img_file='test.jpg')