参考:http://blog.sipeed.com/p/518.html
Ubuntu 1804 64bit 以上, python 3.6 Sipeed MAIX系列开发板
我是在py3.6下通过pip install tensorflow
直接安装,一开始用的py3.7…各种报错到怀疑人生
在网络状况好的情况下……直接运行mnist.py可自行下载mnist数据集
不好的话……
自行下载数据集并新建文件夹MNIST_data存储
链接: https://pan.baidu.com/s/10PslqCXqKaZw9MmR-pJnFg 提取码: ftvr
运行mnist/mnist.py进行训练
clone MAIX_Toolbox项目
MAIX_Toolbox内收集了常用格式转换的脚本程序
我们使用MAIX Toolbox内的gen_pb_graph.py工具来查看计算图,在这之前先把mnist.pb放入workspace目录下
python3 gen_pb_graph.py workspace/mnist.pb
可以看到输入节点名为“inputs”,输出节点名为“output”
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,并解压到此处
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)
从pb转换为tflite:bash pb2tflite.sh workspace/mnist.pb
现在在workspace里生成了mnist.tflite
然后我们再通过tflite2kmodel.sh脚本生成kmodel
现在在workspace里生成了mnist.kmodel
参考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