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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 16:55
用该传感器判断是食指还是中指还是其他指头。
# y# [4 `- a' v& z; r! i8 i8 N# Z' U$ i7 K7 Y
对于我们的三个指头(5个也好)本质上是一种多分类网络问题,我们将输入信号划分成不同的分类。
/ Z7 ~1 @( d; h& |2 p1 w小拇指
: H! j5 F# z9 @7 W大拇指* N, }2 ~3 Y( m; w/ s+ W6 D" x, W
中指(后来用了食指方便)
9 A! O9 }- y- W3 f( j没有指头(空置)
$ P- Q2 C* P$ m. a4 G) w' y$ c
7 @# b2 D2 O6 {
因此我们利用多分类神经网络来实现判断功能。
/ }8 y' A. h. a6 h  g% q
* R$ R4 c/ R- B2 v. b* j9 g! Z
  1. 8 Y5 u# t( T9 ^
  2. int i = 0;6 L/ B" F8 e# p% D2 c
  3. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)4 r# C1 \: [4 B1 R0 I
  4. {5 [! P) u) m; d, n
  5.     maxim_max30102_read_fifo(&red,&ir);, d6 s+ ^# M5 z# D
  6.     printf("%ld ",ir);
    7 ?/ W& w1 _/ J5 j3 Q
  7.     i++;1 a2 X! W- D4 X+ |4 i
  8.     if(i==128)
    7 M7 e9 R" c  u$ ?
  9.     {( _. j" J, x1 Y/ f: V) U
  10.       i=0;
    3 ~2 \' w) ^# l* T5 Z
  11.       printf("\n");
    % k4 A' U6 k7 e, ]
  12.     }
    9 g, y1 G4 K8 U/ U1 ?0 w
  13. }
复制代码
! F0 _6 o) V% W! Q
信号的输入部分则和上期一样,100HZ的采样率,128的采样长度。5 }, u. C2 \4 {5 O" I8 a3 s

: @) x1 q  B' p: H: x2 D) | 微信图片_20240525165450.png
7 U" N: Q$ s. Y  C$ r3 D

6 X) `- `: y( J2 P1 g创建一个n-Class n分类神经网络。
# L+ T& A7 j- P/ ]* V4 H$ J) C0 G! V- X2 M: M& N4 K
微信图片_20240525165446.png
+ T# R! [6 U: t
' g! c3 V- f0 p2 M8 f
其他设置都和上期的保持一样,使用通用一轴传感器。
% v; w  S% [+ s+ r9 z. k8 Q$ ]& H; e9 H  b6 o, t- v4 S6 E1 ~
微信图片_20240525165441.png 2 `! S4 t9 m% [2 n2 L5 l

1 |# T" K0 y% W: r但是信号输入的地方,我们利用串口导入各个类别的数据(这里是不同的指头)
! @7 a1 M4 ]4 b# j
$ }8 R6 L# ~6 @" K+ g, C4 [4 |! J: R 微信图片_20240525165438.png ) D9 k: j5 r. S8 Z7 Y; H# g# Z
  q) w6 Z9 H$ D6 T: M; W3 R2 c% Q
需要注意的是,这里的标签即代表着我们的分类,不像之前那样子可以一个类别下面可以使用多组数据。
7 L5 O  {1 `! P7 P7 ~  o8 f" w: P; c3 x: D$ m
微信图片_20240525165433.png , c& Y, w8 F* d
  ]: ]$ U; i$ M: `
训练我们的模型,这里可以选择我们的分类(其实这里我觉得要是把某组数据能添加到某个分类就好了,这里让我研究一下)。
, L7 P% `0 p& I: u( ]0 t; l+ f" W% Z2 s4 U1 j! |
微信图片_20240525165429.png % B0 d, J  I4 k4 ?  ~+ b) F
$ {; H$ ^7 e, q$ u
训练好我们的模型,这里可以关注各指标。3 N8 T9 R: |3 ]! L

  N: S) U  _  t9 \: S
接着就是验证我们的模型,验证的过程可以参考文章开头的视频。
5 M5 j/ y6 z; F; [
7 R% Y4 [/ D! I. @( T& o 微信图片_20240525165426.png
/ K3 ~7 ~* b8 ^2 `5 u) f/ M3 j. e

. n' Q  c, B6 H+ \& V' {/ A部署完我们的模型之后,查看生成的.ZIP文件,其中相比于异常识别多了一个knowledge的头文件。
$ B% ^2 W% R( ~# O5 o: ~3 P7 [* d4 T! h) h+ C+ b7 R0 s% O* W4 t
微信图片_20240525165423.png & R/ {, E# x* K+ M

# k9 Z' R3 e6 e) K0 E6 w( A- y5 H" B这里我们需要libneai.a以及两个.h文件
1 ?7 c2 W4 z/ C, K9 [+ e
, P$ A1 ^, n3 ^& L( H
STM32中用机器学习实现正确率99.95%的心率异常检测!
. X5 [- W9 ~4 |+ b8 c( _8 [6 S% X% B$ Y9 P2 z4 c3 ?0 s
怎么导入文件请查看这篇文章。
$ [# j8 T9 G1 {; K2 K& z& g$ {1 Y; W5 e& e2 G2 w
微信图片_20240525165420.png
0 x% f9 Q+ x" R5 C5 f0 k) F' \
( \2 R# d5 g( @6 N. z: m9 d! N' k
初始化函数中,我们需要导入一个数组,这个数组就定义在knowledge.h这个文件中。
) u  [, d" L& E' Y4 ~0 U, L5 K2 R8 j; {- w
微信图片_20240525165416.png 3 ?5 l9 v, c* N( J- k: h, l

2 }4 |7 y3 s3 }8 M2 N( f$ @
  1. neai_classification_init(knowledge);
复制代码

# \% G5 i' W4 y7 {# B8 l0 `" t初始化的时候,需要以这个数组为参数。' m/ y# a8 r1 b; j, {- T  T

# C0 w# Y) E% X& O: ]. D& l
之后我们在定时器中,采集到128个数据之后进行预测。
3 n0 n5 d3 i+ r) i& j; H" P5 D" ^+ n
  1. float IRD[128];
    2 a5 _2 A5 O+ ~2 i( |
  2. int i = 0;5 y  }, U- T( l( J( P4 K
  3. int LeranTime= 0;2 |' H) t' g  P3 K: X
  4. const char *id2class[CLASS_NUMBER + 1] = { // Buffer for mapping class id to class name- ?  c2 w' M% ]# u. a( o* v
  5.   "unknown",$ G/ s4 }- ^# N) x) M. V0 }
  6.   "zhongzhi",
    & w$ M) o9 N2 c( U' b: |
  7.   "Error",
    * A9 h3 j# {: r
  8.   "xiaomuzhi2",, K% ?  a' s8 w
  9.   "damuzhi",2 Q+ @" a8 a+ P  @* w3 G; s
  10. };
    ) b9 i7 `0 z  ]% j
  11. float Output[4];0 [7 {4 {( f/ D! i6 b
  12. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)0 G3 a5 v5 E7 @
  13. {2 z1 c6 i4 w$ }# K+ F: I& Y
  14.     uint16_t yuce;
    + I6 u, G/ P6 V) |! g9 c7 w9 W5 M1 N
  15.     maxim_max30102_read_fifo(&red,&ir);
    ( m" m% K* l0 D
  16.     IRD = ir;+ ~! ~3 j1 B: b
  17.     i++;! h, `$ i+ C6 p- r0 V% f
  18.     //printf("%d ",ir);3 J5 y( j2 K" O* m( r5 w) {
  19.     if(i==128)
    2 H! x: T* V  k) n' D( _
  20.     {
    " c  }. P/ q8 {% G- q( {! r  w/ @
  21. ; S6 t/ _2 B+ K. j1 o0 S2 J

  22. ' v, m2 E. h; Y
  23.       neai_classification(IRD,Output,&yuce);
    5 E: A" r( A0 z0 v+ Z# x" E# h! h
  24. + u$ m# C) ]2 u
  25. " o. X0 b, k3 {+ X  c7 o
  26.       printf("\n\n\n");) w$ J/ Z4 s  k* }
  27.       printf("zhongzhi:%.2f\r\n",Output[0]);
    : r2 C1 \4 L2 t. w/ G
  28.       printf("Error:%.2f\r\n",Output[1]);
    1 b; ]& ?+ T5 w" O
  29.       printf("xiaomuzhi:%.2f\r\n",Output[2]);
    8 O, K/ K" i. r+ T1 `; A' }
  30.       printf("damuzhi:%.2f\r\n",Output[3]);
    / g+ Z; \+ l+ @3 O. g4 v
  31.       LeranTime++;" w% Y+ [2 X+ }# v$ J( [8 y/ c( o
  32.       i = 0;
    1 ]. C% f% ~5 P2 Y, Z& D
  33.     }0 e5 a& Y, J) j' S. q# o, I3 v6 b: `( ]
  34. }
复制代码

: q0 X6 Z9 M6 d* q这里的 预测函数有三个参数,第一个参数是输入数组,第二参数是输出数组,输出数组中包含着对于各个分类的参数预测值,第三个参数输入一个指针,这个指针会指向预测最大值的索引。
; c. _; {) }$ [! D
- M8 h  g, g$ E( I$ _' r2 K: d
微信图片_20240525165413.png
' p& ~! n7 k1 h

5 ?6 B- h7 N* o  {! i" o1 Y烧入我们的代码,可以看到,空置的时候,Error的预测值是最大的。+ Y  Z  t4 T& q% @, v
% P; ]4 c6 m& H' |  V! Z0 c
微信图片_20240525165410.png
  i6 J) m" E+ j0 D
" |# Y# C' Y% x; e& O
当我们放上中指的时候,检测到中指的概率是最大的。- M) G& Z: f( Z$ a# Y3 a+ A' l. Z5 d

0 ?- @& b7 G# c1 i' k 微信图片_20240525165405.png
$ k" i& o3 J/ m: K
7 y& ]5 p0 a  {6 K/ B: U
小拇指也是可以正常的检测。
! m% f: s" g; e) N9 x+ L: m
6 C/ U* o# `  v' T, M' A
6 M( N4 Q' U0 }5 Z9 K5 Y+ ~0 A1 ?
1 l' P* \- g  J2 j6 y
转载自:电路小白8 Z4 ~/ }) X) _! g! w$ t+ _; _
如有侵权请联系删除+ y7 J0 P% X8 `9 {: I

6 l+ x2 d$ P( H5 ~0 E2 @8 Z3 ]0 w- @* @) _* F; f

9 G7 Z0 M: u. x: F! K
! E6 j/ T% ]9 d% Y4 n; h
收藏 评论0 发布时间:2024-5-25 16:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

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