设备:RK3588、USB3.0串口线、USB2.0下载线、网线、电源线、12V稳压直流电源
虚拟机:Ubuntu20.04,系统依赖python版本为python3.6、python3.8
一、安装RKNN-Toolkit2
先使用virtualenv创建虚拟环境:
1.安装virtualenv:
sudo apt-get install virtualenv
2.创建virtualenv目录
mkdir ~/Virtualenv
3.创建虚拟环境
cd Virtualenv
python --version # 查看Python的默认版本和安装目录
whereis python
virtualenv -p /usr/bin/python3 venv # 使用对应安装路径安装虚拟环境,venv为环境名。
sudo update-alternatives --install /usr/bin/python3.6 1 #更改python的默认版本优先级
4. python –version
5.进入退出删除虚拟环境
cd /home/gec/Virtualenv/venv/bin
source activate
rm -r 环境名
6.在虚拟环境中安装python3.8和pip3
- sudo apt-get install python3 python3-dev python3-pip
2. 安装相关依赖
sudo apt-get install libxslt1-dev zlib1g-dev libglib2.0 libsm6 \ libgl1-mesa-glx libprotobuf-dev gcc
3. 安装python依赖(需要先获取RKNN-Toolkit2的安装包)
cd /rk3588/rk3588/external/rknn-toolkit2/doc
pip3 install -r requirements_cp38-1.4.0.txt (看了一下36、38是一样的内容)
若出现如下类似错误,则可能是因为网络原因(2.7KB/s),根据需要的版本更换源下载即可,使用临时更换指令:pip install 包名称 -i Simple Index
常用换源网址:
阿里云 http://mirrors.aliyun.com/pypi/simple/
豆瓣http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
华中科技大学http://pypi.hustunique.com/
换源后结果如下:
出现如下错误:
更换对应版本:
pip install --upgrade six==1.15.0
4. 安装RKNN-Toolkit2
进入安装包路径
cd /rk3588/rk3588/external/rknn-toolkit2/packages
python --version
sudo pip3 install rknn_toolkit2-1.4.0_22dcfef4-cp38-cp38-linux_x86_64.whl
5. 验证安装是否成功:
python3
from rknn.api import RKNN返回无错误
exit() 退出python环境
二、PC模拟器运行YOLO示例test.py实现.onnx文件到.rknn文件的构建和导出,加载图片并推理得到结果。
1. 进入创建的虚拟环境
cd venc/bin
source activate
2. 进入yolov5目录
cd /rk3588/rk3588/external/rknn-toolkit2/examples/onnx/yolov5
3. 运行示例
python3 test.py
4. 结果
三、在rk3588上实现test.py的测试。获得转换的.rknn模型yolov5s.rknn
将开发板与电脑、电源连接,使用usb下载线连接USB口,电源12V,电流2A。
最开始网口和串口都连接不上,因为电源电压不太稳定,换了一个稳压电源,连上了网口,串口依旧连接不上,最后发现是串口线的问题,购买了RS232转USB串口线才成功连接上串口,但是使用串口识别设备ID依旧识别不了,即adb devices不显示设备,故此处使用网口连接板子设备
1. 在虚拟机上安装adb
sudo apt-get install adb
2. 使用网口连接开发板和虚拟机。
主机ip设为与虚拟机、开发版同网段的固定ip(网络与共享中心的)
相互可以ping通则连接上。
3.连接设备
adb connect 192.168.1.197 (开发板ip)(如果报错client39,serve40,则表示Ubuntu和rk3588的版本不匹配,升级Ubuntu的adb版本)
4.更新板子的rknn_server和librknnrt.so。librknnrt.so: 是一个板端的 runtime 库。
rknn_server: 是一个运行在板子上的后台代理服务,用于接收PC通过USB传输过来的协议,
然后执行板端runtime对应的接口,并返回结果给PC。RKNN Toolkit2的连板功能一般需要更新板端的 rknn_server 和 librknnrt.so,并且手动启动 rknn_server 才能正常工作。
找到下面这些文件的路径:
cd /rk3588/rk3588/external/rknpu2
adb push runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/
adb push runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/lib/
adb push runtime/RK3588/Linux/librknn_api/aarch64/librknn_api.so /usr/lib/
adb push runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/start_rknn.sh /usr/bin/
adb push runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/restart_rknn.sh /usr/bin/
然后在虚拟机执行。
adb shell
chmod +x /usr/bin/rknn_server
chmod +x /usr/bin/start_rknn.sh
chmod +x /usr/bin/restart_rknn.sh
restart_rknn.sh
查看更新是否成功
pgrep rknn_server
5. 连板调试,修改脚本target 和 device_id
6. 执行转换和推理模型的test.py脚本
cd Virtualenv/venv/bin/
source activate
cd /rk3588/rk3588/external/rknn-toolkit2/exam
ples/onnx/yolov5
python3 test.py
如果出现一下错误:
说明版本不对应,看到API:1.4.0 rknn_server:1.4.0 rknnrt:1.3.0有可能是之前更新文件时将库文件没有传到lib位置即
adb push runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/lib/
adb push runtime/RK3588/Linux/librknn_api/aarch64/librknn_api.so /usr/lib/
7. 结果,生成yolov5s.rknn。
四、RKNPU2编译加速
1.修改postprocess.h
找到目录/rk3588/rk3588/external/rknpu2/examples/rknn_yolov5_demo/include
下的postprocess.h文件;
/rk3588/rk3588/external/rknpu2/examples/rknn_yolov5_demo/model
下的coco_80_labels_list.txt文件,修改类的个数和自己的类别数。
2.更新rknn模型。
将前面转换得到的yolov5s.rknn文件复制到
/rk3588/rk3588/external/rknpu2/examples/rknn_yolov5_demo/model/RK3588/目录下,然后编译。
- cd /rk3588/rk3588/external/rknpu2/examples/rknn_yolov5_demo
- ./build-linux_RK3588.sh # 成功生成install目录
adb push install/rknn_yolov5_demo_Linux /mnt # 将整个install文件传到板端的mnt目录
- adb shell # 进入板端系统shell,运行rknn_yolov5_demo。
- cd /mnt/rknn_yolov5_demo_Linux/
- ./rknn_yolov5_demo ./model/RK3588/yolov5s-640-640.rknn ./model/bus.jpg
- 退出shell为exit+enter
- 结果如下: