高通 QNN 量化部署:从 YOLO 权重到 8295 推理评估
编写时间:2024-06
代码仓库:Plumess/yolov5-qnn
QNN 量化、推理、评估的工程链路,重点是从 YOLO 权重走到 8295 可评估产物。流程包括环境准备、ONNX 转换、QNN 量化、推理后处理和验证集评估。
总流程
项目结构
qnn/
├── onnx/ # pt 转 onnx 的产物
├── pt/<version>/weights/ # YOLOv5 权重
├── qnn_out/<version>/ # QNN 量化产物
├── qnn_proc/ # 推理和后处理脚本
├── scripts/ # export / raw / serialize 脚本
├── val/images # 验证图片
├── val/labels # 验证标签
├── infer.sh
├── quantity.sh
└── val.sh
QNN 流程截图 1

QNN 流程截图 2
环境搭建
QNN 环境搭建的关键步骤:
- 安装 Conda 或 Miniconda。
- 准备 Qualcomm AI Engine SDK 和 QPM。
- 配置
QNN_SDK_ROOT。 - 创建
qnnPython 环境。 - 安装 ONNX / ONNXRuntime / ONNX simplifier。
- 安装 PyTorch 和 YOLOv5 依赖。
- 执行 QNN SDK 自带的依赖检查。
环境变量只保留 SDK 根目录和版本占位:
export QNN_SDK_ROOT="/opt/qcom/aistack/qnn/<QIK_VERSION>"量化脚本关注点
quantity.sh 里通常只需要暴露少量变量:
MODEL_VERSION="0509"
ENABLE_8295_INFERENCE="false"
eval "$(~/anaconda3/bin/conda shell.bash hook)"量化校准图要能代表真实输入分布。校准集使用 200 张参考图,这个数量不是绝对标准,但至少比随便抽几张更稳。
qnn-onnx-converter 常用参数
| 参数 | 用途 |
|---|---|
--input_network | ONNX 模型路径 |
--input_dim | 指定输入尺寸 |
--input_list | 量化校准 raw 列表 |
--act_bitwidth | 激活量化位宽 |
--weights_bitwidth | 权重量化位宽 |
--use_per_channel_quantization | 权重逐通道量化 |
--algorithms cle | 跨层均衡等优化 |
示意命令:
qnn-onnx-converter \
--input_network ./onnx/<version>.onnx \
--input_dim images 1,3,512,960 \
--input_list ./input_raw.txt \
--act_bitwidth 8 \
--weights_bitwidth 8 \
--use_per_channel_quantization推理与评估
推理时要把原图转 RAW,QNN 得到中间输出后,再用 Python 脚本做 YOLO 后处理,保存 pred_labels,最后和 val/labels 对齐计算指标。
QNN 的难点不只是转换成功,而是量化后指标是否可接受、车端输入输出是否和训练一致、后处理 anchor/stride 是否同步。只要这三点有一个没对齐,量化模型的评估就会失真。