探索QCS6490目标检测AI应用开发(一):Yolov8n模型转换及量化

目标检测(Object Detection)是计算机视觉领域的核心任务之一,它旨在识别图像中的物体并确定其位置,在本期的文章中,我们用一个端到端的目标检测AI应用为例子。介绍如何在QCS6490 Ubuntu系统上实现一个目标检测应用开发,我们选择Yolov8n模型作为目标检测的模型,以摄像头的实时预览的视频流为输入,最终将检测到结果会更新到视频画面帧并且显示出来。对于这样一个任务,涉及到几个关键的流程:

  1. Yolov8n模型的转换和量化
  2. 摄像头视频的拉取和解码,结果的实时显示
  3. Yolov8n模型的推理

本期的系列文章将会针对这3个步骤展开,在这个例子中,我们选择C++作为开发语言,但是文章的重点更多是关注在整体的流程和操作部署,而避免陷入太多的代码实现中

  1. Yolov8n模型的转换及量化

YOLOv8n 是 YOLOv8 系列的一个变体,它是由 Ultralytics 开发的最新一代目标检测模型,在精度和速度都有不错的表现。

1.1前置环境要求

Ubuntu 20.04 x64 机器

QCS6490 开发板

  1. 在Ubuntu 20.04 x64上安装 Qualcomm AI Engine Direct SDK

软件包的安装说明和下载地址可以在以下链接获得

https://www.qualcomm.com/developer/software/qualcomm-ai-engine-direct-sdk

     2.QCS6490 开发板安装的是Ubuntu 20.04 arch64的系统镜像

1.2 导出onnx模型

下载Yolov8n的预训练模型

https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt

使用下面的python脚本把模型转换成onnx模型

from ultralytics import YOLOmodel = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)
path = model.export(format="onnx")  # export the model to ONNX format
print(path)

1.3 准备模型量化的数据

Qualcomm AI Engine Direct SDK提供了工具能够非常的完成模型的转换和量化工作。但是在模型量化之前,需要准备2个实际输入的测试数据

由于Yolov8n预训练的权重文件输入shape是 [1,640,640,3] NHWC的张量,所以我们也需要准备一些准备640x640大小的图片,并且把图片转换成float类型的张量,参考下面的python代码片段

Src是输入图片的路径

Dst是输出的目录

def convert_img_to_raw(src, dst, size,resize_type):img=cv2.imread(src)   cv2.imwrite(dst,img)input_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)input_img = input_img / 255.0raw_np = input_img[np.newaxis, :, :, :].astype(np.float32)#img_filepath = os.path.abspath(dst)filename, ext = os.path.splitext(dst)raw_filename = filenameraw_filename += '.raw'raw_np.tofile(raw_filename)print("save raw file to:",raw_filename)return 0

例如 把输入src 为 “/data/test01.jpg” dst 路径为 “/data/raw” 最后得到  /data//raw/test01.raw

创建文本yolov8n_raw_list.txt

内容为

/data/raw/test01.raw

​​​​​​​1.4 把Yolov8n的onnx模型转换为高通QNN格式

请确认步骤1.1中的环境已经安装完成,执行模型转换命令

参考文档 Qualcomm Documentation

先使用qnn-onnx-converter工具把onnx模型转换为量化并转换为QNN的中间文件

$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

act.encodings 是一个json格式的文本文件,内容如下

{"activation_encodings": {"/model.22/Sigmoid_output_0": [{"bitwidth": 16,"dtype": "int","is_symmetric": "False","max": 0.996093750000,"min": 0.0,"offset": 0,"scale": 0.00001519941634}],"output0":[{"bitwidth": 16,"dtype": "int","is_symmetric": "False","max": 643.878662109375,"min": 0.0,"offset": 0,"scale": 0.00982495860394255}]},"param_encodings": {}
}

​​​​​​​1.5 编译QNN生成的代码

使用 qnn-model-lib-generator  工具编译QNN生成的cpp代码

$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

最后在./qnn_libs/aarch64-ubuntu-gcc9.4文件夹下面得到libyolov8n_quant.so 文件到这一步我们完成了把Yolov8的模型文件转换成QNN格式的libyolov8n_quant.so文件

​​​​​​​1.6 拷贝so文件到QCS6490的开发板

我们把1.5编译QNN生成的代码 中生成的libyolov8n_quant.so文件拷贝的QCS6490的开发板上,同样的QCS6490也需要安装Qualcomm AI Engine Direct SDK 

接下来我们做个图预编译的动作,把libyolov8n_quant.so序列化 为yolov8n_quant.bin文件

$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 整个模型转换步骤完成

作者:Ricky Li

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 5 章理解 ScrollView 并构建 Carousel UI

通过上一章的学习,我相信你现在应该明白如何使用堆栈构建复杂的 UI。当然,在你掌握 SwiftUI 之前,你还需要大量的练习。因此,在深入研究 ScrollView 以使视图可滚动之前,让我们先以一个挑战开始本章。你的任务是创建一个类似于图 1 所示的卡片视图。 …

如何迁移R包

迁移R包涉及将一个或多个R包从一个系统转移到另一个系统。以下是迁移R包的详细步骤: 1. 确定要迁移的R包 首先,列出你在当前系统中安装的所有R包,或仅列出你需要迁移的R包。你可以使用以下代码列出所有安装的R包: installed_pa…

swp添加池子addLiquidity失败

案发现场 首次添加交易对、一直失败、但是也没提示具体的原因。到这一步就没了、由下图可知、也没看到log、由此可见第一步就失败了。 解决方案 一、添加 工厂KywFactory 添加如下 bytes32 public constant INIT_CODE_PAIR_HASH keccak256(abi.encodePacked(type(KywPair…

移植对话框MFC

VC版 MFC程序对话框资源移植 以下均拷贝自上面,仅用来记录 (部分有删除) 法1: Eg:将B工程调试好的对话框移植到A工程中 1.资源移植 1.1 在2017打开B工程,在工作区Resource标签页中选中Dialog文件夹下的资源文件,按…

注意!短视频的致命误区,云微客教你避开!

为什么你做短视频就是干不过同行?因为你总想着拍剧情、段子这些娱乐视频,还想着当网红做IP人设,但是这些内容跟你的盈利没有半毛钱关系,况且难度大、见效慢,还不是精准客户。 以上这些就代表你走进了短视频的误区&…

C++初学者指南-2.输入和输出---流输入和输出

C初学者指南-2.输入和输出—流输入和输出 文章目录 C初学者指南-2.输入和输出---流输入和输出1.定制输入/输出1.1 示例:点坐标输入/输出1.2 流操作符1.3(一部分)标准库流类型 2. 工具2.1 用getline读取行 2.2 用ignore进行跳转2.3 格式化操作…

【论文阅读】-- Temporal Summary Images:通过交互式注释生成和放置实现叙事可视化的方法

Temporal Summary Images: An Approach to Narrative Visualization via Interactive Annotation Generation and Placement 摘要1 引言2 背景及相关工作2.1 叙事可视化和讲故事2.2 显示面向时间的数据2.3 小倍数和漫画2.4 注释可视化 3 设计要求和工作流程3.1 工作流程3.2 TSI…

基线核查--渗透

基线检查 基线核查概念 it中定义: 基线为初始的标准,以后更改就要经过授权,形成下一基线。 软件配置管理的基线:1功能基线,分配基线,产品基线 安全配置基线--基线核查 安全基线可以说是木桶理论&…

【python】eval函数

1.eval函数的语法及用法 (1)语法:eval(expression) 参数说明: expression:必须为字符串表达式,可为算法,也可为input函数等。 说明:表达式必需是字符串,否则会报错&a…

Vue3-尚硅谷笔记

1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…

Dubbo运行原理

目录 Dubbo通讯协议 Dubbo负载均衡策略 RPC和HTTP有什么区别? 让你设计一个RPC框架,如何考虑数据序列化问题? Dubbo 是一款高性能、轻量级的开源 RPC(远程过程调用)框架,主要用于构建分布式服务和微服务…

springcloud第4季 springcloud-alibaba之openfegin+sentinel整合案例

一 介绍说明 1.1 说明 1.1.1 消费者8081 1.1.2 openfegin接口 1.1.3 提供者9091 9091微服务满足: 1 openfegin 配置fallback逻辑,作为统一fallback服务降级处理。 2.sentinel访问触发了自定义的限流配置,在注解sentinelResource里面配置…

基于SpringBoot的学生综合测评系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot框架 工具:MyEclipse、Tomcat 系统展示 首页 系统首页,提供综合…

After Effects 2024 mac/win版:创意视效,梦想起航

After Effects 2024是一款引领视效革命的专业软件,汇聚了创意与技术的精华。作为Adobe推出的全新版本,它以其强大的视频处理和动画创作能力,成为从事设计和视频特技的机构,如电视台、动画制作公司、个人后期制作工作室以及多媒体工…

求职产品运营的个人简历案例(精选篇)

在求职产品运营的道路上,一份出色的个人简历是迈向成功的第一步,但是简历怎么写才最好呢?下面是小编整理的求职产品运营的个人简历案例,同时,幻主简历网还提供精美简历模板下载和简历在线制作工具,欢迎大家…

Kivy tutorial 008: More kv language

Kivy tutorial 008: More kv language – Kivy Blog Central themes: Event binding and canvas instructions in kv language 中心主题: 事件绑定 和 kv语言里的画布结构 This tutorial directly follows on from the previous, so start by retrieving the previous code, …

meizu M10 魅蓝 10 mblu10 root 解锁 安装LSPosed框架 紫光展锐改串 AT命令 一键新机 改机软件 硬改 改参数

meizu M10 魅蓝 10 mblu10 root 解锁 安装LSPosed框架 紫光展锐改串 AT命令 一键新机 改机软件 硬改 改参数 ro.system.build.version.release11 ro.system.build.version.release_or_codename11 ro.system.build.version.sdk30 ro.system.custom.versionAndroid_M01 ro.prod…

python目录树生成器

代码如下: import os from colorama import Fore, Style, init from tkinter import Tk, Label, Entry, Button, Text, Scrollbar, RIGHT, Y, END# 初始化 colorama init(autoresetTrue)def print_directory_tree(root_dir, text_widget, indent, lastTrue):"…

NISP国家信息安全水平考试

国家信息安全水平考试(NISP)是中国信息安全测评中心考试、发证,由国家网络空间安全人才培养基地运营管理,并授权网安世纪科技有限公司为NISP证书管理中心。 中国信息安全测评中心开展国家信息安全水平考试(NISP)考试项目,是为普及信息安全/网…

Sklearn 深入教程

Sklearn 深入教程 Scikit-learn(sklearn)是Python中功能强大且广泛使用的机器学习库。本教程将深入探讨sklearn中的高级主题,涵盖高级数据预处理、高级特征工程、复杂模型调参、高级集成学习、模型持久化与部署等内容。 目录 高级数据预处…