×

日常活动识别的超微型解决方案

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

张健

分享资料个

描述

介绍

尽管当今可穿戴设备种类繁多,但大多数人工智能功能归结为仅定义非常简单的动作。他们确定一个人是在跑步还是在睡觉,他们计算步数,并确定一个人是否跌倒。

在我看来,我们已经准备好从我们的设备进行更复杂的分析。如果他们能够识别更具体、相似和复杂的活动会怎样?它将开启前所未有的可能性,创造出许多有趣的新应用程序和设备。

然而,识别更复杂的活动需要庞大而复杂的神经网络,这需要大量的计算。这显然会很快耗尽嵌入该神经网络的物联网设备的电池。大多数可穿戴设备应在常亮模式下运行,这对此类解决方案的能源效率提出了严格要求。

我们如何解决这个挑战?在我的项目中,我想展示一个示例,说明如何显着增加智能功能的复杂性,并确定可穿戴设备可以使用非常小且准确的神经网络识别什么。

在我的项目中,您将找到有关如何使用 Nicla Sense ME 实施多项日常活动识别的详细指南。

如果你有 Nicla Sense ME,你可以在你的实验/项目/课程中尝试我的预训练模型。

我们的测试结果表明,该模型完美地识别了 30 名未使用其数据训练模型的参与者的动作。

按照本教程,您还可以轻松地进行自己的实验并根据您的数据训练神经网络以识别相同或不同的动作。

我们相信,使用小型神经网络识别极其复杂和相似的动作的能力为永远在线的设备开辟了一个新时代。

下面,您将找到有关如何重现此实验的完整教程,包括数据收集、模型训练、模型嵌入和推理。此外,我们还创建了一个带有预训练模型的公共存储库,该模型已证明对新用户具有良好的泛化能力。它是一个预编译的模型存档,您只需点击几下鼠标即可下载并嵌入到您的 Nicla Sense ME 中,然后开始测试。

https://github.com/NeutonTinyML/hand-activity-recognition

使用 Nicla Sense ME 收集数据

对于这个案例,我选择了 5 种类型的活动(对于您的实验,您可以选择其他活动):

  • 洗手
  • 刷牙
  • 鼓掌
  • 梳理头发
  • 随机活动(负类)

对于每种活动类型,我使用 Nicla Sense ME 连续 10 分钟不间断地收集传感器数据。数据是从 7 个不同地点的 7 个不同的人那里收集的。这是一个非常具有挑战性但又很有趣的过程,因为为了正确收集数据,中断是不可取的。对于那些计划重新进行我的实验的人,这里有一些建议:在为另一项活动收集数据之前,先休息一下!但是,如果 10 分钟的持续刷毛太多了,您可以进行两个 5 分钟的数据收集流,然后将两个文件连接起来。

对于负类,我们收集了 60 分钟的数据。这次不需要做任何特别的事情;继续你的日常活动。在键盘上打字,操作鼠标,接听电话,喝茶,或做任何你想做的事。只需确保在收集负面类别数据期间,您的手不会完全闲着不动。负面类别是除上述 4 类之外的所有其他类别的子集。

脚步:

现在让我为您提供有关如何调整 Arduino 板 Nicla Sense ME 以收集数据的详细指南。

1.访问https://www.arduino.cc/en/software为您的操作系统下载 Arduino IDE 2.xx,并安装软件包。

pYYBAGSBPNKAERH1AAGTsevV4AI840.png
 

2.打开 Arduino IDE,单击Boards Manager图标,键入“nicla sense me”并安装Arduino Mbed OS Nicla Boards包。

poYBAGSBPNWAPWAWAACNybxqVys696.png
 

单击库管理器图标,在搜索框中键入“nicla sense me”并安装两个库:Arduino_BHY2ArduinoBLE

pYYBAGSBPNiAePCaAAHCQbSh9QY807.png
 

在搜索框中键入“printf”并安装LibPrintf

pYYBAGSBPNuAKIAiAACmpku-8fg108.png
 

3.在主菜单中选择File->Examples->Arduino_BHY2>BHYFirmwareUpdate

poYBAGSBPN6AQFH-AAL0C0EdwSs025.png
 

4.将Nicla Sense ME板连接到 USB 并在下拉菜单中选择端口。

poYBAGSBPOGAQ9XNAAFwVF0g5pY324.png
 

5.点击上传按钮...

pYYBAGSBPOSAW2jJAAAyz3p7qTU483.png
 

…等到上传过程完成。

poYBAGSBPOaAIHStAADZ6VWMgfw634.png
 

6.单击串行监视器图标并选择115200 波特,然后单击 Nicla 开发板上的重置按钮。

pYYBAGSBPOiAdmviAAAVVFsD8Pw129.png
 

7. 5-10 秒后,您会看到 BHY 固件已上传。

poYBAGSBPOuAIwPWAABrcbCdW_0945.png
 

8.使用 Nicla Sense ME 从 Neuton存储库下载用于传感器数据收集的 Arduino 预编译库

模型 -> Arduino_Neuton.zip(不要解压存档)

9.将“Arduino_Neuton.zip”模型安装到 Arduino IDE 中:

Sketch -> Include Library -> Add .ZIP Library…(指向下载的“Arduino_Neuton.zip”存档)

pYYBAGSBPO6AJp9cAAFZkD4_nFA784.jpg
 

10.退出并重新启动 Arduino IDE(Arduino IDE 最多需要一分钟时间来索引所有示例,包括新安装的“Arduino_Neuton”)

11、打开安装好的例子:File -> Examples -> Arduino_Neuton -> Inertial_Sensor_Data_Collection (会弹出一个新的Arduino IDE窗口,关闭之前的Arduino IDE窗口)

pYYBAGSBPPKATKLPAAKFLhf99Go576.jpg
 

12.将 Nicla Sense ME 连接到计算机的 USB 端口。

13.在 IDE 中选择您的 MCU 并上传固件。

poYBAGSBPPSAaWWHAADiGKuReIg349.jpg
 

14.固件上传后(1-2 分钟),打开串行监视器 - 您应该看到传感器读数(如果您看到连接错误 - 重新启动 Arduino IDE 并再次打开串行监视器)

pYYBAGSBPPeAXNuGAAEVwySP0Yw373.png
 

现在您可以从 USB 端口拔下威廉希尔官方网站 板。

15.将威廉希尔官方网站 板牢固地连接到手表或手链上。Micro-USB 端口应位于右下角。

poYBAGSBPPuAGoSkAACF0FYnQ34465.png
 

16.将带有威廉希尔官方网站 板的手表或手环戴在右手上,并连接数据线。确保连接器附近的电缆没有拉紧,以免损坏威廉希尔官方网站 板。

pYYBAGSBPP2AQLC1AADZpQuWK3s172.png
 

17.根据您的操作系统,打开串行端口并尝试记录数据。在提示中可以看到串口。

poYBAGSBPQCAM1JVAADTU44bUiU590.png
 

如果您使用的是 macOS,请在终端中使用此命令:

stty -f /dev/cu.usbmodem85EB3A0F2 115200 | 猫/dev/cu.usbmodem85EB3A0F2 | T 恤 4_brushing_hair.csv

这会将端口速度设置为 115200 波特。从串行端口打印出文本数据并将其保存为 CSV 文件。

pYYBAGSBPQSAcRmZAAIJl-MyNfc571.png
 

按 Control-C 停止录制。将有一个 CSV 文件,其中包含来自传感器(加速度计、线性加速度计和陀螺仪)的数据和时间戳。

poYBAGSBPQeAWM28AAEHg6O8zLk519.png
 

18.开始记录运动。按下 Nicla 板上的重置按钮并重新开始记录到文件。

例如,拍手 10 分钟(使用智能手机中的秒表应用程序)。在此过程中,改变双手的位置,使数据更加多样化。录制过程中不要停止移动。

按下重置按钮后约 7 秒内将开始录制。

10 分钟结束后,继续运动 10-20 秒并停止记录。

19.对每个活动类型重复第 18 步(使用不同的文件名):

poYBAGSBPQmATFlsAAArsJhcdNM152.png
 

在记录每个动作之前重置板。

模型训练

在您收集了所有活动的数据并将它们组合成一个数据集后,前往Neuton.ai平台训练您的模型。

1.创建一个新的解决方案

poYBAGSBPQuAU-51AAAwARqLdbI298.jpg
 

2.选择数据类型,上传数据

pYYBAGSBPQ6AVeZYAACHRXXTm-4793.jpg
 
poYBAGSBPRGACTfeAAB0PTj5k10147.jpg
 

3.在左侧字段中删除变量 lacc_X、lacc_Y、lacc_Z(此模型不需要线性加速度计);在右边的字段中选择目标变量并单击下一步。

pYYBAGSBPRSAEaJGAAETSvfkhg8113.jpg
 

4.选择任务类型。

poYBAGSBPReAKW6CAACTvQ-Ey3k227.jpg
 

5.选择输入数据类型为 INT16。

poYBAGSBPRmAeG3BAABF5A3Zy_M761.jpg
 

6.启用数字信号预处理,选择 Window size 200 和 Sliding shift 5。

pYYBAGSBPRyATW4RAAFlTNeUpws141.jpg
 

7.对于每个特征(acc_X、acc_Y、acc_Z、gyro_X、gyro_Y、gyro_Z)重复以下步骤:

A。点击“编辑”

pYYBAGSBPR-APiHOAAC-2SOL49A434.jpg
 

b. 选择“全部删除”

poYBAGSBPSKAD4W6AACcdVKM0Aw465.jpg
 

C。选择“统计”功能并检查以下功能:均值、均方根、平均绝对偏差、标准偏差、均值交叉率、过零率

poYBAGSBPSWAR1QCAACPKxK0fhQ331.jpg
 

8.选择单片机位深:8位,开始训练。

pYYBAGSBPSeATbM5AABcgR5hK48963.jpg
 

模型训练完成后,进入“预测”选项卡,检查模型质量指标并下载包含模型的存档以进行嵌入。

poYBAGSBPSqANN1BAADDbdZ5Rzc447.jpg
 
pYYBAGSBPS2AMb8FAAHxz9ZELNw932.png
 

下载的模型源代码如下所示:

poYBAGSBPTCAd2lIAAFXBa_746o101.jpg
 

该档案包含将模型嵌入任何 MCU 所需的一切。使用存档内容编译一个 Arduino 草图,用这个草图刷新你的 Nicla Sense ME 并开始推理。

 


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

评论(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.obk20.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:'日常活动识别的超微型解决方案',//标题 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.obk20.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);