目录:
本示例以ultralytics/yolov5,meituan/YOLOv6 和 WongKinYiu/yolov7 目标检测模型为例,借助X2Paddle的能力,将PyTorch框架模型转换为Paddle框架模型,再使用ACT自动压缩功能进行模型压缩,压缩后的模型可使用Paddle Inference或者导出至ONNX,利用TensorRT部署。
模型 | 策略 | 输入尺寸 | mAPval 0.5:0.95 |
模型体积 | 预测时延FP32 |
预测时延FP16 |
预测时延INT8 |
内存占用 | 显存占用 | 配置文件 | Inference模型 |
---|---|---|---|---|---|---|---|---|---|---|---|
YOLOv5s | Base模型 | 640*640 | 37.5 | 28.1MB | 14.4ms | 6.9ms | - | 2637MB | 1143MB | - | Model |
YOLOv5s | 离线量化 | 640*640 | 36.7 | 7.5MB | - | - | 6.4ms | 2669MB | 1089MB | config | - |
YOLOv5s | ACT量化训练 | 640*640 | 36.8 | 7.5MB | - | - | 6.8ms | 2593MB | 1083MB | config | Infer Model | ONNX Model |
YOLOv6s | Base模型 | 640*640 | 42.5 | 65.9MB | 18.3ms | 7.1ms | - | 2660MB | 1183MB | - | Model |
YOLOv6s | KL离线量化 | 640*640 | 34.0 | 17MB | - | - | 4.9ms | 2570MB | 1085MB | config | - |
YOLOv6s | 量化蒸馏训练 | 640*640 | 41.3 | 17MB | - | - | 4.9ms | 2532MB | 1085MB | config | Infer Model | ONNX Model |
YOLOv7-Tiny | Base模型 | 640*640 | 37.2 | 24MB | 13.2ms | 8.1ms | - | 2466MB | 1133MB | - | Model |
YOLOv7-Tiny | ACT量化训练 | 640*640 | 36.8 | 6.2MB | - | - | 6.6ms | 2547MB | 1085MB | config | Infer Model | ONNX Model |
说明:
- mAP的指标均在COCO val2017数据集中评测得到,IoU=0.5:0.95。
- 测速环境:Tesla T4,TensorRT 8.6.1,CUDA 11.2,batch_size=1,cudnn 8.2.0 Intel(R)Xeon(R)Gold 6271C CPU , 测试脚本是paddle_inference_eval.py。
- PaddlePaddle 2.6 (可从Paddle官网根据相应环境的安装指令进行安装)
- PaddleSlim 2.6
(1)安装paddlepaddle
# CPU
python -m pip install paddlepaddle==2.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
# GPU 以Ubuntu、CUDA 11.2为例
python -m pip install paddlepaddle-gpu==2.6.0.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
(2)安装paddleslim 2.6
pip install paddleslim
(3) 安装paddledet
pip install paddledet
注:安装PaddleDet的目的是为了直接使用PaddleDetection中的Dataloader组件。
PaddleSlim | x2paddle |
---|---|
2.3.x | 1.3.8 |
develop / 2.4 | 1.3.9 |
选择(1)或(2)中一种方法准备数据即可。
-
(1)支持无标注图片,直接传入图片文件夹,但不支持评估模型mAP
修改config中
image_path
路径为真实预测场景下的图片文件夹,图片数量依据数据集大小来定,尽量覆盖所有部署场景。Global: image_path: dataset/coco/val2017
-
(2)支持加载COCO格式数据集,可支持实时评估模型mAP
可以从MS COCO官网下载Train、Val、annotation。
目录格式如下:
dataset/coco/ ├── annotations │ ├── instances_train2017.json │ ├── instances_val2017.json │ | ... ├── train2017 │ ├── 000000000009.jpg │ ├── 000000580008.jpg │ | ... ├── val2017 │ ├── 000000000139.jpg │ ├── 000000000285.jpg
如果是自定义数据集,请按照如上COCO数据格式准备数据。
准备好数据集后,修改config中
coco_dataset_dir
路径。Global: coco_dataset_dir: dataset/coco/ coco_train_image_dir: train2017 coco_train_anno_path: annotations/instances_train2017.json coco_val_image_dir: val2017 coco_val_anno_path: annotations/instances_val2017.json
(1)准备ONNX模型:
-
YOLOv5:
本示例模型使用ultralytics/yolov5的master分支导出,要求v6.1之后的ONNX模型,可以根据官方的导出教程来准备ONNX模型。也可以下载准备好的yolov5s.onnx。
python export.py --weights yolov5s.pt --include onnx
-
YOLOv6:
可通过meituan/YOLOv6官方的导出教程来准备ONNX模型。也可以下载已经准备好的yolov6s.onnx。
-
YOLOv7: 可通过WongKinYiu/yolov7的导出脚本来准备ONNX模型,具体步骤如下:
git clone https://github.com/WongKinYiu/yolov7.git python export.py --weights yolov7-tiny.pt --grid
注意:目前ACT支持不带NMS模型,使用如上命令导出即可。也可以直接下载我们已经准备好的yolov7.onnx。 将ONNX模型转换为Paddle模型,举例: 使用命令行将YOLOv6s.onnx转换为paddle模型
x2paddle --framework=onnx --model=yolov6s.onnx --save_dir=yolov6_model
蒸馏量化自动压缩示例通过run.py脚本启动,会使用接口paddleslim.auto_compression.AutoCompression
对模型进行自动压缩。配置config文件中模型路径、蒸馏、量化、和训练等部分的参数,配置完成后便可对模型进行量化和蒸馏。
本示例启动自动压缩以YOLOv7-Tiny为例,如果想要更换模型,可修改--config_path
路径即可,具体运行命令为:
- 单卡训练:
export CUDA_VISIBLE_DEVICES=0
python run.py --config_path=./configs/yolov7_tiny_qat_dis.yaml --save_dir='./yolov7-quantAware/'
- 多卡训练:
export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch --log_dir=log --gpus 0,1,2,3 run.py \
--config_path=./configs/yolov6s_qat_dis.yaml --save_dir='./yolov6s_quantaware/'
执行完自动压缩后会生成:
├── model.pdiparams # Paddle预测模型权重
├── model.pdmodel # Paddle预测模型文件
├── ONNX
│ ├── quant_model.onnx # 量化后转出的ONNX模型
│ ├── calibration.cache # TensorRT可以直接加载的校准表
量化模型在GPU上可以使用TensorRT进行加速,在CPU上可以使用MKLDNN进行加速。
以下字段用于配置预测参数:
参数名 | 含义 |
---|---|
model_path | inference 模型文件所在目录,该目录下需要有文件 model.pdmodel 和 model.pdiparams 两个文件 |
dataset_dir | eval时数据验证集路径, 默认dataset/coco |
image_file | 如果只测试单张图片效果,直接根据image_file指定图片路径 |
val_image_dir | COCO数据集中验证图像的目录名,默认为val2017 |
val_anno_path | 指定COCO数据集的注释(annotation)文件路径,这是包含验证集标注信息的JSON文件,默认为annotations/instances_val2017.json |
benchmark | 指定是否运行性能基准测试。如果设置为True,程序将会进行性能测试 |
device | 使用GPU或者CPU预测,可选CPU/GPU |
use_trt | 是否使用 TesorRT 预测引擎 |
use_mkldnn | 是否启用MKL-DNN 加速库,注意use_mkldnn 与use_gpu 同时为True 时,将忽略enable_mkldnn ,而使用GPU 预测 |
use_dynamic_shape | 是否使用动态形状(dynamic_shape)功能 |
cpu_threads | CPU预测时,使用CPU线程数量,默认10 |
precision | 预测精度,包括fp32/fp16/int8 |
arch | 指定所使用的模型架构的名称,例如YOLOv5 |
img_shape | 指定模型输入的图像尺寸 |
batch_size | 指定模型输入的批处理大小 |
Paddle-TensorRT Python部署:
首先安装带有TensorRT的Paddle安装包。
然后使用paddle_inference_eval.py进行部署:
- YOLOv5
python paddle_inference_eval.py \
--model_path==yolov5_model/inference_model \
--dataset_dir=/datasets/coco \
--use_trt=True \
--precision=fp32 \
--arch=YOLOv5
python paddle_inference_eval.py \
--model_path=yolov5s_quantaware \
--dataset_dir=/work/GETR-Lite-paddle-new/inference/datasets/coco \
--use_trt=True \
--precision=int8 \
--arch=YOLOv5
- MKLDNN预测:
python paddle_inference_eval.py \
--model_path=yolov5_model/inference_model \
--dataset_dir=/work/GETR-Lite-paddle-new/inference/datasets/coco \
--device=CPU \
--use_mkldnn=True \
--cpu_threads=10 \
--precision=fp32 \
--arch=YOLOv5
- 测试单张图片
python paddle_inference_eval.py --model_path=yolov5_model/inference_model --image_file=images/000000570688.jpg --use_trt=True --precision=fp32 --arch=YOLOv5
- C++部署
进入cpp_infer文件夹内,请按照C++ TensorRT Benchmark测试教程进行准备环境及编译,然后开始测试:
# 编译
bash compile.sh
# 执行
./build/trt_run --model_file yolov7-quantAware/model.pdmodel --params_file yolov7-quantAware/model.pdiparams --run_mode=trt_int8
-
如果想对模型进行离线量化,可进入YOLO系列模型离线量化示例中进行实验。
-
欢迎使用FastDeploy一键压缩及部署示例,支持丰富的预测后端,上手更简单。