PaddleX训练一个自定义数据集的图像分类模型,全流程打通(从环境搭建到推理部署)

PaddleX训练一个自定义数据集的图像分类模型,全流程打通(从环境搭建到推理部署)

写在最前: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')

猜你喜欢

转载自blog.csdn.net/weixin_45921929/article/details/128271831