第一次在QCS6490开发板上部署Yolov8n模型时,我踩了不少坑。这个高通平台虽然性能强劲,但模型转换和量化的步骤确实需要特别注意。下面我就把完整的实战经验分享给大家,手把手教你如何把Yolov8n模型从PyTorch格式一路转换到QNN量化模型,最终在QCS6490上跑起来。
整个过程可以分为几个关键步骤:首先是环境准备,包括Ubuntu开发机和QCS6490开发板的系统配置;然后是模型转换,从PyTorch到ONNX再到QNN格式;接着是最关键的量化环节,这一步直接影响最终模型的推理速度和精度;最后是模型编译和部署。每个环节都有需要注意的细节,比如量化策略的选择、输入数据的准备、编译参数的优化等。
在开始之前,我们需要准备好开发环境。我使用的是Ubuntu 20.04 x64作为开发机,QCS6490开发板刷的是Ubuntu 20.04 aarch64系统镜像。最关键的是要安装Qualcomm AI Engine Direct SDK,这个SDK提供了模型转换和量化的全套工具链。
安装SDK时有个小技巧:建议使用官方提供的安装脚本,但要注意检查系统依赖是否完整。我遇到过因为缺少某些库导致安装失败的情况,特别是OpenSSL和zlib这些基础库。安装完成后,记得设置环境变量QNN_SDK_ROOT,后续的工具调用都需要这个路径。
Yolov8n是Ultralytics推出的轻量级目标检测模型,在精度和速度之间取得了不错的平衡。我们可以直接从官方仓库下载预训练模型(yolov8n.pt),然后用下面的Python代码导出为ONNX格式:
python复制from ultralytics import YOLO
model = YOLO("yolov8n.pt")
path = model.export(format="onnx", dynamic=False, imgsz=640)
这里有几个关键参数需要注意:
导出ONNX后,建议用Netron工具检查模型结构,确认输入输出节点是否符合预期。这一步看似简单,但模型结构是否正确直接影响后续的转换和量化效果。
量化是模型部署中最关键的环节之一。Qualcomm的量化工具需要提供真实的输入数据来计算量化参数。对于Yolov8n模型,我们需要准备一批640x640大小的图片作为校准数据。
我建议准备至少100张多样化的图片,覆盖各种光照条件和场景。这些图片需要转换为模型期望的输入格式——归一化后的float32张量,并保存为.raw文件。下面是我常用的转换代码:
python复制import cv2
import numpy as np
def convert_to_raw(img_path, raw_path):
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (640, 640))
img = img.astype(np.float32) / 255.0
img.tofile(raw_path)
转换完成后,需要创建一个文本文件列出所有.raw文件的路径,这个文件将在量化时使用。
有了ONNX模型和校准数据,就可以使用Qualcomm的工具进行转换了。核心命令如下:
bash复制$QNN_SDK_ROOT/bin/x86_64-linux-clang/qnn-onnx-converter \
--input_network yolov8n.onnx \
--input_list yolov8n_raw_list.txt \
--output_path ./qnn/yolov8n_quant.cpp \
--quantization_overrides act.encodings
这里有几个关键点需要注意:
在我的测试中,Yolov8n的输出层对量化比较敏感,所以我为输出层单独指定了16位量化,其他层使用8位量化。这样可以保持较好的检测精度,同时获得不错的推理速度。
转换完成后,我们需要将生成的C++代码编译为QCS6490可用的库文件:
bash复制$QNN_SDK_ROOT/bin/x86_64-linux-clang/qnn-model-lib-generator \
-c ./qnn/yolov8n_quant.cpp \
-b ./qnn/yolov8n_quant.bin \
-o ./qnn_libs \
-t aarch64-ubuntu-gcc9.4
编译时需要注意目标平台的选择,QCS6490使用的是aarch64架构。编译完成后会生成libyolov8n_quant.so文件,这就是我们最终需要的模型库。
为了优化加载速度,我们可以将模型序列化为二进制文件:
bash复制$QNN_SDK_ROOT/bin/aarch64-ubuntu-gcc9.4/qnn-context-binary-generator \
--model ./libyolov8n_quant.so \
--backend libQnnHtp.so \
--binary_file yolov8n_quant
生成的yolov8n_quant.bin文件可以直接部署到QCS6490开发板上。在实际部署时,建议将模型文件和推理代码放在板子的/data分区,这个分区通常有更好的I/O性能。
部署完成后,我们需要评估模型的性能。我通常测量以下几个指标:
在QCS6490上,可以使用Qualcomm提供的性能分析工具来获取更详细的硬件指标,比如DSP利用率、内存带宽等。
在实际测试中,我遇到过几个典型的性能问题:
一个实用的调优技巧是使用QNN SDK的profiling功能,找出性能瓶颈所在。比如我发现Yolov8n的后处理部分在CPU上运行较慢,通过优化这部分代码,整体性能提升了约15%。
在QCS6490上部署Yolov8n模型时,有几个经验值得分享:
我在一个安防监控项目中实际应用了这套方案,最终在QCS6490上实现了约25FPS的实时目标检测性能,同时保持了不错的检测精度。整个过程虽然有些曲折,但积累的经验对后续的项目帮助很大。