Rockchip RK3588 - Rockchip RKNN快速上手
----------------------------------------------------------------------------------------------------------------------------
开发板 :ArmSoM-Sige7开发板
eMMC :64GB
LPDDR4 :8GB
显示屏 :15.6英寸HDMI接口显示屏
u-boot :2017.09
linux :5.10
----------------------------------------------------------------------------------------------------------------------------
在《Rockchip RK3588 - Rockchip Linux SDK Buildroot文件系统构建》我们对Buildroot文件系统进行了详细的介绍,不过不知道你有没有留意到在配置环节【配置Target packages】中,需要配置Rockchip板级支持包,这些板级支持包是由Rockchip提供的,本节的目的实际上就是研究部分核心板级支持包,比如OpenGL ES、rknpu。
至于为什么去研究这些很简单,比如我们自己在做ubuntu根文件系统的时候,我们通常需要移植适配于硬件的动态库,因此我们就需要参考Rockchip Linux SDK文件系统的实现。
一、板级支持包回顾
回顾《Rockchip RK3588 - Rockchip Linux SDK Buildroot文件系统构建》文章【配置Target packages】小节中的配置:
Target packages --->
Hardware Platforms --->
[*] Rockchip Platform --->
Rockchip SoC (rk3588) --->
( ) rk3358 chip
(X) rk3588 chip
......
[*] Rockchip Camera Engine For ISP
Rockchip BSP packages ---> // Rockchip板级支持包,很重要
[*] Rockchip Camera Engine 3A service run in booting
Specify a directory to store xml speed up bin (disabled) --->
() Rockchip Camera Engine IQ xml file
[ ] rockchip common algorithm
[*] gstreamer1-rockchip
[*] A rockchip-mpp V4L2 wrapper plugin for chromium V4L2 VDA
[ ] Rockchip NPU power control for linux
[ ] Rockchip NPU power control combine for linux
[ ] rk n4 camera
[ ] Rockchip recovery for linux
[ ] rknpu
[ ] rknpu pcie
[ ] rknpu2
[ ] rknn_demo
[*] rockchip script
() default PCM
[ ] rkscript iodomain notice script
......
[ ] Rockchip rkupdate for linux
[*] rkwifibt
[ ] Enable static
[ ] rkwifibt wireless applicantion
[*] rockchip-alsa-config
[*] rockchip-rga
[*] prefer using rockchip-rga
[*] rockchip-mali
......
[*] wayland winsys
[*] GBM
[*] OpenGL EGL
[*] OpenGL EGL Wayland
[*] OpenGL ES
[*] OpenCL
[ ] Vulkan
[*] rockchip-mpp --->
......
除了我们在OTA升级中介绍过的Rockchip recovery for linux,还有一堆其它的编译选项,比如rknpu、OpenGL ES等,你可能好奇这些配置项是用来做什么的,但是请你按住性子往下看下去,我们会在后续文章一一介绍这些编译配置选项。
在为Buildroot自定义软件包时,在软件包目录下通常为引入.in和.mk文件,这里我们以rknpu2为例进行介绍;
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot# ll package/rockchip/rknpu2
-rw-r--r-- 1 root root 509 6月 9 2024 Config.in
-rw-r--r-- 1 root root 82 6月 9 2024 rknpu2.hash
-rw-r--r-- 1 root root 1575 6月 9 2024 rknpu2.mk
1.1 Config.in
我们首先从Config.in文件入手,该文件实际上就是定义make menuconfig支持的配置选项;
config BR2_PACKAGE_RKNPU2
bool "rknpu2"
help
"rknpu runtime lib and server"
config BR2_PACKAGE_RKNPU2_ARCH
string
depends on BR2_ARCH = "arm" || BR2_ARCH = "aarch64"
default "armhf" if BR2_ARCH="arm"
default BR2_ARCH
config BR2_PACKAGE_RKNPU2_SOC
string
depends on BR2_PACKAGE_RK3566_RK3568 || BR2_PACKAGE_RK3562 || \
BR2_PACKAGE_RK3588
default "RK3588" if BR2_PACKAGE_RK3588
default "RK356X"
if BR2_PACKAGE_RKNPU2
config BR2_PACKAGE_RKNPU2_EXAMPLE
bool "rknpu2 example"
default y
endif
BR2_PACKAGE_RKNPU2用于启用或禁用 rknpu2 包,它提供了运行时库和服务,支持RK处理器中的神经网络加速功能。
BR2_PACKAGE_RKNPU2_ARCH用于指定 rknpu2 的架构,对于RK3588配置项BR2_ARCH=aarch64,因此BR2_PACKAGE_RKNPU2_ARCH=aarch64。
BR2_PACKAGE_RKNPU2_SOC指定 rknpu2 的目标系统,对于RK3588配置项BR2_PACKAGE_RK3588=y,因此BR2_PACKAGE_RKNPU2_SOC=RK3588。
比如我们勾选了rknpu2,在生成的output/rockchip_rk3588/.config配置文件会配置:
BR2_PACKAGE_RKNPU2=y
BR2_PACKAGE_RKNPU2_ARCH="aarch64"
BR2_PACKAGE_RKNPU2_SOC="RK3588"
BR2_PACKAGE_RKNPU2_EXAMPLE=y
1.2 rknpu2.mk
buildroot编译rknpu2所需要的设置rknpu2.mk,包括源码位置、安装目录、权限设置等。
################################################################################
#
# rknpu2
#
################################################################################
RKNPU2_VERSION = 1.0.0
RKNPU2_SITE_METHOD = local
RKNPU2_SITE = $(TOPDIR)/../external/rknpu2
RKNPU2_INSTALL_STAGING = YES
RKNPU2_LICENSE = ROCKCHIP
RKNPU2_LICENSE_FILES = LICENSE
RKNPU2_ARCH = $(call qstrip,$(BR2_PACKAGE_RKNPU2_ARCH))
RKNPU2_SOC = $(call qstrip,$(BR2_PACKAGE_RKNPU2_SOC))
define RKNPU2_INSTALL_TARGET_CMDS
cp -r $(@D)/runtime/$(RKNPU2_SOC)/Linux/rknn_server/$(RKNPU2_ARCH)/* \
$(TARGET_DIR)/
cp -r $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/$(RKNPU2_ARCH)/* \
$(TARGET_DIR)/usr/lib/
endef
define RKNPU2_INSTALL_STAGING_CMDS
cp -r $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/$(RKNPU2_ARCH)/* \
$(STAGING_DIR)/usr/lib/
cp -rT $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/include \
$(STAGING_DIR)/usr/include/rknn
endef
ifeq ($(BR2_PACKAGE_RKNPU2_EXAMPLE),)
$(eval $(generic-package))
else
RKNPU2_SUBDIR = examples/rknn_common_test
RKNPU2_CONF_OPTS += -DTARGET_SOC=$(call LOWERCASE,$(RKNPU2_SOC))
define RKNPU2_INSTALL_TARGET_EXAMPLE
cp -r $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/$(RKNPU2_ARCH)/* \
$(STAGING_DIR)/usr/lib/
cp -rT $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/include \
$(STAGING_DIR)/usr/include/rknn
cp $(@D)/$(RKNPU2_SUBDIR)/rknn_common_test $(TARGET_DIR)/usr/bin/
cp -r $(@D)/$(RKNPU2_SUBDIR)/model $(TARGET_DIR)/usr/share/
endef
RKNPU2_POST_INSTALL_TARGET_HOOKS += RKNPU2_INSTALL_TARGET_EXAMPLE
$(eval $(cmake-package))
endif
1.2.1 约定配置
首先映入眼帘的是一些约定的配置:
RKNPU2_VERSION:定义了源码的版本号为1.0.0;RKNPU2_SITE:定义了源码下载地址,这里指定为<SDK>/external/rknpu2,实际上就是后文我们从github下载的rknn-toolkit2仓库的rknpu2文件夹;RKNPU2_SITE_METHOD:定义了源码下载的方式,该处指定为本地获取(local);RKNPU2_LICENSE:设置许可证类型为ROCKCHIP;RKNPU2_LICENSE_FILES:设置许可证文件LICENSE。
1.2.2 变量
RKNPU2_ARCH = $(call qstrip,$(BR2_PACKAGE_RKNPU2_ARCH))
$(call qstrip, ...) 是一个用于去掉前后空格的函数,因此RKNPU2_ARCH=aarch64;
RKNPU2_SOC = $(call qstrip,$(BR2_PACKAGE_RKNPU2_SOC))
指定RKNPU2的目标芯片(SOC),RKNPU2_SOC=RK3588。
1.2.3 CMD命令之INSTALL_TARGET
_INSTALL_TARGET_CMDS结尾的变量是在编译完之后,自动安装执行,一般是让buildroot把编译出来的的bin或lib拷贝到指定目录。
define RKNPU2_INSTALL_TARGET_CMDS
cp -r $(@D)/runtime/$(RKNPU2_SOC)/Linux/rknn_server/$(RKNPU2_ARCH)/* \
$(TARGET_DIR)/
cp -r $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/$(RKNPU2_ARCH)/* \
$(TARGET_DIR)/usr/lib/
endef
其中:$(@D)是一个自动变量,表示表示当前规则的目标路径,也就是rknpu2源码所在目录(具体路径为<SDK>/external/rknpu2);
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/external# tree rknpu2/runtime/RK3588/Linux/rknn_server/aarch64/
rknpu2/runtime/RK3588/Linux/rknn_server/aarch64/ # 复制到目标系统/目录
└── usr
└── bin
├── restart_rknn.sh
├── rknn_server
└── start_rknn.sh
2 directories, 3 files
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/external# tree rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/ # 复制到目标系统/usr/lib/目录
rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/
├── librknn_api.so -> librknnrt.so
└── librknnrt.so
0 directories, 2 files
复制 rknn_server 和 librknn_api 相关的文件到目标文件系统相应目录下。
1.2.4 CMD命令之INSTALL_STAGING
将文件安装到暂存区($(STAGING_DIR)):
define RKNPU2_INSTALL_STAGING_CMDS
cp -r $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/$(RKNPU2_ARCH)/* \
$(STAGING_DIR)/usr/lib/
cp -rT $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/include \
$(STAGING_DIR)/usr/include/rknn
endef
复制 librknn_api 库文件到暂存区的 usr/lib/ 目录,并将头文件安装到 usr/include/rknn 目录。
1.2.5 示例程序
如果配置项 BR2_PACKAGE_RKNPU2_EXAMPLE 被启用,示例程序也会被安装;
ifeq ($(BR2_PACKAGE_RKNPU2_EXAMPLE),)
$(eval $(generic-package))
else
RKNPU2_SUBDIR = examples/rknn_common_test
RKNPU2_CONF_OPTS += -DTARGET_SOC=$(call LOWERCASE,$(RKNPU2_SOC))
define RKNPU2_INSTALL_TARGET_EXAMPLE
cp -r $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/$(RKNPU2_ARCH)/* \
$(STAGING_DIR)/usr/lib/
cp -rT $(@D)/runtime/$(RKNPU2_SOC)/Linux/librknn_api/include \
$(STAGING_DIR)/usr/include/rknn
cp $(@D)/$(RKNPU2_SUBDIR)/rknn_common_test $(TARGET_DIR)/usr/bin/
cp -r $(@D)/$(RKNPU2_SUBDIR)/model $(TARGET_DIR)/usr/share/
endef
RKNPU2_POST_INSTALL_TARGET_HOOKS += RKNPU2_INSTALL_TARGET_EXAMPLE
$(eval $(cmake-package))
endif
(eval(generic-package)) 最核心的就是这个东西了,一定不能够漏了,不然源码不会被编译,这个函数就是把整个.mk构建脚本,通过Buildroot框架的方式,展开到Buildroot/目录下的Makfile中,生成的构建目标。
1.3 总结
通过前面的分析,我们已经明白rknpu2配置项的作用,其本质就是安装板端RKNPU2,涉及到的文件有: restart_rknn.sh、 rknn_server、 start_rknn.sh、librknnrt.so,并且这些文件并不是编译得到的,因此我们是无法查看其实现。
二、RKNPU介绍
2.1 NPU的由来
NPU(Nerual Processing Unit)是一种专门用于加速神经网络计算的处理器。
在深度学习技术刚开始流行的时候,人们主要使用通用计算设备,如CPU和GPU,来执行神经网络计算。但是,随着神经网络的复杂度和规模不断增加,传统的计算设备已经不能满足快速、高效地执行神经网络计算的需求。因此,研究人员开始探索如何设计一种专门用于加速神经网络计算的处理器,这就是NPU的由来。
早期的NPU主要是基于FPGA(Field Programmable Gate Array)实现的。FPGA 是一种可编程逻辑器件,可以通过编程实现各种不同的电路功能。由于FPGA具有高度的灵活性和可编程 性,可以用于实现各种不同类型的神经网络处理器。
2010年,斯坦福大学的研究人员提出了一种基于FPGA的神经网络加速器,可以实现高效的神经网络计算。此后,越来越多的研究人员开始尝试使用FPGA实现NPU。
随着深度学习技术的不断发展和普及,NPU的研究和开发也取得了越来越多的进展;
2013年,Google发布了一篇论文,介绍了一种名为Tensor Processing Unit(TPU)的定制芯片,专 门用于加速深度学习模型的训练和推理。TPU采用了特定的硬件架构和优化算法,可以实现高效、低功耗的神经网络计算。TPU的成功引起了业界的广泛关注,也促进了NPU的发展。 随后,其他公司也开始研发自己的NPU2015年,华为发布了一款名为Kirin 950的处理 器,集成了一种名为Neural Processing Unit(NPU)的模块,用于加速神经网络计算;2017年,苹果公司在2017年发布的A11芯片中集成了神经网络处理器,用于支持人脸识别等功能;2018年,华为推出了全新的昇腾(Ascend)系列处理器,其中包括专门用于加速深度学习计算的NPU模块。同年,英伟达推出了名为TensorCore的加速器,用于加速深度学习模型的训练和推理;
随着NPU技术的不断发展和普及,越来越多的公司开始将NPU集成到自己的芯片中,以 速神经网络计算。瑞芯微为了满足人工智能的需要,瑞芯微的处理器也逐渐集成了NPU,而瑞芯微处理器内置的NPU,就被称之为RKNPU。
2.2 RKNPU介绍
到目前为止,RKNPU已经经过了几代的发展,趋近成熟;
RK3399pro和RK1808初次引入了RKNPU,相比传统的CPU和GPU,在深度学习运算能力上有比较大幅度的提升;- 接下来在
RV1109和RV1126上使用了第二代NPU,提升了NPU的利用 率; - 第三代
NPU应用在RK3566和RK3568上,搭载全新NPU自研架构; - 而
RK3588搭载的 为第四代NPU,提高了带宽利用率,支持了多核扩展。
RKNPU具体发展过程如下图所示:
RKNPU1.0和RKNPU2.0被划分为了RKNPU,而RKNPU3.0、RKNPU4.0和RKNPU5.0被划分为了RKNPU2,RKNPU和RKNPU2所使用的SDK和工具套件不同。
RK3568和RK3588的NPU具有的功能如下:
| SoC类型 | NPU功能描述 |
|---|---|
| RK3588 | (1)拥有三个NPU核心 (2)支持三核协同工作,双核协同工作和独立工作 (3)使用AHB接口配置 NPU (4)使用AXI接口从内存中获取数据 (5)支持int4、int8、int16、float16、Bfloat16和tf32操作 (6)每个周期可进行1024x3 个int8 MAC操作 (7)每个周期可进行512x3 个int16 MAC操作 (8)每个周期可进行512x3 个float16 MAC操作 (9)每个周期可进行512x3 个bfloat16 MAC操作 (10)每个周期可进行256x3 个tf32 MAC操作 (11)每个周期可进行 2048x3 个int4 MAC操作 (12)每个核心有384KB的内部缓存 (13)支持转换的推理模型:TensorFlow、Caffe、Tflite、Pytorch、Onnx NN |
| RK3568 | (1)NPU支持以下特性: (2)使用AHB接口配置 NPU (3)使用AXI接口从内存中获取数据 (4)支持int8、int16、float16、Bfloat16 操作(5)每个周期可进行512个int8 MAC操作 (6)每个周期可进行128 个int16 MAC操作 (7)每个周期可进行128 个float16 MAC操作 每个周期可进行128 个 bfloat16 MAC操作(8)4(9)每个核心有256KB的内部缓存 (10)支持转换的模型:TensorFlow、Caffe、Tflite、Pytorch、OnnxNN等 |
RKNN三核架构如下图所示:
2.3 RKNPU单核框架
RKNPU单核心架构如下图所示:
2.3.1 AHB/AXI 接口
AXI 主接口【用来和内存进行连接,从中获取模型、图像的相关参数和数据】用于从连接到SoC AXI互联的内存中获取数据。AXI是 一种高性能、低延迟、可扩展的总线接口,常用于连接处理器和外设,并支持多个主设备和从设备。AXI主接口通常用于从内存中获取数据,例如从DRAM或其它存储器中读取程序和数据, 并将其传输到处理器或其他外设中进行处理和计算。
AHB从接口【用于访问寄存器,从而对RKNPU进行配置、调试和测试】用于访问寄存器进行配置、调试和测试。AHB是一种标 准化的系统总线接口,通常用于连接处理器、内存和外设等硬件电路。AHB从接口通常用于访问寄存器,例如控制和配置处理器、外设和其他硬件电路的参数和状态,以实现系统的配置、 调试和测试。
在SoC系统中,AXI主接口和AHB从接口通常被用于连接处理器、内存、外设和其他硬件电路,以实现数据传输、控制和配置等功能。AXI接口通常用于高速数据传输和处理,而AHB接口通常用于配置、调试和测试等低速控制操作。
2.3.2 卷积神经网络加速单元(CNA)
卷积神经网络加速单元(Convolutional Neural Network Accelerator,CNA)是RKNPU中重要的组成部分之一。包括卷积预处理控制器、NPU内部缓存区、序列控制器、乘加运算单元和累 加器,下面对各个部分进行介绍:
- 卷积预处理控制器:卷积预处理控制器是
CNA中用于预处理卷积计算的硬件单元,可以对输入的模型权重进行 解压缩之后加载进NPU的内部缓冲区,并且可以判断零节点加速运算速度,最后将要推理的数据加载进NPU的内部缓冲区中; NPU内部缓存区(Internal Buffer):NPU内部缓存区是CNA中用于存储中间计算结果的缓存区。它可以高效地存储和管理卷积神经网络中的各种数据,包括输入数据、卷积核、卷积结果等。NPU内部缓存区采用了多级缓 存和数据重用技术,可以高效地利用计算资源和存储资源,从而进一步提高计算速度和效率;- 序列控制器(
Sequence Controller):序列控制器是CNA中用于控制卷积计算序列的硬件单元。它可以根据卷积神经网络的结构和参数,自动地配置和控制CNA中各个硬件单元的工作模式和参数。序列控制器还可以实现卷积计算的并行化和流水化,从而提高计算速度和效率; - 乘加运算单元(
Multiply-Accumulate Unit,MAC):乘加运算单元是CNA中用于执行卷积计算的硬件单元。它可以对输入数据和卷积核进行乘 法和累加运算,从而得到卷积计算结果。乘加运算单元采用了高度并行的设计,可以同时执行多个卷积计算操作,从而大大提高计算速度和效率; - 累加器(
Accumulator):累加器是CNA中用于累加卷积计算结果的硬件单元。它可以高效地累加卷积计算结果,从 而得到最终的输出结果。累加器可以采用多种精度,可以适应不同的计算精度要求; - 数据处理单元(
Data Processing Unit,DPU):主要处理单个数据的计算,例如Leaky ReLU、ReLU、 ReluX、Sigmoid、Tanh等。它还提供了一些功能,例如Softmax、转置、数据格式转换等;- 数据处理单元是一种硬件电路,用于加速神经网络的计算过程。它通常被用于处理前向计算过程中的单个数据,例如卷积层和全连接层中的激活函数计算。不同的激活函数需要不同的 计算操作,例如
ReLU需要计算max(0,x)、Sigmoid需要计算1/(1+exp(-x)),而数据处理单元可 以通过硬件电路来实现这些计算操作,从而提高神经网络的计算性能和效率; - 除了激活函数计算之外,数据处理单元还提供了一些其他的函数,例如
Softmax、转置、 数据格式转换等。这些函数通常被用于神经网络模型的构建和优化过程中,例如将模型的输出 转换为概率分布、重新排列张量的维度、将数据从一种格式转换为另一种格式等。
- 数据处理单元是一种硬件电路,用于加速神经网络的计算过程。它通常被用于处理前向计算过程中的单个数据,例如卷积层和全连接层中的激活函数计算。不同的激活函数需要不同的 计算操作,例如
2.3.3 平面处理单元(Planar Processing Unit,PPU)
平面处理单元(Planar Processing Unit)主要提供对数据处理单元的输出数据进行平面操作的功能,例如平均池化、最大值池化、最小值池化等。
平面处理单元是一种硬件电路,用于加速神经网络的计算过程。它通常被用于对数据处理 单元的输出数据进行平面操作,例如在卷积神经网络中,对卷积层的输出进行池化操作,以降 低数据维度和减少计算量。平面处理单元可以通过硬件电路来实现这些操作,从而提高神经网 络的计算性能和效率。
平面处理单元支持多种平面操作,例如平均池化、最大值池化、最小值池化等。这些操作 可以通过不同的参数来控制池化窗口的大小和步幅等,从而适应不同的应用场景和要求。
2.4 NPU性能计算
NPU(Neural Processing Unit)是专门用于神经网络计算的处理器,其算力是指每秒可以处理的运算次数,通常以TOPS(Tera Operations Per Second)为单位进行衡量。
每个周期的理论峰值性能为Perf=MACs*2(ops/cycle),其中MACs表示每个周期内可以达到的乘加操作次数,在前面RKNPU介绍 章节已经对单个周期的每个数据类型可以进行的乘加操作次数进行了列举,而算力指的是运算的次数,所以要将乘加操作分解为一次乘法和一次加法,也就是最后乘以2的由来。当NPU的频率为f时,则每秒的理论峰值性能为Perf=MACs*2*f(ops/s)。
以RK3588 int 8数据类型为例进行性能计算演示:
RK3588每个周期可进行1024x3个int8 MAC操作;RK3588的NPU算力为1G HZ;- 理论峰值性能计算公式为
Perf=MACs*2*f(ops/s);
综上RK3588 int 8理论峰值性能为Perf=1024x3x1G×2 = 6 TOPS,6 TOPS即每秒处理6万亿次操作
2.5 RKNPU应用领域
Rockchip NPU是一种专门用于深度学习应用的高性能处理器,并且在多个应用场景中都有广泛的应用。
2.5.1 计算机视觉
计算机视觉RKNPU最常见的应用场景之一。其主要应用包括:
- 图像分类:将图像分成不同的类别。例如,将一张图片分成猫、狗、马等不同的类别;
- 目标检测:检测图像中不同物体的位置和类别。例如,检测图像中的人、汽车、建筑等;
- 图像分割:将图像中的不同物体分割出来。例如,将一张街景图片分割成不同的车辆、 建筑、行人等。
- 人脸识别:识别图像中的人脸并将其与已知的人脸进行匹配。
- 行为识别:识别视频中的不同行为,例如人的走路、跑步、跳舞等。
2.5.2 语音识别
语音识别是另一个常见的RKNPU应用场景。其主要应用包括:
- 语音识别:将语音信号转换成文字;
- 语音合成:根据文字生成语音信号;
- 说话人识别:识别语音信号的说话人身份。
2.5.3 自然语言处理
RKNPU也可以用于自然语言处理。其主要应用包括:
- 情感分析:判断一段文本表达的情感是正面、负面还是中性;
- 文本分类:将文本分成不同的类别。例如,将一封电子邮件分为垃圾邮件和非垃圾邮件;
- 文本生成:根据给定的文本生成新的文本,例如自动写作、机器翻译等;
- 机器翻译:将一种语言的文本翻译成另一种语言的文本。
2.5.4 医疗保健
在医疗保健领域,可以用于:
- 疾病预测:利用患者的病历和生理数据等信息预测患者的疾病风险和病情发展;
- 医学影像分析:对医学影像数据进行分析和识别,例如
CT、MRI等; - 药物发现:利用深度学习模型预测分子与靶点之间的相互作用,从而加速药物研发;
- 基因组学:利用深度学习模型对基因序列进行分析和预测,例如基因突变、基因表达等。
2.5.5 金融服务
在金融服务领域,可以用于:
- 风险评估:利用深度学习模型对客户信用、还款能力等进行评估;
- 欺诈检测:利用深度学习模型检测信用卡欺诈、账户盗用等非法行为;
- 股票预测:利用深度学习模型预测股票价格和趋势;
- 投资组合优化:利用深度学习模型对投资组合进行优化,降低风险并提高收益。
三 RKNPU推理软件框架
3.1 RKNPU硬件层
有关NPU硬件前文以纪念馆进行了详细介绍,这里不重复介绍。
3.2 RKNPU驱动层
RKNPU的驱动层是连接上层应用和RKNPU硬件的桥梁。驱动层的主要作用是将应用程序需要推理的内容提交给 RKNPU进行计算,从而加速神经网络的训练和推理过程。
具体来说,驱动层需要完成以下任务:
- 硬件初始化:驱动层需要初始化
RKNPU硬件,包括设置寄存器、分配内存等操作,以确保RKNPU可以正常工作; - 数据传输:驱动层需要将数据从主机内存传输到
RKNPU内存中,以便进行计算。在计算完成后,驱动层还需要将计算结果传输回主机内存; - 计算任务调度:驱动层需要根据应用程序的需求,管理和分配
RKNPU的计算资源,以确保多个计算任务之间不会互相干扰。
3.3 RKNPU应用层
RKNPU应用层由AI应用程序、RKNN API以及运行时所需要的库所组成。
开发者通过调用瑞芯微提供好的API接口进行AI应用的开发,瑞芯微分别提供了C语言和python语言这两种 API帮助开发者进行嵌入式设备部署,python语言提供的接口较为简单, 旨在帮助用户进行前期的模型检测、测试以及应用调试,而要想得到更好的效果从而真正应用到实际项目中就要使用C API接口了。
而无论是由C API接口还是python的API接口编写的应用程序,要想实际运行都需要相应的动态库,动态库包含这些API的具体实现,这些动态库由瑞芯微所提供。而我们只需要根据 瑞芯微所提供的API编写对应的应用程序即可。
3.4 RKNN组件介绍
瑞芯微官方提供的RKNN组件包括 RKNPU2、 RKNN Toolkit2 、 RKLLM-Toolkit 和RKNPU驱动等。
RKNPU2开发套件有一个运行库(librknnrt.so等),提供c/c++编程接口,用来部署推理RKNN模型,接口适用于Linux或者Android系统;RKNN Toolkit2开发套件(Python接口)提供了在PC,Rockchip NPU平台上进行模型转换、量化功能、模型推理、性能和内存评估、量化精度分析、模型加密等功能。 该套件中还有一个RKNN Toolkit Lite2,它提供了一个Python编程接口,可以在板端部署RKNN模型;RKLLM-Toolkit是为用户提供在计算机上进行大语言模型(Large Language Model,LLM)的量化、转换的开发套件,支持将Hugging Face格式的大语言模型转换为RKLLM模型;RKNPU驱动提供了NPU硬件接口程序,板卡系统固件都已经适配好。
另外,还有 RKNN Model Zoo 模型仓库,是基于RKNN工具链开发,提供了目前主流算法的部署例程(包括Python API和C API例程)。
3.4.1 RKNN模型
RKNN(Rockchip Neural Network)是瑞芯微公司开发的一种神经网络模型格式,它可以将常见的深度学习模型转换为适用于瑞芯微的AI加速器RKNPU的模型格式。RKNN模型的优点是在保证精度的同时,可以实现高效的推理和低功耗的计算。
下面是RKNN模型的详细介绍:
RKNN模型的文件格式:RKNN模型使用自定义的文件格式来表示神经网络模型。它将神经网络模型划分为两个部分:静态部分和动态部分;静态部分包括模型的网络结构和权重,而动态部分包括输入输出的形状和类型等信息。使用这种格式可以减少模型的存储空间和加载时间;RKNN模型的转换工具:为了将其他常见的深度学习模型转换为RKNN模型,瑞芯微提供了一个转换工具RKNN-Toolkit2。该工具支持将TensorFlow、Caffe、MXNet等框架训练出来的模型转换为RKNN模型,并且支持对模型进行量化、融合等优化操作,以提高运行效率;RKNN模型的部署和推理:RKNN模型可以通过RKNPU硬件进行高效的推理。在部署RKNN模型时,开发者需要使用RKNPU提供的SDK,并调用相应的API接口来加载和运行RKNN模型。 由于RKNPU硬件的优化,RKNN模型可以实现高效的推理和低功耗的计算。

对于Caffe、TensorFlow等其他模型,想要在RK3588平台运行,需要先进行模型转换。可以使用RKNN-Toolkit2工具将模型转换成RKNN格式。
3.4.2 RKNN-Toolkit2工具
RKNN-Toolkit2是为用户提供在PC、Rockchip NPU平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的Python接口可以便捷地完成各种操作。
工具的全部功能简单介绍如下:
- 模型转换:支持
Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch等模型转为RKNN模型,并支持RKNN模型导入导出,RKNN模型能够在Rockchip NPU平台上加载使用; - 量化功能: 支持将浮点模型量化为定点模型,目前支持的量化方法为非对称量化 (
asymmetric_quantized-8及asymmetric_quantized-16),并支持混合量化功能 。asymmetric_quantized-16目前版本暂不支持; - 模型推理:能够在
PC上模拟Rockchip NPU运行RKNN模型并获取推理结果; 或将RKNN模型分发到指定的NPU设备上进行推理并获取推理结果; - 性能评估:将
RKNN模型分发到指定NPU设备上运行,以评估模型在实际设备上运行时的性能; - 内存评估:评估模型运行时的内存的占用情况。使用该功能时,必须将
RKNN模型分发到NPU设备中运行,并调用相关接口获取内存使用信息; - 量化精度分析:该功能将给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距离,以便于分析量化误差是如何出现的,为提高量化模型的精度提供思路;
系统依赖:RKNN-Toolkit2目前版本适用系统ubuntu 18.04(x64)及以上,工具只能安装在PC上,暂不支持 Windows、MacOS、Debian等操作系统;
python版本:3.6~3.11;
python依赖库:详见rknn-toolkit2/packages/packages/x86_64/requirements_xx,比如:requirements_cp310-2.3.0.txt:
# if install failed, please change the pip source to 'https://pypi.tuna.tsinghua.edu.cn/simple/'
# base deps
protobuf>=4.21.6,<=4.25.4
# utils
psutil>=5.9.0
ruamel.yaml>=0.17.21
scipy>=1.9.3
tqdm>=4.64.1
opencv-python>=4.5.5.64
fast-histogram>=0.11
numpy<=1.26.4
# base
onnx>=1.10.0
onnxruntime>=1.12.0
torch>=1.10.1,<=2.4.0
# tensorflow>=2.8.0rc0,<=2.14.0
四、搭建RK3588 RKNPU开发环境
RK3588内置NPU模块处理性能最高可达6TOPS(即每秒处理6万亿次操作)。这款NPU不仅拥有强大的计算能力,支持TensorFlow、Caffe、Tflite、Pytorch、Onnx NN、Android NN等常见框架。
使用该NPU需要下载RKNN SDK,RKNN SDK为带有NPU的RK3588S/RK3588芯片平台提供编程接口,能够帮助用户部署使用RKNN-Toolkit2导出的RKNN模型,加速AI应用的落地。

在PC端主要是进行模型训练和模型转换等,可以选择Windows系统,或者Windows上的虚拟机ubuntu,Docker的linux系统,或者云服务器等等。
在PC端需要安装常用软件和库,比如pycharm、Python、交叉编译器等, 安装一些深度学习框架,比如Pytorch,TensorFlow,PaddlePaddle等等。 各种软件的使用,建议创建虚拟环境来隔离,常用Python虚拟环境和Anaconda或者Miniconda。
在开发板上,系统使用ubuntu或者debian,内核默认适配rknn驱动,其它rknn相关组件均包含。 另外,还有一些常用的软件和库,例如python,cmake,make,gcc,opencv等等。
4.1 RKNN开发流程
深度学习模型工作流程大致可分为训练和推理,而在板块上部署模型,具体的步骤如下:
- 模型训练:模型训练前需要根据具体项目问题,选择模型,数据采集,然后使用适合的深度学习框架进行模型训练, 其中关于
RKNN模型算子的支持请参考RKNN_Compiler_Support_Operator_List。 - 模型转换:将训练的深度学习模型会被转化为
RKNN格式的模型; - 模型评估:将使用
RKNN-Toolkit2工具量化和分析模型性能,包括精度、连板推理性能和内存占用等关键指标, 根据模型的评估尝试修改和优化模型,一些模型的优化可以参考下RKNPU_User_Guide_RKNN_SDK。 - 板端推理:将转换的
RKNN模型部署到板卡上,具体可以查看下rknpu运行库和RKNN-Toolkit-lite2的使用。
后面教程测试,PC端是使用ubuntu 22.04、Python3.8, 进行模型训练和转换,开发板系统是以debian11、ubuntu 20.04为主,进行部署推理测试。
4.2 软件包安装
4.2.1 ubuntu 22.04
操作系统自行安装ubuntu 22.04,安装完成后查看:
root@ubuntu:/work# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
4.2.2 安装Anaconda
Anaconda是一个用于科学计算的python发行版,支持linux,mac,windows系统,提供了包管理和环境管理的功能,Anaconda是一个打包的集合,里面装好了conda,某个版本的python,众多的packages等,科学计算工具等。
下载中科大镜像:http://mirrors.ustc.edu.cn/;
从archive路径下载Anaconda3-2023.03-0-Linux-x86_64.sh ;
root@ubuntu:/work# wget https://mirrors.ustc.edu.cn/anaconda/archive/Anaconda3-2023.03-0-Linux-x86_64.sh
开始安装:
root@ubuntu:/work# sh Anaconda3-2023.03-0-Linux-x86_64.sh
然后回车,一直往下滑动看完license,最后输入yes后,继续按下回车,然后进入安装,安装完成后输入yes初始化anaconda3。
后面选择安装路径,我是安装到/work/anaconda3文件夹下:
>>> yes
Anaconda3 will now be installed into this location:
/root/anaconda3
- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below
[/root/anaconda3] >>> /work/anaconda3 PREFIX=/work/anaconda3
Unpacking payload ...
.......
执行到这里说明已经安装成功;
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>> yes
no change /work/anaconda3/condabin/conda
no change /work/anaconda3/bin/conda
no change /work/anaconda3/bin/conda-env
no change /work/anaconda3/bin/activate
no change /work/anaconda3/bin/deactivate
no change /work/anaconda3/etc/profile.d/conda.sh
no change /work/anaconda3/etc/fish/conf.d/conda.fish
no change /work/anaconda3/shell/condabin/Conda.psm1
no change /work/anaconda3/shell/condabin/conda-hook.ps1
no change /work/anaconda3/lib/python3.10/site-packages/xontrib/conda.xsh
no change /work/anaconda3/etc/profile.d/conda.csh
modified /root/.bashrc
==> For changes to take effect, close and re-open your current shell. <==
If you'd prefer that conda's base environment not be activated on startup,
set the auto_activate_base parameter to false:
conda config --set auto_activate_base false
Thank you for installing Anaconda3!
4.2.3 创建虚拟环境(python 3.10)
输入命令:
root@ubuntu:/work# conda create -n toolkit2_3 python=3.10
其中:
toolkit2_3是环境名;3.10是python版本。
4.2.4 下载RKNN相关仓库
获取RKNN-Toolkit2安装包:
root@ubuntu:/work/sambashare/rknpu# git clone https://github.com/airockchip/rknn-toolkit2 --depth 1
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# ll
drwxr-xr-x 4 root root 4096 11月 11 11:58 autosparsity/
-rw-r--r-- 1 root root 5201 11月 11 11:58 CHANGELOG.md
drwxr-xr-x 2 root root 4096 11月 11 11:58 doc/
-rw-r--r-- 1 root root 35 11月 11 11:58 .gitignore
-rw-r--r-- 1 root root 1301 11月 11 11:58 LICENSE
-rw-r--r-- 1 root root 3169 11月 11 11:58 README.md
drwxr-xr-x 2 root root 4096 11月 11 11:58 res/
drwxr-xr-x 5 root root 4096 11月 11 11:58 rknn-toolkit2/
drwxr-xr-x 4 root root 4096 11月 11 11:58 rknn-toolkit-lite2/
drwxr-xr-x 4 root root 4096 11月 11 11:58 rknpu2/
获取RKNN Model Zoo安装包:
root@ubuntu:/work/sambashare/rknpu# git clone https://github.com/airockchip/rknn_model_zoo.git --depth 1
4.2.4.1 rknn-toolkit2
RKNN-Toolkit2资料包如下;
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# ll rknn-toolkit2
-rw-r--r-- 1 root root 20441 1月 12 11:20 CHANGELOG.txt
drwxr-xr-x 3 root root 4096 1月 12 11:20 docker/
drwxr-xr-x 9 root root 4096 1月 12 11:20 examples/
drwxr-xr-x 2 root root 4096 1月 12 11:20 packages/
4.2.4.2 rknn_toolkit_lite2
RKNN-Toolkit lite2资料包如下;
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# ll rknn_toolkit_lite2/
-rw-r--r-- 1 root root 890 1月 12 11:20 CHANGELOG.txt
drwxr-xr-x 4 root root 4096 1月 12 11:20 examples/
drwxr-xr-x 2 root root 4096 1月 12 11:20 packages/
4.2.4.3 rknpu2
rknpu2资料包如下;
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# ll rknpu2/
drwxr-xr-x 17 root root 4096 11月 11 11:58 examples/
-rw-r--r-- 1 root root 64 11月 11 11:58 rknpu.mk
drwxr-xr-x 4 root root 4096 11月 11 11:58 runtime/
4.3 安装RKNN-Toolkit2环境
激活环境中,命令为:
root@ubuntu:/work# conda activate toolkit2_3
提示:在进行后续操作之前,一定要先进入刚创建的环境,不然后面的操作是在默认环境base上进行。
4.3.1 安装依赖
安装相关库和软件包:
root@ubuntu:/work# apt-get install libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 libsm6 \
libgl1-mesa-glx libprotobuf-dev gcc
4.3.2 安装python依赖
配置pip源:
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# conda activate toolkit2_3
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
pip安装指定版本的库(教程测试时toolkit2版本是2.3,请根据python版本选择文件安装);
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# cd rknn-toolkit2
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2# pip3 install -r packages/x86_64/requirements_cp310-2.3.0.txt
4.3.3 安装RKNN-Toolkit2
需要根据python版本和rknn_toolkit2版本选择whl文件;
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2# pip3 install packages/x86_64/rknn_toolkit2-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
检查RKNN-Toolkit是否安装成功:
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2# python
Python 3.10.16 (main, Dec 11 2024, 16:24:50) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from rknn.api import RKNN
>>>
如果RKNN模块没有失败,说明安装成功。
4.4 安装板端RKNPU2
在进行如下操作前,需要给开发板烧录debian系统,系统编译参考《Rockchip RK3588 - Rockchip Linux SDK编译》,编译完成会在rockdev目录下生成如下文件;
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp# ll rockdev/
lrwxrwxrwx 1 root root 21 1月 2 21:43 boot.img -> ../../kernel/boot.img
lrwxrwxrwx 1 root root 44 7月 19 2024 MiniLoaderAll.bin -> ../../u-boot/rk3588_spl_loader_v1.13.112.bin
-rw-r--r-- 1 root root 49152 7月 19 2024 misc.img
-rw-r--r-- 1 root root 17457152 7月 19 2024 oem.img
lrwxrwxrwx 1 root root 49 7月 19 2024 parameter.txt -> ../../device/rockchip/.chips/rk3588/parameter.txt
lrwxrwxrwx 1 root root 67 7月 19 2024 recovery.img -> ../../buildroot/output/rockchip_rk3588_recovery/images/recovery.img
lrwxrwxrwx 1 root root 30 1月 19 13:19 rootfs.img -> ../../debian/linaro-rootfs.img
lrwxrwxrwx 1 root root 22 7月 19 2024 uboot.img -> ../../u-boot/uboot.img
lrwxrwxrwx 1 root root 26 7月 19 2024 update.img -> ../update/Image/update.img
-rw-r--r-- 1 root root 4472832 7月 19 2024 userdata.img
这里我只重新烧录根文件系统,接着按如下步骤操作;
- 找到开发板的电源接口,连接开发板电源适配器;
- 使用
Type C数据线连接开发板与计算机; - 按住
Mask键再长POWER键给开发版供电(保持按下Mask键5秒以上),将强制进入Maskrom模式;
使用upgrade_tool工具进行烧录:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp# ./tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool ul ./rockdev/MiniLoaderAll.bin -noreset
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp# ./tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool di -rootfs ./rockdev/rootfs.img
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp#
./tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool di -userdata userdata.img
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp# ./tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool rd
最后我们重启开发板,进入debian系统。如果不知道秘密是多少,可以连接串口,重新设置密码;
root@armsom-sige7:/# passwd
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
这里我直接将root账号密码设置为root。此外,系统还有一个普通用户:armsom/armsom。
配置/etc/resolv.conf 文件;
root@armsom-sige7:/# vim /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
root@armsom-sige7:/# systemctl restart networking
4.4.1 确认RKNPU2驱动版本
可以在板端执行以下命令查询RKNPU2驱动版本:
root@armsom-sige7:~# dmesg | grep -i rknpu
[ 3.746154] RKNPU fdab0000.npu: Adding to iommu group 0
[ 3.746305] RKNPU fdab0000.npu: RKNPU: rknpu iommu is enabled, using iommu mode
[ 3.747582] RKNPU fdab0000.npu: can't request region for resource [mem 0xfdab0000-0xfdabffff]
[ 3.747606] RKNPU fdab0000.npu: can't request region for resource [mem 0xfdac0000-0xfdacffff]
[ 3.747624] RKNPU fdab0000.npu: can't request region for resource [mem 0xfdad0000-0xfdadffff]
[ 3.747957] [drm] Initialized rknpu 0.9.2 20230825 for fdab0000.npu on minor 1
[ 3.751409] RKNPU fdab0000.npu: RKNPU: bin=0
[ 3.751618] RKNPU fdab0000.npu: leakage=9
[ 3.751766] debugfs: Directory 'fdab0000.npu-rknpu' with parent 'vdd_npu_s0' already present!
[ 3.759181] RKNPU fdab0000.npu: pvtm=890
[ 3.764006] RKNPU fdab0000.npu: pvtm-volt-sel=4
[ 3.766556] RKNPU fdab0000.npu: avs=0
[ 3.766999] RKNPU fdab0000.npu: l=10000 h=85000 hyst=5000 l_limit=0 h_limit=800000000 h_table=0
[ 3.775298] RKNPU fdab0000.npu: failed to find power_model node
[ 3.775331] RKNPU fdab0000.npu: RKNPU: failed to initialize power model
[ 3.775355] RKNPU fdab0000.npu: RKNPU: failed to get dynamic-coefficient
如下图所示,当前RKNPU2驱动版本为0.9.2;
[ 3.747957] [drm] Initialized rknpu 0.9.2 20230825 for fdab0000.npu on minor 1
Rockchip开发板的官方固件均自带RKNPU2驱动。若以上命令查询不到NPU驱动版本,则可能使用的是第三方固件,其中可能没有安装NPU驱动。
如果有固件源码,可以在kernel config中将CONFIG_ROCKCHIP_RKNPU选项的值改成y以集成NPU驱动,然后重新编译内核驱动并烧录。建议RKNPU2驱动版本>= 0.9.2。
4.4.2 adb驱动安装
安装adb驱动到PC端ubuntu系统;
root@ubuntu:/work# sudo apt-get install android-tools-adb
检查安装是否成功:
root@ubuntu:/work# adb version
Android Debug Bridge version 1.0.41
Version 28.0.2-debian
Installed as /usr/lib/android-sdk/platform-tools/adb
在PC端ubuntu系统执行如下命令:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp# adb devices
List of devices attached
如果RK3588无法被识别为adb设备,开发板debian系统添加:
root@armsom-sige7:~# vim /etc/init.d/.usb_config
usb_adb_en
use_hid_en
再次执行如下命令:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp# adb devices
List of devices attached
a91b637f99bdf965 device
连接成功时输出信息如下,其中a91b637f99bdf965为RK3588的设备ID。
4.4.3 检查RKNPU2环境是否安装
RKNN-Toolkit2的连板调试功能要求板端已安装RKNPU2环境,并且启动rknn_server服务。
以下是RKNPU2 环境中的两个基本概念:
RKNN Server:一个运行在开发板上的后台代理服务。该服务的主要功能是调用板端Runtime对应的接口处理计算机通过USB传输过来的数据,并将处理结果返回给计算机;RKNPU2 Runtime库(librknnrt.so):主要职责是负责在系统中加载RKNN模型,并通过调用专用的神经处理单元(NPU)执行RKNN模型的推理操作;
如果板端没有安装RKNN Server和Runtime库,或者RKNN Server和Runtime库的版本不一致,都需要重新安装RKNPU2环境。
注意:
- 若使用动态维度输入的
RKNN模型,则要求RKNN Server和Runtime库版本>= 1.5.0; - 要保证
RKNN Server、Runtime库的版本、RKNN-Toolkit2的版本是一致的,建议都安装最新的版本;
通常情况下,开发板默认已经安装版本一致的RKNPU2环境,可以通过下面命令确认(如果没有安装RKNPU2环境或者版本不一致,请按照下一节中的步骤来安装/更新RKNPU2环境):
4.4.3.1 检查RKNPU2环境是否安装
如果能够启动rknn_server服务,则代表板端已经安装RKNPU2环境。
# PC ubuntu进入板端
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp# adb shell
root@armsom-sige7:/#
# 启动 rknn_server
root@armsom-sige7:/# restart_rknn.sh
如果出现以下输出信息,则代表启动rknn_server服务成功,即已经安装RKNPU2环境。
start rknn server, version:1.5.2 (8babfea build@2023-08-25T10:29:51)
I NPUTransfer: Starting NPU Transfer Server, Transfer version 2.1.0 (b5861e7@2020-11-23T11:50:51)
4.4.3.2 检查版本是否一致
root@armsom-sige7:/# apt install binutils
# 查询rknn_server版本
root@armsom-sige7:/# strings /usr/bin/rknn_server | grep -i "rknn_server version"
rknn_server version: 1.5.2 (8babfea build@2023-08-25T10:29:51)
# 查询librknnrt.so库版本
root@armsom-sige7:/# strings /usr/lib/librknnrt.so | grep -i "librknnrt version"
librknnrt version: 1.5.2 (c6b7b351a@2023-08-23T15:28:22)
rknn_server版本为1.5.2,librknnrt.so的版本为1.5.2。
4.4.4 安装/更新RKNPU2环境
如果已经安装版本一致RKNPU2环境,则此节内容可以跳过。
进入rknpu2目录,使用adb工具将相应的rknn_server和librknnrt.so推送至板端,然后启动rknn_server,参考命令如下:
# pc ubuntu进入rknpu2 目录
root@ubuntu:/work/sambashare/rknpu# cd ./rknn-toolkit2/rknpu2
# 推送 rknn_server 到板端
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknpu2# ll runtime/Linux/rknn_server/aarch64/usr/bin/
-rw-r--r-- 1 root root 252 11月 11 11:58 restart_rknn.sh
-rw-r--r-- 1 root root 455600 11月 11 11:58 rknn_server
-rw-r--r-- 1 root root 71 11月 11 11:58 start_rknn.sh
# 注:在64位Linux系统中,BOARD_ARCH对应aarch64目录,在32位系统,对应armhf目录。
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknpu2# adb push runtime/Linux/rknn_server/${BOARD_ARCH}/usr/bin/* /usr/bin
# 推送 librknnrt.so
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknpu2# adb push runtime/Linux/librknn_api/${BOARD_ARCH}/librknnrt.so /usr/lib
# pc ubuntu进入板端
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknpu2# adb shell
# 赋予可执行权限
root@armsom-sige7:/# chmod +x /usr/bin/rknn_server
root@armsom-sige7:/# chmod +x /usr/bin/start_rknn.sh
root@armsom-sige7:/# chmod +x /usr/bin/restart_rknn.sh
# 重启 rknn_server 服务
root@armsom-sige7:/# restart_rknn.sh
4.5 安装深度学习框架
下面将演示一些深度学习框架的安装,具体详情可以参考下深度学习框架对应的官网。
这里我们以tensorFlow安装为例进行讲解。
直接命令安装最新稳定版tensorflow,也可以指定下以前版本(GPU和CPU版本已经合并);
root@ubuntu:/work# pip3 install tensorflow
验证是否安装成功:
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2# python
Python 3.10.16 (main, Dec 11 2024, 16:24:50) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2025-01-14 21:00:54.062850: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register c uFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
E0000 00:00:1736859654.076464 5598 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to registe r factory for plugin cuDNN when one has already been registered
E0000 00:00:1736859654.080442 5598 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to regis ter factory for plugin cuBLAS when one has already been registered
2025-01-14 21:00:54.094649: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is opti mized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate co mpiler flags.
>>> gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
2025-01-14 21:00:58.240421: E external/local_xla/xla/stream_executor/cuda/cuda_driver.cc:152] failed call to cu Init: INTERNAL: CUDA error: Failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
>>> cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
>>> print(gpus, cpus)
[] [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
由于我是用的电脑并没有GPU,所以这里就没有安装CUDA和cudnn。
五、RKNN-Toolkit2接口使用
本节将介绍如何快速在开发板上运行示例程序,内容分为三个部分:
RKNN Model Zoo介绍;RKNN Python Demo使用方法;RKNN C Demo使用方法。
5.1 RKNN Model Zoo介绍
RKNN Model Zoo提供了示例代码,旨在帮助用户快速在Rockchip的开发板上运行各种常用模型,整个工程的目录结构如下:
root@ubuntu:/work/sambashare/rknpu# ll rknn_model_zoo/
drwxr-xr-x 14 root root 4096 1月 14 22:24 3rdparty/
drwxr-xr-x 2 root root 4096 1月 14 22:24 asset/
-rw-r--r-- 1 root root 4949 1月 14 22:24 build-android.sh
-rw-r--r-- 1 root root 5293 1月 14 22:24 build-linux.sh
drwxr-xr-x 6 root root 4096 1月 14 22:24 datasets/
drwxr-xr-x 2 root root 4096 1月 14 22:24 docs/
drwxr-xr-x 30 root root 4096 1月 14 22:24 examples/
-rw-r--r-- 1 root root 8719 1月 14 22:24 FAQ_CN.md
-rw-r--r-- 1 root root 10212 1月 14 22:24 FAQ.md
drwxr-xr-x 8 root root 4096 1月 14 22:24 .git/
-rw-r--r-- 1 root root 772 1月 14 22:24 .gitignore
-rw-r--r-- 1 root root 11357 1月 14 22:24 LICENSE
drwxr-xr-x 2 root root 4096 1月 14 22:24 py_utils/
-rw-r--r-- 1 root root 27350 1月 14 22:24 README_CN.md
-rw-r--r-- 1 root root 28033 1月 14 22:24 README.md
-rw-r--r-- 1 root root 11713 1月 14 22:24 scaling_frequency.sh
drwxr-xr-x 2 root root 4096 1月 14 22:24 utils/
其中,examples目录包括了一些常用模型的示例,例如MobileNet和YOLO等。每个模型示例提供了Python和C/C++两个版本的示例代码(为了方便描述,后续用RKNN Python Demo和RKNN C Demo来表示)。
以 YOLOv5模型为例,其目录结构如下:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo# tree ./examples/yolov5 -d 1
./examples/yolov5
├── cpp # C/C++ 版本的示例代码
│ ├── rknpu1
│ └── rknpu2
├── model # 模型、测试图片等文件
├── model_comparison
└── python # 模型转换脚本和Python版本的示例代码
5.2 RKNN Python Demo使用方法
下面以YOLOv5模型为例,介绍RKNN Python Demo的使用方法。
注:不同的RKNN Python Demo用法存在差异,请按照各自目录下README.md中的步骤运行。
5.2.1 准备模型
进入rknn_model_zoo/examples/yolov5/model目录,运行download_model.sh脚本,脚本内容如下:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/model# wget -O ./yolov5s_relu.onnx https://ftrg.zbox.filez.com/v2/delivery/data/95f00b0fc900458ba134f8b180b3f7a1/examples/yolov5/yolov5s_relu.onnx
该脚本将下载一个可用的YOLOv5 ONNX模型,并存放在当前model目录下:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/model# sh download_model.sh
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/model# ll
-rw-r--r-- 1 root root 96 1月 14 22:24 anchors_yolov5.txt
-rw-r--r-- 1 root root 181374 1月 14 22:24 bus.jpg
-rw-r--r-- 1 root root 621 1月 14 22:24 coco_80_labels_list.txt
-rw-r--r-- 1 root root 140 1月 14 22:24 download_model.sh
-rw-r--r-- 1 root root 28935807 1月 14 22:33 yolov5s_relu.onnx
下载好的onnx模型存放路径为model/yolov5s_relu.onnx。
5.2.2 模型转换
进入rknn_model_zoo/examples/yolov5/python目录,运行convert.py脚本,该脚本将原始的ONNX模型转成RKNN模型;
# 用法: python convert.py model_path [rk3566|rk3588|rk3562] [i8/fp] [output_path]
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/python# python convert.py ../model/yolov5s_relu.onnx rk3588 i8 ../model/yolov5s_relu.rknn
其中convert.py代码如下:
import sys
from rknn.api import RKNN
DATASET_PATH = '../../../datasets/COCO/coco_subset_20.txt'
DEFAULT_RKNN_PATH = '../model/yolov5.rknn'
DEFAULT_QUANT = True
def parse_arg():
if len(sys.argv) < 3:
print("Usage: python3 {} onnx_model_path [platform] [dtype(optional)] [output_rknn_path(optional)]".format(sys.argv[0]))
print(" platform choose from [rk3562,rk3566,rk3568,rk3576,rk3588,rv1103,rv1106,rk1808,rv1109,rv1126]")
print(" dtype choose from [i8, fp] for [rk3562,rk3566,rk3568,rk3576,rk3588,rv1103,rv1106]")
print(" dtype choose from [u8, fp] for [rk1808,rv1109,rv1126]")
exit(1)
model_path = sys.argv[1]
platform = sys.argv[2]
do_quant = DEFAULT_QUANT
if len(sys.argv) > 3:
model_type = sys.argv[3]
if model_type not in ['i8', 'u8', 'fp']:
print("ERROR: Invalid model type: {}".format(model_type))
exit(1)
elif model_type in ['i8', 'u8']:
do_quant = True
else:
do_quant = False
if len(sys.argv) > 4:
output_path = sys.argv[4]
else:
output_path = DEFAULT_RKNN_PATH
return model_path, platform, do_quant, output_path
if __name__ == '__main__':
model_path, platform, do_quant, output_path = parse_arg()
# Create RKNN object
rknn = RKNN(verbose=False)
# Pre-process config
print('--> Config model')
rknn.config(mean_values=[[0, 0, 0]], std_values=[
[255, 255, 255]], target_platform=platform)
print('done')
# Load model
print('--> Loading model')
ret = rknn.load_onnx(model=model_path)
if ret != 0:
print('Load model failed!')
exit(ret)
print('done')
# Build model
print('--> Building model')
ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH)
if ret != 0:
print('Build model failed!')
exit(ret)
print('done')
5.2.3 运行RKNN Python Demo
进入rknn_model_zoo/examples/yolov5/python目录,运行yolov5.py脚本,便可通过连板调试的方式在板端运行YOLOv5模型:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/python# conda activate toolkit2_3
# 运行yolov5.py脚本,在板端运行yolov5模型
# 用法: python yolov5.py --model_path {rknn_model} --target {target_platform} --img_show
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/python# python yolov5.py --model_path ../model/yolov5s_relu.rknn --target rk3588 --img_show
use anchors from '../model/anchors_yolov5.txt', which is [[[10.0, 13.0], [16.0, 30.0], [33.0, 23.0]], [[30.0, 61.0], [62.0, 45.0], [59.0, 119.0]], [[116.0, 90.0], [156.0, 198.0], [373.0, 326.0]]]
I rknn-toolkit2 version: 2.3.0
--> Init runtime environment
adb: unable to connect for root: closed
I target set by user is: rk3588
I Get hardware info: target_platform = rk3588, os = Linux, aarch = aarch64
I Check RK3588 board npu runtime version
I Starting ntp or adb, target is RK3588
I Start adb...
I Connect to Device success!
I NPUTransfer(230162): Starting NPU Transfer Client, Transfer version 2.2.2 (12abf2a@2024-09-02T03:22:41)
I NPUTransfer(230162): TransferBuffer: min aligned size: 1024
D RKNNAPI: ==============================================
D RKNNAPI: RKNN VERSION:
D RKNNAPI: API: 2.3.0 (e80ac5c build@2024-11-07T12:57:35)
D RKNNAPI: DRV: rknn_server: 1.5.2 (8babfea build@2023-08-25T10:29:51)
D RKNNAPI: DRV: rknnrt: 1.5.2 (c6b7b351a@2023-08-23T15:28:22)
D RKNNAPI: ==============================================
D RKNNAPI: Input tensors:
D RKNNAPI: index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=1228800, w_stride = 0, size_with_stride = 0, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
D RKNNAPI: Output tensors:
D RKNNAPI: index=0, name=output0, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, w_stride = 0, size_with_stride = 0, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
D RKNNAPI: index=1, name=286, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, w_stride = 0, size_with_stride = 0, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
D RKNNAPI: index=2, name=288, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, w_stride = 0, size_with_stride = 0, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
done
Model-../model/yolov5s_relu.rknn is rknn model, starting val
W inference: The 'data_format' is not set, and its default value is 'nhwc'!
IMG: bus.jpg
person @ (209 243 286 510) 0.880
person @ (479 238 560 526) 0.871
person @ (109 238 231 534) 0.840
person @ (79 353 121 517) 0.301
......
其中,如果带上--img_show参数,则会显示结果图片。
注:这里以rk3588平台为例,如果是其他开发板,则需要修改命令中的平台类型。
如果想先在计算机端运行原始的onnx模型:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/python# python yolov5.py --model_path ../model/yolov5s_relu.onnx --img_show
默认输入图片是model/bus.jpg ,输出图片如下所示:
5.2.4 数据集精度评估(可选)
rknn_model_zoo/datasets目录存放数据集,用于精度评估,需要先下载评估数据集并保存至该目录。
例如,对于YOLOv5模型,需要下载COCO数据集。进入rknn_model_zoo/datasets/COCO目录,运行download_eval_dataset.py 脚本,该脚本将下载val2017数据集,并存放在当前COCO目录下,命令
如下:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/datasets/COCO# sh ./download_eval_dataset.py
进行数据集精度评估时,需要指定--coco_map_test参数,并指定评估数据集路径--img_folder ,命令如下:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/python# conda activate toolkit2_3
# 请先安装 pycocotools
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/python# pip install pycocotools
# 运行 yolov5.py 脚本
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/python# python yolov5.py \
--model_path ../model/yolov5s_relu.rknn \
--target rk3588 \
--img_folder ../../../datasets/COCO/val2017 \
--coco_map_test
5.3 RKNN C Demo使用方法
下面以YOLOv5模型为例,介绍RKNN C Demo的使用方法。
注:不同的RKNN C Demo用法存在差异,请按照各自目录下README.md中的步骤运行。
5.3.1 准备模型
进入rknn_model_zoo/examples/yolov5/model目录,运行download_model.sh脚本,该脚本将下载一个可用的YOLOv5 ONNX模型,并存放在当前model目录下,命令如下:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/model# sh download_model.sh
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/model# ll
-rw-r--r-- 1 root root 96 1月 14 22:24 anchors_yolov5.txt
-rw-r--r-- 1 root root 181374 1月 14 22:24 bus.jpg
-rw-r--r-- 1 root root 621 1月 14 22:24 coco_80_labels_list.txt
-rw-r--r-- 1 root root 140 1月 14 22:24 download_model.sh
-rw-r--r-- 1 root root 28935807 1月 14 22:33 yolov5s_relu.onnx
5.3.2 模型转换
进入rknn_model_zoo/examples/yolov5/python目录,运行convert.py脚本,该脚本将原始的ONNX模型转成RKNN模型;
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo/examples/yolov5/python# python convert.py ../model/yolov5s_relu.onnx rk3588 i8 ../model/yolov5s_relu.rknn
5.3.3 运行RKNN C Demo
完整运行一个RKNN C Demo,需要先将C/C++源代码编译成可执行文件,然后将可执行文件、模型文件、测试图片等相关文件推送到板端上,最后在板端运行可执行文件。
对应不同的板端系统,执行过程有所差异。下面以Linux 系统的RK3588平台为例,简要介绍运行RKNN C Demo的过程。
5.3.3.1 编译
需要使用rknn_model_zoo目录下的build-linux.sh脚本进行编译。在运行build-linux.sh脚本之前,需要指定编译器的路径GCC_COMPILER为本地的GCC编译器路径。即在build-linux.sh脚本中,需要加入以下命令:
GCC_COMPILER=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
接着执行如下命令:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo# chmod +x ./build-linux.sh
# 运行 build-linux.sh 脚本
# 用法:./build-linux.sh -t <target> -a <arch> -d <build_demo_name> [-b <build_type>] [-m]
# -t : target (rk356x/rk3588) # 平台类型,rk3568/rk3566 都统一为rk356x
# -a : arch (aarch64/armhf) # 板端系统架构
# -d : demo name # 对应 examples 目录下子文件夹的名称,如yolov5、mobilenet
# -b : build_type(Debug/Release)
# -m : enable address sanitizer, build_type need set to Debug
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo# ./build-linux.sh -t rk3588 -a aarch64 -d yolov5
./build-linux.sh -t rk3588 -a aarch64 -d yolov5
/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
===================================
BUILD_DEMO_NAME=yolov5
BUILD_DEMO_PATH=examples/yolov5/cpp
TARGET_SOC=rk3588
TARGET_ARCH=aarch64
BUILD_TYPE=Release
ENABLE_ASAN=OFF
DISABLE_RGA=OFF
INSTALL_DIR=/work/sambashare/rknpu/rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov5_demo
BUILD_DIR=/work/sambashare/rknpu/rknn_model_zoo/build/build_rknn_yolov5_demo_rk3588_linux_aarch64_Release
CC=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
CXX=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++
===================================
-- The C compiler identification is GNU 10.5.0
-- The CXX compiler identification is GNU 10.5.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /work/sambashare/rknpu/rknn_model_zoo/build/build_rknn_yolov5_demo_rk3588_linux_aarch64_Release
[ 8%] Building C object utils.out/CMakeFiles/fileutils.dir/file_utils.c.o
[ 16%] Building C object utils.out/CMakeFiles/imageutils.dir/image_utils.c.o
[ 25%] Building C object utils.out/CMakeFiles/imagedrawing.dir/image_drawing.c.o
......
[100%] Built target audioutils
Install the project...
-- Install configuration: "Release"
-- Installing: /work/sambashare/rknpu/rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov5_demo/./rknn_yolov5_demo
-- Set runtime path of "/work/sambashare/rknpu/rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov5_demo/./rknn_yolov5_demo" to "$ORIGIN/lib"
-- Installing: /work/sambashare/rknpu/rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov5_demo/./model/bus.jpg
-- Installing: /work/sambashare/rknpu/rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov5_demo/./model/coco_80_labels_list.txt
-- Installing: /work/sambashare/rknpu/rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov5_demo/model/yolov5s_relu.rknn
-- Installing: /work/sambashare/rknpu/rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov5_demo/lib/librknnrt.so
-- Installing: /work/sambashare/rknpu/rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov5_demo/lib/librga.so
如果需要重新编译,删除build下对应目录即可。
5.3.3.2 推送文件到板端
编译完成后,会在rknn_model_zoo目录下产生install文件夹, 其中有编译好的可执行文件,以及测试图片等相关文件。参考目录结构如下:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo# tree install/
install/
└── rk3588_linux_aarch64 # rk3588平台
└── rknn_yolov5_demo
├── lib # 依赖库
│ ├── librga.so
│ └── librknnrt.so
├── model # 存放模型、测试图片等文件
│ ├── bus.jpg
│ ├── coco_80_labels_list.txt
│ └── yolov5s_relu.rknn
└── rknn_yolov5_demo # 可执行文件
4 directories, 6 files
执行如下命令:
# 推送整个 rknn_yolov5_demo 文件夹到板端
# 注:rknn_yolov5_demo 文件夹下有一个同名的可执行文件 rknn_yolov5_demo
# 注:使用不同的模型和平台时,建议直接在 install 下找对应的路径
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo# adb push install/rk3588_linux_aarch64/rknn_yolov5_demo /data/
install/rk3588_linux_aarch64/rknn_yolov5_demo/: 6 files pushed. 0.9 MB/s (17023251 bytes in 17.261s)
5.3.3.3 板端运行Demo
执行以下命令,在板端运行可执行文件:
# 进入板端
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo# adb shell
# 进入 rknn_yolov5_demo 目录
root@armsom-sige7:/# cd /data/rknn_yolov5_demo/
# 设置依赖库环境
root@armsom-sige7:/data/rknn_yolov5_demo# export LD_LIBRARY_PATH=./lib
# 运行可执行文件
# 用法: ./rknn_yolov5_demo <model_path> <input_path>
root@armsom-sige7:/data/rknn_yolov5_demo# ./rknn_yolov5_demo model/yolov5s_relu.rknn model/bus.jpg
load lable ./model/coco_80_labels_list.txt
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, 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, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
index=1, name=286, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
index=2, name=288, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, 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
origin size=640x640 crop size=640x640
input image: 640 x 640, subsampling: 4:2:0, colorspace: YCbCr, orientation: 1
scale=1.000000 dst_box=(0 0 639 639) allow_slight_change=1 _left_offset=0 _top_offset=0 padding_w=0 padding_h=0
rga_api version 1.10.1_[0]
rknn_run
person @ (209 243 286 510) 0.880
person @ (479 238 560 526) 0.871
person @ (109 238 231 534) 0.840
bus @ (91 129 555 464) 0.692
person @ (79 353 121 517) 0.301
write_image path: out.png width=640 height=640 channel=3 data=0x3e57cb50
5.3.3.4 查看结果
默认情况下,输出图片保存路径为rknn_yolov5_demo/out.png,可以通过adb工具从板端拉取到本地查看,在本地计算机的终端中,执行以下命令:
root@ubuntu:/work/sambashare/rknpu/rknn_model_zoo# adb pull /data/rknn_yolov5_demo/out.png
/data/rknn_yolov5_demo/out.png: 1 file pulled. 1.1 MB/s (719636 bytes in 0.605s)
输出图片如下所示:
六、常见问题
6.1 命令adb devices查看不到设备
可以尝试以下方式来解决此问题:检查连线是否正确、重新插拔数据线、换计算机另一个USB端口来连接数据线、更换数据线。
6.2 手动启动rknn_server服务
RKNN-Toolkit2的连板调试功能要求板端已安装RKNPU2环境,并且启动rknn_server服务。
但有些开发板系统没有开机自启动rknn_server服务,这导致在运行RKNN Python Demo时会遇到如init_runtime: The rknn_server on the concected device is abnormal.的报错信息。
此时请参考前面章节《检查RKNPU2环境是否安装》中启动rknn_server服务的相关内容手动启动rknn_server 服务。
参考文章
[1] 01_Rockchip_RKNPU_Quick_Start_RKNN_SDK_V2.3.0_CN.pdff
[2] AI嵌入式人工智能开发 --- 【1】初始RKNPU
[3] 02_Rockchip_RKNPU_User_Guide_RKNN_SDK_V2.3.0_CN.pdf
[4] AI嵌入式RK3588人工智能开发 --- 【2】RKNPU软件推理框架
[5] 嵌入式AI应用开发实战指南

浙公网安备 33010602011771号