【AI达人特训营第三期】 用PaddleClas实现的吸烟行为检测方案
使用PaddleClas实现一个吸烟行为检测模型的训练、导出和部署推理,选用轻量级网络选用PP-LCNetV2,初步训练精度可达到78%
·
★★★ 本文源自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%,应该还有提升空间。
- 心得体会:
- 数据处理很重要,拿到数据集一定要检查一下数据质量,看看是否存在错误,进行必要的修正和数据清洗,特别要注意图片格式、通道数是否正确。
- 我所选用的这个PP-LCNetV2不是很好train,尤其是在数据量很小的情况下,毕竟它是一个简化的轻量级网络。默认配置文件里面的epochs是480,以为太多了,但是从实际训练的情况来看,是有必要的,尤其是数据量不大的时候。
- RandomErasing确实有效,在正式训练之前曾尝试跑了一个banseline,没做RandomErasing,同样是100个epoch,精度只有72%。
- Paddle套件确实很好用,对于向我这样一知半解的小白也能轻松使用。另外,看文档很重要。
- 作者简介:
- ccraise,从事企业信息化工作的业余开发者
- Github:https://github.com/ccraise
- Gitee:https://gitee.com/ccraise
- 项目指导:
- 刘建建 Javaroom
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.
此文章为转载
原文链接
更多推荐
已为社区贡献1438条内容
所有评论(0)