×

使用TinyML开发私人教练

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

李梅

分享资料个

描述

介绍

据巴西卫生部长称,到 2020 年,该国 36.8% 的人口习惯于在空闲时间进行某种体育活动。

为了寻求一种方法来改善人们在锻炼时可以获得的反馈,通过将 TinymL 与可以连接到哑铃的小型开发板集成在一起开发了一个系统。

本项目将使用的开发板是Seeed XIAO nRF52840 BLE Sense,具有紧凑的尺寸、较低的功耗、能够为电池充电以及内置加速度计和陀螺仪。该项目必不可少的传感器。

3D外壳

为了能够将整个系统带到健身房或体育活动环境中,需要制作一个外壳来保护开发板免受意外跌落,同时能够携带电池,从而可以在不使用的情况下运行电缆。

可以使用 3D 打印机制作一个简单而实用的外壳。

poYBAGSBLdyAbmdKAABr5CClJFQ471.png
3D 外壳的渲染。
 

数据采集

该项目的主要问题之一是能够收集可靠的数据,因为收集数据涉及将整个系统连接到哑铃的一侧,哑铃一直在上下移动,左右移动或同时移动。

解决这个问题的一种方法是使用蓝牙将数据从惯性测量单元 (IMU) 传输到智能手机,而无需电缆。

pYYBAGSBLd6ARo67AACouZ1zwtA482.png
通过 BLE 通量图采集数据。
 

在这个项目中,主要关注三个练习,二头肌卷曲,卧推和侧平举,所有这些练习都是使用哑铃完成的。这个选择是基于这些锻炼不同类型肌肉的练习:分别是二头肌、胸部和肩膀。

poYBAGSBLeGAfaofAACJNLOblV4461.png
二头肌卷曲、卧推和侧平举。
 
pYYBAGSBLeWACogvAAFjj8GzLqA526.png
将外壳连接到哑铃上。
 

要从微控制器接收数据,必须使用 Android 应用程序,为此,MIT App Inventor 2 网站上开发了一个应用程序。

该应用程序的功能是在必要的时间内从 IMU 的 6 轴接收数据,并将其存储在 a.csv 文件或在线谷歌表格中。

pYYBAGSBLeeAFmfuAAFZO_rG0MY955.png
左边是应用程序,右边是生成文件。
 
pYYBAGSBLeqAKBXBAAF_JIldrlw491.jpg
二头肌卷曲收集数据的图形可视化
 

模型训练

为了训练这个模型,我们使用了 Edge Impulse 网站。首先,所有采集到的原始数据都上传到平台内部进行预处理。为了生成我们的特征,我们将使用 256 点长度的 FFT。

模型设计将是一个密集神经网络 (DNN),其输入层有 570 个神经元,两个隐藏层分别有 40 个和 20 个神经元,一个 0.25 比率的 dropout 层,另外 10 个神经元层和 5 个神经元的输出层,每个神经元一个每个班级。

poYBAGSBLe2AJnsuAACt_uCIliM607.png
NN 设置和模型性能。
 

模型测试

通过使用在数据采集阶段收集的 20% 的数据,我们可以验证我们的模型将如何处理未知数据。

pYYBAGSBLfCAMPQEAABeQ85OAOM633.png
模型测试结果。
 

尽管 85% 的准确率并不理想,但考虑到所分析数据的复杂性,这仍然是一个不错的结果。

部署

训练完成后,我们可以在我们选择的开发板 Seeed XIAO nRF52840 BLE Sense 中部署模型,一个简单的方法是使用 Edge Impulse 提供的编译库,之后,我们将拥有整个系统已准备好部署。

但是,我们仍然需要一种方法来可视化推理结果,为此,可以采用与数据采集阶段相同的方法。

进行推论

通过开发一个新的应用程序来显示推理,许多选项变得可用,推理结果可以通过音频和智能手机振动显示在智能手机屏幕上。还可以保存数据以创建整个练习部分的时间线,并可以执行数据分析以创建图表,从而允许最终用户进行交互并了解他的表现何时何地好或坏。

poYBAGSBLfKAOALyAAC4_C_XUBk012.png
推论结果通量图。
 

结论

 

借助该项目中使用的出色且可靠的威廉希尔官方网站 板,我们可以使用我们的微型模型取得显著成果。

如模型训练部分所示,最终模型仅占用 1.9K RAM,这使我们有可能通过捕获更多数据或来自新的不同练习的数据来进一步扩展和改进该项目。

项目 Github 存储库中,您将找到所有使用的代码,以及模型库和 3D 外壳 stl 文件。

了解更多!

这个项目也在 Youtube 上:SciTinyML-23 - Day4 - UNIFEI 私人教练

如果您想了解更多关于通过蓝牙收集数据的信息,请查看 Marcelo Rovai 制作的精彩教程:Sensor DataLogger

要了解并了解此项目中使用的开发板,请查看 Marcelo Rovai 制作的其他教程:TinyML Made Easy:异常检测和运动分类

谢谢你!

我们要感谢 CNPq 赞助这个项目,感谢 Seeed Studio 为我们提供这里使用的开发板,以及来自 4FIT 健身房的私人教练 Cleyton Nogueira。

也感谢您阅读到这里,我们希望这个项目能以某种方式帮助您或给您对未来的新想法!


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

评论(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:'使用TinyML开发私人教练',//标题 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);