你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-U545RE-Q】移植TinyML测试数字识别。

[复制链接]
STMWoodData 发布时间:2023-12-25 17:22

TinyML是指在边缘设备上运行的机器学习模型,通常是在资源受限的嵌入式系统上运行的轻量级模型。这些设备可以是智能手机、传感器、微控制器或其他嵌入式设备。

TinyML的目标是在这些设备上实现低功耗、低延迟和隐私保护的机器学习应用。

TinyML的发展受益于多个技术进步,包括模型压缩、量化、剪枝和量化训练等技术。这些技术允许将大型的深度学习模型压缩到足够小的尺寸,以适应嵌入式设备的资源限制。

此外,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 在线模型训练支持

项目地址: https://github.com/sipeed/TinyMaix

下面 说明 如何移植。官方文档内有说明如何移植(readme文档),** 在这里 重新记录一下。** TinyMaix的核心文件只有这5个:

tm_model.c,

tm_layers.c,

tinymaix.h,

tm_port.h,

arch_xxx.h 如果你使用没有任何指令加速的普通单片机,选择 arch_cpu.h, 否则选择对应架构的头文件。 然后你需要编辑tm_port.h,填写你需要的配置,所有配置宏后面都有注释说明。注意 TM_MAX_CSIZE,TM_MAX_KSIZE,TM_MAX_KCSIZE 会占用静态缓存。 最后你只需要把他们放进你的工程里编译即可。

如何使用 (API)** 使用步骤-》1、加载模型-》2、输入数据预处理-》3、运行模型-》4、移除模型 加载模型* tm_err_t tm_load (tm_mdl_t mdl, const uint8_t* bin, uint8_tbuf, tm_cb_t cb, tm_mat_t in); mdl: 模型句柄; bin: 模型bin内容; buf: 中间结果的主缓存;如果NULL,则内部自动malloc申请;否则使用提供的缓存地址 cb: 网络层回调函数; in: 返回输入张量,包含输入缓存地址 //可以忽略之,如果你使用自己的静态输入缓存

输入数据预处理 tm_err_t tm_preprocess(tm_mdl_t mdl, tm_pp_t pp_type, tm_mat_t in, tm_mat_t* out); TMPP_FP2INT //用户自己的浮点缓存转换到int8缓存 TMPP_UINT2INT //典型uint8原地转换到int8数据;int16则需要额外缓存 TMPP_UINT2FP01 //uint8转换到01的浮点数 u8/255.0 TMPP_UINT2FPN11//uint8转换到-11的浮点数

运行模型 tm_err_t tm_run (tm_mdl_t mdl, tm_mat_t in, tm_mat_t* out);

移除模型 void tm_unload(tm_mdl_t* mdl);

怎样添加新平台的加速代码 对于新增平台,你只需要在src里添加arch_xxx.h文件并实现其中的函数即可,主要为以下几个函数(重要性降序排列,不重要的函数可以直接拷贝纯CPU运算的函数): a. TM_INLINE void tm_dot_prod(mtype_t sptr, mtype_t kptr,uint32_t size, sumtype_t result) 实现平台相关的点积函数,可以使用MAC相关的加速指令加速。 b. TM_INLINE void tm_dot_prod_pack2(mtype_t sptr, mtype_t kptr, uint32_t size, sumtype_t result) 实现平台相关的双通道点积函数。(仅提供到双通道是因为有些芯片平台的寄存器不足以支持更多通道的点积加速) c. TM_INLINE void tm_postprocess_sum(int n, sumtype_t sums, btype_t bs, int act, mtype_t outp, sctype_t scales, sctype_t out_s, zptype_t out_zp) 实现平台相关的批量后处理函数,注意n为2的次幂。 d. TM_INLINE void tm_dot_prod_3x3x1(mtype_t sptr, mtype_t kptr, sumtype_t result) 实现平台相关的3x3点积加速 e. TM_INLINE void tm_dot_prod_gap_3x3x1(mtype_t sptr, mtype_t kptr, uint32_t k_oft, sumtype_t* result) 实现平台相关的3x3 gap的点积加速

下面分享基于STM32U545的具体移植过程。

首先下载源码,添加到工程中。

image.png

接着修改tm_port.h文件配置

image.png

由于代码中使用了动态分配,所以工程中堆栈的容量最好先设置大一些。

下面是添加数字识别例子。

image.png

然后要包含TinyML的头文件路径。设置优化等级。

image.png

再就是主函数中调用例子。

image.png

编译整个工程,然后下载到开发板上。通过串口可以看到识别结果。

image.png

我在lcd屏上也显示了输出结果。

image.png

收藏 评论1 发布时间:2023-12-25 17:22

举报

1个回答
STMCU-管管 回答时间:2023-12-26 08:37:08
LCD屏设计的真不错
2 O3 ?# q$ {% n* u% c8 X
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版