在嵌入式人工智能领域,微控制器(MCU)上的神经网络部署面临内存和计算资源的严峻挑战。
NNoM(Neural Network on Microcontroller)项目作为一款轻量级、高层推理库,专为这类环境设计。
项目主页
基于GitHub仓库(https://github.com/majianjia/nnom),NNoM提供用户友好的接口,支持Keras模型一键转换至C代码,实现高效部署。
支持复杂结构如Inception和RNN,深受TinyML开发者青睐。
项目介绍NNoM的核心目标是简化MCU上的神经网络实现,避免底层细节干扰开发者。
它通过Python前端(nnom脚本)将Keras模型转换为预编译C代码,消除运行时解释开销。
系统架构
仓库结构包括源代码(src)、移植层(port)、示例(examples)和文档(docs)。
关键组件:
- 前端:Python工具nnom.py(结构化接口)和nnom_utils.py(层接口),处理模型转换和量化。
- 后端:纯C默认实现,或CMSIS-NN/DSP优化(针对ARM Cortex-M4/7/33/35P,提升5倍性能)。
- 内存管理:依赖malloc/free/memset,支持自定义移植至RTOS如RT-Thread。
- 文档:包括5分钟指南、移植优化手册和API手册(https://majianjia.github.io/nnom/)。
与TensorFlow Lite Micro相比,NNoM更轻量(<50KB),专注小规模模型(参数<1MB),适用于低功耗IoT设备。
基础知识嵌入式神经网络推理涉及将训练模型优化至MCU资源内。
核心概念包括量化(8/16位整数减少浮点计算)、数据格式(HWC/CHW)和加速(如SIMD指令)。NNoM支持Conv1D/2D(包括Depthwise、Dilated)、Pooling、Activation(ReLU/Leaky ReLU/TanH/Sigmoid)、RNN/GRU/LSTM(alpha版,支持stateful/return_sequence)和矩阵操作。
量化采用per-channel(per-axis)方式,提升准确率;建议在Conv后添加BatchNormalization,避免极端激活值影响分辨率。
针对RTOS集成,如RT-Thread(国产轻量操作系统,支持多线程),NNoM需定义内存分配(rt_malloc/rt_free)和时钟(rt_tick_get)。
兼容RT-Thread v4+,通过menuconfig启用NNoM组件和CMSIS-NN,避免浮点库冲突。构建使用scons,示例项目如MNIST演示实时推理。
RT-Thread online packages --->项目特点
miscellaneous packages --->
[*] NNoM: A Higher-level Nerual Network ... --->
NNoM的硬核在于其分层设计:Layer API(Conv2D(),人性化)和Structured API(conv2d_s())。
后端选项确保跨架构兼容,CMSIS-NN利用DSP指令加速。评估工具包括运行时分析、Top-k和混淆矩阵,便于优化。
v0.4.1新增RNN层,支持序列处理如语音识别。
项目实例- MNIST手写识别:使用Keras训练LeNet-5,nnom.from_keras()生成C代码。示例(examples/mnist):
#include "nnom.h"
nnom_model_t *model = mnist_model_new();
uint8_t input[28*28]; // 预处理图像
nnom_run(model, input, output); // 输出分类
在STM32F4上,CMSIS后端推理<10ms,准确率>98%
集成RT-Thread:menuconfig启用NNoM,rt_thread_create()调度线程,实时处理传感器输入。
RNN语音降噪:基于RNNoise变体,部署GRU/LSTM。RT-Thread指南:scons构建,applications/nnom_rnn.c示例。配置CMSIS-NN,rt_malloc分配tensor,推理延迟<20ms,功耗<5mW。适用于RISC-V MCU,优化Dilated Conv处理音频。
ResNet图像分类:支持DenseBlock,量化8位部署CIFAR-10。移植FreeRTOS/ESP32,Top-5准确率>80%。自定义Lambda层后处理。
NNoM作为嵌入式NN框架的典范,其高层抽象和RTOS兼容性(如RT-Thread)显著降低部署门槛,适用于实时IoT应用。
相较通用库,它更注重MCU优化,未来扩展潜力大。
我要赚赏金
