新手小白记录一下自己使用香橙派模型转换以及在开发板上运行的过程,防止后面忘记。
使用的开发板:Orange Pi 5 Plus(rk3588)
官方的一些资料在(主要参考用户手册):Orange Pi - Orangepihttp://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-5-plus.html

虚拟机:ubuntu20.04
前提:1、在自己笔记本上已经安装好虚拟机 (ubuntu20.04)
2、开发板已经烧录好镜像(可以正常开机使用)
一、自己笔记本虚拟机端的环境配置:
1、查看python的版本:
python3 --version
这里我的虚拟机是完全新装的一个,里面没有额外装任何东西。

2、安装RKNN-Tookl2的依赖包:
sudo apt-get update

sudo apt-get install libxslt1-dev zlib1g-dev libglib2.0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc
然后我这里报错:报错:E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
解决办法(参考:https://www.cnblogs.com/while19/p/16197099.html):
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend
接着继续使用上面的命令安装依赖,安装完成之后如下图:

3、安装rknn-toolkit2:
git clone https://github.com/rockchip-linux/rknn-toolkit2 -b v1.5.2
正常应该都是可以正常下载的,我也不知道为什么报了那么多错误,这里报错:
报错:fatal: 无法访问 'https://github.com/rockchip-linux/rknn-toolkit2/':GnuTLS recv error (-110): The TLS connection was non-properly terminated.
解决办法:https://www.cnblogs.com/forforever/p/16451444.html
按照上面的方法,一开始我还是不能正常下载,然后我重启了一下虚拟机之后就可以了,还是我的网络问题。
4、安装rknn-toolkit2需要的环境:
pip3 install -r rknn-toolkit2/doc/requirements_cp38-1.5.2.txt -i https://mirror.baidu.com/pypi/simple
如果报错没有pip命令的话,根据提示安装一下即可:

如果这里使用百度的镜像源下载不了报错的话,可以更换一下镜像源(更换方法:将 -i 后面的网址换掉即可),下面是常用的几个镜像源:
1. 清华大学镜像站:https://pypi.tuna.tsinghua.edu.cn/simple/
2. 阿里云镜像站:https://mirrors.aliyun.com/pypi/simple/
3. 中科大镜像站:https://pypi.mirrors.ustc.edu.cn/simple/
4. 中国科技大学镜像站:https://pypi.mirrors.ustc.edu.cn/simple/
5. 中国科学技术大学镜像站:https://pypi.mirrors.ustc.edu.cn/simple/
6. 华中科技大学镜像站:https://pypi.hustunique.com/
如果有个别的库下载不下来的话,可以再重新换个镜像源单独安装。
5、安装 RKNN-Toolkit2 软件包
bash
pip3 install rknn-toolkit2/packages/rknn_toolkit2-1.5.2+b642f30c-cp38-cp38-linux_x86_64.whl
安装完成之后,可以使用里面给出的样例测试一下:
bash
cd rknn-toolkit2/examples/onnx/yolov5/
python3 test.py
结果如下:

在这个文件夹下可以看到输出的结果以及转换的rknn模型。

二、使用ADB功能连接开发板和虚拟机:
我是参考用户手册里面的使用type-c数据线连接adb的部分,打开开发板之后,用一根数据线连接开发板和虚拟机。
1、开发板端设置
将type-c接口设置为device模式:
bash
sudo set_device.sh
确认adbd已经启动:
bash
ps -ax | grep "adbd"
会输出两行类似下面的信息:

2、虚拟机端:
(1)要确认设备是连接在虚拟机上面的,可以通过虚拟机选项的可移动设备上面查看,有一个rk3588的设备,要连接到虚拟机,不能连接到主机。
(2)在虚拟机上面安装adb:
bash
sudo apt-get update
sudo apt-get install -y adb
安装完成如下:

(3)测试一下能不能识别到:
bash
adb devices
正常时输出下面的结果,这里得到的那一串device_id后面是需要用到的。

但是我这里很容易出问题,一开始老是检测不到设备,可以多拔几次重新插试试。
三、在ubuntu端使用开发板的NPU运行模型:
1、更新开发板的rknn_server 和****librknnrt.so
(1)更新开发板的rknn_server:
adb push rknpu2/runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/* /usr/bin

adb push rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/lib

(3)虚拟机端通过adb打开开发板的终端:
adb shell

可以看到已经进入了开发板的终端。
(4)打开rknn_server服务:
restart_rknn.sh

(5)可以再使用下面检查一下是否有进程id
pgrep rknn_server
2、生成对应的模型,并调用开发板的NPU推理
(1)切换到官方给的测试代码:
cd rknn-toolkit2/examples/onnx/yolov5/

(2)打开test.py文件修改相关参数,这里有两种方式:第一种是直接打开test.py文件在里面修改并保存,第二种方式是使用vim编辑器从终端打开test.py文件进行修改,这里我直接打开test.py文件修改保存。

在241行和270行,添加平台rk3588和device_id,其中device_id是通过前面的adb device命令得到的。
注意如果用第二种方式(使用vim编辑器在终端打开test.py文件)的话,需要先按 i 键进入插入模式,然后修改参数,修改完成之后,按esc退出插入模式,再直接敲 :wq 保存退出(注意在vim模式下,想要输入命令得先输入一个 : 才能输入命令),使用vim的命令如下(如果之前没有安装过vim,会报错,根据提示安装一下即可):
vim test.py
(3)在虚拟机端使用python运行示例:
python3 test.py

正常检测。
3、调用C接口部署RKNN模型到开发板上运行
(1)由于虚拟机端用的是x86,而开发板用的是arrch64,所以需要在虚拟机端安装交叉编译链:
git clone https://github.com/airockchip/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu

(2)修改编译工具的路径:
#进入rknn_yolov5_demo文件夹
cd ~/rknpu2/examples/rknn_yolov5_demo
#使用vim打开build-linux_RK3588.sh并修改
vim build-linux_RK3588.sh

键盘敲 i 键进入插入模式,然后按照下图设置TOOL_CHAIN值:
export TOOL_CHAIN=~/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu

这里需要注意一下,如果只修改了TOOL_CHAIN的值,后面编译生成可用程序的时候会报错:
CMake Error at /usr/share/cmake-3.16/Modules/CMakeDetermineCCompiler.cmake:49 (message):
Could not find compiler set in environment variable CC:
aarch64-linux-gnu-gcc.

所以建议一起修改GCC_COMPILER的值:
GCC_COMPILER=~/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu/bin/aarch64-rockchip-linux-gnu

修改完成之后按esc退出插入模式,然后输入:wq保存退出。
(3)编译生成可用程序:
./build-linux_RK3588.sh

如果报错未找到cmake命令的话,就使用下面命令安装一下:
sudo apt-get install -y cmake

编译生成完成之后,会在该文件夹下生成一个install的文件夹,里面有一个rknn_yoov5_demo_Linux文件夹,里面就是我们需要的文件。使用 ls install命令可以看到:

(4)将编译生成的文件上传到开发板:
adb push install/rknn_yolov5_demo_Linux /data/rknn_yolov5_demo_Linux
(5)进入开发板的文件系统:
adb shell
cd /data/rknn_yolov5_demo_Linux/
ls

(6)在开发板上进行推理:
./rknn_yolov5_demo ./model/RK3588/yolov5s-640-640.rknn ./model/bus.jpg

推理完成之后可以使用 ls 命令查看生成的文件目录。
(7)使用adb pull将结果拉到虚拟机内
adb pull /data/rknn_yolov5_demo_Linux/out.jpg ~/yolo_output
这里的yolo_output是我事先在虚拟机里面建好的一个文件夹,用来存放推理出来的结果,这里的路径可以修改。

打开虚拟机里面的yolo_output文件夹,可以看到拉出来的结果图片:
