RT-Threadwilliam hill官网
直播中

ouxiaolong

11年用户 470经验值
擅长:嵌入式技术 光电显示
私信 关注
[经验]

【Vision Board创客营连载体验】TinyMaix进行手写数字识别

1 TinyMaix简介

TinyMaix是国内sipeed团队开发一个轻量级AI推理框架,TinyMaix 是面向单片机的超轻量级的神经网络推理库,即 TinyML 推理库,可以让你在任意单片机上运行轻量级深度学习模型。

  • 关键特性
  • 核心代码少于 400行(tm_layers.c+tm_model.c+arch_cpu.h), 代码段(.text)少于3KB
  • 低内存消耗,甚至 Arduino ATmega328 (32KB Flash, 2KB Ram) 都能基于 TinyMaix 跑 mnist(手写数字识别)
  • 支持 INT8/FP32/FP16 模型,实验性地支持 FP8 模型,支持 keras h5 或 tflite 模型转换
  • 支持多种芯片架构的专用指令优化: ARM SIMD/NEON/MVEI,RV32P, RV64V
  • 友好的用户接口,只需要 load/run 模型~
  • 支持全静态的内存配置(无需 malloc )
  • 即将支持 MaixHub 在线模型训练

1.2 TinyMaix核心API

TinyMaix框架对上层应用程序提供的核心API主要位于代码仓的tinymaix.h文件中,核心API如下:

/******************************* MODEL FUNCTION ************************************/
tm_err_t tm_load  (tm_mdl_t* mdl, const uint8_t* bin, uint8_t*buf, tm_cb_t cb, tm_mat_t* in);   //load model
void     tm_unload(tm_mdl_t* mdl);                                      //remove model
tm_err_t tm_preprocess(tm_mdl_t* mdl, tm_pp_t pp_type, tm_mat_t* in, tm_mat_t* out);            //preprocess input data
tm_err_t tm_run   (tm_mdl_t* mdl, tm_mat_t* in, tm_mat_t* out);         //run model

/******************************* UTILS FUNCTION ************************************/
uint8_t TM_WEAK tm_fp32to8(float fp32);
float TM_WEAK tm_fp8to32(uint8_t fp8);

/******************************* STAT FUNCTION ************************************/
#if TM_ENABLE_STAT
tm_err_t tm_stat(tm_mdlbin_t* mdl);                    //stat model
#endif

主要分为三类:

  • 模型函数,包括模型加载、卸载、预处理、推理;
  • 工具函数,包含FP32和uint8的互转;
  • 统计函数,用于输出模型中间层信息;

这里的模型,通常是预训练模型经过脚本转换生成的TinyMaix格式的模型;

1.2 TinyMaix底层依赖

TinyMaix可以简单理解为一个矩阵和向量计算库,目前已支持如下几种计算硬件:

#define TM_ARCH_CPU         (0) //default, pure cpu compute
#define TM_ARCH_ARM_SIMD    (1) //ARM Cortex M4/M7, etc.
#define TM_ARCH_ARM_NEON    (2) //ARM Cortex A7, etc.
#define TM_ARCH_ARM_MVEI    (3) //ARMv8.1: M55, etc.
#define TM_ARCH_RV32P       (4) //T-head E907, etc.
#define TM_ARCH_RV64V       (5) //T-head C906,C910, etc.
#define TM_ARCH_CSKYV2      (6) //cskyv2 with dsp core
#define TM_ARCH_X86_SSE2    (7) //x86 sse2

对于ARM-Cortex系列MCU,可以支持纯CPU计算和SIMD计算。其中CPU计算部分无特殊依赖(计算代码均使用标准C实现)。SIMD部分,部分计算代码使用了C语言内嵌汇编实现,需要CPU支持相应的汇编指令,才可以正常编译、运行。

TinyMaix的示例代码依赖于精准计时和打印输出能力,具体是项目的tm_port.h中的几个宏定义:

#define  TM_GET_US()       ((uint32_t)((uint64_t)clock()*1000000/CLOCKS_PER_SEC))
#define TM_DBGT_INIT()     uint32_t _start,_finish;float _time;_start=TM_GET_US();
#define TM_DBGT_START()    _start=TM_GET_US();
#define TM_DBGT(x)         {_finish=TM_GET_US();\
                            _time = (float)(_finish-_start)/1000.0;\
                            TM_PRINTF("===%s use %.3f ms\n", (x), _time);\
                            _start=TM_GET_US();}

2 TinyMaix部署

TinyMaix移植到RT-Thread很简单,只需要打开r-tinymaix安装包即可。

1.png

最后运行效果如下:

1.cifar10实例,分类检测,识别图片是一只鸟:

2.png

2. mnist实例,数字识别,图片是一个数字2:

3.png

3.vww实例,检测有没有人,图片有人:

4.png

更多回帖

发帖
×
20
完善资料,
赚取积分