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

电子说

1.2w人已加入

描述

1 认识 wio terminal

Wio Terminal 是一款专门用于 IoT 与 TinyML 的多功能开发板 – 包含了 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 字段中填入:

传感器

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

传感器

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

传感器

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

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

npm install -g edge-impulse-cli

传感器

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

传感器

Edge Impulse – 登入与设定装置

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

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

传感器

左侧– Device

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

传感器

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 时间)

传感器

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

传感器

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

传感器

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),这里就不用动。

传感器

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

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

传感器

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

传感器

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

传感器

Edge Impulse – 原始数据产生特征

左侧– impulse design / Raw data

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

传感器

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

传感器

Edge Impulse – 训练模型

左侧– impulse design /  NNclassifier

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

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

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

传感器

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

传感器

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

传感器

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

传感器

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

传感器

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

网站左侧,选择Live Classification

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

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

传感器

Edge Impulse – 导出神经网络模型

网站左侧,选择 Deployment

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

传感器

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

传感器

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

传感器

Arduino 汇入之后开始使用

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

传感器

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

传感器

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

传感器

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

传感器

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

传感器

  审核编辑:汤梓红

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分