MAIXPY平台训练mnist数据集并转换推理模型

参考:http://blog.sipeed.com/p/518.html

Ubuntu 1804 64bit 以上, python 3.6 Sipeed MAIX系列开发板

一、安装tensorflow 1.13

我是在py3.6下通过pip install tensorflow直接安装,一开始用的py3.7…各种报错到怀疑人生

二、准备mnist数据并训练

在网络状况好的情况下……直接运行mnist.py可自行下载mnist数据集
不好的话……
自行下载数据集并新建文件夹MNIST_data存储
链接: https://pan.baidu.com/s/10PslqCXqKaZw9MmR-pJnFg 提取码: ftvr

运行mnist/mnist.py进行训练

三、10min: pb模型转换为kmodel

clone MAIX_Toolbox项目

MAIX_Toolbox内收集了常用格式转换的脚本程序

1. 查看计算图

我们使用MAIX Toolbox内的gen_pb_graph.py工具来查看计算图,在这之前先把mnist.pb放入workspace目录下

python3 gen_pb_graph.py workspace/mnist.pb

可以看到输入节点名为“inputs”,输出节点名为“output”

2. 下载nncase工具箱

TFlite模型转换为K210的模型格式,需要借助嘉楠的nncase工具箱。

若网络情况好……运行Maix_Toolbox中的get_nncase.sh 脚本,自动从github下载nncase的linux的编译好的二进制文件
若网络情况不好……
将get_nncase.sh 脚本内的wget https://github.com/kendryte/nncase/releases/download/v0.1.0-rc5/ncc-linux-x86_64.tar.xz
修改为wget https://gitee.com/cnbright/nncase/attach_files/267069/download
换到码云的下载地址
也可以直接在这个地址下载,再在Maix_Toolbox内新建文件夹ncc,并解压到此处

3. 准备量化图片(添加测试图片)

TFlite模型在转换为K210模型的时候,会对原来的网络结构进行量化quantization, 量化会将原来网络中的浮点运算转化为8比特整数运算,起到压缩模型尺寸与加速的目的。线性激活函数, relu激活函数, relu6激活函数等均可以转换为等价的量化运算。

在Maix_Toolbox的根目录下新建一images文件夹,用于存放量化图片数据, 在量化的过程中需要用到。

测试图片必须直接放置在images文件夹中。 图像的名称可以任意,图像尺寸跟训练集的图像尺寸保持一致,可以从训练集的图像样本中选取一些有代表性的,放在images文件夹中。

但是我们下载的mnist数据集是二进制的,并不是图片格式,所以使用以下脚本转换成图片:

#coding:utf-8

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) #MNIST数据输入

import scipy.misc
import os
save_dir = './images/'
if os.path.exists(save_dir) is False:
    os.makedirs(save_dir)
for i in range(20):
    image = mnist.train.images[i,:]
    image = image.reshape(28,28)
    file = save_dir+'mnist_train_%d.jpg' % i
    scipy.misc.toimage(image,cmin=0.0,cmax=1.0).save(file)

4. 转换模型

从pb转换为tflite:bash pb2tflite.sh workspace/mnist.pb

现在在workspace里生成了mnist.tflite

四、生成kmodel

然后我们再通过tflite2kmodel.sh脚本生成kmodel
现在在workspace里生成了mnist.kmodel

五、打包kfpkg并烧录

参考http://blog.sipeed.com/p/390.html
也可以用kflash_gui打包

烧录kmodle
参考http://blog.sipeed.com/p/668.html

六、测试代码

通过maixpy运行以下代码测试模型

import sensor,lcd,image
import KPU as kpu
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))    #set to 224x224 input
sensor.set_hmirror(0)               #flip camera
task = kpu.load(0x00A00000)         #load model from 
sensor.run(1)
while True:
    img = sensor.snapshot()
    lcd.display(img,oft=(0,0))      #display large picture
    img1=img.to_grayscale(1)        #convert to gray
    img2=img1.resize(28,28)         #resize to mnist input 28x28
    a=img2.invert()                 #invert picture as mnist need
    a=img2.strech_char(1)           #preprocessing pictures, eliminate dark corner
    lcd.display(img2,oft=(224,32))  #display small 28x28 picture
    a=img2.pix_to_ai();             #generate data for ai
    fmap=kpu.forward(task,img2)     #run neural network model 
    plist=fmap[:]                   #get result (10 digit's probability)
    pmax=max(plist)                 #get max probability
    max_index=plist.index(pmax)     #get the digit
    lcd.draw_string(224,0,"%d: %.3f"%(max_index,pmax),lcd.WHITE,lcd.BLACK)  #show result

效果展示

MAIXPY平台训练mnist数据集并转换推理模型_第1张图片

你可能感兴趣的:(K210,MAIXPY,micropython,深度学习,MNIST,目标识别)