你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32上的机器学习实例经验分享

[复制链接]
攻城狮Melo 发布时间:2024-5-25 16:55
用该传感器判断是食指还是中指还是其他指头。

对于我们的三个指头(5个也好)本质上是一种多分类网络问题,我们将输入信号划分成不同的分类。
小拇指
大拇指
中指(后来用了食指方便)
没有指头(空置)

因此我们利用多分类神经网络来实现判断功能。


  1. int i = 0;
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4.     maxim_max30102_read_fifo(&red,&ir);
  5.     printf("%ld ",ir);
  6.     i++;
  7.     if(i==128)
  8.     {
  9.       i=0;
  10.       printf("\n");
  11.     }
  12. }
复制代码

信号的输入部分则和上期一样,100HZ的采样率,128的采样长度。

微信图片_20240525165450.png

创建一个n-Class n分类神经网络。

微信图片_20240525165446.png

其他设置都和上期的保持一样,使用通用一轴传感器。

微信图片_20240525165441.png

但是信号输入的地方,我们利用串口导入各个类别的数据(这里是不同的指头)

微信图片_20240525165438.png

需要注意的是,这里的标签即代表着我们的分类,不像之前那样子可以一个类别下面可以使用多组数据。

微信图片_20240525165433.png

训练我们的模型,这里可以选择我们的分类(其实这里我觉得要是把某组数据能添加到某个分类就好了,这里让我研究一下)。

微信图片_20240525165429.png

训练好我们的模型,这里可以关注各指标。

接着就是验证我们的模型,验证的过程可以参考文章开头的视频。

微信图片_20240525165426.png

部署完我们的模型之后,查看生成的.ZIP文件,其中相比于异常识别多了一个knowledge的头文件。

微信图片_20240525165423.png

这里我们需要libneai.a以及两个.h文件

STM32中用机器学习实现正确率99.95%的心率异常检测!

怎么导入文件请查看这篇文章。

微信图片_20240525165420.png

初始化函数中,我们需要导入一个数组,这个数组就定义在knowledge.h这个文件中。

微信图片_20240525165416.png

  1. neai_classification_init(knowledge);
复制代码

初始化的时候,需要以这个数组为参数。

之后我们在定时器中,采集到128个数据之后进行预测。

  1. float IRD[128];
  2. int i = 0;
  3. int LeranTime= 0;
  4. const char *id2class[CLASS_NUMBER + 1] = { // Buffer for mapping class id to class name
  5.   "unknown",
  6.   "zhongzhi",
  7.   "Error",
  8.   "xiaomuzhi2",
  9.   "damuzhi",
  10. };
  11. float Output[4];
  12. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  13. {
  14.     uint16_t yuce;
  15.     maxim_max30102_read_fifo(&red,&ir);
  16.     IRD = ir;
  17.     i++;
  18.     //printf("%d ",ir);
  19.     if(i==128)
  20.     {


  21.       neai_classification(IRD,Output,&yuce);


  22.       printf("\n\n\n");
  23.       printf("zhongzhi:%.2f\r\n",Output[0]);
  24.       printf("Error:%.2f\r\n",Output[1]);
  25.       printf("xiaomuzhi:%.2f\r\n",Output[2]);
  26.       printf("damuzhi:%.2f\r\n",Output[3]);
  27.       LeranTime++;
  28.       i = 0;
  29.     }
  30. }
复制代码

这里的 预测函数有三个参数,第一个参数是输入数组,第二参数是输出数组,输出数组中包含着对于各个分类的参数预测值,第三个参数输入一个指针,这个指针会指向预测最大值的索引。

微信图片_20240525165413.png

烧入我们的代码,可以看到,空置的时候,Error的预测值是最大的。

微信图片_20240525165410.png

当我们放上中指的时候,检测到中指的概率是最大的。

微信图片_20240525165405.png

小拇指也是可以正常的检测。



转载自:电路小白
如有侵权请联系删除




收藏 评论0 发布时间:2024-5-25 16:55

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版