一 背景:

        我们都知道如果要在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.使用工具分析共…