×

使用SAMD21 ML评估套件进行手势识别

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-15

h1654155275.6483

分享资料个

描述

 

图 1:部署的手势分类器
 

本教程将指导您完成使用 SensiML 构建手势分类器并将其部署到 Microchip SAMD21 机器学习评估套件的过程。我们还将就您在设计数据收集过程时应考虑的因素以及您在开发自己的应用程序时可能遇到的常见问题的解决方案提供一些指导。

与本指南一起提供的是一个完全开发的手势分类器项目,包括数据集、预训练的机器学习模型和固件源代码,可帮助您使用 SensiML 和 SAMD21 ML 评估套件快速启动和运行您自己的项目。

在你开始之前

在我们开始之前,您需要按照以下步骤中的详细说明安装和设置所需的软件。

1. 安装 MPLAB X IDE 和 XC32 编译器。这些是加载手势识别项目和对 SAMD21 板进行编程所必需的。您可以使用 XC32 编译器的默认免费许可证,因为我们在这里不需要任何专业功能。

2.如果您还没有,请在 SensiML注册一个免费的社区版帐户。我们将使用它来处理我们的传感器数据并生成手势分类库。

3. 从 SensiML下载页面下载 SensiML Data Capture Lab 并安装。我们将使用它来将数据导入到我们的 SensiML 项目中。

4. 最后,前往该项目的 GitHub发布页面并下载ml-samd21-iot-sensiml-gestures-demo.zip包含本指南的数据集和预构建固件二进制文件的存档。

刷入手势分类器演示固件

我们现在设置为运行预构建的固件。使用以下步骤,使用最新 GitHub 版本中的固件 HEX 文件对您的设备进行编程

1. 通过 USB 将您的 SAMD21 评估套件插入您的 PC。SAMD21 应自动作为 USB 闪存驱动器出现。

2. 打开ml-samd21-iot-sensiml-gestures-demo.zip之前下载的存档,找到与您的传感器品牌对应的手势分类器演示 hex 文件:

博世 IMU:TDK IMU:binaries/samd21-iot-sensiml-gestures-demo_bmi160.hex
binaries/samd21-iot-sensiml-gestures-demo_icm42688.hex

3. 将 hex 文件拖放到 SAMD21 USB 驱动器上以对设备进行编程。

手势分类器固件概述

有关此项目中包含的演示固件的描述,包括操作、使用和基准测试,请参阅GitHub 存储库中的“README”

数据收集概述

在我们开始收集数据样本之前,我们应该对数据收集过程的设计进行一些考虑;毕竟,我们收集的数据最终将决定我们可以通过机器学习模型实现的性能类型。

有关数据收集过程的深入指南,请参阅 SensiML 的使用 AutoML 构建智能物联网设备白皮书的“传感器数据收集”部分(第 29 页)。

数据收集:传感器配置

数据收集过程的第一步是为您的应用确定最佳传感器配置;这包括传感器的物理放置和安装以及采样率和灵敏度等信号处理参数。

很可能,您用于传感器配置的许多设计参数是固定的(例如,由于固定板设计、共享传感器使用等),但值得考虑的是应用程序设计是否最适合您的机器学习任务,以及是否某些设计参数应该改变。在设计的这一点上,您应该问的问题是:在给定传感器数据输入的情况下,我是否可以合理地期望一种算法来预测所需的输出?数据探索(例如可视化)将有助于在这里产生良好的初始假设,以及对信号域的良好工作知识(即理解工作中的物理过程)。

以下是我们在传感器配置阶段可能会提出的一些具体问题,以及一些可能的答案:

Q : 传感器采样参数应该如何配置?(即采样率、灵敏度/输入范围等)

选择一种传感器配置,以合理紧凑的表示形式捕获感兴趣的事件,并具有良好的信干比。

:传感器应该如何放置?(即安装和方向)

选择一个可以最大限度地减少对干扰(例如来自发动机的振动)的敏感性的位置。

:传感器应该如何固定?

选择一种方法,以确保读数随时间和不同传感器部署之间的一致性。

为了说明,以下是为该项目选择的主要传感器配置参数及其选择背后的理由:

ParameterValue : 仅加速度计

选择的手势应该对设备旋转基本不变

参数值:100 Hz 采样率

所选手势的频率范围通常 < 5 Hz(即 10 Hz 奈奎斯特率),但选择 100 Hz 是为了在数据收集过程中具有灵活性

ParameterValue : 16 G 加速度计范围

最不敏感的设置,因为我们对微动不感兴趣

数据收集:收集协议

数据收集过程的下一步是将收集数据时使用的协议放在一起。

粗略地说,我们希望通过协议实现三件事:

1. 一种可重复的数据收集方法

可重复的方法确保数据收集过程以规定的方式执行,测量之间的差异最小,并确保我们数据的完整性。

2. 采样参数将确保我们有足够数量的样本用于开发,以及足够的多样性(即覆盖率)以使我们的最终模型能够很好地泛化

一个好的经验法则是,对于要分类的每一类事件,您至少需要数十个样本(30 个是一个很好的起点);但是,这个数字可能会根据样本之间的差异而增加。以手势应用程序为例,如果您想检测一个圆圈手势,但希望您的模型不受圆圈手势的大小或速度的影响,您将需要更多的样本来覆盖性能范围。

选择样本量时要考虑的另一件事是,您总是会在样本中捕获噪声——即意外的差异;希望有足够的样本,训练算法将有足够的信息来学习区分感兴趣的信号和噪声。

给智者的一句话:从小处做起!预计您的数据收集过程的开发将需要一些迭代;首先完善您的流程,然后开始扩大规模。

3.在收集过程中要捕获的一组元数据变量,可用于解释样本之间的已知差异

元数据变量(或标签)是你留下的面包屑,一旦它们加入到更大的样本池中,你就可以追踪它们;除其他外,这些标签可用于探索数据中的子组(例如,由单个测试对象执行的所有手势)并跟踪您以后可能发现的任何数据问题(例如硬件问题、异常样本等)。

对于这个演示项目,我们创建了一个数据协议文档,其中指定了应该如何执行手势,以及应该收集哪些元数据。为了说明,下面是限制测试对象如何执行收集手势的指令。斜体文本定义了我们明确控制的固定实验参数。

  • 对象应该以一种他们觉得自然的方式流畅地做出手势。
  • 对象应连续做手势至少十秒钟
  • 对象应该站立
  • 受试者应使用惯用手
  • 受试者应用拇指和食指握住板子,绳子朝下,如下图所示
  • 受试者应执行遵循指定轨迹描述的手势(例如顺时针轮)
 
poYBAGNkg2CAC_UKAAAvpUzLgOI912.jpg
图 2:用于执行手势的拇指和食指抓握。
 

此外,为每个数据收集记录了以下元数据值。

  • 拍摄日期
  • SAMD21测试板ID
  • 测试环境标识
  • 测试对象ID
  • (仅适用于空闲类数据)SAMD21 板的放置和方向

数据收集:后处理

最后,对所有数据样本进行后处理以形成最终数据集。

  • 数据被精确地分成十秒的样本
  • 样本被格式化为具有以下命名约定的 CSV 文件:

----.csv

  • 样品被分成几份,80% 用于开发,20% 用于测试
  • 对拆分进行分层,以便开发集和测试集的每个类别和每个主题 ID 的样本比例相同。

数据收集:数据捕获工具

对于本指南,我们将使用手势演示中包含的预构建数据集,但要构建您自己的数据集,您可以使用 MPLAB X数据可视化器机器学习插件。这些插件可以串联使用来捕获样本并将它们导出为 CSV 或 DCLI 文件(SensiML 的本机格式),这些文件可以轻松导入 SensiML 的数据捕获实验室。

为了将 ML 评估套件与 MPLAB Data Visualizer 一起使用,您需要使用 GitHub 上维护的数据记录器固件为方便起见,此项目中使用的传感器配置的预构建二进制文件已打包在最新版本中ml-samd21-iot-sensiml-gestures-demo.zip包含的存档中

博世 IMU:binaries/samd21-iot-data-visualizer_bmi160_100hz-axayzgxgygz-16g-2000dps.hexTDK IMU:binaries/samd21-iot-data-visualizer_icm42688_100hz-axayzgxgygz-16g-2000dps.hex

有关数据捕获过程的更多信息,请参阅将ML 插件与 SensiML指南一起使用。

使用 Data Capture Lab 导入数据

让我们继续将数据导入新的 SensiML 项目。

1. 将包含手势数据集的存档提取ml-samd21-iot-sensiml-gestures-demo.zip到工作目录中。

2. 打开 SensiML Data Capture Lab 工具并为本指南创建一个新项目。

3. 打开新创建的项目后,导航到文件菜单并单击从 DCLI 导入…项,如下图所示。

 
pYYBAGNkg2KAQGYBAAA2FDAchdo818.png
图 3:从 DCLI 文件导入数据集。
 

4. 在出现的对话框中,导航到您之前提取ml-samd21-iot-sensiml-gestures-demo.zip存档的文件夹,然后打开位于 的 DCLI 文件dataset/train/train.dcli逐步完成生成的导入提示,将所有设置保留为默认设置,直到您到达Select a Device Plugin窗口。

5. 当您到达Select a Device Plugin对话框时,单击SAMD21 ML Eval Kit项,如下图所示,然后单击Next

 
poYBAGNkg2WAMy0NAACJl3mnW54273.png
图 4:选择一个设备插件。
 

6、选择设备插件后,会出现插件详情页面;单击“下一步”前进到“传感器属性”页面。在属性页面上,填写与下图所示配置匹配的字段(如果您使用的是 TDK IMU,则选择 ICM 传感器),然后单击Next

 
poYBAGNkg2mAb4l3AABXZxlVLCk178.png
图 5:手势项目的传感器配置。
 

7. 最后,在Save Sensor Configuration窗口中为传感器配置命名。如下图所示,我们简单地选择了名称BMI160

 
pYYBAGNkg2uAfnL1AABAUiM8LtQ013.png
图 6:保存传感器配置。
 

8. 重复步骤三、四导入测试样本(dataset/test/test.dcli);这是将用于验证模型的数据。出现提示时,使用我们在上一步中创建的相同传感器配置。

至此,我们的项目已经设置好我们需要的数据,我们可以进入模型开发阶段。

 
pYYBAGNkg2-AfBWqAANSb_GlIlw432.png
图 7:导入手势数据集的项目。
 

模型开发

现在让我们进入 Analytics Studio 以生成我们的分类器模型。

1. 在您的网络浏览器中打开Analytics Studio并登录。

2. 导航到主页选项卡以查看您的项目并打开您在上一节中创建的项目,如下图所示。

 
poYBAGNkg3GAcXEtAAAYJnj19uQ486.png
图 8:打开您的新 SensiML 项目。
 

3. 导航到准备数据选项卡以创建将用于训练机器学习模型的查询。如下图所示填写字段;这些查询参数将仅选择训练折叠中的样本,并且仅使用加速度计轴。

SensiML Query确定将选择我们数据集中的哪些数据进行训练。我们可以使用它来排除样本(例如我们的测试样本)或排除数据轴(例如陀螺仪轴)。
 
poYBAGNkg3WAYnxJAAENK13Ozj471.jpeg
图 9:在训练模型时创建要使用的查询。
 

4. 切换到构建模型选项卡开始开发机器学习模型。如下图所示填写字段。请注意,唯一需要更改默认设置的设置是查询(在最后一步中创建)、优化指标(f1-score)和窗口大小(200 个样本)。

由于手势数据集的类分布不平衡,此处选择准确度优化指标会使模型优化偏向样本较多的类;因此,我们选择f1-score来提供更好的模型性能代表性度量。我们在这里选择 200 的窗口大小(即 100 Hz IMU 采样率时两秒),因为这足以覆盖至少一个周期我们感兴趣的手势。
pYYBAGNkg3iALTCNAAFBAY2sLh8268.png
图 10:用于生成手势分类器模型的管道设置。
 

5. 输入管道设置后,单击优化按钮。此步骤将使用 AutoML 技术为给定输入数据的手势分类任务自动选择最佳特征和机器学习算法。此过程通常需要几分钟。

​有关 AutoML 配置参数的更多详细信息,请参见AutoML 文档页面

6.构建模型优化步骤完成后,导航到测试模型选项卡。

 
poYBAGNkg3yAf21iAAFjxX8Q7is08.jpeg
图 11:验证生成的分类器模型。
 

一个。选择我们在上一步中创建的管道。

湾。选择上一步生成的模型之一,通常,秩为0的模型是所有生成的候选模型中的最佳折衷。

C。选择折叠列中的倒三角形图标并选择测试以过滤数据,以便仅选择测试样本。

d。单击位于表最左列的省略号 (...),然后选择全选以包括所有测试样本。

e. 单击计算摘要以生成测试样本的混淆矩阵。这应该需要几分钟;完成后,您将看到如下图所示的表格,汇总了分类结果。

​混淆矩阵绘制了真实标签(行)与预测标签(列)分类结果。最右边的列显示每个类的敏感度(或召回)分数(真阳性预测/总真阳性),最底部的行显示精度分数(真阳性预测/总阳性预测)。
 
poYBAGNkg3-AZ_oOAABgN8zHgzE494.png
图 12:测试样本的分类结果。
 

7. 最后,导航到下载模型选项卡以部署您的模型。使用您在前面的步骤中创建的Pipeline ModelData Source填写Knowledge Pack设置,并选择Library输出格式(参见图 13 以供参考),然后单击Download按钮。

格式适用于所有 SensiML 订阅层,将为生成的机器学习模型生成预编译库,以及定义用户 API 的头文件
pYYBAGNkg4KAObtEAAFlm4hZIyM04.jpeg
图 13:知识包部署设置。
 

您现在应该有一个用于 SAMD21 的编译库,其中包含您可以集成到您自己的项目中的机器学习模型。有关 Analytics Studio 的更多详细信息,请访问 SensiML 的文档页面

知识包集成

让我们使用我们的 SensiML 库(即知识包)并将其集成到现有的 MPLAB X 项目中,使用手势演示项目作为模板。

使用本指南随附的 MPLAB X 项目作为您自己项目的起点。这将省去您自己进行硬件和项目配置的麻烦。

1. 从GitHub存储库下载手势演示源代码或使用 git clone https://github.com/MicrochipTech/ml-samd21-iot-sensiml-gestures-demo/克隆存储库除了演示源代码之外,该存储库还包含为使用 SensiML 知识包而预先配置的 MPLAB X 项目。

2. 将 SensiML 知识包的内容(上一节中下载的 ZIP 存档)解压缩到 MPLAB X 项目所在的同一根文件夹中,以便覆盖现有的知识包文件夹。

3.导航到knowledgepack/knowledgepack_project解压后的知识包中的文件夹,定位到app_config.h将此文件移动到固件src目录(与 .X 项目相同的根文件夹)以替换现有的app_config.h这将确保您的应用程序的传感器配置与模型开发中使用的传感器配置相匹配。

4.在 MPLAB X IDE 中打开项目。samd21-iot-sensiml-gestures-demo.X

5. 在 MPLAB X 中,打开Source Files下的 main.c 文件

6. 向下滚动到class_map定义变量的位置 - 请参阅下图以供参考。修改字符串以匹配在 Analytics Studio的下载模型步骤中class_map显示的类映射。请注意,“UNK”类(整数 0)由 SensiML 保留,因此此映射不会更改。

 
pYYBAGNkg4WAesTdAAIpDKUQmr8331.png
图 14:类到标签的映射。
 

7. 在主 while 循环内向下滚动一点,直到到达如下图所示的部分,该部分以调用buffer_get_read_buffer. kb_run_model这是代码的核心:它通过函数调用我们从 IMU 获得的每个样本的 SensiML 知识包,并kb_reset_model在成功进行推理时调用。

在此处修改 LED 代码以反映您的类映射。​

kb_run_model函数是 SensiML SDK 的主要入口点;它在内部缓冲我们给它的样本,并在它有足够的数据时进行推断。对于本指南中的项目,每 200 个样本进行一次推断 - 这对应于我们在 Analytics Studio 中模型开发的查询步骤中定义的窗口大小参数。返回一个负整数,直到它有足够的数据来运行推理。kb_run_model
 
poYBAGNkg4iAFg2DAALYbzWPhTo631.png
图 15:主循环代码。
 

好的,你现在应该准备好编译了。继续并单击工具栏中的Make and Program Device按钮以编译您的固件并将其刷新到 SAMD21 MCU。

最后的话

而已!您现在应该基本了解如何使用 SensiML 和 SAMD21 ML 评估套件开发手势识别应用程序。

有关数据驱动设计过程的深入指南,请参阅 SensiML 的使用 AutoML 构建智能物联网设备白皮书。

要了解有关 SensiML 工具包的更多信息,包括其他机器学习应用程序的教程,请转到 SensiML入门页面。


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

评论(0)
发评论

下载排行榜

全部0条评论

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

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用SAMD21 ML评估套件进行手势识别',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);