TinyML-note

TinyML-note

Charles Lv7

TinyML-note

PS:感谢管爷的资料支持

什么是TinyML?

TinyML 指的是在 mW 功率的微处理器上,实现机器学习的方法、工具和技术。它连接了物联网设备,边缘计算和机器学习。

​ 我认为所谓TinyML就是在Tiny的处理器上进行ML(Maching learning)的开发,在实际应用中就是在 Arduino 和超低功耗微控制器上运行 ML 。

可行性讨论:基于机器学习的流程

软件方面,TinyML与一般的机器学习并无根本性不同,只是它所解决的问题的规模较小,基于一两个传感器(比如音频,加速度)提供数据输入,基于有限的存储和计算能力给出结果。

需要关注部分选题是否超出了所用低功耗芯片的性能限制,比如视频特征实时识别等较高负载场景(也许可以通过进一步优化和简化来实现基本的功能,摒弃复杂的细节)

TinyML的简单事例——“唤醒词”

智能手机是最典型的 TinyML 例子。手机一直处于主动聆听“唤醒词”的状态,例如 Android 智能手机的“你好,谷歌”,以及 iPhone 的“你好,Siri”。如果通过智能手机的 CPU(主流 iPhone 的 CPU 已达 1.85 GHz)运行语音唤醒服务,那么电池电量会在短短几个小时内耗尽。这样的电量消耗是不可接受的,而语音唤醒服务大多数人每天最多使用几次。

为了解决这个问题,开发人员创建了可以用小型电池(例如 CR2032 纽扣电池)供电的专用低功耗硬件。即使 CPU 未运行(通常表现为屏幕并未点亮),集成电路也能保持活跃状态。

这样的集成电路消耗功率仅为 1mW,如果使用标准的 CR2032 电池,可供电长达一年。

​ 一方面唤醒词服务是现在Maching Learning的重要部分,另一方面硬件由于低功耗可以实现超长续航,两者巧妙结合就形成了经典的TinyML模型。

TinyML目前的主要使用领域(未来使用领域)

实际上,TinyML 为产品粉丝和企业提供了大量令人兴奋的应用,用于实现更智能的 IoT 设备。在当前数据变得越来越重要的情况下,将机器学习资源分发到远端内存受限设备的能力,为农业、天气预报或地震等数据密集行业提供了巨大机遇。

毫无疑问,赋予边缘设备执行数据驱动处理的能力,将为工业过程中的计算范式带来转变。举个例子,如果能够监测农作物并检测到诸如土壤湿度、特定气体(例如苹果成熟时会释放出乙烷)等特征或特定的大气条件(例如大风、低温或高湿度等),将极大地促进作物的生长,提高作物的产量。

另一个例子是,在智能门铃中可安装摄像机,使用面部识别确定到场的来访者。这将实现安防功能,甚至可以在有人到场时将门铃摄像头输出到屋内电视屏幕,以便主人了解门口的访客情况。

目前,TinyML 主要的两个重点应用领域是:

  • 关键字发现。大多数人已经非常熟悉此应用,例如“你好,Siri”和“你好,Google”等关键字,通常也称为“热词”或“唤醒词”。设备会连续监听来自麦克风的音频输入,训练实现仅响应与所学关键字匹配的特定声音序列。这些设备比自动语音识别(automatic speech recognition,ASR)更简单,使用更少的资源。Google 智能手机等设备还使用了级联架构实现扬声器的验证,以确保安全性。
  • 视觉唤醒词。视觉唤醒词使用图像类似替代唤醒词的功能,通过对图像做二分类表示存在与否。例如,设计一个智能照明系统,在检测到人的存在时启动,并在人离开时关闭。同样,野生动物摄影师可以使用视觉唤醒功能在特定的动物出现时启动拍摄,安防摄像机可以在检测到人活动时启动拍摄。

TinyML的优势

1.从上面对TinyML的介绍不难看出,TinyML凭借着在arduino或低功耗硬件上开发的条件,所以可以实现凭借着体积较小的电源设备实现超长续航,非常适合“监测”类型的服务。

2.从其他的一些现成的TinyML的应用事例分析得出,TinyML还有着可以将用户信息存储在微处理器而非与服务器或者其他外部设备相连,这样一方面保持了TinyML低延迟的优势,而且也不会造成用户的信息泄露。

3.TinyML的很多应用都离不开是在无人机等设备上应用的,而正是因为TinyML构造比较简单,重量比较轻的缘故。当然电路简单成本低也是它的一大优势,这个优势有利于将TinyML的设备投入大规模使用。

​ 综上,我认为TinyML的优势在于续航能力强信息安全性(隐私保护)高,信息传递低延迟重量较轻成本低几个方面。

Maching Learning的大概流程

1. 确定目标

机器学习的最大优势?
不需要给出具体算法(专家系统),便可解决复杂的问题。
为什么要把机器学习应用到MCU(Microcontroller)?
MCU正在植入到越来越多的边缘设备中(智能家居),这些设备有时需要应对一些复杂的问题(语音,视频等等的智能化需求)。
如果不依靠机器学习,需要依靠中心侧的算力计算结果,然后把数据通过网络、蓝牙传输到边缘设备的MCU,得到计算结果(延迟高,需占用中心算力)。
如果应用TinyML,在这些边缘设备MCU中存储的机器学习模型直接计算,得到结果。(低延迟实时计算,节省云端算力)
TinyML在物联网(基于MCU)应用已经很广泛。重点关注还有哪些场景还没有覆盖到。

平台

基于TensorFlow-lite。见参考资料[7]

选题

技术创新难,前人的项目所用到的技术覆盖范围很广。
可以选择从应用创新下手。利用已有技术,应用到新的使用场景。解决痛点。
基于加速度传感器:
手势识别(已有开源项目)=> 手语输入(应用场景扩展)、握笔姿势检测
无绳跳绳(已有开源项目)=> 无实物呼啦圈/踢毽子/羽毛球/…(各类体感游戏,健身环大冒险的低成本实现)

硬件

芯片(ESP32 / Arduino Nano )
其他传感器(摄像头)
其他硬件(LCD屏幕/LED)
供电方式(电池/USB)
有无数据传输需求(蓝牙/WIFI)

2. 收集数据集

目前TinyML的应用绝大多数为监督学习,需收集数据集。
(能否应用于非监督学习?比如聚类等算法。一个技术创新的点)
数据集的收集难易影响项目的可行性,数据集的收集质量影响模型训练的质量。
对于一个确定的选题,是否有开源的数据集?
如果有,是否与我们的需求兼容?如果不兼容,能否通过修改来符合?
如果没有,能否制作出可靠的数据集?(比如上例中的手势识别,需要手动录入数据)

3. 设计模型架构

需要学习机器学习基础知识,了解不同模型的优势,了解不同模型所擅长解决的问题。
全连接神经网络,卷积神经网络,循环神经网络等。
需要学习TensorFlow等机器学习库,会模型搭建与调参。

4. 训练模型:注意一下过拟合和欠拟合所产生的各种问题

  • 生成小型 TensorFlow 模型,该模型适合您的目标设备并包含支持的操作
    • 限制
      适用于微控制器的 TensorFlow Lite 专为满足微控制器开发的特定限制条件而设计。如果您使用的是更强大的设备(例如 Raspberry Pi 等嵌入式 Linux 设备),那么标准 TensorFlow Lite 框架可能更易于集成。
      应考虑以下限制:
  • 支持的 TensorFlow 操作有限
  • 支持的设备有限
  • 需要手动管理内存的低阶 C++ API
  • 不支持设备端训练**(需要在电脑上进行模型训练,然后转换并烧录到MCU设备)**

5. 转换模型

基本流程

  • 生成小型 TensorFlow 模型,该模型适合您的目标设备并包含支持的操作
  • **第一步转换:**使用 TensorFlow Lite 转换器转换为 TensorFlow Lite 模型。(一种优化的 FlatBuffer格式,由 .tflite文件扩展名标识)
  • **第二步转换:**使用标准工具转换为 C 语言字节数组,以将其存储在设备上的只读程序内存中。(以 char 数组形式包含 TensorFlow Lite 模型的 C 源文件)

转化评估

在尝试转换模型之前评估模型是一个重要步骤。在评估时,您想要确定模型的内容是否与 TensorFlow Lite 格式兼容。您还应该根据模型使用的数据大小、硬件处理要求以及模型的整体大小和复杂性来确定您的模型是否适合在移动和边缘设备上使用。
对于许多型号,转换器应该开箱即用。但是,TensorFlow Lite 内置运算符库支持 TensorFlow 核心运算符的子集,这意味着某些模型在转换为 TensorFlow Lite 之前可能需要额外的步骤。此外,出于性能原因,TensorFlow Lite 支持的某些操作限制了使用要求。请参阅 运算符兼容性指南以确定您的模型是否需要重构以进行转换。
Key Point:
大多数模型可以直接转换为 TensorFlow Lite 格式。某些模型可能需要重构或使用高级转换技术才能使它们兼容。

第一步转换

输入模型格式

您可以将转换器与以下输入模型格式一起使用:

  • SavedModel推荐):作为一组文件保存在磁盘上的 TensorFlow 模型。
  • Keras 模型:使用高级 Keras API 创建的模型。
  • Keras H5 格式:Keras API 支持的 SavedModel 格式的轻量级替代方案。
  • 从具体函数构建的模型:使用低级 TensorFlow API 创建的模型。
    您可以将 Keras 和具体函数模型都保存为 SavedModel 并使用推荐的路径进行转换。
    **注意:**为避免推理过程中出现错误,请在导出为 SavedModel 格式时包含签名。TensorFlow 转换器支持将 TensorFlow 模型的输入/输出规范转换为 TensorFlow Lite 模型。请参阅有关添加签名的主题。
    如果您有 Jax 模型,则可以使用TFLiteConverter.experimental_from_jax API 将其转换为 TensorFlow Lite 格式。请注意,此 API 在实验模式下可能会发生变化。
转换工作流

装换工作流
可以使用下面的其中一个选项来转换模型:

  1. Python API推荐):这允许您将转换集成到开发流水线中,应用优化,添加元数据,以及许多其他简化转换过程的任务。
  2. 命令行:这仅支持基础模型转换。
训练后量化

训练后量化是一种转换技术,它可以在改善 CPU 和硬件加速器延迟的同时缩减模型大小,且几乎不会降低模型准确率。使用 TensorFlow Lite 转换器将已训练的浮点 TensorFlow 模型转换为 TensorFlow Lite 格式后,可以对该模型进行量化。

第二步转换

许多微控制器平台没有本地文件系统的支持。从程序中使用一个模型最简单的方式是将其以一个 C 数组的形式包含并编译进你的程序。
以下的 unix 命令会生成一个以 char 数组形式包含 TensorFlow Lite 模型的 C 源文件:

1
>xxd -i converted_model.tflite > model_data.cc

其输出类似如下:

1
2
3
4
5
>unsigned char converted_model_tflite[] = {
0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
// <Lines omitted>
};
>unsigned int converted_model_tflite_len = 18200;

一旦你已经生成了此文件,你可以将它包含入你的程序。在嵌入式平台上,将数组声明改变为 const 类型以获得更好的内存效率是重要的。
有关如何在程序中包含并使用模型的示例,请参阅 Hello World 示例中的 model.cc

6. 运行推断

平台:Arduino / Platform IO / …

7. 评估并排除故障

若要在微控制器上部署并运行 TensorFlow 模型,必须执行以下步骤:

  1. 训练模型:
  • 生成小型 TensorFlow 模型,该模型适合您的目标设备并包含支持的操作
  • 使用 TensorFlow Lite 转换器转换为 TensorFlow Lite 模型。
  • 使用标准工具转换为 C 语言字节数组,以将其存储在设备上的只读程序内存中。
  1. 使用 C++ 库在设备上进行推断并处理结果。

参考代码见资料[1]

TinyML的开发环境

适用于微控制器的 TensorFlow Lite 用 C++ 11 编写而成,需要使用 32 位平台。针对基于 Arm Cortex-M 系列架构的众多处理器,它已经过了广泛的测试,并已移植到其他架构(包括 ESP32)。该框架可作为 Arduino 库提供。它还可以为 Mbed 等开发环境生成项目。它是开源的,可以包含在任何 C++ 11 项目中。

支持的开发板包括:

​ 推荐使用Arduino Nano 33 BLE和STM32F746G开发板

探索事例

每个示例应用都位于 GitHub 上,并有一个 README.md 文件说明了如何将应用部署到受支持的平台。部分示例还有使用特定平台的端到端教程,如下所示:

​ 这部分实例用于拓宽思路,如果想要看更多实例,见下方参考资料[4](需要vpn)

一些功能限制

在设计一个面向微控制器的模型时,考虑模型的规模、工作负载,以及用到的运算是非常重要的。

模型规模

一个模型必须在二进制和运行时方面都足够小,以使其可以和你程序的其他部分一起符合你目标设备的内存限制。

为了创建一个更小的模型,你可以在你的结构里使用更少和更小的层。然而,小规模的模型更易面临欠拟合问题。这意味着对于许多问题,尝试并使用符合内存限制的尽可能大规模的模型是有意义的。但是,使用更大规模的模型也会导致处理器工作负载的增加。

注:在一个 Cortex M3 上,面向微控制器的 TensorFlow Lite 的核心运行时占 16 KB。

工作负载

工作负载受到模型规模与复杂度的影响。大规模、复杂的模型可能会导致更高的占空比,即导致你所用设备处理器的工作时间增长、空闲时间缩短。视你的应用,这种情况所带来的电力消耗与热量输出的增加可能会成为一个问题。

运算支持

面向微控制器的 TensorFlow Lite 目前仅支持有限的部分 TensorFlow 运算,这影响了可以运行的模型结构。我们正致力于在参考实现和针对特定结构的优化方面扩展运算支持。

可以在 all_ops_resolver.cc 文件中查看支持的运算。

​ 总结而言,Tensorflow模型对于TinyML的限制主要一方面来自于硬件本身的存储空间较小,所以只能适用于一些对存储能力要求较低的应用开发。另一方面模型的限制来自于支持的运算,由于开源的代码的限制,我们只能在这些函数的基础上进行增量开发。

competition想法总结

tinyML Vision Challenge结果的分类总结:

1.检测类:

使用超低功率热视觉进行入侵者检测 - Hackster.io

使用机器学习进行溢油检测和修复 - Hackster.io

Arduino Nano 33 BLE Sense 上的白血病检测 - Hackster.io

空中森林火灾检测

2.识别类:

使用Tiny Arduino H7的智能人脸识别系统 - Hackster.io

低功耗和支持加密的边缘 AI 相机 - Hackster.io

拴狗警报系统 - Hackster.io

一些TinyML实践的想法

非触屏输入设备

非触屏输入设备

说明

本项目的第一版本正常效果是隔空书写字母、数字,发送至计算机,输出对应字母、数字。
我们当时的想法是用加速度传感器的方向变化完成字母和数字的判断,最终在屏幕上完成书写,最终也达到了预期效果。
在之前和老师交流时,老师告诉我这个项目可以用姿态识别技术和机器学习技术进行改进,我觉得这就十分符合TinyML的特点——单片机和ML相结合,因此诞生了开发第二版的这个想法。

对于第二版,经过小组讨论,大概思路如下:
可以将传感器+视觉的方式来进行协同,由于手势识别,单独的传感器、或者单独的视觉方式,可能都不太准确,但如果能够引入传感器+视觉的方式,通过融合的形式来进行,一般准确度要显著提升,所以我们可以将用于输出的显示屏同样智能化。
简单思路可以理解为是将TinyML:Machine Learning with TensorFlow Lite on Arduino and Ultra-Low-Power Microcontroller的示例magic_wand和person_detection两个项目的有机结合,具体源代码可以参考Arduino_Tensorflow的github项目。

tflite-micro-arduino-examples/examples/magic_wand at main · tensorflow/tflite-micro-arduino-examples · GitHub

tflite-micro/tensorflow/lite/micro/examples at main · tensorflow/tflite-micro · GitHub

具体有关模型参考即使用卷积模型实现视觉并通过对加速度数据进行处理实现手势识别。

实际探索后的一些收获

这部分是一些关于本项目的关键技术的一些可以参考的项目:

首先是视觉识别方面,可以参考下文参考示例2,该项目是通过写字母或数字过程中关于屏幕的距离问题来进行优化,并且该项目的项目介绍者展示该项目最终取得了很好的效果。

示例视频

之后是加速度数据处理的例子,这方面在远程书写的例子还是比较多的,如下方参考示例1,这个就是很常见的arduino实现书写字母的例子了,可能还参考了tensorflow的库。

更多例子可以参考下方的参考示例部分。

应用前景

在科技不断发展的现代化社会,人机交互技术受到人们的广泛关注,而手势识别作为新型人机交互技术更受到研究者们的青睐,本文研究的是手势识别技术中的一种:手写识别。手写识别为人们提供了一种更为方便的交流方式,但是对于视力模糊的老人和手部神经综合性疾病的患者来说,在智能手机或智能手表等小屏幕上无论是打字还是手写都是困难的,所以本文将目光转向非接触式空中手写识别的研究。

除此之外,我通过大家对于这个项目的想法及应用场景的简单调研,排在第一位的答案是——好玩。当然,这个答案或许也不失为一种思路,随着当前大家生活水平的提高,享受资料消费的比例逐渐增高,我们可以将这个远程书写的项目首先作为一个体验性的项目,也可以作为叫小孩子认识数字、字母等的一种有趣的方式(后续如果可以加上汉字)。

总结应用场景:

[1].对于智能手表,儿童手表这类产品,现在微信已经十分常见了,但由于屏幕较小,打字操作较为不便,所以可以通过远程书写来实现微信书写等需求。

[2].对于视力模糊的老人和手部神经综合性疾病的患者来说,在智能手机或智能手表等小屏幕上无论是打字还是手写都是困难的,所以远程书写同样适用。

[3].充分发挥项目的趣味性,我们可以将这个远程书写的项目首先作为一个体验性的项目,也可以作为叫小孩子认识数字、字母等的一种有趣的方式。

项目的一些困难

但这个项目拓展性不太好,一方面加速度传感器有着方向易突变的性质,另一方面这个方法由于符号的相似性,增加符号时会带来识别几何倍数的增长,当时主要应用了滤波算法解决了易突变这个问题,但第二个问题依然很难解决。

优势方面,这个项目最后的视觉效果真的很好,但另一方面,这个项目并没有发挥出TinyML低延迟之类的传统优势,甚至我觉得如果要实现远程输入一定是要用到wifi传递信号的,这会使延迟大大增加,而且技术难度和是否可行没有评估。(这也是本项目在除去视觉处理的简化版本,即通过wifi传递的小屏幕),当前暂未找到有关两种方向(视觉+加速度)综合的开源项目。简化版本有利有弊,一方面在简化后可以更好的便携,当然准确率也会随之下降。

在实际实施方面,当前器材问题尚未解决,暂定思路需求为arduino nano 33 ble sense开发的(该开发板支持蓝牙、麦克风、加速度传感器及LED等单片机常见设备),摄像头。(材料这部分确实不了解)

还有一些让我比较担心的细节,当前上面那个开发板的1MB,但我暂时没有相关经验来确定是否这个想法在实现后会超出预期容量等问题,还有会不会出现训练好的tensorflow模型不能转化为tensorflow-lite这类问题。

一些改进想法

1.继续改进设备,提高容错率,尝试采用新技术完成部分字母的识别输出。
2.增加无线模块,增加使用距离。(第一版是有数据线的)
3.更精确的滤波+积分求轨迹。
4.姿态识别和机器学习的应用,进一步提高准确率,完成更多内容的识别输出。
5.小型化,轻量化,更加便捷,使使用者不用再被数据线束缚真正做到随用随写。

资料查找

知网无,所以创新性还是可以的(当然也可能是我的查找能力比较差)

实例图片

想法优化启发

【1】.我们可以将用于输出的显示屏同样智能化。

用于控制 RGB 灯的 TinyML 关键字检测 - Hackster.io

基于Wi-Fi与视频相结合的低成本高精度跨目标手势识别系统 - 中国知网 (buaa.edu.cn)

【2】.此外,还有些技术优化的思路

手写数字识别下的联邦学习优化算法研究 - 中国知网 (buaa.edu.cn),但这个是利用ML做的是手写字的识别,还是有区别,但不知道能不能借鉴。

其次我们可以将思路扩大到手势识别方面,从我们手指输入的各种字符数字其实可以理解为各种指令,如果显示器可以对这种行为做出对应的反应也是可以的。

如:

手势识别在会议控制中的应用研究 - 中国知网 (buaa.edu.cn)(控制PPT的各种行为)

基于STM32单片机的智能手势识别手套的设计与应用 - 中国知网 (buaa.edu.cn)(音乐播放器)

应用场景参考资料

基于佩戴式输入设备的手语识别方法 - 中国知网 (cnki.net)(其实手语表达本质上也是一种手势)

基于深度图像的空中手写识别技术 - 中国知网 (buaa.edu.cn)

非接触式空中手写系统研究 - 中国知网 (buaa.edu.cn)(故事来源论文)

参考示例

[1].空中书写 TinyML 字母识别 - Hackster.io

[2].使用Wio终端和边缘脉冲进行手写识别 - Hackster.io

[3].Tiny ML Air Writing Recognition with Nicla Sense ME - Hackster.io

[4].在OpenMV上使用TinyML的手势识别 - Hackster.io

参考资料

下方列出资料并非参考文献,而是一些可以访问的TinyML的知识及相关模型

参考资料

[1].tensorflow/tflite-micro

[2].TinyML:下一轮人工智能革命

[3].2022 ACM/IEEE TinyML Design Contest

[4].Eyes on Edge: tinyML Vision Challenge! - Hackster.io

[5].Eyes on Edge: tinyML Vision Challenge! projects - Hackster.io

[6].TinyML 机器学习简介

[7].适用于微控制器的 TensorFlow Lite

[8].Train a Simple TensorFlow Lite for Microcontrollers model

[9].社区分享 | 从零开始学习 TinyML(三)

[10].社区分享 | 从零开始学习 TinyML(二)

[11].社区分享 | 从零开始学习 TinyML(一)

[12].mushroomcloud-cc/tinyml-workshop (github.com)

[13].让单片机都能部署神经网络,这个神器是什么?_哔哩哔哩_bilibili

[14].TinyML推荐课程

【Coursera 吴恩达】2022 Machine Learning Specialization
视频
课程资料(来自视频简介)
课程官网

【北京大学】TensorFlow2.0
视频
课程资料(来自视频简介)
提取码:mocm

[15].Build Your Own Object Detection System with Machine Learning - YouTube

[16].Edge Impulse

[17].302 Edge Impulse Projects & Tutorials for Beginners and Up - Hackster.io

[18].Build Your Own Object Detection System with Machine Learning - YouTube

[19].Adding sight to your sensors - Edge Impulse Documentation

[20].

supperted825/WioTerminal_HandwritingRecogniser:Wio终端项目,用于识别单个ToF传感器的手写手势。由机器学习和边缘脉冲提供支持。 (github.com)

[21].使用 Esp32 和 TinyML 进行手势分类 - Hackster.io

[22].

Neuton-tinyML/nicla_digits (github.com)

TinyML 课程 #1 使用光传感器进行手势识别 - Hackster.io

基于穿戴式传感器的空中手写识别算法研究 - 中国知网 (buaa.edu.cn)

使用基于 TinyML 的数字识别解锁密码 - Hackster.io

智能手套 - Hackster.io

格斯特:治疗言语障碍的智能手套 - Hackster.io

[23].用于控制 RGB 灯的 TinyML 关键字检测 - Hackster.io

[24].Tensorflow_lite hello_world示例运行在Arduino/Devkit_jack@london的博客-CSDN博客_tensorflow-lite stm32f4

[25].如何开始在 Arduino 上使用机器学习 — TensorFlow 博客

[26].Arduino Editor

[27].Supplemental material – TinyML Book

[28].欢迎使用 Colaboratory - Colaboratory (google.com)

[29].Jupyter Notebook介绍、安装及使用教程 - 知乎 (zhihu.com)

(持续更新ing)

  • Title: TinyML-note
  • Author: Charles
  • Created at : 2022-12-31 21:05:07
  • Updated at : 2026-05-11 20:11:30
  • Link: https://charles2530.github.io/2022/12/31/tinyml-note/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
TinyML-note