EASY EAI灵眸科技
直播中

ALSET

3年用户 269经验值
擅长:可编程逻辑,电源/新能源,嵌入式技术,处理器/DSP
私信 关注
[经验]

【EASY EAI Nano开源套件试用体验】5.RKNN神经网络开发测试

【EASY EAI Nano开源套件试用体验】5.RKNN神经网络开发测试
大信(QQ:8125036)

        电子发烧友和灵眸科技推出EASY EAI Nano开发板的试用。该开发板采用的是Rockchip 的RV1126处理器,该处理器拥有四核32位Cortex®-A7架构,集成2.0 TOPs AI算力的NPU。能够广泛适用物联网边缘计算以及智能应用,如人脸闸机、车载录像、安防监控等方面。
       本次实验就是尝试研究测试该开发板自带的RKNN神经网络框架,在实时推理方面的应用,本次计划以开发板带的摄像头作为输入,通过RKNN对输入视频进行实时识别,并测试各个算法模型的效率与性能。
1.png

一、RKNN简介

      RKNN 是 Rockchip npu平台推出的一个专用神经网络运行平台,其使用特定的以.rknn后缀结尾的模型文件。Rockchip 提供了完整了模型转换Python工具,方便用户将自己研发的算法模型转换成 RKNN 模型,同时 Rockchip 也提供了C/C++和Python API 接口在板上进行模型的运行。
对于Ternsorflow,PyTorch等其他模型,想要在RK系列平台运行,需要先进行模型转换。可以在搭载Ubuntu18.04以及以上版本的PC上使用RKNN-Toolkit2工具将模型转化为RKNN格式,再按照RKNN的调用方式部署到开发板上进行运行。
2.png

二、RKNN-Toolkit 简介
        RKNN-Toolkit是为用户提供在PC、 Rockchip NPU 平台上进行模型转换、推理和性能评估的 开发套件,用户通过该工具提供的 Python 接口可以便捷地完成以下功能:
       模型转换:支持Caffe、TensorFlow、TensorFlowLite、ONNX、Darknet、Pytorch、MXNet 模型转成RKNN 模型,支持 RKNN 模型导入导出,后续能够在 Rockchip NPU 平台上加 载使用。从1.2.0版本开始支持多输入模型。从1.3.0版本开始支持 Pytorch 和 MXNet。
      RKNN-Toolkit环境依赖:
      目前RKNN-Toolkit系统支持:Ubuntu 16.04 x64(以上)、Window 7 x64(以上)、Mac OS X 10.13.5 x64 (以上)、 Debian 9.8 (x64)以上,Python 版本:3.5/3.6/3.7。
RKNN-Toolkit的安装步骤网站有很多教程,这里不再验证了。在Easy-EAI-Nano提供的开发环境里,已经安装好了RKNN-Toolkit,可以直接使用,不需要另行安装了,这点非常方便。
3.png

三、模型的转换

       这次的验证是把YOLOv5模型在rknn跑起来。YOLOv5的代码是开源的,可以从github上克隆其源码。YOLOv5更新了5个分支了,分别是yolov5.1-yolov5.6分支。这里使用yolov5.6分支作为测试。
YOLOv5原模型是PyTorch框架的,使用RKNN-Toolkit分步转换 PyTorch->ONNX->RKNN
1.模型转换流程简介
4.png
2.主机环境检查
检查环境,这里首先检查一下python环境,系统安装多个版本的python,需要注意使用正确的版本。
5.png
3.加载RKNN-Toolkit的Docker镜像环境
进入docker目录下,加载RKNN-Toolkit镜像
docker load --input/mnt/hgfs/EASY-EAI-NANO/rknn-toolkit-v1.7.1/docker/rknn-toolkit-1.7.1-docker.tar.gz
6.png
运行镜像:
dockerrun -t -i --privileged -v /dev/bus/usb:/dev/bus/usb rknn-toolkit:1.7.1/bin/bash
7.png
4.测试python环境
8.png
5. 准备模型工程
需要训练自己模型参数的可拉取yolov5的工程代码,按里面的文档进行训练。
https://github.com/glenn-jocher/yolov5.git
9.png
       实际训练时,出问题的概率非常高,还需要自己学仔细研究所使用模型的结构并修改训练代码,这部分比较麻烦。笔者研究了一下,对于不同的模型需要调整模型结构,和调整各个参数。这过程没有一个通用的方法,因此这里不在展示自己数据的训练过程了,而是直接使用例程里已经训练好的一个模型。
      在这个开发板上,这里使用Docker环境来进行模型的转换,在RKNN-Tools2的资料里也已经有训练好的源模型工程,可以直接使用它验证转换方法:
      先把这个主机的工程目录映射进入Docker运行环境
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v/mnt/hgfs/EASY-EAI-NANO/rknn-toolkit-v1.7.1:/rknn_conv rknn-toolkit:1.7.1/bin/bash
10.png
6.生成图片量化文件
进入model_conv工程目录,执行python gen_list.py
在执行这个脚本时,需要修改一下图片目录:
image_dir = '../quant_dataset/coco_data'
11.png
查看生成的文件内容:cat pic_path.txt | more
12.png
7. onnx模型转换为rknn模型
再执行转换脚本命令python3 rknn_convert.py
13.png
此过程大概执行约20分钟左右,生成了 rknn 模型:
14.png
转换时Ubuntu虚机的系统开销大概如下图:
15.png
转换过程的整体系统情况如下图,可见这个转换比较非常消耗CPU和内存,因此高性能的cpu和大的内存是必须的。
16.png
8. 检测验证rknn模型  
生成完rknn模型后,在主机下提供了一个评估测试生成的python脚本可以用来检验一下生成的rknn模型。
执行python3 yolov5_coco_test.py脚本测试rknn模型推理时报出如下错误:
17.png
Traceback (most recent call last):
  File"yolov5_test2.py", line 329, in
    input0_data =input0_data.reshape([3,-1]+list(input0_data.shape[-2:]))
ValueError: cannot reshape array of size 2142000 into shape (3,newaxis,25200,85)
   这是推理输出处理时出现的错误,经过分析,发现推理输出的矩阵多了一个维度,需要把下面的0,1,2 改成1,2,3
18.png
修改完,再运行又出现下面的错误:
19.png
这是重整输出数据取维度出现错误,需要改为
20.png
运行之后,再次出现错误:
21.png
调试发现,在重新调整输出图片缩放时,当图像是正方形时,不需要缩放,因此设置缩放率为1,但代码里却默认输入是长方形,修改这里:
22.png
再次运行,终于获得了正确的结果:
23.png
输出结果显示识别出4个person和1个bus,下面是输出的推理输出图像,完全正确的输出:
24.png

四、模型的部署测试
1.准备原RKNN模型
      从文档里得知rknn模型用NPU API在加载的时候速度慢,还需要在评估模型精度没问题的情况下,还需要进行模型预编译。
25.png
2.然后把rknn-toolkit-lite包传送到板子上
26.png
在板子上把rknn_toolkit_lite-1.7.1-cp37-cp37m-linux_ARMv7l.whl改名为 rknn_toolkit_lite-1.7.1-cp37-cp37m-linux_armv7l.gz, 并解压,再把rknnlite目录复制到 /usr/lib/python2.7/site-packages目录下
27.png
3.执行预编译
再把adb的设备权限交给虚机,使Docker里能够使用adb连接开发板,然后再进入Docker中的yolov5模型转换工程目录,执行
python3 precompile_rknn.py
28.png
这样就产生了上图红色的预编译文件。预编译部署完成,模型就已全部处理完成,把它复制到板子上,准备使用。

五.模型的板上推理测试
      开发yolov5板上推理程序。下载官方提供的demo例程,该程序里加载上面转换预编译完的RKNN模型文件,
yolov5_detect_C_demo.tar.bz2,
解压后,修改一下代码,调用上面转换并预编译的模型文件,增加屏幕上显示输出的图片的代码:
29.png
然后进行交叉编译
30.png
编译成功后,把编译完的执行程序,传到目标板上,和模型放在同一个目录下,再放一个测试图片文件,然后执行推理测试:
31.png
最后在屏幕上显示识别出的结果:
32.jpg
凑近点看,识别效果非常漂亮:
33.jpg
从测试可看出,识别耗时0.69秒,可谓非常的快。比在PC上验证模型是,快了上百倍。

五、RKNN开发测试总结
       通过一个完整的PyTorch模型转换为RKNN模型,在进行预编译以及使用该模型在板上进行推理运行过程的验证,基本上RKNN在该开发板上的开发流程得以跑通。
       在处理模型转换时,遇到了很多细小的问题,需要逐一去排查,比如yolov5和yolov5s的模型,所输出的结构定义就不一样,导致使用的转换脚本必须做相应的修改,而这些修改也必须对模型的结构非常的了解。没有一个较为通用的工具来“傻瓜”式的一键转换。
       而在尝试转换其它版本的yolo版本模型时,也遇到问题,并不是很顺利的能够转换成RKNN模型。因此对于模型的处理还需要比较熟悉模型的工程师来写转换脚本。

更多回帖

发帖
×
20
完善资料,
赚取积分