RK3588芯片NPU的使用:yolov8-pose例子圖片檢測在安卓系統部署與源碼深度解析(rknn api)

一、本文的目標

  • 將yolo8-pose例子適配安卓端,提供選擇圖片后進行姿態識別功能。
  • 通過項目學習源碼和rknn api。

二、開發環境說明

  • 主機系統:Windows 11
  • 目標設備:搭載RK3588芯片的安卓開發板
  • 核心工具:Android Studio Koala | 2024.1.1 Patch 2,NDK 27.0

三、適配(遷移)安卓

有了前兩次的遷移經驗,這次就很順利了。可以參考之前三篇文章,如果還是遇到問題(或者需要源碼),給我留言。
Yolo8-pose C語言例子請參考之前的博文《RK3588芯片NPU的使用:Windows11 Docker中編譯YOLOv8-Pose C Demo并在開發板運行實踐》。
將C Demo移植到安卓應用端的相關知識,請參考博文《手把手部署YOLOv5到RK3588安卓端:NPU加速與JNI/C/Kotlin接口開發指南》。
上一次移植,請參考《RK3588芯片NPU的使用:PPOCRv4例子在安卓系統部署》,解決圖像格式問題,很重要。

四、重要源碼解析

4.1 init_yolov8_pose_model方法

本函數主要任務是YOLOv8模型在RKNN框架下的初始化、屬性查詢和配置保存。
函數源碼如下:

int init_yolov8_pose_model(const char *model_path, rknn_app_context_t *app_ctx)
{int ret;// 1.初始化RKNN上下文rknn_context ctx = 0;ret = rknn_init(&ctx, (char *)model_path, 0, 0, NULL);if (ret < 0){printf("rknn_init fail! ret=%d\n", ret);return -1;}// 2.查詢模型的輸入輸出數量rknn_input_output_num io_num;ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));if (ret != RKNN_SUCC){printf("rknn_query fail! ret=%d\n", ret);return -1;}printf("model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output);// 3.獲取輸入張量屬性printf("input tensors:\n");rknn_tensor_attr input_attrs[io_num.n_input];memset(input_attrs, 0, sizeof(input_attrs));for (int i = 0; i < io_num.n_input; i++){input_attrs[i].index = i;ret = rknn_query(ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]), sizeof(rknn_tensor_attr));if (ret != RKNN_SUCC){printf("rknn_query fail! ret=%d\n", ret);return -1;}dump_tensor_attr(&(input_attrs[i]));}// 4.獲取輸出張量屬性printf("output tensors:\n");rknn_tensor_attr output_attrs[io_num.n_output];memset(output_attrs, 0, sizeof(output_attrs));for (int i = 0; i < io_num.n_output; i++){output_attrs[i].index = i;ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]), sizeof(rknn_tensor_attr));if (ret != RKNN_SUCC){printf("rknn_query fail! ret=%d\n", ret);return -1;}dump_tensor_attr(&(output_attrs[i]));}// 5.保存配置到應用上下文app_ctx->rknn_ctx = ctx;// 6.判斷模型是否量化:檢查第一個輸出張量是否是非FP16的仿射量化類型,設置is_quant標志,用于后續反量化處理。if (output_attrs[0].qnt_type == RKNN_TENSOR_QNT_AFFINE_ASYMMETRIC && output_attrs[0].type != RKNN_TENSOR_FLOAT16){app_ctx->is_quant = true;}else{app_ctx->is_quant = false;}// 7. 復制輸入輸出屬性到應用上下文:動態分配內存并拷貝輸入輸出屬性,保存到app_ctx以便后續訪問。app_ctx->io_num = io_num;app_ctx->input_attrs = (rknn_tensor_attr *)malloc(io_num.n_input * sizeof(rknn_tensor_attr));memcpy(app_ctx->input_attrs, input_attrs, io_num.n_input * sizeof(rknn_tensor_attr));app_ctx->output_attrs = (rknn_tensor_attr *)malloc(io_num.n_output * sizeof(rknn_tensor_attr));memcpy(app_ctx->output_attrs, output_attrs, io_num.n_output * sizeof(rknn_tensor_attr));// 8. 解析輸入張量維度if (input_attrs[0].fmt == RKNN_TENSOR_NCHW){printf("model is NCHW input fmt\n");app_ctx->model_channel = input_attrs[0].dims[1];app_ctx->model_height = input_attrs[0].dims[2];app_ctx->model_width = input_attrs[0].dims[3];}else{printf("model is NHWC input fmt\n");app_ctx->model_height = input_attrs[0].dims[1];app_ctx->model_width = input_attrs[0].dims[2];app_ctx->model_channel = input_attrs[0].dims[3];}printf("model input height=%d, width=%d, channel=%d\n",app_ctx->model_height, app_ctx->model_width, app_ctx->model_channel);return 0;
}

4.1.1 rknn_init初始化

rknn_init初始化函數功能為創建rknn_context對象、加載RKNN模型以及根據flag和rknn_init_extend結構體執行特定的初始化行為。
函數原型

int rknn_init(rknn_context* context,      // 輸出參數:返回的 RKNN 上下文句柄void* model,                // 輸入參數:模型數據或模型文件路徑uint32_t size,              // 輸入參數:模型數據的大小(字節數)uint32_t flag,              // 輸入參數:初始化標志位(擴展選項)rknn_in

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

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

相關文章

DeepSeek本地部署手冊

版本:v1.0 適用對象:零基礎開發者 一、部署前準備 1.1 硬件要求 組件最低配置推薦配置說明CPUIntel i5 8代Xeon Gold 6230需支持AVX指令集內存16GB64GB模型越大需求越高GPUNVIDIA GTX 1060 (6GB)RTX 3090 (24GB)需CUDA 11.7+存儲50GB可用空間1TB NVMe SSD建議預留2倍模型大小…

HashMap的源碼解析

HashMap基于哈希表的Map接口實現&#xff0c;是以key-value存儲形式存在&#xff0c;即主要用來存放鍵值對。HashMap的實現不是同步的&#xff0c;這意味著它不是線程安全的。它的key、value都可以為null。此外&#xff0c;HashMap中的映射不是有序的。 JDK1.8 之前 HashMap由數…

論文精讀:大規模MIMO波束選擇問題的量子計算解決方案

論文精讀&#xff1a;大規模MIMO波束選擇問題的量子計算解決方案 概要&#xff1a; 隨著大規模多輸入多輸出系統&#xff08;MIMO&#xff09;在5G及未來通信技術中的應用&#xff0c;波束選擇問題&#xff08;MBS&#xff09;成為提升系統性能的關鍵。傳統的波束選擇方法面臨計…

DPIN河內AI+DePIN峰會:共繪藍圖,加速構建去中心化AI基礎設施新生態

近日&#xff0c;一場聚焦前沿科技融合的盛會——AIDePIN峰會在越南河內成功舉辦。此次峰會由DPIN、QPIN及42DAO等Web3領域的創新項目聯合組織&#xff0c;匯聚了眾多Web3行業領袖、技術專家與社區成員。峰會于2025年4月19日舉行&#xff0c;其核心議題圍繞去中心化物理基礎設施…

品牌公關如何邀請媒體采訪?|微信文案模版

傳媒如春雨&#xff0c;潤物細無聲&#xff0c;大家好&#xff0c;我是51媒體胡老師。 &#x1f4f8;?不論是舉行活動、展會、發布會、推介會&#xff0c;還是新店開業&#x1f389; 都需要邀約媒體出席活動并采訪報道&#x1f3a4;&#x1f4f0; 我們需要在活動前提醒媒體參…

影樓精修-手部青筋祛除算法解析

注意&#xff1a;本文樣例圖片為了避免侵權&#xff0c;均使用AIGC生成&#xff1b; 手部青筋祛除科普 手部青筋祛除是影樓精修中一個非常精細的工作&#xff0c;需要較高的修圖技巧&#xff0c;目前市面上很少有自動化的青筋祛除功能的&#xff0c;而像素蛋糕目測是第一個做到…

智慧景區國標GB28181視頻平臺EasyGBS視頻融合應用全場景解決方案

一、方案背景? 隨著旅游業的蓬勃發展&#xff0c;景區的規模不斷擴大&#xff0c;游客數量持續增長&#xff0c;對景區的安全管理和游客服務質量提出了更高要求。打造一個高效、智能的視頻監控及管理系統成為景區運營的關鍵。EasyGBS作為一款基于國標GB28181協議的視頻云服務…

dedecms織夢arclist標簽noflag屬性過濾多個參數

織夢dedecms系統arclist標簽noflag屬性默認是只能過濾一個參數&#xff0c;比如過濾推薦是noflagc&#xff0c;過濾有圖片的文章是noflagc&#xff0c;在模板制作過程中&#xff0c;有時候我們為了seo和避免重復&#xff0c;需要過濾多個參數。今天小編就來跟大家講講織夢dedec…

如何用go語言搭MCP

1.什么是MCP? MCP是“模型上下文協議(Model Context Protocol)”的簡稱,用一句簡單通俗易懂的話描述: 是一種讓 AI 模型能夠無縫連接到外部工具和數據源的標準化方式。想象它就像 AI 的“萬能接口”,能讓 AI 像用 USB 線連接設備一樣,輕松調用其他程序或服務。2.官方M…

js 的call 和apply方法用處

主要用于ECMAScript與宿主環境&#xff08;文檔對象&#xff08;DOM&#xff09;、瀏覽器對象&#xff08;BOM&#xff09;&#xff09;的交互中&#xff1b; 例子&#xff1a;function changeStyle(attr, value){ this.style[attr] value; } …

移動通信行業術語

英文縮寫英文全稱中文名稱解釋/上下文舉例IMSIP Multimedia SubsystemIP多媒體子系統SIPSession Initiation Protocol會話初始化協議常見小寫sip同。ePDG/EPDGEvolved Packet Data Gateway演進分組數據網關 EPDG是LTE&#xff08;4G&#xff09;和后續蜂窩網絡架構&#xff08;…

c++11新特性隨筆

1.統一初始化特性 c98中不支持花括號進行初始化&#xff0c;編譯時會報錯&#xff0c;在11當中初始化可以通過{}括號進行統一初始化。 c98編譯報錯 c11: #include <iostream> #include <set> #include <string> #include <vector>int main() {std:…

Spark-Streaming簡介 核心編程

1. Spark-Streaming概述 定義&#xff1a;用于處理流式數據&#xff0c;支持多種數據輸入源&#xff0c;可運用Spark原語運算&#xff0c;結果能保存于多處。它以離散化流&#xff08;DStream&#xff09;為抽象表示&#xff0c;是RDD在實時數據處理場景的封裝。 特點&#x…

SpringbootWeb開發(注解和依賴配置)

Lombok 工具 Spring Web web開發相關依賴 MyBatis Framework MyBatis驅動 MySQL Driver MySql驅動包 Restful 風格 Slf4j 記錄日志對象 RequestMapping(value “/depts”, method RequestMethod.GET) //指定請求方式為GET method 指定請求方式 GetMapping 限定請求方式為Get…

雜項知識點

雜項 1 激活函數1.1 sigmoid1.2 tanh1.3 Relu1.4 leakRelu 1 激活函數 常用的激活函數包括sigmoid tanh Relu leakRelu 1.1 sigmoid import torch import numpy as np import matplotlib.pyplot as plt # sigmoid tanh Relu leakRelu ## 1 sigmoid ### 1.1 代碼復現sig…

計算機組成原理:指令系統

計算機組成原理:指令集系統 指令集體系結構(ISA)ISA定義ISA包含的內容舉個栗子指令的基本組成(操作碼+地址碼)指令分類:地址碼的個數定長操作碼變長操作碼變長操作碼的原則變長操作碼的設計指令尋址尋址方式的目的尋址方式分類有效地址直接在指令中給出有效地址間接給出有效地…

Rust實現高性能目錄掃描工具ll的技術解析

Rust實現高性能目錄掃描工具ll的技術解析 一、項目概述 本項目使用Rust構建了一個類ls命令行工具&#xff0c;具備以下核心特性&#xff1a; 多格式文件信息展示并行目錄掃描加速人類可讀文件大小運行時性能統計交互式進度提示 二、技術架構 1. 關鍵技術棧 clap&#xff…

【深度強化學習 DRL 快速實踐】策略梯度算法 (PG)

PG&#xff08;1984&#xff0c;Sutton&#xff09; 核心改進點 策略梯度算法 (PG): 直接對策略函數進行建模&#xff0c;可以適用于連續的動作空間 model-free, on-policy, PG, stochastic 策略 核心改進點說明策略梯度優化通過Actor網絡直接優化策略&#xff0c;適應連續動作…

G1垃圾回收器中YoungGC和MixedGC的區別

在 G1 垃圾回收器中&#xff0c;Mixed GC 和 Young GC 的區別主要體現在以下幾個方面&#xff1a; 作用范圍 Young GC&#xff1a;僅針對年輕代中的Region進行回收&#xff0c;包括 Eden 區和 Survivor 區的 Region。Mixed GC&#xff1a;會回收所有年輕代的 Region 以及部分…

從LLM到AI Agent的技術演進路徑:架構解析與實現邏輯

人工智能技術正經歷從基礎語言模型到智能執行體的關鍵躍遷。解析LLM→RAG→Agent的技術演進三層架構&#xff0c;拆解大模型與知識庫、工具鏈的融合機理&#xff0c;揭示感知-決策-執行閉環系統的構建邏輯。通過架構范式解析、代碼實現示例及多模態實踐案例&#xff0c;為開發者…