- Summary: 在 RT-Thread 系统上执行 Mnist 推理,纯手搭版
- Author: [email protected] & [email protected]
- Date: 2020/07/19
MNIST 在人工智能领域中的地位等同于 “Hello world” 在各个编程语言中的地位.
因此, 本次实验将以 MNIST 为主体, 进一步了解人工智能和嵌入式之间的神秘联系,
本期实现的是:
通过CMSIS NN
库复现神经网络, 导入int
型权重文件, 在 RTT 系统中成功实现Mnist 推理.
如何将 Mnist 跑在 RTT 上:
从
github
拉取Mnist_CMSIS
或者Mnist_CMSIS.7z
到本地,Mnist_CMSIS
有520M, 建议下载压缩包, 仅66.4M运行方法, 二选一:
- scons
- MDK5 编译
CMSIS + RTT 推理成功界面
在github上的文件夹中,已经包含实验运行所需要的CMSIS packages, 下载即可运行, 自己新建的工程需要现在 RTT 的
Menuconfig
中打开CMSIS
包
File: mnist.ipynb
File: ./data/mnist.npz
MNIST 数据集由 60000 (训练集) + 10000(测试集) 手写字符组成, 每张图片的大小为 $ 28 * 28 $, 数据集手动下载地址 http://yann.lecun.com/exdb/mnist/ .
File: ./model/mnist.h5
# save weights
model.save_weights(model_path / 'model_weights.h5')
# load weights
model.load_weights(model_path / 'model_weights.h5')
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy',])
loss, acc = model.evaluate(x_test, y_test)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
313/313 [==============================] - 1s 2ms/step - loss: 0.1226 - accuracy: 0.9651
Restored model, accuracy: 96.51%
ok, 至此, 模型已经训练完成, 但是, 准备工作还没有做完, 请接着往下看
最终的目标是将训练好的 Model 在 RT-Thread 系统上能够推理(测试)成功.
本次实验所采用的方法是CMISIS + RTT
, (需要一定的深度学习背景知识), 步骤如下:
int
型,并保存.c
类文件前提: 已经安装好 RT-Thread 所需要的运行环境
# windows
> pkgs --upgrade
# 开启 CMSIS
> menuconfig
> pkgs --update
> scons --target=mdk5
# linux
# 如果开启不了, 请执行
# (base) Mnist_CMSIS[master*] % source ~/.env/env.sh
(base) Mnist_CMSIS[master] % pkgs --upgrade
(base) Mnist_CMSIS[master] % scons --menuconfig
(base) Mnist_CMSIS[master*] % pkgs --update
通过调用CMSIS API, 实现网络重构, 此步骤需要一定的深度学习基础
另外, 在重构的过程中, 均用int
, 而非float
型
感兴趣的可以阅读源文件
其他文件并无做任何改动
Windows (推荐使用MDK)
MDK 一键编译一键烧录, 时间略久, 通过 Putty 观察输出情况
Linux (推荐使用scons)
scons
编译, 通过STM32 Cube Programmer
烧录, minicom
观察输出情况
成功界面:
arm_math.h
解决:
windows:
增加宏定义
USE_STDPERIPH_DRIVER,ARM_MATH_CM4,__CC_ARM,__FPU_PRESENT, ARM_MATH_DSP
linux:
但是文件均已经存在
解决:
在./Mnist_CMSIS/SConscript
下面, 改为如图所示