Rock5A上RKNN的正确玩法折腾记

举报
张辉 发表于 2023/07/09 13:44:43 2023/07/09
【摘要】 Rock5A
https://zhuanlan.zhihu.com/p/638581085 这篇文字中,张小白提到了Rock5a特有的RKNN-Toolkit AI开发套件。但是大家有没有觉得用法有点奇怪。为啥直接在开发板上运行的是rknn_toolkit_lite2目录下的东西?张小白仔细对了一下下面两个目录:
这个目录下只有x86的安装包。
这个目录下只有arm的安装包。
张小白咨询了官方群,又看了以下文档:https://zhuanlan.zhihu.com/p/590368969 终于搞明白了具体的开发流程:
1、在PC端安装ubuntu 22.04 X86虚拟机,使用X86架构,安装RKNN-Toolkit2工具;
2、在PC端进行神经网络的搭建和模型训练,保存模型文件(如pt);
3、使用onnx工具将原始模型文件转换为onnx文件;
4、使用RKNN-Toolkit2工具将onnx文件转为rknn文件;
5、开发板端是arm架构的,安装rknn-toolkit-lite;
6、在开发板端编写脚本或者代码对模型进行推理。如果是Python代码,可以在开发板端直接运行;如果是C++代码,可以在PC端编写,使用交叉编译生成能在ARM上运行的代码,然后在开发板上运行推理代码;当然,也可以直接在开发板上源码编译,直接生成可以在ARM上运行的代码。
看起来比较复杂,不如试一下吧!
下面是一台已经安装好的ubuntu 22.04 LTS操作系统的虚拟机环境:
我们使用NAT模式,可以看到NAT虚拟网端对应的IP地址是 192.168.80.x
使用ifconfig查看地址:192.168.80.128
使用MobaXterm连接该地址:
先来安装RKNN-Toolkit:
git clone https://github.com/rockchip-linux/rknn-toolkit2.git
安装Miniconda环境:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
安装Miniconda:
bash ./Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc 使得conda环境生效:
根据上文的思路,先创建一个Python 3.6的环境:
conda create -n rock python=3.6
conda activate rock
确认conda环境的Python版本。
安装RKNN-Toolkit的软件依赖:
sudo apt-get install libxslt1-dev zlib1g-dev libglib2.0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc
貌似遇到了点问题。
张小白想了想,貌似上次开发板用的是Python 3.10装好了rknn-toolkit-lite。再开一个python 3.10的conda环境试试呢。
conda deactivate rock
conda create -n rock10 python=3.10
conda activate rock10
sudo apt-get update
cd ~/rknn_toolkit2/packages
pip install ./rknn_toolkit2-1.5.0+1fa95b5c-cp310-cp310-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple/
一切都很顺利,但是在最后报了一个Python需要小于3.10的错。
无奈只好再做一个Python 3.9的版本:
conda deactivate rock10
conda create -n rock9 python=3.9
结果安装后了才发现,官方没有提供Python3.9的 RKNN-Toolkit安装包,只提供了Python 3.6,Python3.8,Python3.10的:
无奈只好再做一个Python 3.8的环境,心想这回不能再给我搞事情了:
pip install ./rknn_toolkit2-1.5.0+1fa95b5c-cp38-cp38-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple/
最后还是报了一些兼容性的错。先不管他。
检查RKNN-toolkit是否安装成功:可在python交互页面执行 from rknn.api import RKNN
事后注个亮:其实张小白在反复试验conda环境的过程中,忽略了rknn_toolkit2包中有个doc目录,存放了每种Python该安装什么版本的pip依赖包的事实,此时使用pip install -r requirements_cp3xx-1.5.0.txt就可以完成依赖包的安装了。另外明明只有偶数版本号的安装包,张小白非要安装奇数版本的Python环境,这也是张小白学习不细心导致的,以后要改!
(--以下根据重跑内容重新修订--)
cd rknn-toolkit2/doc
pip install -r requirements_cp38-1.5.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
(--修订结束--)
我们尝试一下如何将YoloV8移植到rock5a上去,参考nickniu973的文章:https://forum.radxa.com/t/use-yolov8-in-rk3588-npu/15838
下载yoloV8的源码:
git clone https://github.com/ultralytics/ultralytics.git
根据 https://github.com/ultralytics/ultralytics/tree/main/examples/YOLOv8-CPP-Inference 提示:
安装:
cd ultralytics
pip install .
这里面又提到一些版本兼容性的问题。

先编译一下YoLoV8的代码:
cd examples/YOLOv8-CPP-Inference
修改下模型文件目录:
vi main.cpp
mkdir build
cd build
cmake ..
报了一个CUDA找不到的错。这是当然,因为张小白的这个虚拟机没有CUDA环境(也做不了CUDA环境)
根据上图的提示,我们去修改下 ../CMakeLists.txt文件,将CUDA部分都注释掉:
cd build
cmake ..
又报了 Could not find a package configuration file provided by “OpenCV“
安装opencv
sudo apt-get install libopencv-dev

重新编译:cmake ..
make
编译成功。
运行下试试:
./Yolov8CPPInference

报错了。难道在ubuntu的X86环境下,CPU方式无法推理吗?
(--重试--)
找不到onnx文件。
我们来转换一下:
将yolov8的原始模型文件下载到 ~/ultralytics 目录下.
打开:

找到yolov8s.pt文件并复制链接:
cd ~/ultralytics
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt
将pytorch的模型文件转换为onnx文件:
yolo export model=yolov8s.pt imgsz=640,640 format=onnx opset=12
报错:AttributeError: module ‘distutils‘ has no attribute ‘version
执行 pip install setuptools==58.0.4 即可:
pip install setuptools==58.0.4 -i https://pypi.tuna.tsinghua.edu.cn/simple

(--重试--)
yolo export model=yolov8s.pt imgsz=640,640 format=onnx opset=12

说需要numpy 1.19.5的版本:
pip install numpy==1.19.5
再来:yolo export model=yolov8s.pt imgsz=640,640 format=onnx opset=12
pip install numpy==1.20
再来:yolo export model=yolov8s.pt imgsz=640,640 format=onnx opset=12
唉,越来越精确了:
pip install numpy==1.20.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
再来:yolo export model=yolov8s.pt imgsz=640,640 format=onnx opset=12
这回居然成功了,yolo8s.onnx文件也生成了。

下面开始使用RKNN-toolkit生成rknn文件:
cd ~/rknn-toolkit2/examples/onnx/
将yolov5备份成yolov8:
cd yolov8
cp ~/ultralytics/yolov8s.onnx .
修改test.py文件:
首先将两个文件名改为yolov8s.onnx和yolov8s.rknn
再到main模块,增加 target_platform="rk3588"部分:
执行:python test.py
如果遇到:
安装rknn-toolkit
cd ~/rknn-toolkit2/packages
pip install ./rknn_toolkit2-1.5.0+1fa95b5c-cp38-cp38-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
再执行:
cd ~/rknn-toolkit2/examples/onnx/yolov8
python test.py
好像报错了,出错如下:
I rknn buiding done.
done
--> Export rknn model
done
--> Init runtime environment
W init_runtime: Target is None, use simulator!
done
--> Running model
W inference: The 'data_format' has not been set and defaults is nhwc!
Analysing : 100%|███████████████████████████████████████████████| 183/183 [00:00<00:00, 5968.43it/s]
Preparing : 100%|███████████████████████████████████████████████| 183/183 [00:00<00:00, 1825.68it/s]
W inference: The dims of input(ndarray) shape (640, 640, 3) is wrong, expect dims is 4! Try expand dims to (1, 640, 640, 3)!
Traceback (most recent call last):
  File "test.py", line 290, in <module>
    np.save('./onnx_yolov5_1.npy', outputs[1])
IndexError: list index out of range
生成前:
生成后:
不过总觉得这个过程有点奇怪。
登陆到rock5a上,进入rknn的benchmark目录:
cd ~/rknpu2/examples/rknn_benchmark
bash ./build-linux_RK3588.sh
居然没有安装cmake
sudo apt-get install cmake
重来:bash ./build-linux_RK3588.sh
报没有安装aarch64-linux-gnu-g++
确实只装了gcc,没装g++
sudo apt-get install aarch64-linux-gnu-g++
重来:bash ./build-linux_RK3588.sh
成功编译rknn_benchmark
将在x86上转换好的yolov8s.rknn文件传到rock5a开发板上:
cd ~/rknpu2/examples
./rknn_benchmark/build/build_linux_aarch64/rknn_benchmark ~/yolov8s.rknn 5 7
貌似跟nick大佬下面这张截图的结果不大一样:
cd ~/rknpu2/examples/
cp -r rknn_yolov5_demo rknn_yolov8_demo
cd rknn_yolov8_demo
bash ./build-linux_RK3588.sh
编译成功,结果生成如下:
执行试试:
cd ~/rknpu2/examples/rknn_yolov8_demo
./build/build_linux_aarch64/rknn_yolov5_demo ~/yolov8s.rknn model/bus.jpg
报找不到librga.so的错。
这是什么?经过张小白一番寻找,发现是一个rockchip的库:
https://github.com/airockchip/librga.git
于是git clone https://github.com/airockchip/librga.git
并且在 /home/rock/librga/libs/Linux/gcc-aarch64 目录发现了库的踪影,于是果断将其加入~/.bashrc的LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=~/librga/libs/Linux/gcc-aarch64:$LD_LIBRARY_PATH
source ~/.bashrc使其生效
再次执行看看:
cd ~/rknpu2/examples/rknn_yolov8_demo
./build/build_linux_aarch64/rknn_yolov5_demo ~/yolov8s.rknn model/bus.jpg
好像遇到了一些问题,也不是nick大佬贴出的下面的这个结果:

那么,我们还是退回到试试YoLoV5怎么玩吧!
于是在X86的ubuntu上切换到yolov5的目录:
cd ~/rknn-toolkit2/examples/onnx/yolov5
编辑test.py
确保源和目的文件名正确:
在main模块中rknn.config中增加 target_platform="rk3588" 参数:
在python 3.8的conda环境中执行python test.py
可以看到rknn模型文件生成了,而且在x86上的推理也成功了。
将推理的结果文件下载下来可以看到:
将yolov5.rknn文件传到rock上:
cd ~/rknpu2/examples/rknn_yolov5_demo
bash ./build-linux_RK3588.sh
cd ~/rknpu2/examples/rknn_yolov5_demo
./build/build_linux_aarch64/rknn_yolov5_demo ~/yolov5s.rknn model/bus.jpg
推理时间为23毫秒左右,生成了一个out.jpg文件:
同样的,下载到本地看看:
推理结果的颜色有点不大清晰。
虽然yolov5的demo代码可以试验成功,但是不知道为啥yolov8的代码移植失败了。
这个很遗憾,只有下次再说了。
(未完待续)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。