探索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.pswp.cn/diannao/35974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35974.shtml
英文地址,請注明出處:http://en.pswp.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中的高級主題,涵蓋高級數據預處理、高級特征工程、復雜模型調參、高級集成學習、模型持久化與部署等內容。 目錄 高級數據預處…