目录
超轻量图像分类方案PULC
方案主要包括 4 部分,分别是:PP-LCNet轻量级骨干网络、SSLD预训练权重、(EDA)数据增强策略集成和 SKL-UGI 知识蒸馏算法。此外,我们还采用了超参搜索的方法,高效优化训练中的超参数。
- 骨干网络PP-LCNet
PULC 采用了轻量骨干网络 PP-LCNet,相比同精度竞品速度快 50%,您可以在PP-LCNet介绍查阅该骨干网络的详细介绍。 - SSLD预训练权重
SSLD 是百度自研的半监督蒸馏算法,在 ImageNet 数据集上,模型精度可以提升 3-7 个点,您可以在 SSLD 介绍找到详细介绍。- 使用SSLD预训练权重,可以有效提升应用分类模型的精度(配置文件中设置
pretrained:True
、use_ssld:True
) - 训练中使用更小的分辨率,可以有效提升模型精度
- 对学习率进行了优化
- 使用SSLD预训练权重,可以有效提升应用分类模型的精度(配置文件中设置
- EDA数据增强策略
数据增强是视觉算法中常用的优化策略,可以对模型精度有明显提升。除了传统的 RandomCrop,RandomFlip 等方法之外,我们还应用了 RandomAugment 和 RandomErasing。您可以在数据增强介绍找到详细介绍。 由于这两种数据增强对图片的修改较大,使分类任务变难,在一些小数据集上可能会导致模型欠拟合,我们将提前设置好这两种方法启用的概率。 - SKL-UGI模型蒸馏
模型蒸馏是一种可以有效提升小模型精度的方法,您可以在知识蒸馏介绍找到详细介绍。我们选择 ResNet101_vd 作为教师模型进行蒸馏。为了适应蒸馏过程,我们在此也对网络不同 stage 的学习率进行了调整。 - 总结
数据准备
数据格式
PaddleClas 使用 txt
格式文件指定训练集和测试集,train.txt
、test.txt
格式如下:
# 每一行采用"空格"分隔图像路径与标注
classifydata/img_detail/1.jpg 0
classifydata/img_invoice/10.jpg 1
classifydata/img_medicalDOC/20.jpg 2
classifydata/img_other/30.jpg 3
...
类别标签在./ppcls/utils/PULC_label_list/data_classification_label_list.txt
,格式如下:
0 detail
1 invoice
2 medicalDOC
3 other
注意:在配置文件中配置图片路径img_root
、标签路径cls_label_path
、类别标签路径class_id_map_file
文件结构
./dataset_clas/
路径下
data_classification
├── test_data
│ ├── classifydata
│ │ ├── img_detail
│ │ │ ├── 0.jpg
│ │ │ ├── 1.jpg
│ │ │ └── ...
│ │ ├── img_invoice
│ │ │ ├── 0.jpg
│ │ │ ├── 1.jpg
│ │ │ └── ...
│ │ └── ...
│ ├── class_error_230721...
│ ├── ...
│ └── test.txt
└── train_data...
模型训练
训练
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \
tools/train.py \
-c ./ppcls/configs/PULC/language_classification/PPLCNet_x1_0.yaml \
-o Arch.class_num=4
评估
python3 tools/eval.py \
-c ./ppcls/configs/PULC/language_classification/PPLCNet_x1_0.yaml \
-o Global.pretrained_model="output/PPLCNet_x1_0/best_model" \
-o Arch.class_num=4
预测
python3 tools/infer.py \
-c ./ppcls/configs/PULC/language_classification/PPLCNet_x1_0.yaml \
-o Global.pretrained_model="output/PPLCNet_x1_0/best_model" \
-o Arch.class_num=4
通过增加字段 -o Infer.infer_imgs=xxx
对其他图片预测
模型压缩
SKL-UGI 知识蒸馏
SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考SKL-UGI 知识蒸馏。
教师模型训练
复用ppcls/configs/PULC/language_classification/PPLCNet/PPLCNet_x1_0.yaml
中的超参数,训练教师模型,训练脚本如下:(大模型)
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \
tools/train.py \
-c ./ppcls/configs/PULC/language_classification/PPLCNet_x1_0.yaml \
-o Arch.name=ResNet101_vd \
-o Arch.class_num=4
当前教师模型最好的权重保存在output/ResNet101_vd/best_model.pdparams
。
蒸馏训练
配置文件ppcls/configs/PULC/language_classification/PPLCNet_x1_0_distillation.yaml
提供了SKL-UGI知识蒸馏策略
的配置。该配置将ResNet101_vd
当作教师模型,PPLCNet_x1_0
当作学生模型,使用新增的无标签数据。训练脚本如下:
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \
tools/train.py \
-c ./ppcls/configs/PULC/language_classification/PPLCNet_x1_0_distillation.yaml \
-o Arch.models.0.Teacher.pretrained=output/ResNet101_vd/best_model \
-o Arch.class_num=4
当前模型最好的权重保存在output/DistillationModel/best_model_student.pdparams
。
超参搜索
在上述训练过程中,我们调节了学习率、数据增广方法开启概率、分阶段学习率倍数等参数。 这些参数在不同场景中最优值可能并不相同。我们提供了一个快速超参搜索的脚本,将超参调优的过程自动化。 这个脚本会遍历搜索值列表中的参数来替代默认配置中的参数,依次训练,最终选择精度最高的模型所对应的参数作为搜索结果。
基于默认配置搜索
配置文件 search.yaml 定义了有人/无人场景超参搜索的配置,使用如下命令即可完成超参数的搜索。
python3 tools/search_strategy.py -c ppcls/configs/PULC/person_exists/search.yaml
自定义搜索配置
您也可以根据训练结果或调参经验,修改超参搜索的配置。
修改 lrs
中的search_values
字段,可以修改学习率搜索值列表;
修改 resolutions
中的 search_values
字段,可以修改分辨率的搜索值列表;
修改 ra_probs
中的 search_values
字段,可以修改 RandAugment 开启概率的搜索值列表;
修改 re_probs
中的 search_values
字段,可以修改 RnadomErasing 开启概率的搜索值列表;
修改 lr_mult_list
中的 search_values
字段,可以修改 lr_mult 搜索值列表;
修改 teacher
中的 search_values
字段,可以修改教师模型的搜索列表。
搜索完成后,会在 output/search_person_exists
中生成最终的结果,其中,除search_res
外 output/search_person_exists
中目录为对应的每个搜索的超参数的结果的权重和训练日志文件,search_res
对应的是蒸馏后的结果,也就是最终的模型,该模型的权重保存在output/output_dir/search_person_exists/DistillationModel/best_model_student.pdparams
。
模型导出推理部署
导出
Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于Paddle Inference推理引擎的介绍,可以参考Paddle Inference官网教程。
python3 tools/export_model.py \
-c ./ppcls/configs/PULC/language_classification/PPLCNet_x1_0.yaml \
-o Global.pretrained_model=output/DistillationModel/best_model_student \
-o Global.save_inference_dir=server_models/PPLCNet_x1_0_230721_data_cls
推理
- python预测
# 使用下面的命令使用 GPU 进行预测,如果希望使用 CPU 预测,可以在命令后面添加 -o Global.use_gpu=False
# 相关推理配置,可直接修改推理配置文件,或者在命令后添加 -o ...修改配置
python deploy/python/predict_cls.py -c deploy/configs/PULC/data_classification/inference_data_classification.yaml -o Global.infer_imgs="./images/PULC/language_classification/" Global.inference_model_dir="./server_models/PPLCNet_x1_0_230721_data_cls"
- C++预测
PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考服务器端 C++ 预测来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考基于 Visual Studio 2019 Community CMake 编译指南完成相应的预测库编译和模型预测工作。
部署
- 服务化部署
Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考Paddle Serving 代码仓库。
PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考模型服务化部署来完成相应的部署工作。 - 端侧部署
Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考Paddle Lite 代码仓库。
PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考端侧部署来完成相应的部署工作。 - Paddle2ONNX模型转换与预测
Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考Paddle2ONNX 代码仓库。
PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考Paddle2ONNX 模型转换与预测来完成相应的部署工作。