★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

  • 使用PaddleClas实现一个吸烟行为检测模型的训练、导出和部署推理

一、项目简介

  • 本项目使用PaddleClas训练了一个检测吸烟行为的模型,并实现模型的导出和推理部署。
  • 数据集使用的是有2400张图像的smokingVSnotsmoking数据集,但遗憾的是该数据集只有分类而没有主体检测框标注。
  • 由于数据量不大,在对数据集处理的时候使用了RandomErasing以增广数据。
  • 模型结构选用PP-LCNetV2,这是一个轻量级分类模型,在速度和精度之间做了平衡,在Intel CPU上具有很好的推理速度。
  • 项目流程:
    • Step1 处理数据
    • Step2 环境准备
    • Step3 训练模型
    • Step4 模型评估
    • Step5 推理测试
    • Step6 模型导出
    • Step7 部署推理

二、处理数据

2.1 数据集简介

  • 该数据集总共包含 2400 张原始图像,其中 1200 张图像属于吸烟(smokers)类别,其余 1200 张图像属于不吸烟(non-smokers)类别。通过输入多个关键字(包括吸烟、吸烟者、人、咳嗽、吸入器、打电话的人、饮用水等),通过各种搜索引擎扫描该数据集。作者试图在两个类别中考虑通用图像以创建特定的类间混淆程度,以便更好地训练模型。例如,吸烟类别由多个角度和各种手势的吸烟者图像组成。此外,非吸烟类别的图像包含非吸烟者的图像,其手势与吸烟图像略有相似,例如人们喝水、使用吸入器、拿着手机、咬指甲等。
  • 原始地址:https://data.mendeley.com/datasets/7b52hhzs3r/1
    • 注意:原始地址同时有zip和rar包下载,但是下载的zip包里面是rar包,所以直接下载rar,不要下载zip。
  • 原始数据集的训练集和验证集有几张图片文件的格式不正确,对此做了简单处理并重新打包。
    • 对以下图片作了调整,原图片格式不正确
      • /smokingVSnotsmoking/dataset/training_data/notsmoking/notsmoking_0963.jpg
      • /smokingVSnotsmoking/dataset/training_data/smoking/smoking_0687.jpg
      • /smokingVSnotsmoking/dataset/validation_data/smoking/smoking_0702.jpg
  • 调整后的数据集地址:https://aistudio.baidu.com/aistudio/datasetdetail/198025
  • 特别注意:
    • 该数据集某些图片不是三通道RGB格式,不过在训练配置文件中已经有转RGB的默认配置,如果使用其他模型,需要注意加上转换RGB的操作。
  • 数据集已挂载到本项目的data目录
  • 数据集样张

2.2 数据集处理

  • 数据集的目录结构如下图所示:
  • 该数据集已经划分好了训练集、验证集和测试集,并且使用目录做好了二分类,因此可以不必再做划分。
  • 数据集目录情况如下图所示:
  • 不管是训练集还是验证集,两个分类都具有相同数量的图片文件,数据是很均衡的,因此不用做均衡标签的处理。
  • 由于数据量不大,因此在处理的时候使用了RandomErasing以增广数据。
  • RandomErasing生成的图片效果展示:

2.3 数据处理程序代码

# 解压数据集
!unzip /home/aistudio/data/data198025/smokingVSnotsmoking.zip -d /home/aistudio/work/
# 处理数据集
import os
import random
import shutil
import paddle
from PIL import Image

fd_train_nsmk = "/home/aistudio/work/smokingVSnotsmoking/dataset/training_data/notsmoking"    # 训练数据,非吸烟图片
fd_train_smk = "/home/aistudio/work/smokingVSnotsmoking/dataset/training_data/smoking"    # 训练数据,吸烟图片
fd_val_nsmk = "/home/aistudio/work/smokingVSnotsmoking/dataset/validation_data/notsmoking"    # 验证数据,非吸烟图片
fd_val_smk = "/home/aistudio/work/smokingVSnotsmoking/dataset/validation_data/smoking"    # 验证数据,吸烟图片

txt_train = "/home/aistudio/work/train.txt"    # 训练集txt
txt_val = "/home/aistudio/work/val.txt"    # 验证集txt

path_fake = "/home/aistudio/work/smokingVSnotsmoking/dataset/training_data/fake/"    # 生成的fake图片路径

if os.path.exists(path_fake):shutil.rmtree(path_fake)    # 删除fake目录
os.mkdir(path_fake)    # 创建新的fake目录

transform = paddle.vision.transforms.RandomErasing(prob=1,scale=(0.02,0.20))    # 图片变换器

# 填充数据列表:要填充的列表,文件夹路径,标签,是否生成fake图片
def fill_datalist(datalist,folder_path,label,fake=False):
    file_list = os.listdir(folder_path)    # 读取文件列表
    for fname in file_list:
        file_path = folder_path + '/' + fname    # 完整文件路径
        datalist.append([file_path,label])    # 把文件路径和标签填充进列表
        if fake:
            # 生成fake图片并加入列表
            img = Image.open(file_path).convert('RGB')    # 打开原始图片
            fake_img = transform(img)    # 生成fake图片
            file_path = path_fake + '/fake_' + fname    # 完整fake文件路径
            fake_img.save(file_path)
            datalist.append([file_path,label])    # 把文件路径和标签填充进列表

# 把数据列表写入数据集txt文件:数据列表,txt文件路径
def write_txt(datalist,txt_path):
    global uniqid
    random.shuffle(datalist)    # 乱序
    with open(txt_path,"w",encoding='utf-8') as f:
        for file_path,label in datalist:
            f.write(file_path + ' ' + str(label) + '\n')

# 生成数据集txt文件:路径和标签对,txt文件路径,是否生成fake图片
def generate_datatxt(path_label,txt_path,fake=False):
    datalist = []
    # 填充列表
    for path,label in path_label:
        fill_datalist(datalist,path,label,fake)
    # 写入数据集txt文件
    write_txt(datalist,txt_path)

# 生成训练集和验证集txt文件
generate_datatxt(list(zip([fd_train_nsmk,fd_train_smk],[0,1])),txt_train,fake=True)
generate_datatxt(list(zip([fd_val_nsmk,fd_val_smk],[0,1])),txt_val)

# 生成classid_map.txt文件
txt_classid_map = '/home/aistudio/work/classid_map.txt'
with open(txt_classid_map,"w",encoding='utf-8') as f:
    f.write('0 notsmoking\n')
    f.write('1 smoking\n')

三、环境准备

  • AI Studio已经装好的paddle环境,但是PaddleClas需要再配置一下
  • github地址:https://github.com/PaddlePaddle/PaddleClas
  • gitee地址:https://gitee.com/paddlepaddle/PaddleClas
  • 以下是执行代码:
# 克隆PaddleClas项目文件
!git clone https://gitee.com/paddlepaddle/PaddleClas.git
# 安装环境
!python -m pip install --upgrade pip
#!python -m pip install faiss-cpu==1.7.1post2
%cd ~/PaddleClas
!pip install -r requirements.txt
!python setup.py install

四、模型训练

4.1 下载预训练模型进行训练

  • PPLCNetV2的训练配置文件是:PaddleClas/ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml
  • 预训练模型下载地址:https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/PPShiTuV2/general_PPLCNetV2_base_pretrained_v1.0.pdparams
  • 需要拷贝一个配置文件出来,然后对配置文件进行修改。
  • 预训练模型不必预先下载,配置好URL之后会自动下载。
  • 配置文件的主要修改点是:
    • Global.device:使用gpu还是cpuhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/PPShiTuV2/general_PPLCNetV2_base_pretrained_v1.0.pdparams
    • Global.pretrained_model:预训练模型地址
    • Global.save_interval:每隔多少个个epoch保存一次
    • Arch.class_num:类别数量
    • Optimizer.lr.learning_rate:学习率
    • DataLoader.Train.dataset.image_root:数据图片主路径
    • DataLoader.Train.dataset.cls_label_path:训练集标签txt文件
    • DataLoader.Train.sampler.first_bs:batch_size
    • DataLoader.Eval.dataset.image_root:数据图片主路径
    • DataLoader.Eval.dataset.cls_label_path:验证集标签txt文件
    • Infer.infer_imgs:预测的图片或图片目录
    • Infer.PostProcess.class_id_map_file:classid的map文件
  • 其实也可以直接使用原始配置文件,然后使用命令行参数修改训练参数
    • 参数优先级:命令行参数 > 配置文件参数 > 程序默认值
  • 精度最佳的模型参数会保存在:output/PPLCNetV2_base/best_model.pdparams
  • 最后一次训练结果的参数会保存在:output/PPLCNetV2_base/latest.pdparams
  • 以下是执行代码:
# 拷贝一个配置文件出来
!cp /home/aistudio/PaddleClas/ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml /home/aistudio/

# 单卡训练
%cd ~/PaddleClas
!export CUDA_VISIBLE_DEVICES=0
!python tools/train.py -c ~/PPLCNetV2_base.yaml \
-o Global.pretrained_model=https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/PPShiTuV2/general_PPLCNetV2_base_pretrained_v1.0.pdparams \
-o Global.save_interval=20 \
-o Global.epochs=100 \
-o Optimizer.lr.learning_rate=0.4 \
-o DataLoader.Train.sampler.first_bs=256 \
-o Global.device=gpu

4.2 加载最后一次训练结果再次训练

  • 如果模型训练效果不好,可以考虑调整参数再次训练
  • 如果不希望从头重新训练,可以加载最后一次训练结果继续训练
  • 以下是执行代码
# 加载最后一次训练结果继续训练
%cd ~/PaddleClas
!export CUDA_VISIBLE_DEVICES=0
!python tools/train.py -c ~/PPLCNetV2_base.yaml \
-o Global.pretrained_model=/home/aistudio/PaddleClas/output/PPLCNetV2_base/latest \
-o Global.save_interval=20 \
-o Global.epochs=100 \
-o Optimizer.lr.learning_rate=0.4 \
-o DataLoader.Train.sampler.first_bs=256 \
-o Global.device=gpu

五、模型评估

  • 训练好的模型,可以使用 tools/eval.py 脚本进行评估。其中 -o Global.pretrained_model=“output/PPLCNetV2_base/best_model” 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
  • 其中 -o Global.pretrained_model=“output/PPLCNetV2_base/best_model” 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
  • 以下是执行代码:
%cd ~/PaddleClas
!python3 tools/eval.py \
    -c ~/PPLCNetV2_base.yaml \
    -o Global.pretrained_model=output/PPLCNetV2_base/best_model \
    -o Global.device=gpu
/home/aistudio/PaddleClas
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import MutableMapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import Iterable, Mapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import Sized
[2023/03/14 13:53:31] ppcls INFO: 
===========================================================
==        PaddleClas is powered by PaddlePaddle !        ==
===========================================================
==                                                       ==
==   For more info please go to the following website.   ==
==                                                       ==
==       https://github.com/PaddlePaddle/PaddleClas      ==
===========================================================

[2023/03/14 13:53:31] ppcls INFO: Arch : 
[2023/03/14 13:53:31] ppcls INFO:     class_num : 2
[2023/03/14 13:53:31] ppcls INFO:     name : PPLCNetV2_base
[2023/03/14 13:53:31] ppcls INFO: DataLoader : 
[2023/03/14 13:53:31] ppcls INFO:     Eval : 
[2023/03/14 13:53:31] ppcls INFO:         dataset : 
[2023/03/14 13:53:31] ppcls INFO:             cls_label_path : /home/aistudio/work/val.txt
[2023/03/14 13:53:31] ppcls INFO:             image_root : /home/aistudio/work/smokingVSnotsmoking/dataset
[2023/03/14 13:53:31] ppcls INFO:             name : ImageNetDataset
[2023/03/14 13:53:31] ppcls INFO:             transform_ops : 
[2023/03/14 13:53:31] ppcls INFO:                 DecodeImage : 
[2023/03/14 13:53:31] ppcls INFO:                     channel_first : False
[2023/03/14 13:53:31] ppcls INFO:                     to_rgb : True
[2023/03/14 13:53:31] ppcls INFO:                 ResizeImage : 
[2023/03/14 13:53:31] ppcls INFO:                     resize_short : 256
[2023/03/14 13:53:31] ppcls INFO:                 CropImage : 
[2023/03/14 13:53:31] ppcls INFO:                     size : 224
[2023/03/14 13:53:31] ppcls INFO:                 NormalizeImage : 
[2023/03/14 13:53:31] ppcls INFO:                     mean : [0.485, 0.456, 0.406]
[2023/03/14 13:53:31] ppcls INFO:                     order : 
[2023/03/14 13:53:31] ppcls INFO:                     scale : 1.0/255.0
[2023/03/14 13:53:31] ppcls INFO:                     std : [0.229, 0.224, 0.225]
[2023/03/14 13:53:31] ppcls INFO:         loader : 
[2023/03/14 13:53:31] ppcls INFO:             num_workers : 0
[2023/03/14 13:53:31] ppcls INFO:             use_shared_memory : False
[2023/03/14 13:53:31] ppcls INFO:         sampler : 
[2023/03/14 13:53:31] ppcls INFO:             batch_size : 64
[2023/03/14 13:53:31] ppcls INFO:             drop_last : False
[2023/03/14 13:53:31] ppcls INFO:             name : DistributedBatchSampler
[2023/03/14 13:53:31] ppcls INFO:             shuffle : False
[2023/03/14 13:53:31] ppcls INFO:     Train : 
[2023/03/14 13:53:31] ppcls INFO:         dataset : 
[2023/03/14 13:53:31] ppcls INFO:             cls_label_path : /home/aistudio/work/train.txt
[2023/03/14 13:53:31] ppcls INFO:             image_root : /home/aistudio/work/smokingVSnotsmoking/dataset
[2023/03/14 13:53:31] ppcls INFO:             name : MultiScaleDataset
[2023/03/14 13:53:31] ppcls INFO:             transform_ops : 
[2023/03/14 13:53:31] ppcls INFO:                 DecodeImage : 
[2023/03/14 13:53:31] ppcls INFO:                     channel_first : False
[2023/03/14 13:53:31] ppcls INFO:                     to_rgb : True
[2023/03/14 13:53:31] ppcls INFO:                 RandCropImage : 
[2023/03/14 13:53:31] ppcls INFO:                     size : 224
[2023/03/14 13:53:31] ppcls INFO:                 RandFlipImage : 
[2023/03/14 13:53:31] ppcls INFO:                     flip_code : 1
[2023/03/14 13:53:31] ppcls INFO:                 NormalizeImage : 
[2023/03/14 13:53:31] ppcls INFO:                     mean : [0.485, 0.456, 0.406]
[2023/03/14 13:53:31] ppcls INFO:                     order : 
[2023/03/14 13:53:31] ppcls INFO:                     scale : 1.0/255.0
[2023/03/14 13:53:31] ppcls INFO:                     std : [0.229, 0.224, 0.225]
[2023/03/14 13:53:31] ppcls INFO:         loader : 
[2023/03/14 13:53:31] ppcls INFO:             num_workers : 0
[2023/03/14 13:53:31] ppcls INFO:             use_shared_memory : False
[2023/03/14 13:53:31] ppcls INFO:         sampler : 
[2023/03/14 13:53:31] ppcls INFO:             divided_factor : 32
[2023/03/14 13:53:31] ppcls INFO:             first_bs : 500
[2023/03/14 13:53:31] ppcls INFO:             is_training : True
[2023/03/14 13:53:31] ppcls INFO:             name : MultiScaleSampler
[2023/03/14 13:53:31] ppcls INFO:             scales : [160, 192, 224, 288, 320]
[2023/03/14 13:53:31] ppcls INFO: Global : 
[2023/03/14 13:53:31] ppcls INFO:     checkpoints : None
[2023/03/14 13:53:31] ppcls INFO:     device : gpu
[2023/03/14 13:53:31] ppcls INFO:     epochs : 480
[2023/03/14 13:53:31] ppcls INFO:     eval_during_train : True
[2023/03/14 13:53:31] ppcls INFO:     eval_interval : 1
[2023/03/14 13:53:31] ppcls INFO:     image_shape : [3, 224, 224]
[2023/03/14 13:53:31] ppcls INFO:     output_dir : ./output/
[2023/03/14 13:53:31] ppcls INFO:     pretrained_model : output/PPLCNetV2_base/best_model
[2023/03/14 13:53:31] ppcls INFO:     print_batch_step : 10
[2023/03/14 13:53:31] ppcls INFO:     save_inference_dir : ./inference
[2023/03/14 13:53:31] ppcls INFO:     save_interval : 1
[2023/03/14 13:53:31] ppcls INFO:     use_visualdl : False
[2023/03/14 13:53:31] ppcls INFO: Infer : 
[2023/03/14 13:53:31] ppcls INFO:     PostProcess : 
[2023/03/14 13:53:31] ppcls INFO:         class_id_map_file : /home/aistudio/work/classid_map.txt
[2023/03/14 13:53:31] ppcls INFO:         name : Topk
[2023/03/14 13:53:31] ppcls INFO:         topk : 5
[2023/03/14 13:53:31] ppcls INFO:     batch_size : 10
[2023/03/14 13:53:31] ppcls INFO:     infer_imgs : /home/aistudio/work/smokingVSnotsmoking/dataset/testing_data/abc267.jpg
[2023/03/14 13:53:31] ppcls INFO:     transforms : 
[2023/03/14 13:53:31] ppcls INFO:         DecodeImage : 
[2023/03/14 13:53:31] ppcls INFO:             channel_first : False
[2023/03/14 13:53:31] ppcls INFO:             to_rgb : True
[2023/03/14 13:53:31] ppcls INFO:         ResizeImage : 
[2023/03/14 13:53:31] ppcls INFO:             resize_short : 256
[2023/03/14 13:53:31] ppcls INFO:         CropImage : 
[2023/03/14 13:53:31] ppcls INFO:             size : 224
[2023/03/14 13:53:31] ppcls INFO:         NormalizeImage : 
[2023/03/14 13:53:31] ppcls INFO:             mean : [0.485, 0.456, 0.406]
[2023/03/14 13:53:31] ppcls INFO:             order : 
[2023/03/14 13:53:31] ppcls INFO:             scale : 1.0/255.0
[2023/03/14 13:53:31] ppcls INFO:             std : [0.229, 0.224, 0.225]
[2023/03/14 13:53:31] ppcls INFO:         ToCHWImage : None
[2023/03/14 13:53:31] ppcls INFO: Loss : 
[2023/03/14 13:53:31] ppcls INFO:     Eval : 
[2023/03/14 13:53:31] ppcls INFO:         CELoss : 
[2023/03/14 13:53:31] ppcls INFO:             weight : 1.0
[2023/03/14 13:53:31] ppcls INFO:     Train : 
[2023/03/14 13:53:31] ppcls INFO:         CELoss : 
[2023/03/14 13:53:31] ppcls INFO:             epsilon : 0.1
[2023/03/14 13:53:31] ppcls INFO:             weight : 1.0
[2023/03/14 13:53:31] ppcls INFO: Metric : 
[2023/03/14 13:53:31] ppcls INFO:     Eval : 
[2023/03/14 13:53:31] ppcls INFO:         TopkAcc : 
[2023/03/14 13:53:31] ppcls INFO:             topk : [1, 5]
[2023/03/14 13:53:31] ppcls INFO:     Train : 
[2023/03/14 13:53:31] ppcls INFO:         TopkAcc : 
[2023/03/14 13:53:31] ppcls INFO:             topk : [1, 5]
[2023/03/14 13:53:31] ppcls INFO: Optimizer : 
[2023/03/14 13:53:31] ppcls INFO:     lr : 
[2023/03/14 13:53:31] ppcls INFO:         learning_rate : 0.8
[2023/03/14 13:53:31] ppcls INFO:         name : Cosine
[2023/03/14 13:53:31] ppcls INFO:         warmup_epoch : 5
[2023/03/14 13:53:31] ppcls INFO:     momentum : 0.9
[2023/03/14 13:53:31] ppcls INFO:     name : Momentum
[2023/03/14 13:53:31] ppcls INFO:     regularizer : 
[2023/03/14 13:53:31] ppcls INFO:         coeff : 4e-05
[2023/03/14 13:53:31] ppcls INFO:         name : L2
[2023/03/14 13:53:31] ppcls INFO: train with paddle 2.4.0 and device Place(gpu:0)
W0314 13:53:31.345695 10902 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0314 13:53:31.350500 10902 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
[2023/03/14 13:53:37] ppcls WARNING: The output dims(2) is less than k(5), and the argument 5 of Topk has been removed.
[2023/03/14 13:53:37] ppcls INFO: [Eval][Epoch 0][Iter: 0/7]CELoss: 0.53620, loss: 0.53620, top1: 0.75000, batch_cost: 3.98683s, reader_cost: 2.32163, ips: 16.05285 images/sec
[2023/03/14 13:53:44] ppcls INFO: [Eval][Epoch 0][Avg]CELoss: 0.53506, loss: 0.53506, top1: 0.78000

六、模型预测

  • 训练好的模型,可以使用 tools/infer.py 脚本加载训练模型进行预测。
  • -o Global.pretrained_model=“output/PPLCNetV2_base/best_model” 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
  • 默认配置是对 docs/images/inference_deployment/whl_demo.jpg 进行预测,此处也可以通过增加字段 -o Infer.infer_imgs=xxx 对其他图片预测。
  • 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定-o Infer.PostProcess.topk=k,其中,k 为指定的值。
  • 以下是执行代码
# 查看一张测试图片
from PIL import Image

img = Image.open("/home/aistudio/work/smokingVSnotsmoking/dataset/testing_data/abc267.jpg").convert('RGB')
img.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3JdtkHMT-1681704129450)(main_files/main_21_0.png)]

%cd ~/PaddleClas
!python3 tools/infer.py \
    -c ~/PPLCNetV2_base.yaml \
    -o Global.pretrained_model=output/PPLCNetV2_base/best_model \
    -o Infer.infer_imgs=/home/aistudio/work/smokingVSnotsmoking/dataset/testing_data/abc267.jpg \
    -o Global.device=gpu
/home/aistudio/PaddleClas
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import MutableMapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import Iterable, Mapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import Sized
[2023/03/14 13:54:10] ppcls INFO: 
===========================================================
==        PaddleClas is powered by PaddlePaddle !        ==
===========================================================
==                                                       ==
==   For more info please go to the following website.   ==
==                                                       ==
==       https://github.com/PaddlePaddle/PaddleClas      ==
===========================================================

[2023/03/14 13:54:10] ppcls INFO: Arch : 
[2023/03/14 13:54:10] ppcls INFO:     class_num : 2
[2023/03/14 13:54:10] ppcls INFO:     name : PPLCNetV2_base
[2023/03/14 13:54:10] ppcls INFO: DataLoader : 
[2023/03/14 13:54:10] ppcls INFO:     Eval : 
[2023/03/14 13:54:10] ppcls INFO:         dataset : 
[2023/03/14 13:54:10] ppcls INFO:             cls_label_path : /home/aistudio/work/val.txt
[2023/03/14 13:54:10] ppcls INFO:             image_root : /home/aistudio/work/smokingVSnotsmoking/dataset
[2023/03/14 13:54:10] ppcls INFO:             name : ImageNetDataset
[2023/03/14 13:54:10] ppcls INFO:             transform_ops : 
[2023/03/14 13:54:10] ppcls INFO:                 DecodeImage : 
[2023/03/14 13:54:10] ppcls INFO:                     channel_first : False
[2023/03/14 13:54:10] ppcls INFO:                     to_rgb : True
[2023/03/14 13:54:10] ppcls INFO:                 ResizeImage : 
[2023/03/14 13:54:10] ppcls INFO:                     resize_short : 256
[2023/03/14 13:54:10] ppcls INFO:                 CropImage : 
[2023/03/14 13:54:10] ppcls INFO:                     size : 224
[2023/03/14 13:54:10] ppcls INFO:                 NormalizeImage : 
[2023/03/14 13:54:10] ppcls INFO:                     mean : [0.485, 0.456, 0.406]
[2023/03/14 13:54:10] ppcls INFO:                     order : 
[2023/03/14 13:54:10] ppcls INFO:                     scale : 1.0/255.0
[2023/03/14 13:54:10] ppcls INFO:                     std : [0.229, 0.224, 0.225]
[2023/03/14 13:54:10] ppcls INFO:         loader : 
[2023/03/14 13:54:10] ppcls INFO:             num_workers : 0
[2023/03/14 13:54:10] ppcls INFO:             use_shared_memory : False
[2023/03/14 13:54:10] ppcls INFO:         sampler : 
[2023/03/14 13:54:10] ppcls INFO:             batch_size : 64
[2023/03/14 13:54:10] ppcls INFO:             drop_last : False
[2023/03/14 13:54:10] ppcls INFO:             name : DistributedBatchSampler
[2023/03/14 13:54:10] ppcls INFO:             shuffle : False
[2023/03/14 13:54:10] ppcls INFO:     Train : 
[2023/03/14 13:54:10] ppcls INFO:         dataset : 
[2023/03/14 13:54:10] ppcls INFO:             cls_label_path : /home/aistudio/work/train.txt
[2023/03/14 13:54:10] ppcls INFO:             image_root : /home/aistudio/work/smokingVSnotsmoking/dataset
[2023/03/14 13:54:10] ppcls INFO:             name : MultiScaleDataset
[2023/03/14 13:54:10] ppcls INFO:             transform_ops : 
[2023/03/14 13:54:10] ppcls INFO:                 DecodeImage : 
[2023/03/14 13:54:10] ppcls INFO:                     channel_first : False
[2023/03/14 13:54:10] ppcls INFO:                     to_rgb : True
[2023/03/14 13:54:10] ppcls INFO:                 RandCropImage : 
[2023/03/14 13:54:10] ppcls INFO:                     size : 224
[2023/03/14 13:54:10] ppcls INFO:                 RandFlipImage : 
[2023/03/14 13:54:10] ppcls INFO:                     flip_code : 1
[2023/03/14 13:54:10] ppcls INFO:                 NormalizeImage : 
[2023/03/14 13:54:10] ppcls INFO:                     mean : [0.485, 0.456, 0.406]
[2023/03/14 13:54:10] ppcls INFO:                     order : 
[2023/03/14 13:54:10] ppcls INFO:                     scale : 1.0/255.0
[2023/03/14 13:54:10] ppcls INFO:                     std : [0.229, 0.224, 0.225]
[2023/03/14 13:54:10] ppcls INFO:         loader : 
[2023/03/14 13:54:10] ppcls INFO:             num_workers : 0
[2023/03/14 13:54:10] ppcls INFO:             use_shared_memory : False
[2023/03/14 13:54:10] ppcls INFO:         sampler : 
[2023/03/14 13:54:10] ppcls INFO:             divided_factor : 32
[2023/03/14 13:54:10] ppcls INFO:             first_bs : 500
[2023/03/14 13:54:10] ppcls INFO:             is_training : True
[2023/03/14 13:54:10] ppcls INFO:             name : MultiScaleSampler
[2023/03/14 13:54:10] ppcls INFO:             scales : [160, 192, 224, 288, 320]
[2023/03/14 13:54:10] ppcls INFO: Global : 
[2023/03/14 13:54:10] ppcls INFO:     checkpoints : None
[2023/03/14 13:54:10] ppcls INFO:     device : gpu
[2023/03/14 13:54:10] ppcls INFO:     epochs : 480
[2023/03/14 13:54:10] ppcls INFO:     eval_during_train : True
[2023/03/14 13:54:10] ppcls INFO:     eval_interval : 1
[2023/03/14 13:54:10] ppcls INFO:     image_shape : [3, 224, 224]
[2023/03/14 13:54:10] ppcls INFO:     output_dir : ./output/
[2023/03/14 13:54:10] ppcls INFO:     pretrained_model : output/PPLCNetV2_base/best_model
[2023/03/14 13:54:10] ppcls INFO:     print_batch_step : 10
[2023/03/14 13:54:10] ppcls INFO:     save_inference_dir : ./inference
[2023/03/14 13:54:10] ppcls INFO:     save_interval : 1
[2023/03/14 13:54:10] ppcls INFO:     use_visualdl : False
[2023/03/14 13:54:10] ppcls INFO: Infer : 
[2023/03/14 13:54:10] ppcls INFO:     PostProcess : 
[2023/03/14 13:54:10] ppcls INFO:         class_id_map_file : /home/aistudio/work/classid_map.txt
[2023/03/14 13:54:10] ppcls INFO:         name : Topk
[2023/03/14 13:54:10] ppcls INFO:         topk : 5
[2023/03/14 13:54:10] ppcls INFO:     batch_size : 10
[2023/03/14 13:54:10] ppcls INFO:     infer_imgs : /home/aistudio/work/smokingVSnotsmoking/dataset/testing_data/abc267.jpg
[2023/03/14 13:54:10] ppcls INFO:     transforms : 
[2023/03/14 13:54:10] ppcls INFO:         DecodeImage : 
[2023/03/14 13:54:10] ppcls INFO:             channel_first : False
[2023/03/14 13:54:10] ppcls INFO:             to_rgb : True
[2023/03/14 13:54:10] ppcls INFO:         ResizeImage : 
[2023/03/14 13:54:10] ppcls INFO:             resize_short : 256
[2023/03/14 13:54:10] ppcls INFO:         CropImage : 
[2023/03/14 13:54:10] ppcls INFO:             size : 224
[2023/03/14 13:54:10] ppcls INFO:         NormalizeImage : 
[2023/03/14 13:54:10] ppcls INFO:             mean : [0.485, 0.456, 0.406]
[2023/03/14 13:54:10] ppcls INFO:             order : 
[2023/03/14 13:54:10] ppcls INFO:             scale : 1.0/255.0
[2023/03/14 13:54:10] ppcls INFO:             std : [0.229, 0.224, 0.225]
[2023/03/14 13:54:10] ppcls INFO:         ToCHWImage : None
[2023/03/14 13:54:10] ppcls INFO: Loss : 
[2023/03/14 13:54:10] ppcls INFO:     Eval : 
[2023/03/14 13:54:10] ppcls INFO:         CELoss : 
[2023/03/14 13:54:10] ppcls INFO:             weight : 1.0
[2023/03/14 13:54:10] ppcls INFO:     Train : 
[2023/03/14 13:54:10] ppcls INFO:         CELoss : 
[2023/03/14 13:54:10] ppcls INFO:             epsilon : 0.1
[2023/03/14 13:54:10] ppcls INFO:             weight : 1.0
[2023/03/14 13:54:10] ppcls INFO: Metric : 
[2023/03/14 13:54:10] ppcls INFO:     Eval : 
[2023/03/14 13:54:10] ppcls INFO:         TopkAcc : 
[2023/03/14 13:54:10] ppcls INFO:             topk : [1, 5]
[2023/03/14 13:54:10] ppcls INFO:     Train : 
[2023/03/14 13:54:10] ppcls INFO:         TopkAcc : 
[2023/03/14 13:54:10] ppcls INFO:             topk : [1, 5]
[2023/03/14 13:54:10] ppcls INFO: Optimizer : 
[2023/03/14 13:54:10] ppcls INFO:     lr : 
[2023/03/14 13:54:10] ppcls INFO:         learning_rate : 0.8
[2023/03/14 13:54:10] ppcls INFO:         name : Cosine
[2023/03/14 13:54:10] ppcls INFO:         warmup_epoch : 5
[2023/03/14 13:54:10] ppcls INFO:     momentum : 0.9
[2023/03/14 13:54:10] ppcls INFO:     name : Momentum
[2023/03/14 13:54:10] ppcls INFO:     regularizer : 
[2023/03/14 13:54:10] ppcls INFO:         coeff : 4e-05
[2023/03/14 13:54:10] ppcls INFO:         name : L2
[2023/03/14 13:54:10] ppcls INFO: train with paddle 2.4.0 and device Place(gpu:0)
W0314 13:54:10.108472 11084 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0314 13:54:10.113406 11084 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
[{'class_ids': [0, 1], 'scores': [0.90324, 0.09676], 'file_name': '/home/aistudio/work/smokingVSnotsmoking/dataset/testing_data/abc267.jpg', 'label_names': ['notsmoking ', 'smoking ']}]

七、模型导出

7.1 导出为 inference 模型

  • Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于Paddle Inference推理引擎的介绍,可以参考Paddle Inference官网教程。
  • 当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型,因此需要将模型导出为 inference 模型。
  • PaddleClas提供了将权重和模型转换的脚本 tools/export_model.py,执行该脚本可以得到对应的 inference 模型。
  • 以下是执行代码
%cd ~/PaddleClas
!python3 tools/export_model.py \
    -c ~/PPLCNetV2_base.yaml \
    -o Global.pretrained_model=output/PPLCNetV2_base/best_model \
    -o Global.save_inference_dir=deploy/models/PPLCNetV2_base_infer \
    -o Global.device=cpu

7.2 转化为 Paddle Lite 格式

  • 为了方便在移动端部署,比如在arm处理器的手机、树莓派等,还需要将模型转化为 Paddle Lite 格式。
  • 为此,需要先安装paddlelite,然后使用paddlelite的opt工具进行转化,详细的参数配置请查阅paddlelie文档。
  • 以下是执行代码
# 安装paddlelite
%pip install paddlelite
# 创建保存模型用的文件夹,然后转化模型
!mkdir /home/aistudio/arm
!paddle_lite_opt \
    --model_file=/home/aistudio/PaddleClas/deploy/models/PPLCNetV2_base_infer/inference.pdmodel \
    --param_file=/home/aistudio/PaddleClas/deploy/models/PPLCNetV2_base_infer/inference.pdiparams \
    --valid_targets=arm \
    --optimize_out=/home/aistudio/arm/PPLCNetV2_base_infer_opt_v1

八、部署推理

  • 部署可以使用FastDeploy,端侧部署可以参考Paddle Lite文档。
  • 这里演示直接调用python推理引擎进行推理的操作。
  • 以下是执行代码
# 查看一张测试图片
from PIL import Image

img = Image.open("/home/aistudio/work/smokingVSnotsmoking/dataset/testing_data/abc191.jpg").convert('RGB')
img.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIDnCMrW-1681704129450)(main_files/main_30_0.png)]

# 使用 CPU 进行预测
%cd ~/PaddleClas/deploy
!python3 python/predict_cls.py \
    -c configs/inference_cls.yaml \
    -o Global.inference_model_dir=models/PPLCNetV2_base_infer \
    -o Global.use_gpu=False \
    -o Global.infer_imgs="/home/aistudio/work/smokingVSnotsmoking/dataset/testing_data/abc191.jpg" \
    -o PostProcess.Topk.class_id_map_file="/home/aistudio/work/classid_map.txt"
/home/aistudio/PaddleClas/deploy
2023-03-14 13:55:19 INFO: Loading faiss with AVX2 support.
2023-03-14 13:55:19 INFO: Successfully loaded faiss with AVX2 support.
2023-03-14 13:55:19 INFO: 
===========================================================
==        PaddleClas is powered by PaddlePaddle !        ==
===========================================================
==                                                       ==
==   For more info please go to the following website.   ==
==                                                       ==
==       https://github.com/PaddlePaddle/PaddleClas      ==
===========================================================

2023-03-14 13:55:19 INFO: Global : 
2023-03-14 13:55:19 INFO:     batch_size : 1
2023-03-14 13:55:19 INFO:     cpu_num_threads : 10
2023-03-14 13:55:19 INFO:     enable_benchmark : True
2023-03-14 13:55:19 INFO:     enable_mkldnn : True
2023-03-14 13:55:19 INFO:     enable_profile : False
2023-03-14 13:55:19 INFO:     gpu_mem : 8000
2023-03-14 13:55:19 INFO:     infer_imgs : /home/aistudio/work/smokingVSnotsmoking/dataset/testing_data/abc191.jpg
2023-03-14 13:55:19 INFO:     inference_model_dir : models/PPLCNetV2_base_infer
2023-03-14 13:55:19 INFO:     ir_optim : True
2023-03-14 13:55:19 INFO:     use_fp16 : False
2023-03-14 13:55:19 INFO:     use_gpu : False
2023-03-14 13:55:19 INFO:     use_tensorrt : False
2023-03-14 13:55:19 INFO: PostProcess : 
2023-03-14 13:55:19 INFO:     SavePreLabel : 
2023-03-14 13:55:19 INFO:         save_dir : ./pre_label/
2023-03-14 13:55:19 INFO:     Topk : 
2023-03-14 13:55:19 INFO:         class_id_map_file : /home/aistudio/work/classid_map.txt
2023-03-14 13:55:19 INFO:         topk : 5
2023-03-14 13:55:19 INFO:     main_indicator : Topk
2023-03-14 13:55:19 INFO: PreProcess : 
2023-03-14 13:55:19 INFO:     transform_ops : 
2023-03-14 13:55:19 INFO:         ResizeImage : 
2023-03-14 13:55:19 INFO:             resize_short : 256
2023-03-14 13:55:19 INFO:         CropImage : 
2023-03-14 13:55:19 INFO:             size : 224
2023-03-14 13:55:19 INFO:         NormalizeImage : 
2023-03-14 13:55:19 INFO:             channel_num : 3
2023-03-14 13:55:19 INFO:             mean : [0.485, 0.456, 0.406]
2023-03-14 13:55:19 INFO:             order : 
2023-03-14 13:55:19 INFO:             scale : 0.00392157
2023-03-14 13:55:19 INFO:             std : [0.229, 0.224, 0.225]
2023-03-14 13:55:19 INFO:         ToCHWImage : None
abc191.jpg:	class id(s): [1, 0], score(s): [0.80, 0.20], label_name(s): ['smoking ', 'notsmoking ']

INFO: order :
2023-03-14 13:55:19 INFO: scale : 0.00392157
2023-03-14 13:55:19 INFO: std : [0.229, 0.224, 0.225]
2023-03-14 13:55:19 INFO: ToCHWImage : None
abc191.jpg: class id(s): [1, 0], score(s): [0.80, 0.20], label_name(s): ['smoking ', 'notsmoking ']

九、总结

  • 训练情况:
    • 我一共训练了两次,两次的参数实际上是一样的,第一次训练完了之后,再次加载训练的结果继续训练了一次。
    • 第一次训练结束之后的精度是76%,第二次训练结束之后达到78%,应该还有提升空间。
  • 心得体会:
      1. 数据处理很重要,拿到数据集一定要检查一下数据质量,看看是否存在错误,进行必要的修正和数据清洗,特别要注意图片格式、通道数是否正确。
      1. 我所选用的这个PP-LCNetV2不是很好train,尤其是在数据量很小的情况下,毕竟它是一个简化的轻量级网络。默认配置文件里面的epochs是480,以为太多了,但是从实际训练的情况来看,是有必要的,尤其是数据量不大的时候。
      1. RandomErasing确实有效,在正式训练之前曾尝试跑了一个banseline,没做RandomErasing,同样是100个epoch,精度只有72%。
      1. Paddle套件确实很好用,对于向我这样一知半解的小白也能轻松使用。另外,看文档很重要。
  • 作者简介:
    • ccraise,从事企业信息化工作的业余开发者
    • Github:https://github.com/ccraise
    • Gitee:https://gitee.com/ccraise
  • 项目指导:

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.
此文章为转载
原文链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐