网心云 OEC/OECT 笔记(2) 运行RKNN程序
目录
- 网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件
- 网心云 OEC/OECT 笔记(2) 运行RKNN程序
RKNN
OEC/OEC-Turbo 使用的芯片是 RK3566/RK3568, 这个系列是内建神经网络处理器 NPU 的, 利用 RKNN 可以部署运行 AI 模型利用 NPU 硬件加速模型推理. 要使用 NPU, 首先需要在电脑使用 RKNN-Toolkit2 将训练好的模型转换为 RKNN 格式的模型, 然后在传到 OEC/OEC-Turbo盒子上使用 RKNN C API 或 Python API进行推断.
涉及的工具有:
- RKNN-Toolkit2 是一个软件开发工具包, 供用户在 PC 和 Rockchip NPU 平台上执行模型转换、推断和性能评估
- RKNN-Toolkit-Lite2 为 Rockchip NPU 平台提供了 Python 编程接口, 帮助用户部署 RKNN 模型并加速实施 AI 应用
- RKNN Runtime 为 Rockchip NPU 平台提供了 C/C++ 编程接口, 帮助用户部署 RKNN 模型并加速实施 AI 应用
- RKNPU 内核驱动负责与 NPU 硬件交互
RKNN-Toolkit2 和 RKNN-Toolkit-Lite2 都在同一个GitHub仓库 https://github.com/airockchip/rknn-toolkit2
下面以 RKNN-Toolkit2 自带的 rknpu2 示例项目为例, 说明如何编译并在 OEC/OEC-Turbo 上运行 RKNN 项目.
准备GCC工具链
注意: 刷机的固件系统自带的 glibc 版本是 GLIBC_2.36, 因此对应的 gcc 版本最高到 12.2. 如果用 gcc 12.3 编译, 产生的二进制在板子上执行会报"/lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.38’ not found" 这样的错误.
从 https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads 下载 gcc 12.2版本工具链.
Arm GCC 12.2系列的最后一个版本 12.2.MPACBTI-Rel1 没有支持 host 为 Linux X86-64 的工具链, 支持 Linux X86-64 的最后一个版本是 12.2.Rel1, 需要下载这个版本,
在 x86_64 Linux hosted cross toolchains 下面找到 arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz, 注意不是 elf, 也不是 big-endian, 不要下错了.
下载之后解压, 并移动到 /opt/gcc-arm/ 备用
准备 rknn-toolkit2
从GitHub导出 airockchip/rknn-toolkit2
git clone https://github.com/airockchip/rknn-toolkit2.git
这个仓库有2个多GB, 需要耐心等待导出完成.
注意: 导出的文件中存在一处链接错误, 需要手动修复一下, 不然后面编译rknn程序的时候会报错. 到 rknpu2/examples/3rdparty/mpp/Linux/aarch64 目录下
rknn-toolkit2/rknpu2/examples/3rdparty/mpp/Linux/aarch64$ ll
total 2268
lrwxrwxrwx 1 milton milton 8 Jun 2 20:38 librockchip_mpp.so -> ''$'\177''ELF'$'\002\001\001\003'
-rw-rw-r-- 1 milton milton 2321616 Jun 2 20:38 librockchip_mpp.so.0
lrwxrwxrwx 1 milton milton 8 Jun 2 20:38 librockchip_mpp.so.1 -> ''$'\177''ELF'$'\002\001\001\003'
删除这两个软链, 同时将 librockchip_mpp.so.0 复制为 librockchip_mpp.so 和 librockchip_mpp.so.1. 不用软链, 是因为使用软链的话, 传输到盒子的时候会出错.
$ rm librockchip_mpp.so
$ rm librockchip_mpp.so.1
$ cp librockchip_mpp.so.0 librockchip_mpp.so
$ cp librockchip_mpp.so.0 librockchip_mpp.so.1
编译示例代码 rknn_yolov5_demo
到 rknpu2/examples/rknn_yolov5_demo 目录下, 先将两个sh文件设为可执行
$ chmod +x *.sh
执行编译, 将下面的/opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
换成你刚才解压的gcc路径以及文件前缀
GCC_COMPILER=/opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu ./build-linux.sh -t rk3566 -a aarch64 -b Release
编译输出
./build-linux.sh -t rk3566 -a aarch64 -b Release
/opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
===================================
TARGET_SOC=RK3566_RK3568
TARGET_ARCH=aarch64
BUILD_TYPE=Release
BUILD_DIR=/home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/build/build_RK3566_RK3568_linux_aarch64_Release
CC=/opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
CXX=/opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++
===================================
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/build/build_RK3566_RK3568_linux_aarch64_Release
[ 10%] Linking CXX executable rknn_yolov5_video_demo
[ 50%] Built target rknn_yolov5_demo
[100%] Built target rknn_yolov5_video_demo
[ 40%] Built target rknn_yolov5_demo
[100%] Built target rknn_yolov5_video_demo
Install the project...
-- Install configuration: "Release"
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/./rknn_yolov5_demo
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/lib/librknnrt.so
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/lib/librga.so
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/./model/RK3566_RK3568
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/./model/RK3566_RK3568/yolov5s-640-640.rknn
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/./model/bus.jpg
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/./model/coco_80_labels_list.txt
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/./rknn_yolov5_video_demo
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/lib/librockchip_mpp.so
-- Installing: /home/milton/WorkLR3576/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/lib/libmk_api.so
编译产生的文件在 install 目录下
└── rknn_yolov5_demo_Linux├── lib│ ├── libmk_api.so│ ├── librga.so│ ├── librknnrt.so│ └── librockchip_mpp.so├── model│ ├── bus.jpg│ ├── coco_80_labels_list.txt│ └── RK3566_RK3568│ └── yolov5s-640-640.rknn├── rknn_yolov5_demo└── rknn_yolov5_video_demo
运行 rknn_yolov5_demo
将上面的 rknn_yolov5_demo_Linux 整个目录复制到 OEC/OEC-Turbo 文件系统里, 在 rknn_yolov5_demo_Linux 目录下执行以下命令
LD_LIBRARY_PATH=./lib ./rknn_yolov5_demo model/RK3566_RK3568/yolov5s-640-640.rknn model/bus.jpg
输出
post process config: box_conf_threshold = 0.25, nms_threshold = 0.45
Loading mode...
sdk version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27) driver version: 0.9.8
model input num: 1, output num: 3index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=1228800, w_stride = 640, size_with_stride=1228800, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922index=0, name=output0, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, w_stride = 0, size_with_stride=1638400, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922index=1, name=286, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, w_stride = 0, size_with_stride=409600, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922index=2, name=288, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, w_stride = 0, size_with_stride=122880, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
model is NHWC input fmt
model input height=640, width=640, channel=3
Read model/bus.jpg ...
img width = 640, img height = 640
once run use 55.863000 ms
loadLabelName ./model/coco_80_labels_list.txt
person @ (209 243 286 510) 0.879723
person @ (479 238 560 526) 0.870588
person @ (109 238 231 534) 0.839831
bus @ (91 129 555 464) 0.692042
person @ (79 353 121 517) 0.300961
save detect result to ./out.jpg
loop count = 10 , average run 48.848400 ms
将产生的 out.jpg 传回本地电脑, 就能看到已经标记上识别结果
编译和运行 rknn_benchmark
在 rknpu2/examples/rknn_benchmark 目录下, 编译命令和上面的示例是一样的, 编译完成后传输到 OEC/OEC-Turbo 后, 假定之前执行过 rknn_yolov5_demo 这个例子, 并且都在同一个目录下, 执行下面的命令
LD_LIBRARY_PATH=./lib ./rknn_benchmark ../rknn_yolov5_demo_Linux/model/RK3566_RK3568/yolov5s-640-640.rknn ../rknn_yolov5_demo_Linux/model/bus.jpg
输出
rknn_api/rknnrt version: 2.0.0b0 (35a6907d79@2024-03-24T10:31:14), driver version: 0.9.8
total weight size: 7299584, total internal size: 10585600
total dma used size: 26521600
model input num: 1, output num: 3
input tensors:index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=1228800, w_stride = 640, size_with_stride=1228800, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
output tensors:index=0, name=output0, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, w_stride = 0, size_with_stride=1638400, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922index=1, name=286, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, w_stride = 0, size_with_stride=409600, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922index=2, name=288, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, w_stride = 0, size_with_stride=122880, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
custom string:
Warmup ...0: Elapse Time = 40.69ms, FPS = 24.571: Elapse Time = 40.19ms, FPS = 24.882: Elapse Time = 40.11ms, FPS = 24.933: Elapse Time = 40.19ms, FPS = 24.884: Elapse Time = 40.74ms, FPS = 24.54
Begin perf ...0: Elapse Time = 41.03ms, FPS = 24.371: Elapse Time = 41.12ms, FPS = 24.322: Elapse Time = 41.20ms, FPS = 24.273: Elapse Time = 41.17ms, FPS = 24.294: Elapse Time = 41.11ms, FPS = 24.325: Elapse Time = 41.17ms, FPS = 24.296: Elapse Time = 41.08ms, FPS = 24.347: Elapse Time = 41.09ms, FPS = 24.348: Elapse Time = 41.25ms, FPS = 24.249: Elapse Time = 41.10ms, FPS = 24.33Avg Time 41.13ms, Avg FPS = 24.312Save output to rt_output0.npy
Save output to rt_output1.npy
Save output to rt_output2.npy
---- Top5 ----
0.984299 - 17902
0.984299 - 1122607
0.984299 - 1122705
0.984299 - 1122706
0.984299 - 1122707
---- Top5 ----
0.999985 - 280992
0.996063 - 9032
0.996063 - 280970
0.996063 - 280993
0.996063 - 281010
---- Top5 ----
1.000000 - 36255
1.000000 - 36256
0.996078 - 2236
0.996078 - 2245
0.996078 - 2255
相关文章:

网心云 OEC/OECT 笔记(2) 运行RKNN程序
目录 网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件网心云 OEC/OECT 笔记(2) 运行RKNN程序 RKNN OEC/OEC-Turbo 使用的芯片是 RK3566/RK3568, 这个系列是内建神经网络处理器 NPU 的, 利用 RKNN 可以部署运行 AI 模型利用 NPU 硬件加速模型推理. 要使用 NPU, 首先需要在电脑使…...
vue-21 (使用 Vuex 模块和异步操作构建复杂应用)
实践练习:使用 Vuex 模块和异步操作构建复杂应用 Vuex 模块提供了一种结构化的方式来组织你的应用程序状态,特别是当应用程序变得复杂时。命名空间模块通过防止命名冲突和提高代码可维护性来增强这种组织。异步操作对于处理从 API 获取数据等操作至关重要,这些操作在现代 W…...
#开发环境篇:postMan可以正常调通,但是浏览器里面一直报403
本地header代理下面内容即可 headers: { // 添加必要的请求头 ‘Host’: ‘服务端域名’, ‘Origin’: https://服务端域名, ‘Referer’: https://服务端域名 }, devServer: {// 本地开发代理API地址proxy: {^/file: {target: https://服务端域名,changeOrigin: true, // 是否…...
将word文件转为kindle可识别的azw3文件的方法
亚马逊在中国停服后,要将word文件传送到kindle设备上进行阅读就不能通过电子邮件的方式了,只能通过将word文件进行转换后通过数据线传到kindle的方式来实现,通过线上或线下的转换工具可将word文件转化为azw文件,但通过数据线将转换…...
动态规划之01背包
首要 由于自己的个人原因(说白了就是懒),忙于各种事情,实在忙不过来(哭),只能把发文分享的事情一推再推,直到某天良心发现产生了想发文的想法,于是就写下了这篇文章,请各位大佬轻喷 背包问题 背包问题是一…...
Lua和JS的继承原理
JavaScript 和 Lua 都是动态语言,支持面向对象编程(OOP),但它们的 继承机制 实现方式不一样。下面分别介绍它们的继承实现原理和方式: 🔶 JavaScript 的继承机制 JavaScript 使用的是 基于原型(…...

灵活控制,modbus tcp转ethernetip的 多功能水处理方案
油田自动化和先进的油气行业软件为油气公司带来了诸多益处。其中包括: 1.自动化可以消除多余的步骤、减少人为错误并降低运行设备所需的能量,从而降低成本。 2.油天然气行业不断追求高水平生产。自动化可以更轻松地减少计划外停机时间,从而…...
boost::qvm 使用示例
boost::qvm 使用示例 boost::qvm (Quaternions, Vectors and Matrices) 是 Boost 库中的一个组件,专门用于处理向量、矩阵和四元数运算。以下是几个常见的使用示例: 基本向量操作 #include <boost/qvm/vec.hpp> #include <boost/qvm/vec_ope…...
go语言学习 第6章:错误处理
第6章:错误处理 在任何编程语言中,错误处理都是一个至关重要的环节。Go语言以其简洁而强大的错误处理机制而闻名,这使得开发者能够以一种优雅且高效的方式处理程序中可能出现的错误情况。本章将深入探讨Go语言中的错误处理机制,包…...
VMware 安装 CentOS8详细教程 (附步骤截图)附连接公网、虚拟机yum源等系统配置
1 下载安装镜像 centos8官方源已下线,旧的下载地址已不可用,需要切换centos-vault源 华为云CentOS8镜像下载地址 阿里云CentOS8镜像下载地址 中科大CentOS8镜像下载地址 2 安装CentOS8 2.1 创建虚拟机 打开VMware Workstation 左上角 文件-新建虚拟机...
Editing Language Model-based Knowledge Graph Embeddings
基于语言模型的知识图谱嵌入 原文链接:https://arxiv.org/abs/2301.10405 Comment: AAAI 2024.03 摘要 基于语言模型的KG嵌入通常部署为静态工件,这使得它们在部署后如果不重新训练就很难修改。在本文中提出了一个编辑基于语言模型的 KG 嵌入的新任务。…...

深入了解linux系统—— 进程池
前言: 本篇博客所涉及到的代码以同步到本人gitee:进程池 迟来的grown/linux - 码云 - 开源中国 一、池化技术 在之前的学习中,多多少少都听说过池,例如内存池,线程池等等。 那这些池到底是干什么的呢?池…...
JavaScript 原型与原型链:深入理解 __proto__ 和 prototype 的由来与关系
引言 在 JavaScript 的世界中,原型和原型链是理解这门语言面向对象编程(OOP)机制的核心。不同于传统的基于类的语言如 Java,JavaScript 采用了一种独特的原型继承机制。本文将深入探讨 __proto__ 和 prototype 的由来、关系以及它…...
逻辑回归与Softmax
Softmax函数是一种将一个含任意实数的K维向量转化为另一个K维向量的函数,这个输出向量的每个元素都在(0, 1)区间内,并且所有元素之和等于1。 因此,它可以被看作是某种概率分布,常用于多分类问题中作为输出层的激活函数。这里我们以拓展逻辑回归解决多分类的角度对Softmax函…...
vscode .husky/pre-commit: line 4: npx: command not found
目录 1. 修复 npx 路径问题(90% 的解决方案)2. 显式加载环境变量(nvm 用户必选)3. 修复全局 PATH 配置4. 重装 Husky 与钩子5. 使用 HUSKY_DEBUG 调试执行流程 🔧 核心解决方法(按优先级排序) …...

光电耦合器:数字时代的隐形守护者
在数字化、自动化高速发展的今天,光电耦合器正以一种低调却不可或缺的方式,悄然改变着我们的生活。它不仅是电子电路中的“安全卫士”,更是连接信号世界的“桥梁”,凭借出色的电气隔离能力,为各类设备提供稳定可靠的信…...
FPGA没有使用的IO悬空对漏电流有没有影响
结论: 1.在FPGA中,没有使用的IO悬空确实是可能对漏电流和功耗产生一定的影响。 2.这种影响特别是在低功耗设计中或者电流敏感的应用中需要注意。 问题一:未连接 IO(Floating IO)会不会产生漏电流? 1.会有影…...
11. vue pinia 和react redux、jotai对比
对比 Vue 的 Pinia,和 React 的 Redux、Jotai,分中英文简要介绍、特性、底层原理、使用场景。 简单介绍 1.1 Pinia(Vue) • 英文:Pinia is the official state management library for Vue 3, designed to be simple…...

手机如何防止ip关联?3种低成本方案
在当今数字化时代,手机已成为人们日常生活中不可或缺的工具,无论是社交、购物、支付还是工作,都离不开手机。然而,随着网络技术的不断发展,网络安全问题也日益突出,其中IP关联问题尤为常见。那么࿰…...

Pandas和Django的示例Demo
以下是一个结合Pandas和Django的示例Demo,展示如何在Django项目中读取、处理和展示Pandas数据。 Pandas和Django的示例Demo 前置条件: 安装python 基础设置 确保已安装Django和Pandas: pip install django pandasInstalling collected p…...
护网行动面试试题(1)
文章目录 1、描述外网打点的流程?2、举几个 FOFA 在外网打点过程中的使用小技巧?3、如何识别 CDN?4、判断出靶标的 CMS,对外网打点有什么意义?5、Apache Log4j2 的漏洞原理是什么?6、如何判断靶标站点是 wi…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信拓扑与操作 BR/EDR(经典蓝牙)和 BLE
目录 1. BR/EDR(经典蓝牙)网络结构微微网(Piconet)散射网(Scatternet)蓝牙 BR/EDR 拓扑结构示意图 2. BLE(低功耗蓝牙)网络结构广播器与观察者(Broadcaster and Observer…...

航道无人机巡检系统
随着长江干线、京杭运河等航道智慧化升级提速,传统人工巡检模式已难以满足高频次、大范围、高精度的航道管理需求。无人机凭借其灵活机动、多源感知、高效覆盖等优势,正成为航道巡检的“空中卫士”。本文将结合多地成功案例,从选型标准、技术…...

【JVM】Java虚拟机(一)——内存结构
目录 一、简介 二、程序计数器 三、虚拟机栈 栈帧结构: 特点: 四、本地方法栈 特点: 五、堆 堆结构: 特点: 对象分配过程: 六、方法区 方法区结构: 特点: 运行时常量池…...
从微积分到集合论(1630-1910)(历史简介)——第4章——现代积分理论的起源(Thomas Hawkins)
第 4 章 现代积分理论的起源 (The Origins of Modern Theories of Integration) Thomas Hawkins 目录 4.1 引言(Introduction) 4.2 Fourier分析与任意函数(Fourier analysis and arbitrary functions) 4.3 对Fourier问题的回应(Responses to Fourier)(1821-1854)…...

《Linux运维总结:宝德服务器RAID开启(方式一)》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、背景信息 说明:从客户那里退回来的一台宝德服务器,硬盘不见了,现在需要用两个2T的硬盘…...

NY118NY120美光固态闪存NY124NY129
NY118NY120美光固态闪存NY124NY129 美光NY系列固态闪存深度解析:技术、性能与行业洞察 技术架构与核心创新 美光NY系列(包括NY118、NY120、NY124、NY129等型号)作为企业级存储解决方案的代表作,延续了品牌在3D NAND技术上的深厚…...

Odoo 19 路线图(新功能)
Odoo 19 路线图(新功能) Odoo 19 路线图是Odoo官方针对下一版本的发布计划,将在自动化、合规性、用户体验、碳排放报告及本地化等领域推出超过16项新功能。本路线图详细阐述了Odoo 19如何在过往版本基础上进一步提升,助力企业优化销售、财务、运营及客户…...

基于NXP例程学习CAN UDS刷写流程
文章目录 前言1.概述1.1 诊断报文 2.协议数据单元(N_PDU)2.1 寻址信息(N_AI)2.1.1 物理寻址2.1.2 功能寻址2.1.3 常规寻址(Normal addressing)2.1.4 常规固定寻址(Normal fixed addressing)2.1.5 扩展寻址&…...
RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)
🔄 RNN循环网络:给AI装上"记忆"(superior哥AI系列第5期) 嘿!小伙伴们,又见面啦!👋 上期我们学会了让AI"看懂"图片,今天要给AI装上一个更酷的技能——…...