目录:
本示例将以ultralytics/yolov5,meituan/YOLOv6 和 WongKinYiu/yolov7 YOLO系列目标检测模型为例,将PyTorch框架产出的推理模型转换为Paddle推理模型,使用离线量化功能进行压缩,并使用敏感度分析功能提升离线量化精度。离线量化产出的模型可以用PaddleInference部署,也可以导出为ONNX格式模型文件,并用TensorRT部署。
模型 | 策略 | 输入尺寸 | mAPval 0.5:0.95 |
预测时延FP32 (ms) |
预测时延FP16 (ms) |
预测时延INT8 (ms) |
配置文件 | Inference模型 |
---|---|---|---|---|---|---|---|---|
YOLOv5s | Base模型 | 640*640 | 37.4 | 5.95ms | 2.44ms | - | - | Model |
YOLOv5s | KL离线量化 | 640*640 | 36.0 | - | - | 1.87ms | - | - |
YOLOv6s | Base模型 | 640*640 | 42.4 | 9.06ms | 2.90ms | - | - | Model |
YOLOv6s | KL离线量化(量化分析前) | 640*640 | 30.3 | - | - | 1.83ms | - | - |
YOLOv6s | KL离线量化(量化分析后) | 640*640 | 39.7 | - | - | - | - | Infer Model |
YOLOv7 | Base模型 | 640*640 | 51.1 | 26.84ms | 7.44ms | - | - | Model |
YOLOv7 | KL离线量化 | 640*640 | 50.2 | - | - | 4.55ms | - | - |
说明:
- mAP的指标均在COCO val2017数据集中评测得到。
- PaddlePaddle >= 2.3 (可从Paddle官网下载安装)
- PaddleSlim > 2.3版本
- opencv-python
(1)安装paddlepaddle:
# CPU
pip install paddlepaddle
# GPU
pip install paddlepaddle-gpu
(2)安装paddleslim:
pip install paddleslim
本示例默认以COCO数据进行自动压缩实验,可以从 MS COCO官网 下载 Train、Val、annotation。
目录格式如下:
dataset/coco/
├── annotations
│ ├── instances_train2017.json
│ ├── instances_val2017.json
│ | ...
├── train2017
│ ├── 000000000009.jpg
│ ├── 000000580008.jpg
│ | ...
├── val2017
│ ├── 000000000139.jpg
│ ├── 000000000285.jpg
(1)准备ONNX模型:
-
YOLOv5:可通过ultralytics/yolov5 官方的导出教程来准备ONNX模型,也可以下载准备好的yolov5s.onnx。
-
YOLOv6:可通过meituan/YOLOv6官方的导出教程来准备ONNX模型,也可以下载已经准备好的yolov6s.onnx。
-
YOLOv7:可通过WongKinYiu/yolov7的导出脚本来准备ONNX模型,也可以直接下载我们已经准备好的yolov7.onnx。
离线量化示例通过post_quant.py脚本启动,会使用接口paddleslim.quant.quant_post_static
对模型进行量化。配置config文件中模型路径、数据路径和量化相关的参数,配置完成后便可对模型进行离线量化。具体运行命令为:
- YOLOv5
python post_quant.py --config_path=./configs/yolov5s_ptq.yaml --save_dir=./yolov5s_ptq_out
- YOLOv6
python post_quant.py --config_path=./configs/yolov6s_ptq.yaml --save_dir=./yolov6s_ptq_out
- YOLOv7
python post_quant.py --config_path=./configs/yolov7s_ptq.yaml --save_dir=./yolov7s_ptq_out
修改 yolov5s_ptq.yaml 中model_dir
字段为模型存储路径,然后使用eval.py脚本得到模型的mAP:
export CUDA_VISIBLE_DEVICES=0
python eval.py --config_path=./configs/yolov5s_ptq.yaml
本节介绍如何使用量化分析工具提升离线量化精度。离线量化功能仅需使用少量数据,且使用简单、能快速得到量化模型,但往往会造成较大的精度损失。PaddleSlim提供量化分析工具,会使用接口paddleslim.quant.AnalysisQuant
,可视化展示出不适合量化的层,通过跳过这些层,提高离线量化模型精度。
由于YOLOv6离线量化效果较差,以YOLOv6为例,量化分析工具具体使用方法如下:
python analysis.py --config_path=./configs/yolov6s_analysis.yaml
如下图,经过量化分析之后,可以发现conv2d_2.w_0
, conv2d_11.w_0
,conv2d_15.w_0
, conv2d_46.w_0
, conv2d_49.w_0
这些层会导致较大的精度损失。
对比权重直方分布图后,可以发现量化损失较小的层数值分布相对平稳,数值处于-0.25到0.25之间,而量化损失较大的层数值分布非常极端,绝大部分值趋近于0,且数值处于-0.1到0.1之间,尽管看上去都是正太分布,但大量值为0是不利于量化统计scale值的。
经此分析,在进行离线量化时,可以跳过这些导致精度下降较多的层,可使用 yolov6s_analyzed_ptq.yaml,然后再次进行离线量化。跳过这些层后,离线量化精度上升9.4个点。
python post_quant.py --config_path=./configs/yolov6s_analyzed_ptq.yaml --save_dir=./yolov6s_analyzed_ptq_out
预测部署可参考YOLO系列模型自动压缩示例
- 如果想对模型进行自动压缩,可进入YOLO系列模型自动压缩示例中进行实验。