前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Arduino 机器学习实战入门(上)

Arduino 机器学习实战入门(上)

作者头像
AiTechYun
发布于 2019-11-07 06:53:39
发布于 2019-11-07 06:53:39
3.6K0
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号

编辑 | sunlei

这是来自Arduino团队的Sandeep Mistry和Dominic Pajak的一篇客座文章。

Arduino的任务是让机器学习变得简单,任何人都可以使用。在过去的几个月里,我们一直在与Tensorflow Lite团队合作,并很高兴向您展示我们的合作成果:将Tensorflow Lite Micro应用于Arduino Nano 33 BLE Sense。在本文中,我们将向您展示如何安装和运行几个新的TensorFlow Lite微示例,这些示例现在可以在Arduino库管理器中找到。

下面的第一个教程将向您展示如何在Arduino板上安装一个神经网络来识别简单的语音命令。

示例1:运行预训练的micro_speech推断示例。

接下来,我们将介绍一个更深入的教程,您可以使用它在Colab中使用TensorFlow为Arduino训练自己的自定义手势识别模型。本材料是根据Sandeep Mistry和Don Coleman举办的一个实践研讨会编写的,现在已经在网上更新了。

例2:训练自己的手势分类模型。

如果你以前有过Arduino的经验,你可以在几个小时内完成这些教程。如果你对微控制器还不太熟悉,可能需要更长的时间。

我们很高兴与大家分享一些最初的例子和教程,并看看您将从这里构建什么。我们开始吧!

注:以下项目是基于TensorFlow Lite的微控制器,目前正在TensorFlow repo中进行实验。这还是一个新兴的领域!

微控制器和TinyML

微控制器,如Arduino板上使用的微控制器,是低成本、单芯片、独立的计算机系统。它们是隐藏在数十亿日常用品中的隐形电脑,如可穿戴设备、无人机、3D打印机、玩具、电饭煲、智能插头、电动滑板车、洗衣机。连接这些设备的趋势是所谓物联网的一部分。

Arduino是一个开源平台和社区,致力于让每个人都可以访问微控制器应用程序开发。我们使用的主板有一个Arm Cortex-M4微控制器,运行频率为64MHz,有1MB的闪存和256KB的RAM。与云、PC或移动设备相比,这是很小的,但以微控制器标准来看是合理的。

Arduino Nano 33 BLE感应板比一根口香糖还小

可能有一些实际原因需要在微控制器上挤压ML,包括:

  • 功能-希望智能设备在本地快速运行(独立于互联网)。
  • 成本-用简单、低成本的硬件实现这一点。
  • 隐私-不想在外部共享所有传感器数据。
  • 效率-更小的设备形状系数,能量收集或更长的电池寿命。

有一个最终目标,我们正在朝着这个目标努力,这是非常重要的:

机器学习可以让没有嵌入式开发背景的开发人员访问微控制器。

在机器学习方面,您可以使用一些技术将神经网络模型放入内存受限的设备(如微控制器)中。其中一个关键步骤是将权重从浮点量化为8位整数。这也有助于使推断更快地计算,并且更适用于较低的时钟速率设备。

TinyML是一个新兴的领域,还有很多工作要做——但令人兴奋的是,还有一个巨大的未开发的应用空间。数以亿计的微控制器和各种各样的传感器结合在一起,在未来可能会带来一些非常有创意和价值的微型ML应用。

开始之前你需要做什么

Arduino Nano 33 BLE感应板

连接Arduino板和台式机的微型USB电缆

要对板进行编程,可以使用Arduino Web编辑器或安装Arduino IDE。我们将在下一节详细介绍如何设置这些

Arduino Nano 33 BLE Sense有多种板载传感器,这意味着它有可能用于一些很酷的微型ML应用程序:

  • 语音-数字麦克风
  • 运动- 9轴IMU(加速度计、陀螺仪、磁力仪)
  • 环境-温度、湿度和压力
  • 光-亮度,颜色和物体接近度

与经典的Arduino Uno不同的是,它将一个微控制器与板载传感器结合在一起,这意味着你可以在不需要额外的硬件或线路的情况下解决许多用例。该电路板也足够小,可以在可穿戴设备等终端应用中使用。顾名思义,它具有蓝牙LE连接性,因此您可以将数据(或推断结果)发送到笔记本电脑、移动应用程序或其他BLE板和外围设备。

小贴士:U盘上的传感器

通过USB连接BLE感知板是一种简单的方法,可以捕获数据并将多个传感器添加到单板计算机中,而不需要额外的线路或硬件——例如,这是对树莓派的一个很好的补充。

Tensorflow Lite微控制器示例

现在,TensorFlow Lite for微控制器的推理示例已经打包并通过Arduino库管理器提供,这样就可以在Arduino上包含并运行它们。在本节中,我们将向您展示如何运行它们。例如:

  • micro_speech—使用板载麦克风的语音识别
  • magic_wand——使用内置IMU的手势识别功能
  • person_detection—使用外部ArduCam相机进行人物检测

有关示例的更多背景知识,可以查看TensorFlow存储库中的源代码。这些示例中的模型之前都经过了培训。下面的教程向您展示了如何在Arduino上部署和运行它们。在下一节中,我们将讨论培训。

如何使用Arduino创建Web编辑器运行示例

一旦你使用USB数据线将Arduino Nano 33 BLE Sense连接到台式机,你就可以通过Arduino Create web编辑器在面板上编译和运行以下TensorFlow示例:

从Arduino_TensorFlowLite库编译一个示例

聚焦语音识别实例:micro_speech

Arduino板的第一步是让LED闪光。在这里,我们将通过使用Tensorflow Lite Micro识别语音关键字来实现。它有一个简单的词汇“是”和“否”。请记住,这种型号是在一个只有256kb内存的微控制器上本地运行的,所以不要期望商业上的“语音助手”级别的准确性-它没有互联网连接,可用的本地RAM大约是2000x。

注意,电路板也可以用电池供电。由于Arduino可以连接到电机、执行器等,这为语音控制项目提供了潜力。

运行micro_speech示例

如何使用Arduino IDE运行示例

或者,您可以使用ArduinoIDE应用程序尝试相同的推理示例。

首先,按照下一节中的说明设置Arduino IDE。

在ArduinoIDE中,您将通过ArduinoIDE中的文件>示例>Arduino_TensorFlowlite菜单查看示例。

选择一个示例,将打开示意图。要编译、上传和运行板上的例子,并点击箭头图标:

对于喜欢命令行的高级用户,还有arduino-cli。

为Arduino训练Tensorflow Lite微观模型

Arduino BLE 33 Nano Sense上的手势分类,输出表情符号

接下来,我们将使用ML使Arduino板能够识别手势。我们将从Arduino Nano 33 BLE感知板中获取运动数据,将其导入TensorFlow中以训练模型,并将得到的分类器部署到该板上。本教程的灵感来源于查理·杰拉德(Charlie Gerard)使用Arduino和Tensorflow.js制作的《街头霸王》(Street Fighter)。在Charlie的例子中,电路板将所有的传感器数据从Arduino传输到另一台机器上,而这台机器将用Tensorflow.js对手势进行分类。我们更进一步,通过在Arduino板上执行手势分类来“TinyML-ify”它。在我们的示例中,由于我们使用的Arduino Nano 33 BLE感知板具有更强大的Arm Cortex-M4处理器和一个内置的IMU,这使得实现起来更容易。

我们已经修改了下面的教程,所以不需要额外的硬件——采样开始于检测板的移动。本教程的原始版本添加了一个实验板和一个硬件按钮来按下以触发采样。如果你想进入一个小硬件,你可以遵循这个版本。关于这一部分我们明天继续分析。

原文链接:

https://medium.com/tensorflow/how-to-get-started-with-machine-learning-on-arduino-7daf95b4157

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust学习笔记Day18 智能指针Cow/MutexGuard
这是用于提供写时克隆(Clone-on-Write)的一个智能指针,和虚拟内存管理的写时复制很像。
用户1072003
2023/02/23
7200
Rust学习笔记Day18 智能指针Cow/MutexGuard
【Rust每周一库】once_cell - 最多初始化一次的cell
once_cell提供了unsync::OnceCell和sync::OnceCell这两种Cell(字面意思,前者用于单线程,后者用于多线程),用来存储堆上的信息,并且具有最多只能赋值一次的特性。API大概是:
MikeLoveRust
2020/12/18
6.8K0
【Rust 日报】2023-11-26 Rust全局变量,两年过去了
2021 年 11 月,我写了一篇博文,研究了 Rust 与全局变量的奇怪关系。它旨在解释为什么这种无处不在的语言特性需要外部 crates,并以关于在新代码中使用全局变量的个人建议结束。两年过去了,Rust 已经发生了很大的变化,是时候重新审视一下了。本文的其余部分假定您已经阅读了上一篇文章或熟悉该主题。
MikeLoveRust
2023/11/28
7550
【Rust 日报】2023-11-26 Rust全局变量,两年过去了
基于 actix、async-graphql、rbatis 构建异步 Rust GraphQL 服务(3)- 重构
首先,我们通过 shell 命令 cd ./actix-web-async-graphql-rbatis/backend 进入后端工程目录(下文中,将默认在此目录执行操作)。
niqin.com
2022/06/30
1.4K0
基于 actix、async-graphql、rbatis 构建异步 Rust GraphQL 服务(3)- 重构
rust写操作系统 rCore tutorial 学习笔记:实验指导二 内存分配与管理
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/11
7210
透过 Rust 探索系统的本原:并发原语
几周前我写了篇关于并发的文章(透过 rust 探索系统的本原:并发篇),从使用者的角度介绍了常用的处理并发的工具:Mutex / RwLock / Channel,以及 async/await。今天我们讲讲这些并发手段背后的原语。这些原语,大家在操作系统课程时大多学过,但如果不是做一些底层的开发,估计大家都不记得了。今天,我们就来简单聊聊这些基础的并发原语,了解它们的差异,明白它们使用的场景,对撰写高性能的并发应用有很大的帮助。
tyrchen
2021/04/07
1.1K0
透过 Rust 探索系统的本原:并发原语
【Rust每周一知】Rust中的读写锁RwLock
在计算机科学中,有一些经典的同步问题,读者-作家问题就是其中一个,该问题涉及多个并发线程试图同时访问同一共享资源的情况。
MikeLoveRust
2020/04/07
4.7K0
【翻译】从头实现Rust异步执行器
原文:https://stjepang.github.io/2020/01/31/build-your-own-executor.html 现在我们已经构建了block_on函数,是时候进一步将其转换为一个真正的执行器了。我们希望我们的遗执行器不只是一次运行一个future,而是同时运行多个future!
MikeLoveRust
2020/07/23
9110
Rust学习笔记Day15 标记trait有哪些常用trait
昨天我们一起学习了 内存相关的3个常用trait Clone/Copy/Drop。
用户1072003
2023/02/23
3960
Rust学习笔记Day15 标记trait有哪些常用trait
Rust 中的 QUIC 实现 --- quinn
QUIC 是基于 UDP 的多路复用、安全传输协议。可以简单理解为在用户空间将 TCP 里的机制实现了一遍,比如拥塞控制、流量控制等。好处是升级比较方便,TCP 协议栈是内核中实现的,只能随内核升级,而 QUIC 可灵活升级。
谛听
2022/01/30
4.2K0
rust写操作系统 rCore tutorial 学习笔记:实验指导五 驱动与文件
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/11
7830
Rust的第二次接触-写个小服务器程序
蛮久前入门了一下 Rust 语言。它的设计模型非常地吸引C/C++的开发者。但是学习语言嘛还是要练习一下,之前也用它给我们项目写了个命令行小工具。这回拿来写个小型的服务器程序吧。
owent
2018/10/09
4.2K2
【翻译】200行代码讲透RUST FUTURES (2)
在我们深入研究 Futures in Rust 的细节之前,让我们快速了解一下处理并发编程的各种方法,以及每种方法的优缺点。
MikeLoveRust
2020/07/28
7640
用Actix写的一个类似于Facemash的小项目总结
在入口文件中,首先启用了一些库的宏(Macro),并声明了 Actix-Web 框架的 main 函数;
MikeLoveRust
2022/11/28
4670
【翻译】200行代码讲透RUST FUTURES (7)
我们将用一个伪reactor和一个简单的执行器创建我们自己的Futures,它允许你在浏览器中编辑和运行代码
MikeLoveRust
2020/08/05
1.3K0
深入理解Rust的Atomic及Ordering
之前提到的Mutex、Condvar是Rust中比较偏高层的共享数据型并发控制,更底层的并发控制也有,比如Atomic(原子操作)。
newbmiao
2023/12/26
6040
深入理解Rust的Atomic及Ordering
Rust Async: async-task源码分析
本文转载自知乎地址:https://zhuanlan.zhihu.com/p/92679351?utm_source=wechat_session&utm_medium=social&utm_oi=5
MikeLoveRust
2019/11/24
1.5K0
rust写操作系统 rCore tutorial 学习笔记:实验指导三 虚拟地址与页表
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/11
7510
构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(3)- 重构
行文开始,先感谢几位指导的老师。相关标题和内容都已经在博客站点修改,微信公众号中就不重复推送了。
niqin.com
2022/06/30
9890
构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(3)- 重构
Rust 赋能前端: 视频抽帧
大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder
前端柒八九
2025/01/03
1300
Rust 赋能前端: 视频抽帧
推荐阅读
相关推荐
Rust学习笔记Day18 智能指针Cow/MutexGuard
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档