Hi3861使用NNOM实现AI神经网络的功能 原创 精华

再见南丫岛
发布于 2022-5-2 19:08
浏览
5收藏

在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关键词识别两个例子,在后续的文字中,会测试说明,并提供源码,给到想要体验的同学使用。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-5-2 19:08:16修改
5
收藏 5
回复
举报
回复
    相关推荐