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')
使用 PaddleX 进行图像分类任务,可以通过以下步骤加载数据集并进行数据处理: 1. 安装 PaddleX ```python !pip install paddlex ``` 2. 导入 PaddleX 和必要的模块 ```python import paddlex as pdx from paddlex import transforms as T ``` 3. 加载数据集 ```python train_dataset = pdx.datasets.ImageNet( data_dir='image_net', file_list='image_net/train_list.txt', label_list='image_net/labels.txt', transforms=train_transforms) val_dataset = pdx.datasets.ImageNet( data_dir='image_net', file_list='image_net/val_list.txt', label_list='image_net/labels.txt', transforms=val_transforms) ``` 上述代码中,`data_dir` 参数指定了数据集所在的目录,`file_list` 参数指定了数据集的索引文件,`label_list` 参数指定了数据集的标签文件,`transforms` 参数指定了数据增强方法。 4. 数据增强 在训练过程中,可以使用数据增强方法来扩充数据集,提高模型的泛化能力。PaddleX 提供了丰富的数据增强方法,包括随机裁剪、随机旋转、随机翻转等。 ```python train_transforms = T.Compose([ T.RandomCrop(crop_size=224), T.RandomHorizontalFlip(), T.Normalize() ]) val_transforms = T.Compose([ T.Resize(target_size=256), T.CenterCrop(crop_size=224), T.Normalize() ]) ``` 上述代码中,`RandomCrop` 方法对图像进行随机裁剪,`RandomHorizontalFlip` 方法对图像进行随机翻转,`Normalize` 方法对图像进行归一化处理。 5. 创建数据迭代器 创建数据迭代器时,可以指定批次大小、数据集和是否随机打乱数据。 ```python train_loader = pdx.datasets.DataLoader( train_dataset, batch_size=32, shuffle=True, drop_last=True, num_workers=4) val_loader = pdx.datasets.DataLoader( val_dataset, batch_size=32, shuffle=False, drop_last=False, num_workers=4) ``` 上述代码中,`DataLoader` 方法创建了数据迭代器,其中 `num_workers` 参数指定了使用多少个进程来处理数据。 6. 使用数据迭代器训练模型 ```python model = pdx.cls.ResNet50(num_classes=train_dataset.num_classes) optimizer = pdx.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()) trainer = pdx.Trainer( model=model, optimizer=optimizer, train_loader=train_loader, val_loader=val_loader, save_interval_epochs=1, log_interval_steps=10) trainer.train(num_epochs=10) ``` 上述代码中,`ResNet50` 方法创建了 ResNet50 模型,`Adam` 方法创建了优化器,`Trainer` 方法创建了训练器,并指定了训练参数,最后调用 `train` 方法开始训练。 以上就是 PaddleX 加载数据集并进行数据处理的方法,如果需要更详细的介绍和使用方法,可以参考 PaddleX 官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhijun.li@Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值