一、剪枝工具选型与操作步骤
1. 工具选型(二选一)
TorchPrune:适合新手,支持自动化剪枝,与 PyTorch 生态兼容
YOLOv8 自带剪枝工具:需修改源码,灵活性更高,适配 YOLO 系列模型
2. 剪枝实操步骤
(1)数据准备
# 整理数据集(需符合YOLO格式)
python utils/dataset_prepare.py --data_dir ./data --output_dir ./prune_data
(2)剪枝训练(以 TorchPrune 为例)
from torchprune import Pruner
from ultralytics import YOLO
# 加载预训练YOLOv8模型
model = YOLO('yolov8s.pt')
# 初始化剪枝器(剪枝比例0.5,保留核心通道)
pruner = Pruner(model, pruning_ratio=0.5, mode='channel')
# 剪枝训练(50轮,学习率0.001)
pruner.train(data='prune_data/data.yaml', epochs=50, lr0=0.001)
# 保存剪枝后模型
pruner.save_model('./pruned_yolov8s.pt')
(3)模型验证
# 验证剪枝后模型精度(IOU≥0.5)
python val.py --weights ./pruned_yolov8s.pt --data ./prune_data/data.yaml --iou 0.5
二、量化步骤(INT8/FP16)
1. 量化方式选择
PTQ(Post-Training Quantization):无需重新训练,适合快速部署(精度损失≤3%)
QAT(Quantization-Aware Training):需微调训练,精度更高(推荐边缘低算力场景)
2. PTQ 量化实操(以 Ultralytics 库为例)
# 1. 导出ONNX模型(量化前需先转ONNX)
yolo export model=pruned_yolov8s.pt format=onnx imgsz=320
# 2. INT8量化(使用ONNX Runtime工具)
python -m onnxruntime.quantization.quantize \
--input pruned_yolov8s.onnx \
--output quantized_yolov8s_int8.onnx \
--quant_format QDQ \
--per_channel_quantization \
--calibration_data ./prune_data/calib_data.txt \ # 校准数据集(100-200张图)
--calibration_method minmax
3. QAT 量化关键命令
# 加载剪枝模型进行QAT训练
yolo train model=pruned_yolov8s.pt data=prune_data/data.yaml \
epochs=30 lr0=0.0005 quantize=int8 # 启用INT8量化训练
# 导出QAT量化模型
yolo export model=runs/detect/train/weights/best.pt format=onnx quantize=int8
三、推理引擎配置要点
1. TensorRT(GPU 边缘设备,如 NVIDIA Jetson)
(1)模型转换
# 1. 安装TensorRT(需匹配CUDA版本)
pip install tensorrt==8.6.1
# 2. ONNX转TRT
trtexec --onnx=quantized_yolov8s_int8.onnx \
--saveEngine=yolov8s_trt.engine \
--fp16 # 启用FP16加速(比INT8快15%,精度损失小)
(2)推理优化
启用maxBatchSize=1(边缘实时检测场景)
配置workspaceSize=4096(内存充足时可增大)
2. OpenVINO(CPU 边缘设备,如 Intel Atom)
(1)模型转换
# 1. 安装OpenVINO
pip install openvino-dev==2023.2
# 2. ONNX转IR格式
mo --input_model quantized_yolov8s_int8.onnx \
--output_dir ./openvino_model \
--data_type FP16 \
--mean_values [123.675,116.28,103.939] # 图像归一化
(2)推理配置
from openvino.runtime import Core
# 加载模型
core = Core()
model = core.read_model(model='./openvino_model/quantized_yolov8s_int8.xml')
compiled_model = core.compile_model(model=model, device_name='CPU')
# 启用CPU优化
compiled_model.set_property("CPU_THREADS_NUM", "4") # 匹配CPU核心数
compiled_model.set_property("CPU_BIND_THREAD", "YES")
3. MNN(多硬件适配,如 ARM 架构开发板)
(1)模型转换
# 1. 安装MNN转换工具
pip install MNN==2.6.1
# 2. ONNX转MNN
mnnconvert -f ONNX --modelFile quantized_yolov8s_int8.onnx \
--MNNModel yolov8s_mnn.mnn \
--fp16 True
(2)推理优化
启用memoryReuse=true(减少内存占用 30%)
配置numThread=2(根据 CPU 核心数调整)
需求留言: