目标检测《三、rv1109平台部署yolov5环境 官方onnx模型转换rknn模型》
3. rv1109平台部署yolov5环境,官方onnx模型转换rknn模型验证
以上文章是从0到1,一点点记录部署全部过程,包括出现的错误以及解决过程。
第五篇是汇总前4篇,做一个归纳总理,顺序总结出部署过程,因为是后期总结,可能会导致哪里遗落,具体可以查看对应上面对应文章。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
1.环境安装
备注:后续经过验证,发现1109板卡rknn模型转换需要使能预编译,而pc环境不支持预编译。所以需要在ubuntu上安装toolkit将onxx转换成rknn。这步可以跳过直接参考第二步骤的第五小条。
SDK中的rknn toolkit版本比较旧,如果需要最新的,https://github.com/rockchip-linux/rknn-toolkit下载。各种版本环境安装可能有一点不一样,具体查看Rockchip_Quick_Start_RKNN_Toolkit_V1.7.3_CN.pdf手册。
在Conda下新建一个虚拟环境进行安装。需要安装python的版本是3.6
在虚拟环境下使用以下命令新建一个RKNN环境:
conda create --name=rknn python=3.6.8
执行以下命令进入虚拟环境:
conda activate rknn
进入虚拟环境后,再执行以下命令安装深度学习框架,如Tensorflow,Pytorch,Keras等。
pip install tensorflow==1.14.0
pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html --user
pip install mxnet==1.5.0
pip install opencv-python
pip install gluoncv
在安装opencv-python的时候报错:ERROR: Could not build wheels for opencv-python which use PEP 517 and cannot be installed directly
需要注意:opencv和python是有版本匹配,pip install opencv-python默认是安装最新版本,有可能会与我们python版本不对应导致安装失败。
解决:
pip install --upgrade pip setuptools wheel
pip install opencv-python
发现还是报错:Please check the install target is valid and see CMake's output for more information.(版本匹配问题)
pip install -i https://pypi.douban.com/simple/ pip install opencv-python==4.3.0.38
这个版本是与python3.6相匹配的。
在SDK目录rv1126_rv1109\external\rknn-toolkit\packages\required-packages-for-win-python36下有lmdb-0.95-cp36-cp36m-win_amd64.whl
pip install lmdb-0.95-cp36-cp36m-win_amd64.whl
在SDK目录rv1126_rv1109\external\rknn-toolkit\packages下有rknn_toolkit-1.6.0-cp36-cp36m-win_amd64.whl(备注:我从github下载最新的rknn toolkit的时候,对应的whl并没有一起下过来,https://github.com/rockchip-linux/rknn-toolkit/releases需要自己再下载一下对应的安装包)该步骤的安装包要和跟文档的一致,不然后面rknn还是安装不成功的。rknn-toolkit-lite目录下也有一个package,里面也有类似的whl,注意这是不同的。不要安装错了。
pip install rknn_toolkit-1.6.0-cp36-cp36m-win_amd64.whl
报错提示有些版本不兼容,但是还是安装成功了(暂时先不管了):
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. mxnet 1.5.0 requires requests<2.19.0,>=2.18.4, but you have requests 2.22.0 which is incompatible. matplotlib 3.3.4 requires pillow>=6.2.0, but you have pillow 5.3.0 which is incompatible.
然后验证是否安装成功:
python from rknn.api import RKNN
没有报错就是安装成功。
2.官方demo验证
1.官方demo onnx->rknn
这边先用官方的准备的onnx模型转换成rknn模型,然后在rv1109平台上运行。
通过https://github.com/rockchip-linux/rknn-toolkit下载最新的demo,因为我需要用的是yolov5,而SDK里面是yolov3。
rknn-toolkit-master\rknn-toolkit-master\examples\onnx\yolov5目录下修改test.py
默认的平台是rk1808,修改target_platform为rv1109和rv1126,如果只是写rv1109应该也可以。
rknn.config(reorder_channel='0 1 2', mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], optimization_level=3, target_platform =['rv1109', 'rv1126'], output_optimize=1, quantize_input_node=QUANTIZE_ON)
修改rknn.init_runtime函数,设置平台为rv1109,device_id可以不填,那个是PC模拟挂载多个板卡才需要指定。
ret = rknn.init_runtime('rv1109')
激活当创建虚拟环境:
conda activate rknn
切换到对应的目录下,然后执行:
python test.py
可以看到RKNN model已经导出。但是后续的运行失败了,是因为我在pc上运行,但是我设置的平台是rv1109,平台不匹配导致。不用管它。
2. rknn在rv1109板卡运行
在SDK下rv1126_rv1109\external\rknpu\rknn\rknn_api\examples\rknn_yolov5_demo有对应的demo
在这个demo中已经有转换好的rknn,可以根据readme配置一下build.sh中的编译器路径就行了。
修改build.sh
GCC_COMPILER=略rv1126_rv1109/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf
根据自己交叉编译器路径配置一下。
./build.sh
执行成功,在当前目录生成一个install目录。
把目录通过adb放到板卡的/userdata下,并修改执行权限chmod 777 -R 文件夹
./rknn_yolov5_demo model/rv1109_rv1126/yolov5s_relu_rv1109_rv1126_out_opt.rknn model/test1.bmp
执行成功会在当前目录生成一个out.bmp。
以上是执行官网自带的rknn。
3. 替换rknn运行
把刚转换生成的yolov5s.rknn以及bus.bmp(该图片在第一步demo中有,不过是jpg的,要转成bmp格式)放到板卡的目录下,执行
./rknn_yolov5_demo yolov5s.rknn bus.bmp
运行后报错:
This RKNN model is not a pre-compiled model, but the npu driver is mini driver. Mini driver only support rknn models with pre-compiled mode. Create RKNN model fail, error=-14 rknn_init error ret=-14
该错误是板子上的库是Mini driver, 所以只能加载预编译的模型,在转换模型的时候,打开预编译开关precompile。
打开刚才的test.py,增加一个pre_compile=True
ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)
修改成:
ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET, pre_compile=True)
备注:Mini driver 库大小比 full driver 小很多,以 RV1109/RV1126 1.6.0 驱动为例,full driver 大小为 87MB,mini driver 大小为 7.1MB,可以有效的节省 flash 大小。Full driver 支持 RKNN Toolkit 的联机调试功能,mini driver 不支持。
又报错:
E The pre_compile is not supproted on Windows or MacOS platform. Please use export_rknn_precompile_model() to convert rknn to precompile mode. Build yolov5 failed!
不支持windows系统。
4. 使用export_rknn_precompile_model模型预编译
由于我这边第四步行不通,可能是硬件这边不支持,所以我在ubuntu下又安装了rknn toolkit,来代替第一步,使能预编译,转换官方的rknn模型。这步可以跳过不用看,这边只是做了记录,以防万一。
首先使能NTB通信:
/etc/init.d/.usb_config,在这个文件中增加一行:usb_ntb_en,然后重启开发板。
然后在虚拟环境中执行
python -m rknn.bin.list_devices
正常情况会显示对应的设备,但是我的没有显示。可能是硬件没有连接好。这个方法暂时不考虑。
如果这步骤可以正常显示设备
将第一步转换出的rknn模型(不是预编译模型)放在rknn-toolkit-master\examples\common_function_demos\export_rknn_precompile_model目录下
修改export_rknn_precompile_model.py为对应的平台
ret = rknn.init_runtime(target='rv1109', rknn2precompile=True)
再执行该脚本,应该就可以了。
5.Ubuntu安装rknn toolkit
参考:https://www.cnblogs.com/zhuangquan/p/17315575.html
然后在Ubuntu下将onxx转换成rknn
修改rknn-toolkit-master/examples/onnx/yolov5下的test.py,打开预编译
ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)
修改成:
ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET, pre_compile=True)
然后执行
python test.py
就可以看到rknn模型导出成功。
参考上面第三步替换一下rknn模型,就执行成功了。