用微机器学习做手势辨识
本帖最后由 gada888 于 2022-9-30 22:28 编辑这是即tinyML开篇之后的实战篇篇一。开篇那个帖子列出了微机器学习所需要用的软硬件和跑通流程。感兴趣的可以去参考一下。这一篇进入实作内容。来一个手势辨识。
这次硬件仍然用WIO terminal作为主控。
Wio Terminal 是一款专门用于 IoT 与 TinyML 的多功能开发板 – 包含了 ATSAMD51P19 晶片并以 ARM Cortex-M4F 为核心 (20MHz),已支援多种针对微控制器的 ML推论框架。
它包含:光感测器,麦克风, LCD,加速度感测器,可连接多达300种传感
软件仍然用Arduino和Edge Impulse来编译代码,,Edge负责提供python转换的的C++代码,arduino负责改写C++代码,最后把生成的arduino C代码上传到WIO去。
TinyML 的 tiny 代表 ML 模型已针对低功耗的微型装置进行最佳化,但是 Arduino初级系列的各种 MCU 的算力不足。所以用了ARM系列的大算力MCU来干活,
TinyML的常见应用如下:
声音场景
热词侦测
影像辨识
气味分析
等等
这次做剪刀、石头、布的光线遮断样式不同来区分,做一个很小的数据集,每个种类做10个样本。一共30个样本。虽然样本量极小,有欠拟合的风险,但是可以通过增加样本来进行调整。
需要执行以下命令
Wio Terminal
注册Edge Impulse
PC端安装Arduino IDE 2.0
导入 wio terminal 开发板
https://files.seeedstudio.com/ar ... o_boards_index.json
Node.js 1.6
安装edge impulse CLI tool 上传资料
npm install -g edge-impulse-cli
1.Wio terminal 上传单笔资料到Edge Impulse
2.把资料整理到不同类别,反覆操作
3.设计 Impulse:资料处理、定义模型
4.测试神经网路效能、修改、重复
5.汇出神经网路档案
6. 透过 Arduino IDE 烧录至 Wio
7. Wio 执行离线推论,完成!
Edge Impulse的训练流程如下
Impulse design
Create impulse
Raw data
NN Classifier
Retrain model
Live classification
Deployment
接下来面对自己写代码还是用Seeed的官方firmware。后者可以更快的上手。以上传firmware为例
先上传 firmware
再于 cmd 中执行 edge-impulse-daemon --clean
清除设定后进入新的专案(需要重新登入)
然后由EdgeImpulse网站Data acquision的下拉式选单
选择许多wio 已支援的传感
透过 cli 工具上传
把手放于光线传感上方 (wio 背面)
确认 upload.ino 已上传
开启 cmd,输入:edge-impulse-daemon --clean
填入帐号密码、连接com port 以及资料 label 名称
其他手势依序操作
edge-impulse-data-forwarder 指令会沿用前次设定
在edge网站收集和管理资料
单笔原始资料的设置如下
我们收集了训练模型所需的数据样本。然后送入神经网络,并对数据进行预处理。有时我们只是重新缩放数据,可以将 0 到 1000 范围内的值转换为 0 到 1 范围内的值 - 因为神经网络处理较小的数字比处理较大的数字表现更好。 TinyML 中使用的神经网络参数数量小(数字神经元之间的连接),所以我们经常还应用更复杂的预处理技术从 Raw 中提取所谓的特征数据,这加快了训练过程。
神经网络由输入层,隐藏层和输出层组成,大家先了解个大概,细讲1个小时讲不完。简单说,神经网络通过自己的框架把输入的数据的特征找出来。
下面建立impulse
选择机器学习框架,一个即可
生成impulse
神经网络架构
更多的训练
生成的神经网络的python代码是可以手动修改的。前提,你要了解你的神经网络的架构。
检查训练结果
测试资料的单笔结果
进行优化
汇出神经网络到需要的平台
如果认为训练的模型精度不够,那就多加一维来进行训练,通常90%以上精度就OK了。
#define FREQUENCY_HZ
#define INTERVAL_MS
40
(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);
Serial.println(light);
//Serial.print('\t');
}
}
把上述代码插入到static_buffer.ino里面去。然后上传,就得到最后的结果了。static_buffer.ino是从edgeimpulse里导出的给arduino的.zip文件里的。
完成之后,在WIO上用手演示,会在arduino的COM看到预测结果
厉害厉害 呵呵呵呵 点赞!!! 6666666666 不错不错 值得学习!! 感谢分享 赤星三春牛! 发表于 2022-10-1 20:43
感谢分享
谢谢支持
页:
[1]