部署PyTorch模型到draco开发板实现mnist
1.环境的搭建:
首先我们需要在电脑里面安装anaconda环境,具体的可以见我写的一篇博客:
博客地址:
https://blog.youkuaiyun.com/liaoyuan1130/article/details/131599620?spm=1001.2014.3001.5501
2.下载Rt thread studio
下载安装后,在软件的SDK管理器中,需要下载安装三个包:分别是k210-RT-DRACO,RISC-V-GCC-KENDRYTE,OpenOCD-Kendryte。
这里需要注意的是:下载三个包时,如果一次性勾选三个进行安装,可能会有问题,我的解决办法是:先安装后面两个,再安装第一个,或者一个一个安装,安装不上的话就多试几次,应该就不会报错了。
3.其他工具
我们还需要RT-AK, Kflash,Netron(自行下载) ,我都会提供在文件夹里。
4.模型的训练
训练模型的代码提供给了大家,文件后缀是.ipynb,用jupyter notebook打开,jupyter notebook是我们在安装anaconda时自带的。首先我们在cmd中输入:
conda activate 环境名
看了我的博客就知道我建立的环境名叫pytorch,所以这里我应该输入:
conda activate pytorch
再输入jupyter notebook,于是就会在网页中弹出网站,找到该.ipynb文件,就有了模型的代码,运行代码时,如果提示少了什么库,就在conda环境中安装就行。
运行代码后,我们可以得到onnx模型,在这里我们需要对其利用onnxsim优化,得到优化后的模型(之后的每个实验的模型都需要优化,要不然利用rt-ak时会报错)。
5.RT-AK工具转换
我们在在RT-AK路径下打开 Windows 终端:
在该路径下,打开cmd,这里我们还是需要进入到conda 环境中,输入:
Conda activate pytorch
然后在输入:
$ python rt-ak.py nncase -i onnx -t k210 --project=<your_project_path> --model_file=<your_model_path> --model_name=mnist --platform=k210 --dataset=<your_val_dataset> --quant-type uint8 --w-quant-type uint8 --input-shape “1 1 28 28” --preprocess True --input-range “0 1” --input-type uint8 --output-type float32 --input-layout NCHW --output-layout NCHW --mean “0 0 0” --std “1 1 1” --output-range “0 1”
例如我的:
Python rt-ak.py nncase -i onnx -t k210 --project_path=“D:\Apps\Rt-threadStudio\rt-threadstdio\RT-ThreadStudio\workspace\test2” --platform=k210 --model_name=mnist --model_file=“C:\Users\ly\Desktop\新建文件夹\new\lab3-mnist-pytorch\lab3-mnist-pytorch\Models\mnist-onnxsim.onnx” --quant-type uint8 --w-quant-type uint8 --dataset=“C:\Users\ly\Desktop\新建文件夹\new\lab3-mnist-pytorch\lab3-mnist-pytorch\Datasets\quantize_data” --input-shape “1 1 28 28” --preprocess True --input-range “0 1” --input-type uint8 --output-type float32 --input-layout NCHW --output-layout NCHW --mean “0 0 0” --std “1 1 1” --output-range “0 1”。
这里需要输入的几个参数:
(1)rtt工程路径:就是在rtt文件夹下的workspace下,就有你建立的项目。
(2)模型名字:这里叫mnist
(3)模型文件路径:也就是训练的onnxsim模型路径。
(4)量化数据集路径:存入了一些图片。
(5)Input-shape可以通过Netron查看模型的输入大小.
(6)preprocess表示是否进行预处理,如果模型要量化的话就要选的True。
(7)input-range表示图片像素值范围,训练中如果有归一化,就是“0 1”,否则“0 255”。
(8)input-type表示输入图片的类型。
(9)output-type表示输出图片的类型,如果训练时经过softmax等层,就是float32。
(10)input-layout:onnx填NCHW, tflite填写NHWC。
(11)output-layout:onnx填NCHW, tflite填写NHWC。
(12)–Mean-- std:根据图片预处理决定,如果没有经过(img-mean/std,默认000 111。
(13)output-range:表示图片像素值范围,训练中如果有归一化,就是“0 1”,否则“0 255”。
然后运行,如果显示success,表示没有问题了,在你的项目工程文件夹applications下会多出几个文件:
Mnist_kmodel.c,rt_ai_mnist_model.c,rt_ai_mnist_model.h
6.嵌入式应用
首先改变RISC-V的版本,将8.3.0更换到10.2.0,10.2.0的包我已经放到了文件夹里。然后放入与8.3.0相同的路径中:
然后在rtt studio中,右键项目选择属性,看到如下界面,改变路径:
D:\Apps\Rt-threadStudio\rt-threadstdio\RT-ThreadStudio\repo\Extract\ToolChain_Support_Packages\KENDRYTE\RISC-V-GCC-KENDRYTE\10.2.0\bin
然后这里我们要在更换SDK包,新的SDK我也放在了文件夹里,在项目的packages里面删掉旧的kendryte-sdk文件夹,然后放入新的SDK包在里面。
最后在项目目录下找到rtconfig.py文件,然后打开:
将第18行的内容复制一份到第25行,然后改变里面的路径,也就是刚刚在属性里面改变的路径,保存退出。
然后在main函数中,进行初始化配置和外设的配置,具体代码我会放入文件夹中。
点击编译,看到没有错误就行了。
7.烧录
打开kflash,连接好开发板,找到项目生成的.bin文件,点击下载:
就可以看到屏幕上有了效果。