0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【tinyML】使用EdgeImpulse让您的Arduino可以辨识手势!

jf_cVC5iyAO 来源:易心Microbit编程 作者:易心Microbit编程 2022-12-06 11:12 次阅读

1 认识 wio terminal

Wio Terminal 是一款专门用于 IoTTinyML 的多功能开发板 – 包含了 ATSAMD51P19 芯片并以 ARMCortex-M4F 为核心 (20MHz),已支持多种针对微控制器的 ML推论框架。

本开发板已包含:

•光传感器(模拟)

•麦克风

•可自定义按钮 x 3

•4 英吋彩色LCD

•加速度传感器

•Grove 接头 x 2,可连接多达300种 Grove 传感器

就软件面来说, Arduino IDE 已可用于开发各种支持 Edge Impulse 与 Tensorflow Lite 的微控制器装置来进行神经网络训练与推论,或者您也可以玩玩看另一款热门的开发环境 platformIO 也可以玩玩看。EdgeImpulse 是一款针对边缘运算装置 x 机器学习的简单易用的 coding free 开发环境。用户可透过网页接口就可以完成整个 tinyML 作业流程,从数据收集、数据处理、训练神经网络到导出部署,一条龙啊!

本文将示范如何把 wio terminal 所收集到的手势资料 (光传感器数值变化) 上传到 Edge Impulse,完成上述流程之后再放回到 wio terminal 来执行脱机 ML 推论,超好玩又富有学习意义!

如何辨识手势

在此的假设为,不同的手势在光传感器上方晃动时,会产生可区别的时序数据(time series data),我们就是要把这些数据送到 Edge Impulse 网站来处理、学习,并汇出一个 wio terminal 可执行推论的神经网络模型文件!

可想而知,如果用传统的做法就很难去定义,怎样的 pattern 可以一体适用各种不同的手势都可以有不错的辨识效果。(后续各位在收数据的时候就知道,同一种手势的 time series 数据形状差异很大!)

2 PC端设定

2-1 设定 Arduino IDE 2.0

根据原厂文件,请使用 Arduino IDE 1.9 以上,所以我直接使用 2.0,请根据您的操作系统版本取得对应的 Arduino 2.0 IDE。

注意!编译 Edge Impulse 汇出档案才需要用到 Arduino IDE 1.9以上,如果是把 wio terminal 当作一般 arduno 使用的话,经我实测使用 Arudino 1.8.X 没有问题

请在 File → Preference → Additional Baord url 字段中填入:

9e9e68f6-7473-11ed-8abf-dac502259ad0.png

完成之后就可以透过 Tools → Board → Boardmanager,输出“Wio”来安装 wio terminal 相关套件,点选 INSTALL:

9eb5de50-7473-11ed-8abf-dac502259ad0.png

完成就可以看到 Wio Terminal 相关选项

9edc0198-7473-11ed-8abf-dac502259ad0.png

2-2 安装 node.js 与 edgeimpulse 相关工具

根据您的平台安装 Node.js 1.0 以上版本,完成之后开启 cmd 输入以下指令来安装 edge-impulse-cli:

npm install -g edge-impulse-cli

9ef91058-7473-11ed-8abf-dac502259ad0.png

3 透过 edge cli 上传传感器数据到 EdgeImpulse

请新增一个 Arduino项目,输入以下程序代码上传到 wio terminal,会透过 serial 把光传感器数据传给 edge cli,再上传到 Edge Impulse 网站的指定项目(当然是您的账号)

由 FREQUENCY_HZ 40 可知,我们会在 1000 ms (1秒钟) 的时间长度取得 40 笔光传感器数据,并以这一段时间中的亮度变化作为指定的手势,也预设石头 与 布 的手势差异是可以被学习出来的。

#define FREQUENCY_HZ 40

#define INTERVAL_MS (1000 / (FREQUENCY_HZ))

void setup() {

Serial.begin(115200);

Serial.println("Started");

}

void loop() {

static unsigned long last_interval_ms = 0;

float light;

if (millis() > last_interval_ms + INTERVAL_MS) {

last_interval_ms = millis();

light = analogRead(WIO_LIGHT); //读取 wio 光传感器模拟脚位

Serial.println(light);

}

}

刻录完成之后 wio terminal 就摆着,接着要透过 edge cli 来上传数据到 edge Impulse 网站

开启 cmd 之后输入以下指令,会请您登入 edge Impulse 的账号密码并询问以下事项:

•装置所连接的 COM port

•命名数据字段:如下图的 light

由下图可以看到您的装置 ID: 01FE…这一段,就是透过这个 ID 来识别您的装置。

edge-impulse-data-forwarder

9f189c3e-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 登入与设定装置

这一段最辛苦啦,几乎所有的设定都是在 Edge Impulse 网站上完成,但说真的已经省很多事情了。

请先建立一个 Edge Impulse 账号并登入。为了怕各位迷路,我会用颜色来标注现在是在哪一个 tab。以下是登入后的主画面,也就是画面左侧– Dashboard,可以看到项目相关设定。

9f3f3ee8-7473-11ed-8abf-dac502259ad0.png

左侧– Device

装置基本设定,可以看到本账号下的所有装置,可以点选右侧… 来编辑装置设定或删除装置

9f6bfe4c-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 收资料

这里要收资料,请确认您的 wio terminal 已经上传上述 arduino sketch 来准备传数据,否则数据当然无法上传到 Edge Impulse网站。

请点选左侧– Data acquisition

中间的 collected data 一开始当然不会有东西,因为还没开始上传数据。请于画面右侧这样设定:

•Label: rock (石头)/ paper (布) -> 要辨识多少种手势都没问题,端看您愿意花多少时间去收数据而已。

•Sensor: Sensor with 1 axes (light)

•sample length(ms): 1000

•Frequency (39Hz) 这里自动带入 arduino sketch 的 FREQUENCY_HZ,不用改

好了之后,按下右下角的 Start sampling,这时候请准备好您的手在 wio terminal 的光传感器摆好手势并晃动。取得资料,就会在画面中间多一笔新的数据出来,点选该笔数据就可以看到他形状(光传感器读数 vs 时间)

9fa1f024-7473-11ed-8abf-dac502259ad0.png

上传多笔数据之后的画面如下,在此请让您所要辨识的 label 的数据笔数尽量相等,反正上传也不会很麻烦,每一笔数据右侧的… 都可以点选来编辑数据属性或删除该笔数据。

9fd55414-7473-11ed-8abf-dac502259ad0.png

最后请点选 train / test split 来设定训练/测试数据的分配比例,完成每一项的必要设定之后,前面会亮起绿色灯,才能进到下一步。

a00a3008-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 训练模型

左侧– impulse design / Create impulse

根据 EdgeImpulse 本身的定义,impulse 是指一个 pipeline,您会在此设定关于 raw data 处理方式、如何处理(processing block)、如何学习(learning block),这样才算是一个完整的流程。

以我们的手势辨识范例,在此是长度为一秒钟的光传感器数据,所以属于 time series data。在此请把 window size 与 window increase 分别设为 1000, 50ms,Frequency 会自动带入 wio terminal Arduino 码设定中所的频率 (40Hz),这里就不用动。

a044c95c-7473-11ed-8abf-dac502259ad0.png

点选 [Add a processing block] ,选单中选择 Raw data,就会新增这个block。

请在其中选择 Input axes 也就是所要处理的数据,在此只有一笔,就是 light。不同型态的数据可能会用到更多 processing block,之后再慢慢说明。

a0779ada-7473-11ed-8abf-dac502259ad0.png

接着点选 [Add a learningblock] ,选单中选择 Classification (Keras),就会新增这个 block。fafa Input feature 选择 Raw data,输出会自动带出 2 (paper,rock) 也就是 data acquisition 时所设定的 label 名称。

a0b5acc6-7473-11ed-8abf-dac502259ad0.png

本区设定完成如下图,最后点选 Save Impulse 就完成了。

a0d86ba8-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 原始数据产生特征

左侧– impulse design / Raw data

在此要针对原始数据产生特征,先看到 Parameters 卷标,到时候要把 Raw feature 这一段复制到最后汇出的 arduino sketch 才能顺利执行推论。

a10d9b3e-7473-11ed-8abf-dac502259ad0.png

接着按下 Generate features 标签,跑完会看到如右图的数据特征分布,这一段就完成了。

a13a70e6-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 训练模型

左侧– impulse design / NNclassifier

本段要设定神经网络架构,可以自己定义神经网络架构,在此我新增了两个 Dense 密集连接层,分别使用 20, 10 个神经元,相当小巧。另外两个参数如下设定:

•Number of training cycles: 看过一遍所有数据称为一次,在此设定 500

•Learning rate: 神经网络收敛的速度,这个数值通常非常小,在此设定 0.0001

a1673edc-7473-11ed-8abf-dac502259ad0.png

当然功能不止这样啦,点选 [Add an extra layer],可以看到以下 keras 层,要加入卷积层也是可以的,别急,之后都可以玩玩看的。

a19c636e-7473-11ed-8abf-dac502259ad0.png

设定好架构之后,点选下方的 [Start training] 就会开始训练,过程中没有写一行程序代码,真的很方便!右侧可以看到训练过程中的输出讯息。

a1e4a08e-7473-11ed-8abf-dac502259ad0.png

第一次训练完的 accuracy / loss 只有 75%, 0.65,差强人意

a20ed1c4-7473-11ed-8abf-dac502259ad0.png

我又上传了一些手势数据,用同样的架构再跑一次,accuracy 就到 100%了!当然 loss 0.62 很高啦,不过这之后可以慢慢调,先继续下去吧

a23d81f4-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 测试神经网络模型成效

网站左侧,选择Live Classification

先不急着汇出,先上传一笔数据玩玩看,可以上传悬心数据,或是从既有数据来看看

左下角可以看到 PAPERS 0.52, ROCK 0.48,这当然不是一个很好的结果,就需要回头去调整数据,或是修正更好的神经网络架构

a26d5654-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 导出神经网络模型

网站左侧,选择 Deployment

会列出目前可汇出的平台,请点选 Arduino,另外也可以看到 NVIDIA tensorRT,各种选项愈来愈完整,非常棒。

a2c2466e-7473-11ed-8abf-dac502259ad0.png

同一个页面往下拉,使用预设设定 Quantized (int8),接着选择 Build。

a2ee3bb6-7473-11ed-8abf-dac502259ad0.png

看到这张图就没问题了, .zip 档不用解压缩,等等直接汇入 Arduino IDE 即可。

a3419b30-7473-11ed-8abf-dac502259ad0.png

Arduino 汇入之后开始使用

开启 Arduino IDE,选择 Sketch → Include Library → Add .ZIP library 汇入上一步取得的 .zip

a365cb36-7473-11ed-8abf-dac502259ad0.png

完成之后就可以在File 选到这个范例,请开启其中的 static buffer

a37b9b50-7473-11ed-8abf-dac502259ad0.png

请到 Edge Impulse 网站,选择 Impusle design / Raw data,复制 Raw features 到您的样板项目中,有一个复制符号可以直接按,这里的数据数量就会等于 Frequency,以本范例来说就是 40。

a3afb804-7473-11ed-8abf-dac502259ad0.png

贴到您的 Arduino 范例中的 features[] 数组中,这样就可以了。

a3e80ed4-7473-11ed-8abf-dac502259ad0.png

接着上传程序到 wio termnial ,就可以从 serial monitor 看到每一次的推论结果,happy making!!

a40e19b2-7473-11ed-8abf-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2545

    文章

    50433

    浏览量

    750923
  • 开发板
    +关注

    关注

    25

    文章

    4888

    浏览量

    97026
  • Arduino
    +关注

    关注

    187

    文章

    6456

    浏览量

    186478
  • TinyML
    +关注

    关注

    0

    文章

    42

    浏览量

    1210

原文标题:【tinyML】使用 EdgeImpulse 让您的 Arduino 可以辨识手势!

文章出处:【微信号:易心Microbit编程,微信公众号:易心Microbit编程】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是TinyML?微型机器学习

    神经网络实例的可视化。另一方面,TinyML 可以被定义为机器学习的一个子领域,该领域致力于在资源和能力受限的设备上实现机器学习应用程序。TinyML 的目标是以一种极端的方式将机器学习带到边缘,电池供电
    发表于 04-12 10:20

    基于Arduino创建一个手势控制车

    描述如何制作手势控制机器人|| #MadeWithArduino(发射器)嘿,欢迎回到一个新项目。所以今天我们将学习使用Arduino创建一个手势控制车。这里我将分享项目发射器部分的详细教程,我还分
    发表于 06-22 06:55

    arduino手势控制小车

    描述arduino手势控制车
    发表于 08-09 06:51

    基于arduino设计的手势控制小车

    基于arduino手势控制小车
    发表于 09-25 06:06

    使用Arduino和PAJ7620手势传感器制作手势控制机器人

    使用Arduino和PAJ7620手势传感器制作手势控制机器人,简单程序即可实现。小小的传感器可以识别各种手势。它采用内置的空间传感器,
    发表于 09-27 06:17

    arduino手势控制车

    电子发烧友网站提供《arduino手势控制车.zip》资料免费下载
    发表于 07-26 10:29 1次下载
    <b class='flag-5'>arduino</b><b class='flag-5'>手势</b>控制车

    手势识别:用于8位微控制器的TinyML

    电子发烧友网站提供《手势识别:用于8位微控制器的TinyML.zip》资料免费下载
    发表于 10-24 10:52 3次下载
    <b class='flag-5'>手势</b>识别:用于8位微控制器的<b class='flag-5'>TinyML</b>

    使用TinyMLArduino Nano 33 BLE计算阅读时间

    电子发烧友网站提供《使用TinyMLArduino Nano 33 BLE计算阅读时间.zip》资料免费下载
    发表于 10-28 16:50 1次下载
    使用<b class='flag-5'>TinyML</b>和<b class='flag-5'>Arduino</b> Nano 33 BLE计算阅读时间

    使用Open cv python(手势)和arduino控制Led

    电子发烧友网站提供《使用Open cv python(手势)和arduino控制Led.zip》资料免费下载
    发表于 10-28 10:19 5次下载
    使用Open cv python(<b class='flag-5'>手势</b>)和<b class='flag-5'>arduino</b>控制Led

    带有EdgeImpulse的基于视觉的手势控制无人机

    电子发烧友网站提供《带有EdgeImpulse的基于视觉的手势控制无人机.zip》资料免费下载
    发表于 11-14 10:47 0次下载
    带有<b class='flag-5'>EdgeImpulse</b>的基于视觉的<b class='flag-5'>手势</b>控制无人机

    什么是TinyML?它可以(也不能)用于什么?

    FPGA一直以低功耗、可重构的特点在各个领域内应用,同时也可以大大增加物联网应用环境,所以在FPGA上应用TinyML是否是FPGA方便的最佳应用?我们接下来分析一下TinyML的特点再来总结。
    的头像 发表于 11-28 10:25 6753次阅读

    Arduino手势手套

    电子发烧友网站提供《Arduino手势手套.zip》资料免费下载
    发表于 12-21 14:17 1次下载
    <b class='flag-5'>Arduino</b><b class='flag-5'>手势</b>手套

    基于Arduino UNO的手势控制伺服电机

    电机旋转 180 度。通过跟踪,伺服器只会在食指抬起而其他手指保持闭合时才会转动。这可以在具有多个伺服器的许多项目中实现,但在这种情况下,我们坚持使用一个伺服器。伺服电机伺服是一种只能旋转180度的减速电机。它是通过从Arduin
    发表于 12-21 11:26 0次下载

    Arduino手势控制LED亮度

    电子发烧友网站提供《Arduino手势控制LED亮度.zip》资料免费下载
    发表于 01-31 14:47 1次下载
    <b class='flag-5'>Arduino</b><b class='flag-5'>手势</b>控制LED亮度

    使用Esp32和TinyML进行手势分类

    电子发烧友网站提供《使用Esp32和TinyML进行手势分类.zip》资料免费下载
    发表于 06-15 11:43 2次下载
    使用Esp32和<b class='flag-5'>TinyML</b>进行<b class='flag-5'>手势</b>分类