简要记录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可以通过配置的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输出,后续可用于可视化与恢复训练
安装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
#下载预训练模型
!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
在实际训练过程,经常发生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就可以进行边训练边评估,并根据评估的精度值将最优模型参数存储在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
模型训练完成之后,可以加载训练得到的预训练模型(就是存盘文件),进行模型预测。
!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
在训练的过程中,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
转换完成后,使用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
# 也可以使用-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
未完待续