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

基于STM32用机器学习实现心率异常检测经验分享

[复制链接]
攻城狮Melo 发布时间:2024-5-25 17:10
首先我的数据并没有做任何任何的处理,本来我是打算加一个直流滤波的,首先是效果不太好,其次是我都用上机器学习了我为什么还要自己处理数据?机器学习本事的目的就是节约我们的脑子,利用机器来提取特征,而不是我们自己去提取特征(直流偏置本身也是一种特征),就算我的信号有其他的误差,我们可以处理一下提高分辨度,但是!对于机器而言,这些本身就是他的特征,我们只需要告诉机器,哪些特征是对的,哪些特征是错的!

训练模型方面,我们使用MAX30102每10ms采样一次,每128次采样作为一组数据上传。

  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. }
复制代码

这里我们不对数据进行任何处理,因为既然我们选择了机器学习就是为了节省我们对于数据的处理,节省对于特征的提取。

模型训练
我们打开NanoEdge AI Studio,这次的项目我们选择异常检测。

微信图片_20240525170819.png

微信图片_20240525170822.png

传感器选择通用传感器,轴数为1,芯片型号选择自己所需要的芯片型号。

微信图片_20240525170825.png

Regualr signals 常规数据
Abnormal signals 异常数据

我们通过串口(USB)分别导入正常的信号和异常的信号。

微信图片_20240525170827.png

微信图片_20240525170830.png

数据集尽可能多且广泛并且经典。

微信图片_20240525170833.png

我们总共导入了两百组信号,这些信号包含了大拇指,中指以及稍微靠前的位置和稍微靠后的位置,保证数据集的范围足够的广泛。

微信图片_20240525170836.png

异常信号就非常简单,我们放在那里空置信号,晃动信号这里我放在那里测了总共三百多组(打游戏打忘记了)。

然后利用这两组信号进行训练。

微信图片_20240525170838.png

我们将异常信号和正常信号全部选上,之后进行训练。

微信图片_20240525170841.png

之后查看训练详情,等待模型训练完成。

微信图片_20240525170846.png

可以看到,训练完的模型无论是准确率还是RAM大小Flash大小,都相当的合适,接下来我们测试一下我们的模型。

微信图片_20240525170849.png

这边可以查看训练过程中的模型。

微信图片_20240525170852.png

验证我们的模型。

微信图片_20240525170855.png

这里需要注意的是,我们第一次导入数据会先进行训练,异常检测需要有一个学习环节。

官方的手册中推荐了至少十组正常数据进行学习。

微信图片_20240525170858.png

我录了21组正常数据进行学习。

然后就可以对模型进行验证。

微信图片_20240525170901.png


部署我们的模型,其中需要他的.a文件和.h文件。

微信图片_20240525170904.png

这里我们需要使用CubeIDE来编程。因为这里的.a文件是静态文件,静态文件使用keil编程有点麻烦,需要安装GCC编译器,STM32CubeIDE集成好了可以编译.a文件。

微信图片_20240525170906.png

在属性中添加静态库的路径。

微信图片_20240525170909.png

在库中添加路径,我们的.a文件是libneai.a,这里需要省略lib和后缀.a

微信图片_20240525170913.png

导入NanoEdgeAI的库函数。

微信图片_20240525170922.png

可以看到这里有三个函数,初始化函数,学习函数以及预测函数。

  1. enum neai_state MyState;
复制代码

定义一个枚举变量用来存放标志位。
  1. MyState  = neai_anomalydetection_init();//初始化
复制代码

初始化我们的模型。
  1. float IRD[128];
  2. int i = 0;
  3. int LeranTime= 0;
  4. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  5. {
  6.     uint8_t yuce;
  7.     maxim_max30102_read_fifo(&red,&ir);
  8.     IRD[i] = ir;
  9.     i++;

  10.     if(i==128)
  11.     {
  12.       if(LeranTime<10)
  13.       {
  14.         HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);//LED翻转
  15.         neai_anomalydetection_learn(IRD);
  16.       }
  17.       else
  18.       {
  19.         neai_anomalydetection_detect(IRD, &yuce);
  20.         if(yuce>80)
  21.         {
  22.           HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, 1);
  23.         }
  24.         else
  25.         {
  26.           HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, 0);
  27.         }
  28.       }
  29.       LeranTime++;
  30.       i = 0;
  31.     }
  32. }
复制代码


我们在定时器回调函数中调用,上电之后前十次为学习阶段,之后对测量值进行预测,当预期值>80即认为状态正常,则灯灭。
如果预期值<80则报警灯想起。



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



收藏 评论0 发布时间:2024-5-25 17:10

举报

0个回答

所属标签

相似分享

官网相关资源

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