Openharmony4.0 rk3566上面rknn的完美調用

一 背景:

????????我們都知道如果要在android上面使用rknn推理模型需要按照如下的步驟:

???詳細請參考筆者的文章:Android11-rk3566平臺上采用NCNN,RKNN框架推理yolo11官方模型的具體步驟以及性能比較-CSDN博客

???簡而言之就是

  1. 模型轉換:把模型文件轉換成rknn格式
  2. 建立一個C++Native項目,在native層連接 librknnrt.so, 調用其中的API進行推理

那在openharmon4.0上面可行嗎?根據實際的動手試驗答案是:如果完全按照android上面的思路不可行,但是如果我們換一種思路的話,那就可行了。本文將給大家分享一下如何做到。

二 經典思路碰到的問題:

????????我們使用DevEco IDE(4.0)新建一個Native工程,在native(c++)端實現我們一個so,假設叫做rknnwrapper.so,由于我們要使用librknnrt.so這個庫里面的函數,因此就需要在rknnwrapper.so的CMakeLists.txt文件中鏈接這個庫,另外需要把librknnrt.so這個庫拷貝到正確的libs目錄下面。之后編譯鏈接,一切順利,于是信心滿滿的運行了程序,BUT,此時程序出現了異常:rknnwrapper.so加載失敗。通過分析我們發現:

librknnrt.so加載失敗了,進而導致rknnwrapper.so加載失敗,但是為什么會失敗呢?

于是我又把rknn-toolkit2-2.3.2里面的資料翻了一遍:功夫不負有心人,通過樣例代碼發現

Openharmony下面librknnrt.so是rknn-toolkit2-2.3.2\rknpu2\runtime\Linux目錄下面的so,而樣例代碼rknn-toolkit2-2.3.2\rknpu2\examples\rknn_matmul_api_demo目錄下面的build-linux.sh腳本里面有詳細的交叉編譯工具鏈信息:

所以我就想既然rknn_matmul_api_demo是用gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu這個生產的而且rknn_matmul_api_demo也鏈接了librknnrt.so,那我把gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib下面的所有的庫和librknnrt.so一起拷貝到我工程的libs目錄下不就行了嗎。于是就試了一下,發現還是報同樣的錯誤:librknnrt.so加載時失敗了,于是我認為通過DevEco(4.0)開發的Native程序在啟動的時候只會加載系統指定的運行時庫,就算我把librknnrt.so和依賴的運行時庫一起考到libs目錄下面也沒有任何用處。看來只能想其他辦法了

三 如何解決:

通過上面的試驗我們得出結論:

  1. librknnrt.so依賴的運行時庫為一個版本,設為runtime1
  2. DevEco(4.0)編譯出來的程序依賴的運行時庫是 runtime2
  3. 鴻蒙系統(4.0)本身依賴的運行時庫是runtime2

于是我想出了一個辦法如下圖:

思路:

????????1. 寫一個服務進程,假設為rknn_server,使用gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu交叉編譯工具鏈編譯,其從系統啟動的時候就一直常駐在后臺,隨時準備為客戶端提供rknn推理服務
????????2. 寫一個rknn_client.so 使用DevEco(4.0)開發,把librknnrt.so庫中提供的接口根據需要暴露出來給給應用層使用,這樣rknn_client.so就相當于librknnrt.so的代理
????????3. rknn_client.so和rknn_server間的進程間通信需要用到內存映射技術,因為推理輸入張量和輸出張量占用的內存大小往往很大,就拿輸入張量做個例子,假設輸入張量的格式為“NHWC int8" NHWC分別為 1,640,640,3,那么其占用的內存大小就是 640*640*3=1228800,差不多1.2M,為了保證性能最優,這么大級別的內存拷貝需要采用高性能的IPC技術,比如內存映射。除了傳遞數據,我們還需要一個通道用來發送命令(比如加載模型命令和推理命令),這時候套接字或者管道就可以用來做這個事情。

運行結果:

  1. 數據:

模型

單次推理耗時

CPU idle

rknn_server CPU

yolo11n

300ms

280%

50%

yolo11n_pose

380ms

280%

50%

yolo11s_pose

580ms

300%

40%

說明:

????????A:rk3566 是4核CPU(400%),NPU算力是0.8TOPS(int8)。

? ? ? B:Demo的CPU消耗還包含攝像頭采集、ISP算法、UI渲染和目標框的渲染,我們看下yolo11n下的top的數據(其他兩種情況差不多):

讀者可能會問,你的客戶端進程CPU怎么這么低,主要的原因是作者把攝像頭采集這塊優化到了極致,大家可以參考作者的另外一篇文章:

Openharmony4.0攝像頭采集+編碼器+預覽的優化_openharmony 相機預覽-CSDN博客,里面攝像頭方面的優化思路,上面三種情況下對象檢測和姿態檢測是在最高分辨率下的實時識別(3264x2448x15fps采集,識別的頻率是同一時刻只能有一次識別在進行,如果攝像頭采集的幀率大于識別的幀率就采用丟幀策略)

實際效果:

四 結尾:

?Openharmony4.0的官方系統代碼里面沒有rknn驅動的支持,需要大家自行移植并且成功驅動rknpu,網上參考有不少,這里就不在深入說明了 :)

如果大家有更好的思路或者建議,歡迎評論區留言 :)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913686.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913686.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java多線程知識小結:Synchronized

在Java中,synchronized 關鍵字是實現線程同步的核心工具,用于保證同一時刻只有一個線程可以執行被修飾的代碼塊或方法。以下從基本原理、鎖升級過程、應用場景及優化建議四個維度詳細解析: 一、基本原理 1. 同步的對象 synchronized 鎖的是對…

MTK項目wifi.cfg文件如何配置的Tput和功耗參數

下面的MTK參數主要與無線網絡(Wi-Fi)配置相關,特別是與WMM(Wi-Fi Multimedia)和功率控制相關的設置 WMM相關參數: WmmParamCwMax/WmmParamCwMin:定義競爭窗口的最大/最小值,這里設置為10/4,用于控制信道訪問的退避機制13 WmmParamAifsN:仲裁幀間間隔數,設置為3影響不同…

分水嶺算法:圖像分割的浸水原理

分水嶺算法:基于拓撲地貌的邊界提取核心原理 分水嶺算法將圖像視為拓撲地貌,灰度值代表海拔高度。通過模擬浸水過程:局部極小值:對應集水盆(區域內部)。分水嶺線:集水盆之間的山脊(區…

汽車功能安全系統階段開發【技術安全方案TSC以及安全分析】5

文章目錄1 技術安全方案 (Technical Safety Concept - TSC)2 系統安全架構設計 (System Safety Architecture Design)3 如何進行安全分析 (Safety Analysis)4 技術安全需求 (TSR) 如何分配到系統架構1 技術安全方案 (Technical Safety Concept - TSC) 技術安全方案 (Technical…

學習軟件測試的第十二天(接口測試)

一.如果一個接口請求不通,那么你會考慮那些方面的問題?如果一個接口請求不通,我會像“排查水管漏水”一樣一步步定位問題發生在哪一段,主要從這幾個方向去思考:當一個接口請求不通時,我會從以下幾個方面進行…

Linux下的C/C++開發之操作Zookeeper

ZooKeeper C 客戶端簡介與安裝ZooKeeper C API 簡介ZooKeeper 官方提供了多語言客戶端,C 語言客戶端是最底層的實現之一,功能全面且穩定,適合嵌入式開發、系統級組件、C 項目集成等場景。zookeeper.h 是 ZooKeeper 提供的 C 語言客戶端頭文件…

【openp2p】學習3:【專利分析】一種基于混合網絡的自適應切換方法、裝 置、設備及介質

本專利與開源項目無關,但可能是實際商用的一種專利。專利地址從此專利,可見p2p的重要性。透傳服務可能是實時轉發服務,提供中繼能力 透傳服務可以是指一種通過公網服務器將數據從第一客戶端傳遞到另一個設備 或客戶端的服務。這種服務通常用于克服網絡中的障礙,如防火墻、…

OpenCV中DPM(Deformable Part Model)目標檢測類cv::dpm::DPMDetector

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 OpenCV 中用于基于可變形部件模型(DPM) 的目標檢測器,主要用于行人、人臉等目標的檢測。它是一種傳統的基于特…

macOS 26快捷指令更新,融入AI打造智能操作體驗

快捷指令作為Mac系統中提升用戶操作效率的得力助手,在macOS 26中迎來了一次具有突破性的重大更新。此次更新融入了先進的AI技術,推出“智能操作”(Intelligent Actions)功能,讓快捷指令從簡單的自動化工具升級為真正的…

InstructBLIP:邁向具備指令微調能力的通用視覺語言模型

溫馨提示: 本篇文章已同步至"AI專題精講" InstructBLIP:邁向具備指令微調能力的通用視覺語言模型 摘要 大規模的預訓練與instruction tuning在構建通用語言模型方面已取得顯著成效。然而,構建通用的視覺-語言模型仍然具有挑戰性&…

基于dropbear實現嵌入式系統ssh服務端與客戶端完整交互

以下基于 Dropbear 實現 SSH 服務端與客戶端交互的完整步驟,涵蓋服務端部署、客戶端連接、認證配置及消息傳輸,結合了多篇權威資料的核心實踐:環境準備與安裝 服務端安裝 ? Linux 系統(以 Ubuntu/CentOS 為例) Ubuntu…

深圳安銳科技發布國內首款4G 索力儀!讓斜拉橋索力自動化監測更精準高效

近日,深圳安銳科技正式發布國內首款無線自供電、一體化的斜拉索實時監測設備 “4G索力監測儀”,成功攻克了傳統橋梁索體監測領域長期存在的實時性差、布設困難和成本高昂的行業難題,為斜拉橋、系桿拱橋提供全無線、自動化、云端實時同步的索力…

Pipeline 引用外部數據源最佳實踐

場景解析在企業網絡安全日志處理場景中,防火墻、入侵檢測系統(IDS)等設備會持續產生大量日志,記錄網絡流量、訪問請求、異常事件等基礎信息,但這些原始日志僅能呈現表面現象,難以全面剖析安全威脅&#xff…

UI + MCP Client + MCP Server(并且鏈接多個Server)

項目結構前端項目--------->MCP Client----------->MCP Serverserver就不過多贅述了,他只是相當于添加了多個的tools 鏈接前后端 http.createServer創建一個服務器// ---------------------------------------------------------------- // server.js import …

香港站群服務器與普通香港服務器對比

在選擇香港服務器時,用戶常常會遇到"站群服務器"和"普通服務器"兩種選項,雖然它們都基于香港數據中心的基礎設施,但在 IP 地址配置、功能定位和管理復雜度、成本上存在顯著差異,理解這些差異有助于用戶根據實…

4.B樹和B+樹的區別?為什么MySQL選擇B+樹作為索引?

區別:1.數據存儲位置B樹每個節點都存儲了索引和數據B樹只有葉子節點存儲數據,非葉子節點僅存儲索引2.葉子節點的鏈接B樹的所有葉子節點通過指針連接成一個雙向鏈表,可以高效地進行范圍查詢或者順序遍歷B樹則沒有這樣的連接關系,查…

轉換狂魔,Modbus TCP轉Profinet網關打通視覺傳感線連接之路

在汽車零部件沖壓生產線的世界中,液壓機的壓力穩定性是確保產品質量的秘密武器。然而,舊時代的人工巡檢和傳統監測方式卻好似拖累現代化進程的沉重枷鎖:效率低、成本高,還總是趕不上實時反饋的快車。這時,工廠決心大刀…

C++進階—二叉樹進階

第一章:內容安排說明 map和set特性需要先鋪墊二叉搜索樹,而二叉搜索樹也是一種樹形結構二叉搜索樹的特性了解,有助于更好的理解map和set的特性二叉樹中部分面試題稍微有點難度,在前面講解大家不容易接受,且時間長容易…

驅動下一代E/E架構的神經脈絡進化—10BASE-T1S

汽車電子電氣架構的演進正經歷一場深刻的變革,“中央計算單元區域控制器”的架構模式已成為當前主流車型平臺發展的明確方向。這種從傳統的“功能域”(Domain)架構向“區域”(Zonal)架構的轉型升級,旨在實現…

某學校系統中挖礦病毒應急排查

本篇文章主要記錄某學校長期未運營維護的程序,被黑客發現了漏洞,但好在學校有全流量設備,抓取到了過程中的流量包 需要你進行上機以及結合流量分析,排查攻擊者利用的漏洞以及上傳利用成功的木馬 文章目錄靶機介紹1.使用工具分析共…