在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、示例
想了解更多关于开源的内容,请访问:
51CTO 开源基础软件社区
https://ost.51cto.com/#bkwz