Skip to content

Latest commit

 

History

History

detection

目标检测模型自动压缩示例

目录:

1. 简介

本示例将以目标检测模型PP-YOLOE为例,介绍如何使用PaddleDetection中Inference部署模型进行自动压缩。本示例使用的自动压缩策略为量化蒸馏。

2.Benchmark

PP-YOLOE

模型 Base mAP 离线量化mAP ACT量化mAP TRT-FP32 TRT-FP16 TRT-INT8 配置文件 量化模型
PP-YOLOE-l 50.9 - 50.6 11.2ms 7.7ms 6.7ms config Model
PP-YOLOE-s 43.1 41.2 42.6 6.51ms 2.77ms 2.12ms config Model
PP-YOLOE+ s 43.7 - 42.7 - - - config Model
  • mAP的指标均在COCO val2017数据集中评测得到,IoU=0.5:0.95。
  • PP-YOLOE-l模型在Tesla V100的GPU环境下测试,并且开启TensorRT,batch_size=1,包含NMS,测试脚本是benchmark demo
  • PP-YOLOE-s模型在Tesla T4,TensorRT 8.4.1,CUDA 11.2,batch_size=1,不包含NMS,测试脚本是cpp_infer_ppyoloe

YOLOv8

模型 Base mAP 离线量化mAP ACT量化mAP TRT-FP32 TRT-FP16 TRT-INT8 配置文件 量化模型
YOLOv8-s 44.9 43.9 44.3 9.27ms 4.65ms 3.78ms config Model

注意:

  • 表格中YOLOv8模型均为带NMS的模型,可直接在TRT中部署,如果需要对齐测试标准,需要测试不带NMS的模型。
  • mAP的指标均在COCO val2017数据集中评测得到,IoU=0.5:0.95。
  • 表格中的性能在Tesla T4的GPU环境下测试,并且开启TensorRT,batch_size=1。

SSD on Pascal VOC

模型 Box AP ACT量化Box AP TRT-FP32 TRT-INT8 配置文件 量化模型
SSD-MobileNetv1 73.8 73.52 4.0ms 1.7ms config Model
  • 测速环境:Tesla T4,TensorRT 8.4.1,CUDA 11.2,batch_size=1,包含NMS.

RT-DETR

模型 Base mAP 离线量化mAP ACT量化mAP TRT-FP32 TRT-FP16 TRT-INT8 配置文件 量化模型
RT-DETR-R50 53.1 52.9 53.0 32.05ms 9.12ms 6.96ms config Model
RT-DETR-R101 54.3 - 54.1 54.13ms 12.68ms 9.20ms config Model
RT-DETR-HGNetv2-L 53.0 - 52.9 26.16ms 8.54ms 6.65ms config Model
RT-DETR-HGNetv2-X 54.8 - 54.6 49.22ms 12.50ms 9.24ms config Model
  • 上表测试环境:Tesla T4,TensorRT 8.6.0,CUDA 11.7,batch_size=1。
模型 Base mAP 离线量化mAP ACT量化mAP TRT-FP32 TRT-FP16 TRT-INT8 配置文件 量化模型
RT-DETR-R50 53.1 52.9 53.0 9.64ms 5.00ms 3.99ms config Model
RT-DETR-R101 54.3 - 54.1 14.93ms 7.15ms 5.12ms config Model
RT-DETR-HGNetv2-L 53.0 - 52.9 8.17ms 4.77ms 4.00ms config Model
RT-DETR-HGNetv2-X 54.8 - 54.6 12.81ms 6.97ms 5.32ms config Model
  • 上表测试环境:A10,TensorRT 8.6.0,CUDA 11.6,batch_size=1。
  • mAP的指标均在COCO val2017数据集中评测得到,IoU=0.5:0.95。
  • 两个表中的离线量化只量化模型中的conv2d,ACT量化模型中的conv2d和matmul。

3. 自动压缩流程

3.1 准备环境

  • PaddlePaddle >= 2.4 (可从Paddle官网下载安装)
  • PaddleSlim >= 2.4
  • PaddleDet >= 2.4
  • opencv-python

安装paddlepaddle:

# CPU
python -m pip install paddlepaddle==2.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
#GPU 以ubuntu、CUDA11.6为例
python -m pip install paddlepaddle-gpu==2.6.0.post116 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html

安装paddleslim:

pip install paddleslim

源码安装(推荐):

git clone -b release/2.6 https://github.com/PaddlePaddle/PaddleSlim.git & cd PaddleSlim
python setup.py install

安装paddledet:

pip install paddledet

注:安装PaddleDet的目的是为了直接使用PaddleDetection中的Dataloader组件。

3.2 准备数据集

本案例默认以COCO数据进行自动压缩实验,如果自定义COCO数据,或者其他格式数据,请参考PaddleDetection数据准备文档 来准备数据。

如果数据集为非COCO格式数据,请修改configs中reader配置文件中的Dataset字段。

以PP-YOLOE模型为例,如果已经准备好数据集,请直接修改[./configs/yolo_reader.yml]中EvalDatasetTrainDataset'的dataset_dir`字段为自己数据集路径即可。

3.3 准备预测模型

预测模型的格式为:model.pdmodelmodel.pdiparams两个,带pdmodel的是模型文件,带pdiparams后缀的是权重文件。

注:其他像__model____params__分别对应model.pdmodelmodel.pdiparams文件。

根据PaddleDetection文档 导出Inference模型,具体可参考下方PP-YOLOE模型的导出示例:

  • 下载代码
git clone -b release/2.6 https://github.com/PaddlePaddle/PaddleDetection.git
  • 导出预测模型
  • 当你使用Paddle Inference但不使用TensorRT时,运行以下命令导出模型(不包含NMS)
python tools/export_model.py \
        -c configs/ppyoloe/ppyoloe_crn_s_300e_coco.yml \
        -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_s_300e_coco.pdparams \
        exclude_post_process=True \

PPYOLOE-l模型,包含NMS:如快速体验,可直接下载PP-YOLOE-l导出模型

python tools/export_model.py \
        -c configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml \
        -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams \
        trt=True \

PPYOLOE-s模型,不包含NMS:如快速体验,可直接下载PP-YOLOE-s导出模型

python tools/export_model.py \
        -c configs/ppyoloe/ppyoloe_crn_s_300e_coco.yml \
        -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_s_300e_coco.pdparams \
        trt=True exclude_post_process=True \

YOLOv8-s模型,包含NMS,具体可参考YOLOv8模型文档, 然后执行:

python tools/export_model.py \
        -c configs/yolov8/yolov8_s_500e_coco.yml \
        -o weights=https://paddledet.bj.bcebos.com/models/yolov8_s_500e_coco.pdparams \
        trt=True

如快速体验,可直接下载YOLOv8-s导出模型

3.4 自动压缩并产出模型

蒸馏量化自动压缩示例通过run.py脚本启动,会使用接口paddleslim.auto_compression.AutoCompression对模型进行自动压缩。配置config文件中模型路径、蒸馏、量化、和训练等部分的参数,配置完成后便可对模型进行量化和蒸馏。具体运行命令为: 注意!!!,ppyoloe_s_qat_dis.yaml中属性include_nms,它默认为False,如果你导出的模型有nms,则将它修改为True。

  • 单卡训练:
export CUDA_VISIBLE_DEVICES=0
python run.py --config_path=./configs/ppyoloe_l_qat_dis.yaml --save_dir='./output/'
  • 多卡训练:
export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch run.py --save_dir='./rtdetr_hgnetv2_l_6x_coco_quant' --config_path=./configs/rtdetr_hgnetv2_l_qat_dis.yaml

4.预测部署

4.1 Paddle Inference 验证性能

量化模型在GPU上可以使用TensorRT进行加速,在CPU上可以使用MKLDNN进行加速。

以下字段用于配置预测参数:

参数名 含义
model_path inference 模型文件所在目录,该目录下需要有文件 model.pdmodel 和 model.pdiparams 两个文件
reader_config eval时模型reader的配置文件路径
image_file 如果只测试单张图片效果,直接根据image_file指定图片路径
device 使用GPU或者CPU预测,可选CPU/GPU
use_trt 是否使用 TesorRT 预测引擎
use_mkldnn 是否启用MKL-DNN加速库,注意use_mkldnnuse_gpu同时为True时,将忽略enable_mkldnn,而使用GPU预测
cpu_threads CPU预测时,使用CPU线程数量,默认10
precision 预测精度,包括fp32/fp16/int8
include_nms 是否包含nms,如果不包含nms,则设置False,如果包含nms,则设置为True
use_dynamic_shape 是否使用动态shape,如果使用动态shape,则设置为True,否则设置为False
image_shape 输入图片的大小。这里默认为640,意味着图像将被调整到640*640
trt_calib_mode 如果模型是通过TensorRT离线量化校准生成的,那么需要将此参数设置为True。
  • TensorRT预测:

环境配置:如果使用 TesorRT 预测引擎,需安装 WITH_TRT=ON 的Paddle,下载地址:Python预测库 带NMS的

python paddle_inference_eval.py \
    --model_path=ppyoloe_crn_s_300e_coco \
    --reader_config=configs/yolo_reader.yml \
    --use_trt=True \
    --precision=fp16 \
    --include_nms=True \
    --benchmark=True

不带NMS的

python paddle_inference_eval.py \
    --model_path=ppyoloe_crn_l_300e_coco \
    --reader_config=configs/yolo_reader.yml \
    --use_trt=True \
    --precision=fp16 \
    --include_nms=False \
    --benchmark=True
  • 原生GPU预测:
python paddle_inference_eval.py \
    --model_path=ppyoloe_crn_s_300e_coco \
    --reader_config=configs/yolo_reader.yml \
    --device=GPU \
    --precision=fp16 \
    --include_nms=True \
    --benchmark=True
  • MKLDNN预测:
python paddle_inference_eval.py \
      --model_path=models/ppyoloe_crn_l_300e_coco_quant \
      --reader_config=configs/yoloe_reader.yml \
      --device=CPU \
      --use_mkldnn=True \
      --cpu_threads=10 \
      --precision=int8

5.FAQ