paddleclas 入门

文章目录


前言

简要记录paddleclass入门教程,便于以后使用


一、解压数据集

!unzip -q data/data68810/螺栓质量检测-训练集.zip -d ~/work/data

二、划分训练集和测试集

在研究过程中发现可用jikuai来代替一系列繁琐的工程代码

!pip install jikuai -q
# 想把数据集列表放在哪里,就在哪个目录下执行下面的命令。这里我们生成数据集列表文件在用户根目录:~/目录 。
%cd ~/
from jikuai.dataset import Dataset
dataset = Dataset("work/data/螺栓质量检测-训练集") # 参数为数据集所在的位置,是分类目录的上一级目录
dataset.paddleclastxt(0.8) # 生成训练集和测试集列表,参数为两者划分的比例值。
!ls

三、选PaddleClas模型并训练

1.配置yaml文件

paddleclas可以通过配置的yaml文件来进行训练
我们可以在work路径中创建model文件夹,创建yaml文件,下面我以ResNet50_vd为例,标注配置文件中的重要参数

mode: 'train'
ARCHITECTURE:
    name: 'ResNet50_vd'
checkpoints: "" #断点模型路径,用于恢复训练
last_epoch:-1 #上一次训练结束时已经训练的epoch数量,与checkpoints一起使用
pretrained_model: "" #预训练模型路径
model_save_dir: "./output/"
classes_num: 2
total_images: 320
save_interval: 1 #每隔多少个epoch保存模型
validate: True
valid_interval: 1
epochs: 20 #训练总epoch数
topk: 2  #评估指标K值大小
image_shape: [3, 224, 224]

LEARNING_RATE:
    function: 'Cosine'          
    params:                   
        lr: 0.0125

OPTIMIZER:
    function: 'Momentum'
    params:
        momentum: 0.9
    regularizer:
        function: 'L2'
        factor: 0.00001

TRAIN:# 训练配置
    batch_size: 32 # 训练的batch size
    num_workers: 0 # 每个trainer(1块GPU上可以视为1个trainer)的进程数量
    file_list: "../train.txt" # 训练集标签文件,每一行由"image_name label"组成
    data_dir: "../" # 训练集的图像数据路径
    shuffle_seed: 0 # 数据打散的种子
    transforms: # 训练图像的数据预处理
        - DecodeImage:  # 解码
            to_rgb: True
            to_np: False
            channel_first: False
        - RandCropImage: # 随机裁剪
            size: 224
        - RandFlipImage: # 随机水平翻转
            flip_code: 1
        - NormalizeImage: # 归一化
            scale: 1./255.
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - ToCHWImage: # 通道转换

VALID:
    batch_size: 20
    num_workers: 0
    file_list: "../eval.txt"
    data_dir: "../"
    shuffle_seed: 0
    transforms:
        - DecodeImage:
            to_rgb: True
            to_np: False
            channel_first: False
        - ResizeImage:
            resize_short: 256
        - CropImage:
            size: 224
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - ToCHWImage:
# confit.txt
vdl_dir: "../log/resnet50" #log输出,后续可用于可视化与恢复训练

2.PaddleClas普通训练

安装paddleclas

!git clone https://gitee.com/paddlepaddle/PaddleClas
%cd ~/PaddleClas/
# 切换到develop版本,这个版本才支持visualdl
!git checkout develop
!python3  tools/train.py -c ~/work/luomu/ResNet50_vd.yaml

3.采取预训练模型进行训练

#下载预训练模型
!mkdir pretrained 
!cd pretrained && wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vd_pretrained.pdparams

事实上,我们可以利用这串代码,修改其中的模型名称来获取预训练模型

!cd pretrained && wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vd_pretrained.pdparams

下面这个网址为预训练模型的名称

https://gitee.com/paddlepaddle/PaddleClas#resnet%E5%8F%8A%E5%85%B6vd%E7%B3%BB%E5%88%97

下载预训练模型后,可以重新创建一个配置文件,加上参数 pretrained_model

pretrained_model: "./pretrained/ResNet50_vd_pretrained" #预训练模型路径
!python3  tools/train.py  -c ~/work/luomu/ResNet50_vd_finetune.yaml

4.断点训练模型

在实际训练过程,经常发生gpu配额不足的情况,我们可以进行断点训练来应对
例如,在epoch10时发生了断点,我们可以通过以下代码进行恢复训练

python tools/train.py \
    -c ./configs/quick_start/ResNet50_vd.yaml \
    -o checkpoints="./output/ResNet50_vd/10/ppcls" \
    -o last_epoch=10 \
    -o use_gpu=True

可以 VisualDL可视化看下效果

三、选PaddleClas模型并训练

1.模型评估

在训练的过程中,PaddleClas就可以进行边训练边评估,并根据评估的精度值将最优模型参数存储在output/xxx/best_model目录中。 在训练结束后,可以再单独使用eval.py文件进行评估操作。


!python tools/eval.py \
    -c ~/work/luomu/ResNet50_vd_finetune.yaml \
    -o pretrained_model="./output/ResNet50_vd/best_model/ppcls"\
    -o load_static_weights=False

2. 用预训练模型进行模型预测

模型训练完成之后,可以加载训练得到的预训练模型(就是存盘文件),进行模型预测。

!python tools/infer/infer.py \
    -i ~/work/test \
    --model ResNet50_vd \
    --pretrained_model "output/ResNet50_vd/19/ppcls" \
    --load_static_weights False \
    --class_num=2 

3. 转换模型

在训练的过程中,PaddleClas已经将模型存储起来。但是这时候存储的模型适合继续训练的时候调用,相当于打游戏的存盘文件。在真实应用中,一般会转换成专用的推理模型格式,这个格式在推理的时候速度会远远快于存盘的模型。
转换模型只需要用下面的命令就行了,注意不要忽略–class_dim=2参数,如果忽略,系统会按照默认1000分类来转换模型。

!python tools/export_model.py \
    --model "ResNet50_vd" \
    --pretrained_model=output/ResNet50_vd/best_model/ppcls \
    --output_path=output/resnet50vdmodel \
    --class_dim=2

4.使用inference模型进行模型推理

转换完成后,使用python predict.py进行模型推理。注意推理模型会有两个文件,后缀分别为pdmodel和pdiparams ,因为有pdmodel文件,所以在推理的时候就不需要像预测里面需要–model参数,而是需要告知模型文件–model_file。

!python tools/infer/predict.py \
    --image_file ~/work/test \
    --model_file "./output/resnet50vdmodel/inference.pdmodel" \
    --params_file "./output/resnet50vdmodel/inference.pdiparams" \
    --use_tensorrt=False

5.对单张图片就行推理操作

# 也可以使用-i 参数对单张图片就行推理操作
!python tools/infer/predict.py \
    -i=../work/test/neg_1.png \
    --model_file "./output/resnet50vdmodel/inference.pdmodel" \
    --params_file "./output/resnet50vdmodel/inference.pdiparams" \
    # --use_tensorrt=True

未完待续

上一篇:记一次目标分类任务流程拉通——pytorch+resnet50+重新制作的部分challenge2018农作物病害数据集


下一篇:三、ResNet50预置算法提高美食分类识别精确度