当前位置: 首页 > news >正文

高通跃龙QCS9100平台上工业缺陷检测实战(2): 安装 QAIRT/QNN,并把 ONNX 跑到 HTP/NPU

💡 前言

上一篇我们用 ONNXRuntime(CPU)把链路跑通了,这一步很关键:至少证明“摄像头/预处理/后处理/画框”都没问题。

在此基础上,本篇将完成两项工作:在 Host 端完成 QAIRT/QNN 环境搭建与模型转换,并在高通跃龙QCS9100平台设备端使用 HTP backend 跑通一次推理执行,得到稳定的输出结果。

接下来要做的事也很实在:把推理换到 QNN(最好是 HTP/NPU),让性能和稳定性上一个台阶。本文主要做三件事:

  • 在 Host(x86 Ubuntu 22.04)安装 QAIRT(Community)并完成依赖检查;
  • 把 ONNX 模型转换成 QNN 可运行的模型库(.so);
  • 在 Target 端(高通跃龙QCS9100平台Linux OS)用 HTP backend 跑通一次推理(先跑通,再谈优化)。

小提醒:QAIRT/QNN 不同版本的参数名/路径会有差异,所以本文把“先跑--help确认参数”当作必做步骤。照这个流程走,就能稳定落地。

1. 总体流程

Host (x86 Ubuntu 22.04)

  • 安装 QAIRT SDK
  • qnn-onnx-converter: ONNX → QNN 中间产物
  • qnn-model-lib-generator: 生成可在 Target (aarch64) 加载的模型库.so

Target (高通跃龙QCS9100平台Linux OS)

  • 拷贝 QNN runtime/backends 动态库 + 你的模型库
  • qnn-net-runqnn-sample-app先验证推理可执行

以下流程图更直观地展示了从 Host 环境搭建到 Target 端运行验证的完整流程:

2. Host 环境搭建 (QAIRT)

这里以公开可下载的 QAIRT Communityv2.37.1.250807为例。安装文档可参考(用于读者复现):Radxa QAIRT SDK Installation。

2.1 下载与解压

(实际版本号以你下载的版本为准)

unzipv2.37.1.250807.zipcdqairt/2.37.1.250807

2.2 配环境(这一步别漏)

sourcebin/envsetup.sh

2.3 依赖检查(下面三条都跑一遍)

sudo${QAIRT_SDK_ROOT}/bin/check-linux-dependency.sh${QAIRT_SDK_ROOT}/bin/envcheck-cpython3${QAIRT_SDK_ROOT}/bin/check-python-dependency

3. 模型准备

QNN 对模型形状/算子支持更敏感,按下面三步做完再进入转换:

3.1 固定输入 shape(必须做)

导出固定输入(例如1x3x640x640)。动态 shape 会显著增加转换与运行的不确定性,第一次跑通不要用动态 shape。

3.2 onnxsim 简化(本文流程固定使用简化后的模型)

pipinstallonnxsim python-monnxsim defect.onnx defect_simplified.onnx

3.3 记录输入/输出 tensor 名

后续喂输入/解析输出会用到:

python3-c"import onnx; m=onnx.load('defect_simplified.onnx'); print([i.name for i in m.graph.input]); print([o.name for o in m.graph.output])"

4. Host 转换与生成模型库

4.1 先看帮助(这是步骤的一部分)

qnn-onnx-converter--helpqnn-model-lib-generator--help

4.2 转换(示例形态)

参数名以你的版本为准,常见形态如下:

qnn-onnx-converter\--input_networkdefect_simplified.onnx\--output_pathbuild_qnn\--output_modeldefect

4.3 生成模型库(示例形态)

qnn-model-lib-generator\--model_cppbuild_qnn/defect.cpp\--model_binbuild_qnn/defect.bin\--output_dirbuild_qnn/lib\--target_archaarch64

最终你关心的是类似build_qnn/lib/libdefect.so的模型库文件(名称以实际输出为准)。

5. Target 部署

目录结构按下面放(第一次直接整包拷贝,跑通后再精简):

/opt/defectd/ |-- lib/ # libQnnHtp.so / libQnnSystem.so 以及依赖 |-- model/ # 你的 libdefect.so |-- inputs/ # input_list.txt 与 raw 输入 |-- outputs/

配置动态库路径:

exportLD_LIBRARY_PATH=/opt/defectd/lib:$LD_LIBRARY_PATH

6. Target 运行验证

6.1 用qnn-net-run验证

qnn-net-run--help

常见运行形态(以--help为准):

qnn-net-run\--backend/opt/defectd/lib/libQnnHtp.so\--model/opt/defectd/model/libdefect.so\--input_list/opt/defectd/inputs/input_list.txt\--output_dir/opt/defectd/outputs

6.2 用qnn-sample-app再验证一遍(后面做常驻会直接用它)

qnn-sample-appqnn-net-run类似,但它就是官方示例工程。后面(五)做 C++ 常驻服务的时候,我会直接基于它改,所以你现在提前跑通一下,后面会更顺。

qnn-sample-app--help

7. 常见问题

  • 板端缺依赖库:出现error while loading shared libraries
    处理:把 SDK 的aarch64/lib/目录先整包拷到/opt/defectd/lib/,跑通后再瘦身。

  • HTP backend 初始化失败
    处理:先用 CPU backend 跑通(验证模型/输入没问题),再排查 BSP/驱动/HTP 组件。

  • 转换失败(不支持算子/动态 shape)
    处理:固定输入 shape;使用 onnxsim;必要时换导出方式/降低 opset/替换模型结构。

  • 输出解析不一致
    处理:先用同一份输入 raw 对齐qnn-net-run与 ONNXRuntime 输出的基本分布;输出 shape/dtype 必须按实际读取。

📢下一篇介绍

**下一篇**在该基础上,把“能跑通”推进到“可长期运行”:实现采集、推理、输出三段解耦的流水线结构,并落地事件截图与结构化结果落盘/上报。

http://www.jsqmd.com/news/477997/

相关文章:

  • GTE文本向量-large效果实测:中文命名实体识别准确率超92%
  • 【AI+教育】我用OpenClaw栽了5次跟头后,总结出这10个避坑干货(新手直接抄)
  • STM32 RTC权限控制与写保护机制深度解析
  • 从“山”到“矩阵”:拆解蓝桥杯Java B组真题中的算法思维跃迁
  • C++ map 底层探秘:从结构设计到 operator [] 实现的全解析
  • yolov6安装使用
  • 无需配置环境!YOLO26官方镜像快速入门与实战演示
  • IDEA集成开发环境高效使用:调试调用万象熔炉·丹青幻境的Java应用
  • LobeChat零基础部署教程:5分钟搭建私人ChatGPT,小白也能轻松搞定
  • SpringBoot监听Redis Key过期事件
  • 华为云OBS实战配置:从基础创建到高级策略部署
  • 超4亿元!知识产权行业单笔最大融资落地
  • 重燃创作激情,Webnovel Writer助你轻松连载!
  • MVVM 架构demo
  • 单目结构光三维重建:MATLAB代码实现
  • 【软考】中级软件设计师 23年上半年真题深度解析:从综合知识到案例实战
  • GESP5级C++考试语法知识(四、高精度计算(一)加法和减法)
  • Linux下hadoop2.9.2单节点伪分布搭建完全教程
  • InstructPix2Pix应用全解析:从风景优化到人像精修,小白也能轻松上手
  • 垂直泊车(带Matlab可调参)
  • SEER‘S EYE 一键部署后,如何通过Git进行版本管理与协作开发
  • SQL 窗口函数 学习笔记
  • R提供了一些函数用于判断逻辑表达式的结果
  • C++面试总结(1)
  • MacBook + 台式机如何共享双屏?KVM切换器是终极答案|附TESmart全系对比推荐
  • 深入解析桥接模式:一个C++模板实现的通用桥接类库
  • 统信UOS 20 高效部署实战指南
  • 机械臂轨迹规划是机器人开发中的重头戏,今天咱们用Matlab的Robotics Toolbox带PUMA560走两步。先给机械臂充个电——初始化模型
  • 报错v-bind is missing expression
  • 局部遮阴光伏MPPT仿真:粒子群算法详解及视频解析