基于K210的MNIST手写数字识别
写在前面
本篇文章主要对https://blog.csdn.net/weixin_44874976/article/details/104487069文章进行适当补充,以方便其他同学更好实现作者mgcsky98的例程。
开始
硬件平台
采用Maixd dock开发板(不同板子主要在固件下载和载入kmodel时选择不同而已)
在sipeed官方有售
开发平台
本文用到的所有程序都是从mgcsky98博主的GitHub下载,在此表示十分感谢。
操作系统:Windows系统
模型训练:tensorflow1.15 CPU版,原文作者使用tensorflow2.1 CPU版以及tensorflow1.15 CPU版
模型转换工具:NNCase v0.2.0 Beta2
模型训练IDE:pycharm
nncase下载地址:链接: Github。需要将下载的ncc.exe复制到相应ncc相应文件夹下即可。
操作步骤
1 配置模型开发环境
打开pytoch使用快捷键alt+F12进入终端
进入anoconda 使用conda create 命令新建虚拟环境
conda create -n mnist python=3.7
激活虚拟环境
conda activate mnist
本人建议直接下载python3.7就行,然后使用pip install 命令下载
pip install tensorflow==1.15 keras==2.2.4 imgaug==0.2.6 opencv-python Pillow requests tqdm sklearn pytest-cov codecov matplotlib
安装完成后设置pycharm为解释器当前虚拟环境(快捷键为Ctrl+Shift+S)
2 模型建立
在模型的搭建时有一点需要注意,k210的kpu 最好使用1x1、3x3的卷积核,这样效率比较高。因此根据情况在代码中做调整即可,关于一些kpu的新手问题在这边都有提到。
运行lenet_k210.py代码,训练后得到h5模型
3 模型转换
因为k210单片机并不能识别tensorflow的模型,因此需要转换。
大致的流程是这样的。
h5–>pb–>tflite–>kmodel
3.1 h5->pb
运行h52pb.py
####3.2 2 查看计算图
使用工具箱Maix_Toolbox
进入tf1.15的虚拟环境,并cd到Maix_Toolbox路径下,输入如下指令查看计算图。主要目的是找到计算图的输入与输出,这里输入是conv2d_input, 输出是dense_2/Softmax。
3.3 pb–>tflite
运行命令(一定要在pytorch 的Terminal下运行)
./pb2tflite.sh
根据提示依次输入对应内容即可,最终会自动生成需要的指令,并自动生成tflite文件。
个人建议直接把pb2tflite.sh文件直接做如下修改
echo "This script help you generate cmd to convert *.pb to *.tflite"
echo "Please put your pb into workspace dir"
echo "1. pb file name: (don't include workspace)"
pb_name="mnist_lenet_K210_model.pb"
echo "2. input_arrays name:"
in_name="conv2d_input"
tflite_name=`echo $pb_name | cut -d '.' -f 1`
tflite_name=$tflite_name.tflite
echo "3. output_arrays name:"
out_name="dense_2"
echo "4. input width:"
in_w=32
echo "5. input height:"
in_h=32
echo "6. input channel:"
in_ch=1
这样如果有错误就不用每次都要做一些重复性工作。
3.4 tf->kmodel
首先需要准备训练集并保存到toolbox的images目录下,由于训练时使用的mnist不是图片格式,可以使用dataset2jpg.py代码生成图片。
复制所有图片到toolbox下的images文件夹下。在Terminal中运行以下指令
ncc\ncc compile workspace/mnist_lenet_K210_model.tflite workspace/test1.kmodel -i tflite -o kmodel --dataset images
4 下载模型到k210
使用kflash_gui工具把kmodel模型下载到k210的flash中(注意选好地址本次使用0x300000)
如果maixpy的固件过大,调整地址,避免重叠。本人所购板子为Dock,原作者板子为Maxiduino。
5 运行代码
打开maixpy IDE,运行mnist1.py即可,注意如果有
Traceback (most recent call last):
File "<stdin>", line 9, in <module>
ValueError: [MAIXPY]kpu: load error:2002, ERR_KMODEL_VERSION: only support kmodel V3
MicroPython v0.6.2-46-geafab8cfd on 2021-04-14; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
>>>
报错,需要更新固件,博文介绍的比较详细,大家可以参考一下