[Rock Pi] (四) RK3588S开发板部署yolov5模型及resnet18模型(官方提供的模型)

参考

rockchip rknn-tookit2
rockchip rknpu2

开发环境介绍

宿主机 HostPC: 装有ubuntu22.04(其它亦可参考)
Docker: ubuntu20.04
开发板:rock 5a with rk3588s 芯片
宿主机环境配置
[Rock Pi 1] Rock pi 开启VNC远程桌面适用于VNC+KDE桌面
[Rock Pi 2] rknn宿主机端配置之docker开发环境部署

YOLO v5 模型部署(C++版)

源码下载(宿主机端)

#根据上篇文章创建的docker虚拟机编号执行下面指令进入docker虚拟机
dengml@dengml-SER:~$ sudo docker exec -it -u dengml -w /home/dengml 612c918d5027 /bin/bash
[sudo] dengml 的密码:
dengml@612c918d5027:~$ cd /data/ubuntu/rockpi/rknn-toolkit2
#执行以下命令使能之前创建的python虚拟环境(虽然本节似乎没用到宿主机的python)
dengml@612c918d5027:/data/ubuntu/rockpi/rknn-toolkit2$ source venv/bin/activate
#获取rknpu2源代码
(venv) dengml@612c918d5027:/data/ubuntu/rockpi$ git clone https://kgithub.com/rockchip-linux/rknpu2.git

此代码中包含yolo v5等多个模型的demo,这里我们先部署官方提供的rknn模型

安装交叉编译工具(宿主机端)

ubuntu软件库里已经包含了交叉aarch64-linux交叉编译工具链,因此本着一切从简的原则可以直接使用apt 安装如下:

$ sudo apt update
$ sudo apt-get install gcc-aarch64-linux-gnu
$ sudo apt-get install g++-aarch64-linux-gnu
#安装 cmake 编译工具
$ sudo apt install cmake

源码编译(宿主机端)

$ cd rknpu2/examples/rknn_yolov5_demo
$ ./build-linux_RK3588.sh
#代码通过scp到开发板端,也可以通过winscp、samba、等其他方式
$ scp -r install/rknn_yolov5_demo_Linux rock@192.168.1.13:~/work

验证(开发板端)

编译后的二进制及模型文件scp到板子后,通过ssh登陆到开发板端
develop board

#打开cp过来的目录
rock@rock-5a:~$ cd work/rknn_yolov5_demo_Linux/
#添加运行依赖的动态库
rock@rock-5a:~/work/rknn_yolov5_demo_Linux$ export LD_LIBRARY_PATH=./lib
#执行识别命令
rock@rock-5a:~/work/rknn_yolov5_demo_Linux$ ./rknn_yolov5_demo model/RK3588/yolov5s-640-640.rknn model/bus.jpg

命令执行后结果如图所示
在这里插入图片描述

运行中的log如图所示,首先在moba界面点击SFTP文档管理器界面(标记为“1”处),点击“2”处一般可以直接打开右边终端所在的目录,如果不能自动打开,就在“3”处输入我们右边终端所在的目录,如上图所示。我们可以看到生成了一个新的文件out.jpg, 即模型生成的结果。至此,C++版本的rknn模型部署完成。双击打开,结果如下
result_by_c

resnet18 模型部署到开发板(Python 版)

开发板安装conda 虚拟环境

参考:[Rock Pi] (三) RK3588平台嵌入式linux平台安装配置miniconda
最后激活rknn虚拟python环境。

加载rknn-toolkit2仓库

将rknn-toolkit2拷贝到开发板。可以直接在github上克隆,或者通过scp的方式从host pc复制到开发板。如下:

(rknn) rock@rock-5a:~/work/rknn-toolkit2$ pwd
/home/rock/work/rknn-toolkit2

安装依赖库

首先需要为板子的系统添加国内源,我的板子运行的时ubuntu22.04系统,其他版本的系统需要参考网上的教程,添加国内源,这里讲一下ubuntu22.04 arm64版本添加国内源的方法(添加源的链接有差异,方法一致)。编辑/etc/apt/source.list 文件,添加国内源的路径,添加后的该文件内容为:

deb http://ports.ubuntu.com/ubuntu-ports jammy main restricted universe multiverse
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse

添加完成后需要更新软件源

sudo apt update
sudo apt install python3-dev
···
安装完成后,安装rknn所需的python库
···b
(rknn) rock@rock-5a:~/work/rknn-toolkit2/rknn_toolkit_lite2$ pip3 install ./packages/rknn_toolkit_lite2-1.5.2-cp310-cp310-linux_aarch64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple

由于模型运行以来rk官方的runtime库,所以需要在github上下载rknpu的库:rknpu2 。并将runtime库复制到板子的/usr/lib目录下

git clone -b master https://github.com/rockchip-linux/rknpu2.git
sudo cp  rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknn* /usr/lib/

运行示例

打开rknn-toolkit-lite, 并执行test.py, 得到输出,根据输出的Top 5 结果,该模型可以识别出图像中的物体名称。
中间遇到一些问题。总结在下方

(rknn) rock@rock-5a:~:cd ~/work/rknn-toolkit2/rknn_toolkit_lite2/examples/inference_with_lite
(rknn) rock@rock-5a:~/work/rknn-toolkit2/rknn_toolkit_lite2/examples/inference_with_lite$ python test.py
--> Load RKNN model
done
--> Init runtime environment
I RKNN: [22:27:50.764] RKNN Runtime Information: librknnrt version: 1.5.2 (c6b7b351a@2023-08-23T15:28:22)
I RKNN: [22:27:50.764] RKNN Driver Information: version: 0.8.2
W RKNN: [22:27:50.764] Current driver version: 0.8.2, recommend to upgrade the driver to the new version: >= 0.8.8
I RKNN: [22:27:50.765] RKNN Model Information: version: 6, toolkit version: 1.5.2-source_code(compiler version: 1.5.2 (71720f3fc@2023-08-21T09:35:42)), target: RKNPU v2, target platform: rk3588, framework name: PyTorch, framework layout: NCHW, model inference type: static_shape
done
--> Running model
resnet18
-----TOP 5-----
[812]: 0.9996760487556458
[404]: 0.00024927023332566023
[657]: 1.449744013370946e-05
[466 833]: 9.023910024552606e-06
[466 833]: 9.023910024552606e-06

done

问题及解决办法

1. No module named ‘cv2’

Traceback (most recent call last):
 File "/home/rock/work/rknn-toolkit2/rknn_toolkit_lite2/examples/inference_with_lite/test.py", line 1, in <module>
   import cv2
ModuleNotFoundError: No module named 'cv2'

解决办法:
执行

conda install opencv

2. ModuleNotFoundError: No module named ‘rknnlite’

解决办法:安装rknn_toolkit_lite2-1.5.2-cp310-cp310-linux_aarch64.whl

pip3 install rknn_toolkit_lite2-1.5.2-cp310-cp310-linux_aarch64.whl   -i https://pypi.tuna.tsinghua.edu.cn/simple

3. rknn_toolkit_lite2-1.5.2-cp310-cp310-linux_aarch64.whl 安装出错

        203 | #include_next <limits.h>                /* recurse down to the real one */
            |               ^~~~~~~~~~
      compilation terminated.
      psutil could not be installed from sources. Perhaps Python header files are not installed. Try running:
        sudo apt-get install gcc python3-dev
      error: command '/usr/bin/gcc' failed with exit code 1
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for psutil
  Building wheel for ruamel.yaml.clib (pyproject.toml) ... error
  error: subprocess-exited-with-error

  × Building wheel for ruamel.yaml.clib (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [24 lines of output]

解决办法:

sudo apt install python3-dev 

遇到的包安装不上的问题,可以参考上面添加并更新软件源

4. 缺runtime库的问题

Exception: Can not find dynamic library on RK3588!
Please download the corresponding librknnrt.so from https://github.com/rockchip-linux/rknpu2/tree/master/runtime/RK3588/Linux/librknn_api/aarch64 and move it to directory /usr/lib/
解决办法:

git clone -b master https://github.com/rockchip-linux/rknpu2.git

sudo cp rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknn* /usr/lib/
### 部署 ResNet18 模型的方法 #### 工具准备 为了成功部署 ResNet18 模型,需要准备好必要的工具链和依赖项。例如,在基于 RK3588S 开发板的情况下,可以参考官方文档中的说明来完成交叉编译工具的安装[^3]。 #### 加载预训练模型 加载 ResNet18 的过程通常涉及读取模型文件及其参数。以下是 Python 中的一个典型实现方式: ```python import mxnet as mx def load_resnet_model(symbol_file, params_file): sym, arg_params, aux_params = mx.model.load_checkpoint(symbol_file.split('.')[0], int(params_file.split('-')[-1].split('.')[0])) mod = mx.mod.Module(symbol=sym, context=mx.cpu(), label_names=None) mod.bind(for_training=False, data_shapes=[('data', (1, 3, 224, 224))]) mod.set_params(arg_params, aux_params, allow_missing=True) return mod ``` 上述代码展示了如何通过 `load_checkpoint` 函数加载 MXNet 格式的 ResNet18 模型,并绑定到指定上下文中运行[^1]。 #### 转换为其他框架支持的格式 如果目标硬件不直接支持 MXNet,则可能需要将模型转换为目标平台兼容的形式(如 ONNX 或 TensorFlow Lite)。以下是一个简单的例子展示如何导出为 ONNX 文件: ```python import torch from torchvision import models dummy_input = torch.randn(1, 3, 224, 224) model = models.resnet18(pretrained=True) torch.onnx.export(model, dummy_input, "resnet18.onnx", verbose=True) ``` 这段脚本利用 PyTorch 提供的功能轻松实现了从原始权重保存至通用中间表示形式的过程[^4]。 #### 在嵌入式设备上执行推理 对于特定架构比如 Rock Pi 上的应用场景来说,还需要考虑优化后的性能表现以及内存占用情况等问题。因此建议采用专门针对 ARM 平台设计好的 SDK 来加速计算效率,同时减少资源消耗。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值