简要记录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
未完待续