Qualcomm QNN INT8 量化部署:DMS 模型 Snapdragon NPU 加速指南

Qualcomm QNN INT8 量化部署:DMS 模型 Snapdragon NPU 加速指南

核心要点

Ultralytics 官方支持 QNN 导出:

  • 本地编译:无需云端、无需 Qualcomm 账号
  • INT8 权重 + 16-bit 激活:Hexagon NPU 最优配置
  • 性能提升:NPU 比 CPU 快 3-4倍
  • 广泛覆盖:Snapdragon 8 Gen 2/3/Elite、X Elite
  • 一键导出:model.export(format=”qnn”)

QNN vs 传统部署方案对比

方案 硬件加速 云端依赖 账号要求 性能
QNN 本地导出 ✅ NPU/GPU/CPU ❌ 无 ❌ 无
Qualcomm AI Hub ✅ NPU ✅ 需要 ✅ 需要
SNPE(旧方案) ✅ NPU ❌ 无 ❌ 无
TFLite CPU ❌ 仅CPU ❌ 无 ❌ 无

Hexagon NPU 性能实测

Android 手机(Xiaomi 17,Snapdragon 8 Elite Gen 5)

模型 任务 CPU INT8 GPU INT8 NPU QNN 加速比
YOLO26n 检测 53.3ms 17.2ms 11.3ms 4.7x
YOLO26n-seg 分割 76.0ms 23.9ms 21.3ms 3.6x
YOLO26n-pose 姿态 57.7ms 15.2ms 10.8ms 5.3x
YOLO26n-cls 分类 5.2ms 4.5ms 2.4ms 2.2x

Windows on Snapdragon(Snapdragon X Elite)

模型 CPU PyTorch FP32 NPU QNN INT8 加速比
YOLO26n 检测 91.4ms 27.2ms 3.4x
YOLO26n-pose 109.6ms 28.9ms 3.8x
YOLO26n-seg 138.8ms 34.3ms 4.0x

QNN 导出详解

1. 支持的 HTP 架构

name Hexagon HTP Snapdragon 平台
68 v68 Snapdragon 888
69 v69 Snapdragon 8 Gen 1
73 v73 Snapdragon 8 Gen 2, X Elite(默认)
75 v75 Snapdragon 8 Gen 3
79 v79 Snapdragon 8 Elite
81 v81 Snapdragon 8 Elite Gen 5

2. 一键导出代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
"""
YOLO DMS 模型导出到 Qualcomm QNN 格式

核心流程:
1. 加载 YOLO 模型
2. 导出为 ONNX
3. 量化为 INT8 权重 + 16-bit 激活
4. 编译为 QNN context binary
5. 输出 *_qnn.onnx 文件
"""

from ultralytics import YOLO

# 加载 YOLO 模型
model = YOLO("yolo26n.pt")

# 导出为 QNN 格式(INT8 量化自动启用)
# name 参数指定目标 HTP 架构
model.export(
format="qnn",
name="73", # Snapdragon 8 Gen 2 / X Elite
imgsz=640,
data="coco8.yaml", # 校准数据集
fraction=0.5, # 使用50%数据校准
)

# 输出文件:yolo26n_qnn.onnx

3. DMS 模型导出示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"""
DMS 人脸关键点检测模型导出

模型:YOLO26n-pose(人脸关键点)
"""

from ultralytics import YOLO

# 加载 DMS 人脸关键点模型
dms_model = YOLO("yolo26n-pose.pt")

# 导出为 QNN(目标 QCS8255 平台)
dms_model.export(
format="qnn",
name="75", # Snapdragon 8 Gen 3(QCS8255 同代)
imgsz=640,
data="widerface.yaml", # 人脸数据集校准
)

# 输出:yolo26n-pose_qnn.onnx
# 可直接部署到 QCS8255 Hexagon NPU

QNN 部署到 Snapdragon 设备

1. Python API 推理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"""
在 Snapdragon 设备上运行 QNN 模型

前提条件:
- 安装 onnxruntime-qnn
- Snapdragon 设备(手机/开发板/笔记本)
"""

from ultralytics import YOLO

# 加载 QNN 模型
model = YOLO("yolo26n_qnn.onnx")

# 运行推理(自动使用 Hexagon NPU)
results = model("driver_image.jpg")

# 结果解析
for result in results:
# 边界框
boxes = result.boxes
for box in boxes:
x1, y1, x2, y2 = box.xyxy[0]
confidence = box.conf[0]
class_id = box.cls[0]
print(f"检测: ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f}), 置信度: {confidence:.2f}")

2. ONNX Runtime 直接调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
"""
使用 ONNX Runtime QNN Execution Provider 直接推理

适用于自定义推理管道
"""

import onnxruntime as ort
import onnxruntime_qnn as qnn_ep
import numpy as np

# 注册 QNN Execution Provider
ort.register_execution_provider_library(
"QNNExecutionProvider",
qnn_ep.get_library_path()
)

# 获取 QNN 设备
devices = [d for d in ort.get_ep_devices() if d.ep_name == "QNNExecutionProvider"]

# 创建会话选项
options = ort.SessionOptions()
options.add_provider_for_devices(devices, {
"backend_path": qnn_ep.get_qnn_htp_path() # 使用 Hexagon NPU
})

# 加载模型
session = ort.InferenceSession("yolo26n_qnn.onnx", sess_options=options)

# 准备输入(float32 NCHW)
input_tensor = np.random.randn(1, 3, 640, 640).astype(np.float32)

# 运行推理
outputs = session.run(None, {"images": input_tensor})

print(f"输出形状: {outputs[0].shape}")

INT8 量化精度影响

量化配置

配置 权重精度 激活精度 推荐场景
w8a16 INT8 16-bit float Hexagon NPU 默认
w8a8 INT8 INT8 极致性能(精度损失大)
w4a16 INT4 16-bit float 大模型压缩

精度损失评估

模型 FP32 mAP INT8 w8a16 mAP 损失
YOLO26n 37.5% 36.8% -0.7%
YOLO26n-pose 75.2% 74.6% -0.6%
YOLO26n-seg 32.8% 32.1% -0.7%

结论:INT8 权重 + 16-bit 激活量化精度损失 <1%,可接受。


DMS 部署到 QCS8255 实战

1. QCS8255 规格参数

参数
NPU Hexagon v75(同 8 Gen 3)
NPU TOPS 26 TOPS(INT8)
内存 8-16GB
功耗 <5W(AI推理)
支持框架 QNN, TFLite, ONNX Runtime

2. 部署流程

1
2
3
4
5
6
7
8
9
10
# 1. 在开发机上导出模型(x86 Linux)
python3 export_dms.py # 生成 dms_qnn.onnx

# 2. 推送到 QCS8255 开发板
adb push dms_qnn.onnx /data/local/tmp/

# 3. 在 QCS8255 上运行推理
adb shell
cd /data/local/tmp
python3 run_dms.py --model dms_qnn.onnx --source test_video.mp4

3. 性能优化建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"""
QCS8255 性能优化配置
"""

# 1. 批处理优化(提高吞吐量)
model.export(format="qnn", batch=4) # 批处理4帧

# 2. 输入分辨率优化(平衡精度/速度)
model.export(format="qnn", imgsz=480) # 降低分辨率

# 3. 校准数据优化(提高量化精度)
model.export(
format="qnn",
data="dms_calibration.yaml", # DMS 专用校准集
fraction=1.0 # 使用全部数据校准
)

常见问题 FAQ

Q1:QNN 导出需要 Snapdragon 设备吗?

答:不需要。 导出在 x86 主机上完成,使用 onnxruntime-qnn 本地编译 context binary。只需在推理时需要 Snapdragon 设备。

Q2:QNN 与 Qualcomm AI Hub 有什么区别?

对比项 QNN 本地导出 Qualcomm AI Hub
账号要求 ❌ 无 ✅ 需要
云端依赖 ❌ 无 ✅ 需要
编译速度 快(本地) 慢(排队)
功能 编译 编译+性能分析

Q3:INT8 量化精度损失如何?

答:INT8 权重 + 16-bit 激活配置下,精度损失通常 <1%,可接受。


数据来源


IMS 开发启示

  1. QNN 本地导出是最优方案: 无需云端、无需账号、编译速度快
  2. INT8 权重 + 16-bit 激活是最佳配置: 精度损失 <1%,性能提升 3-4倍
  3. QCS8255 部署优先选择 QNN: 原生支持 Hexagon v75 NPU
  4. 校准数据重要: 使用 DMS 专用数据集校准可提高量化精度
  5. 批处理优化吞吐量: 批处理4帧可提高 2-3倍吞吐量

总结: Qualcomm QNN 提供了本地编译、无需云端的 Snapdragon NPU 部署方案。INT8 权重 + 16-bit 激活量化配置在精度损失 <1%的情况下,性能提升 3-4倍。IMS 开发应优先采用 QNN 方案部署到 QCS8255 等车载芯片,使用 DMS 专用校准数据集优化量化精度,并考虑批处理优化吞吐量。Ultralytics 官方支持一键导出,极大降低了部署门槛。


Qualcomm QNN INT8 量化部署:DMS 模型 Snapdragon NPU 加速指南
https://dapalm.com/2026/07/10/2026-07-10-qualcomm-qnn-int8-quantization-dms-snapdragon-npu-deployment/
作者
Mars
发布于
2026年7月10日
许可协议