Hi3861使用NNOM实现AI神经网络的功能 原创 精华
在Openharmony的系统下,基于Hi3861一直想看看能不能实现一定的人工智能算法的工作。第一步的思路是打算移植tflite micro。但是在移植的过程中,遇到了一些问题。比如,怎么支持C++。在网上找资料,很长时间没有答案。于是,就掉头走了另外一条路,使用纯C的方案,放弃了C++。找到了纯C的方案NNOM,于是就移植了这个框架,测试了一下Hi3861的能力。
1、NNOM简介
Neural Network on Microcontroller (NNoM)是一个针对微小型资源应用 (单片机,MCU,~100kB RAM) 的一个神经网络推理框架。NNoM使用Keras搭建模型,自动量化并部署到单片机上。NNoM使用商业友好的Apache-2.0 开源协议。
项目地址为: NNOM项目。
NNOM可以做的事情:
1)语音关键词识别 (KeyWord Spotting)
2)使用运动传感器识别活动状态 (Human Activity Recognition)
3)神经网络控制系统 (替代PID等传统控制方法)
4)图像处理 (带专用加速器的 MCU)
NNOM的目录结构
nnom
├───docs
│ ├───figures // 文档图片
│ └───*.md // 文档
├───examples // 例子
├───inc // 头文件
├───port // 移植文件
├───scripts // 脚本工具,模型转换工具
├───src // 源代码
│ LICENSE // 软件包许可证
│ README.md // 软件包简介
└───SConscript // 构建脚本
2、代码移植
在nnom\port\nnom_port.h中,可以配置是使用静态内存,还是动态内存。
/* use static memory */
//#define NNOM_USING_STATIC_MEMORY // enable to use built in memory allocation on a large static memory block
// must set buf using "nnom_set_static_buf()" before creating a model.
/* dynamic memory interfaces */
/* when libc is not available, you shall implement the below memory interfaces (libc equivalents). */
#ifndef NNOM_USING_STATIC_MEMORY
//#define nnom_malloc(n) malloc(n)
//#define nnom_free(p) free(p)
#define nnom_malloc(n) hi_malloc(HI_MOD_ID_APP_COMMON,n)
#define nnom_free(p) hi_free(HI_MOD_ID_APP_COMMON,p)
#endif
在一些ARM的处理器中,比如STM32,可以开启CMSIS_NN加速。
//#define NNOM_USING_CMSIS_NN // uncomment if use CMSIS-NN for optimation
3、示例
作者提供了很多实例,供我们去学习
1)mnist-simple 手写数字识别 (超级简单,Msh 交互)
2)uci-inception 使用6轴运动传感器进行人体运动识别(Inception 结构, 3)CMSIS-NN加速,使用Y-modem发送测试数据,支持 Msh命令行交互)
4)mnist-densenet 手写数字识别 (DenseNet 结构)
5)关键词识别例子(KeyWord Spotting)
我在openharmony上移植了mnist-simple和kws关键词识别两个例子,在后续的文字中,会测试说明,并提供源码,给到想要体验的同学使用。