X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
编程基础
[经验] #AI挑战营第二站#从零开始教你使用RKNN-Toolkit进行模型转换
Alex_Jun
2024-5-9 20:37
楼主
# RKNN-Toolkit环境部署与使用 RKNN-Toolkit是一款软件开发套件,可在PC和瑞芯微NPU平台(RK1808/RK1806/RK3399Pro/RV1109/RV1126)上为用户提供模型转换、推理和性能评估。 想要做好一件事,我们首先得要了解我们所需要的东西,正所谓工欲善其事必先利其器。 ## 一、 下载RKNN-Toolkit ``` RKNN-Toolkit的github地址为: https://github.com/rockchip-linux/rknn-toolkit ``` 我们所要部署的开发板为幸狐RV1106开发板, 因此我们应该参考
因此我们点击链接跳转到rknn-toolkit2的链接去 ``` https://github.com/rockchip-linux/rknn-toolkit2 ```
但是我们发现它以及不再维护和更新了,不过给了我们新的地址,我们点击跳转到新的地址去: ``` https://github.com/airockchip/rknn-toolkit2/ ``` 我用网页给大家翻译了一下,方便我们查看:
具体的东西我们可以不用很了解,但是我们可以看到这句话:
这不就是我们需要的功能吗,所以我们需要下载这个仓库。 但是要注意,如果你下载了RKNN-Toolkit可能会出问题,因为它说两个不相容。
## 二、寻找教程 如果你不想寻找教程可以直接跳过这一步,我会将教程里面用到的东西贴出来,可以直接跳转**3.使用教程**,但是如果你想要了解这个工具,那么你一定要找到教程。 那么,在这个页面翻一翻,瞧我们发现了什么,更多的例程,有了例程不就可以来帮助我们理解和使用工具了吗?
我们点击链接进去: ``` https://github.com/airockchip/rknn_model_zoo ``` 在这个页面也翻一翻,找到了什么,**Quick Start**
我们点进这个链接看一看: ``` https://github.com/airockchip/rknn-toolkit2/tree/master/doc ``` 我相信你一定看到了很多版本的教程文件,我们应该选择RV1106对应的且后缀为CN的.pdf教程,如果你想学英语也可以选择EN结尾的。
下载文件打开,先看封面再看目录,好的确实是我们要找的教程了,没错了:
## 三、使用教程 教程找到了,我们又没有开发板,所以我们直接从**3 准备开发环境**开始寻找有用的东西。
好的,看完了,已经学会了,我们可以开始了: ### 1.下载仓库 这一步直接照着他的做可以,文件夹的名字可以修改,我这里使用的文件名是**code**,这个不影响后续操作。
### 2.安装 RKNN-Toolkit2 环境
``` conda -V ``` 查看是否安装,虽然这一步我安装了也是这个结果,但是看一看,一般的新的虚拟机都没有安装,我们直接下一步就行。
下载安装包链接,直接复制到命令行运行就行,这个会自己下载的: ``` wget -c https://mirrors.bfsu.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh ``` 安装conda,也是照做就行,反正都是新手教程。 ``` chmod 777 Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh ``` **使用 Conda 创建 Python 环境**
在命令行输入: ``` source ~/miniconda3/bin/activate ```
通过以下命令创建名称为 toolkit2 的 Python 3.8 环境: ``` conda create -n toolkit2 python=3.8 ``` 我已经创建过了就不再创建了,接下来我们激活 toolkit2 环境, 后续将在此环境中安装 RKNN-Toolkit2: ``` conda activate toolkit2 ```
**安装依赖库和 RKNN-Toolkit2**
我们根据自己的路径来,只要到packages的上一级目录就行:
接下来就是安装依赖了,我们上面创建的python环境是3.8的,教程上说根据python版本选择依赖文件,因此我们选择**requirements_cp38-2.0.0b0.txt**文件。 *为什么我这里只有38和39?因为不想占内存所有,我把其他的都删了,剩个39懒得删了*。
所以我们输入的命令为: ``` pip install -r packages/requirements_cp38-2.0.0b0.txt ``` 接下来就是等它下载... 如果出现**Read Time OUT**错误怎么办? 再执行一遍就行,我第一遍也超时了,多试几次就行,或者可以上网百度conda pip 换源,但是这里还挺快,所以我没换了。
然后来安装工具了,我们还是根据python版本选择38的那个: ``` pip install packages/rknn_toolkit2-2.0.0b09bab5682-cp38-cp38-linux_x86_64.whl ```
查看python是否安装成功
输入以下命令,没报错就是对的: ``` # 进入 Python 交互模式 python # 导入 RKNN 类 from rknn.api import RKNN ```
那么,到这里我们的开发环境就搭建的差不多了,至少转换模型所需要的环境已经够了,后面的等板子到了再说吧。 ### 3.准备转换
在运行之前我们需要进行一点改变,因为我们使用的不是yolo模型,而是MNIST训练的Pytorch模型,与网上的yolov5模型不同,这里我给一个网站: ``` https://netron.app/ ```
这是别人yolov5模型的输入:
我相信你肯定发现不同了,我们这个输入是**input.1**我现在也不知都这个是为什么,但是跟yolo肯定是有点区别的。也会对后续我们的操作造成一点不同。 我们需要修改 ``` rknn_model_zoo-2.0.0/examples/yolov5/python/convert.py ``` 中的四十四行: ```python # rknn.config(mean_values=[[0, 0, 0]], std_values=[ # [255, 255, 255]], target_platform=platform) #修改为 rknn.config(target_platform=platform) ```
接下来就是模型转换了,我们输入这里的命令应该是 ``` #注意my_model为我们模型的名字,将其放到model路径下 python convert.py ../model/my_model.onnx rv1106 i8 ../model/my_model.rknn ```
执行完命令就会生成.rknn模型了。 --- ### 4.代码解读 这是我们使用到的官方的代码,我来浅浅的解读一下。 ```python import sys from rknn.api import RKNN DATASET_PATH = '../../../datasets/MNIST/mnist_subset_20.txt' # 这个就是我们测试数据的路径,用来量化模型 DEFAULT_RKNN_PATH = '../model/yolov5.rknn' # 这是默认的模型输出路径和名字,我们命令行里面输入流参数就不会使用这个了 DEFAULT_QUANT = True # 这个就是量化,RKNN库会根据数据集文件(就是我们上面那个路径)中的数据,自动调整量化结果以获得最佳性能。 # 这就是对参数进行一个处理,咱不管他 def parse_arg(): if len(sys.argv) < 3: print("Usage: python3 {} onnx_model_path [platform] [dtype(optional)] [output_rknn_path(optional)]".format(sys.argv[0])) print(" platform choose from [rk3562,rk3566,rk3568,rk3588,rk1808,rv1109,rv1126]") print(" dtype choose from [i8, fp] for [rk3562,rk3566,rk3568,rk3588]") print(" dtype choose from [u8, fp] for [rk1808,rv1109,rv1126]") exit(1) model_path = sys.argv[1] platform = sys.argv[2] do_quant = DEFAULT_QUANT if len(sys.argv) > 3: model_type = sys.argv[3] if model_type not in ['i8', 'u8', 'fp']: print("ERROR: Invalid model type: {}".format(model_type)) exit(1) elif model_type in ['i8', 'u8']: do_quant = True else: do_quant = False if len(sys.argv) > 4: output_path = sys.argv[4] else: output_path = DEFAULT_RKNN_PATH return model_path, platform, do_quant, output_path if __name__ == '__main__': model_path, platform, do_quant, output_path = parse_arg() # 创建一个rknn模型,verbose=False为不打印输出信息 rknn = RKNN(verbose=False) # 这就是我们的预处理配置,设置目标平台,参数从命令行得到 print('--> Config model') rknn.config(target_platform=platform) print('done') # 加载我们的onnx模型 print('--> Loading model') ret = rknn.load_onnx(model=model_path) if ret != 0: print('Load model failed!') exit(ret) print('done') # 根据onnx模型转化为rknn模型 print('--> Building model') ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH) if ret != 0: print('Build model failed!') exit(ret) print('done') # 将训练好的模型导出到文件中 print('--> Export rknn model') ret = rknn.export_rknn(output_path) if ret != 0: print('Export rknn model failed!') exit(ret) print('done') # 释放资源 rknn.release() ``` 看完代码我们发现有用的就那么几行,所以我们这一站也算是比较简单,但是前面环境配置比较费时间,网上的教程我找了一些后来还是打算自己弄,弄完发现也不是很难对吧。 ## 总结 那么我们这一站的任务就完成了,但是目前板子还没到无法验证我们转化后的模型性能,所以后续打算将模型部署到 RV1106 Linux 开发板上再来决定是否需要更换模型。 让我们一起期待板子的到来,来进行后续的测试吧! 最后贴上转化前后的模型吧:
本帖最后由 Alex_Jun 于 2024-5-9 20:54 编辑
cnn3.rknn
(2024-5-9 20:52 上传)
433.91 KB, 下载次数: 1
RKNN模型
点赞
回复评论 (1)
沙发
freebsder
很详细,谢谢分享!收藏待查
默认摸鱼,再摸鱼。2022、9、28
点赞
2024-5-11 17:34
最新活动
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
随便看看
电子设计大赛预测题
MSP430F5538A watchdog
付费寻求电子高手解决问题
(ARM7)当某个模块以10ms速度更新数据时,使用轮询模式还是中断模式?
keil4注册问题(求解)
手机操作系统问题
也晒E金币换购的书
锂电池供电 LED恒流驱动IC 可驱动10串LED灯珠
【沁恒试用】一、CH549EVT产品展示
线性关系、线性区
【瑞萨电子MCU套件免费试用】之刷卡水表 后续
正品飞思卡尔仿真器USB-ML-12 全新原装支持E金币兑换
如何将TDS210采集的波形上传到PC内
大家有选C题的么?
关于ccs6.0中图形显示功能的使用
ATAPI PCI/IDE Storage Block Driver
SM9858六通道电子音量控制IC
【2022得捷电子创新设计大赛】-【基于物联网的PLC】-物料开箱-树莓派400
wince下有没有USB的API函数?
在异地工作的你,买好过年回家的票了吗?说说买机票退机票的囧事儿
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复