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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 16:55
用该传感器判断是食指还是中指还是其他指头。
2 a9 w5 r) {. B1 T
9 y$ [& T) `! f; G
对于我们的三个指头(5个也好)本质上是一种多分类网络问题,我们将输入信号划分成不同的分类。, E" N; |* r6 I
小拇指( D9 u1 K9 Z4 h! d5 v" Y& U
大拇指& h( z2 _4 v: {- R4 c- g
中指(后来用了食指方便): `; ?. h8 n  j( Z- s+ m; f3 f
没有指头(空置)
: X. o) R' \" N9 U1 d, c) ]. y& j9 ~! S: w
因此我们利用多分类神经网络来实现判断功能。1 j9 P* ~, e! v* C5 ^1 y
1 I7 h5 S* \  g; \. C  q+ A
  1. ) f2 c/ }( Y+ b" f
  2. int i = 0;
    0 o" E2 @" ^, `7 l- E! X% s( m
  3. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)( b, Y% T+ i4 H5 P
  4. {3 w, G8 \  \  a" _) }; H0 L
  5.     maxim_max30102_read_fifo(&red,&ir);
    * S, J, d9 B2 B  \, C; V4 o8 a6 h4 D
  6.     printf("%ld ",ir);0 d% @1 z( I1 C- @0 G! o$ @
  7.     i++;
    * t) R  N& i# f4 r9 j# @% f
  8.     if(i==128)
    1 ~2 u: Z! n) o/ z# |  b2 v
  9.     {8 K/ M  s0 q0 N7 K/ [
  10.       i=0;6 ~6 L3 |9 V* W5 T! y
  11.       printf("\n");
    % o9 o! o- B( p  P/ O2 o
  12.     }
    * G8 o" t  C1 F5 d
  13. }
复制代码

: g5 {! ^( T- C$ O6 w- H信号的输入部分则和上期一样,100HZ的采样率,128的采样长度。
& r. w* x1 R# b! y" b5 E, ]/ X0 A7 ]( f5 _; j  L
微信图片_20240525165450.png
# s: w/ y7 U! T$ ~  {8 E
. N6 W+ U6 a% a  s+ Z2 H
创建一个n-Class n分类神经网络。
+ ^+ V$ p. n7 ^
: f# G1 z$ }9 P$ L 微信图片_20240525165446.png
/ M, r! E+ c9 q2 z! R( }9 \7 q

, I9 [3 \4 W  }- c其他设置都和上期的保持一样,使用通用一轴传感器。$ a' @9 l3 H: ~8 O& t) e# k

- \# q1 h3 s- s. \( L* o5 _' P% q 微信图片_20240525165441.png
  t( p! m2 L" x+ b

) G* s8 R2 q0 h+ O. l但是信号输入的地方,我们利用串口导入各个类别的数据(这里是不同的指头)
8 q2 V$ s+ H0 T4 g+ }4 A# X
/ X& b2 V( T9 O! ~. q1 u# C 微信图片_20240525165438.png
" L. l/ o4 Z( [" Z0 ]
: {/ }& u- ^3 {, C9 ~  G! O
需要注意的是,这里的标签即代表着我们的分类,不像之前那样子可以一个类别下面可以使用多组数据。1 F5 C6 d: r6 ]* N
( Z( x4 x* S; [5 x% ~! t
微信图片_20240525165433.png
3 d! c1 V/ P9 A4 R% L9 x0 a8 H) P
3 G- f1 N9 [: g  V* s6 m; q
训练我们的模型,这里可以选择我们的分类(其实这里我觉得要是把某组数据能添加到某个分类就好了,这里让我研究一下)。
3 O: Y" y# M9 k- d! n' B4 i* T' i- n2 |
微信图片_20240525165429.png 5 c$ K+ U8 K8 V3 y

6 D2 `2 V: d$ ^% u+ |训练好我们的模型,这里可以关注各指标。
% ]. d' ?5 a# y- w8 A( h- {$ q9 ^3 O# H; _
接着就是验证我们的模型,验证的过程可以参考文章开头的视频。! ~1 {+ L: g$ ?6 H& g: K

/ ^( u3 _( O0 s" }) D  ^$ l; z 微信图片_20240525165426.png
) _  H1 s8 p, L  O* H; z! |0 l

# r6 y* u$ @+ s5 ~/ J$ U部署完我们的模型之后,查看生成的.ZIP文件,其中相比于异常识别多了一个knowledge的头文件。
9 [" B+ q1 X& k3 i1 |8 W9 P3 h( u2 N% \( j9 O0 M9 C
微信图片_20240525165423.png 1 B& A% f) g; ~7 q5 F+ g

. k# l4 w* u& ^7 a这里我们需要libneai.a以及两个.h文件
; V( B- F* o2 C' ?. C3 L: Q& q; d2 I- `& y9 U6 Z
STM32中用机器学习实现正确率99.95%的心率异常检测!
4 a* U% l0 E+ k& i% Y% X9 \1 ^9 F7 ?" B4 Y" M8 h/ d3 [
怎么导入文件请查看这篇文章。+ R! _9 g2 f" h

3 s; H% G6 V# @& s* R) x 微信图片_20240525165420.png & D& a1 d8 |8 r  v( ^* ~, t5 W

8 }7 r; d5 G0 _/ [$ H; _初始化函数中,我们需要导入一个数组,这个数组就定义在knowledge.h这个文件中。
( e6 z, Z; T% H! @; c; @+ n  @
* Q1 p# r& ~& q: L- R4 D1 ^ 微信图片_20240525165416.png 9 \' N! g4 J5 i
- h% h# x+ T7 x. Q6 B( ~  Q( n
  1. neai_classification_init(knowledge);
复制代码
2 J( t, f+ z: V0 m9 D0 N0 u
初始化的时候,需要以这个数组为参数。
3 \/ c" z# k% w6 \- l7 l2 y5 [7 z% u( }- l6 p6 m$ z5 ~1 t- g! Q
之后我们在定时器中,采集到128个数据之后进行预测。
" j; W1 W7 l+ C" u0 g3 Z
  }# C$ Z6 C; `' }7 ], o
  1. float IRD[128];
    0 r0 l5 D2 _4 d5 ~7 j. M
  2. int i = 0;
    4 i, m) `8 G5 J5 Z# p; D
  3. int LeranTime= 0;
    / p0 [9 s6 p/ }) N) K9 R. G1 U
  4. const char *id2class[CLASS_NUMBER + 1] = { // Buffer for mapping class id to class name
    ) t9 [; b# J2 z* Q! k" L
  5.   "unknown",% }+ l0 c) T% i4 `" Z$ w" b
  6.   "zhongzhi",
    - q- }! V. C/ v. L" W8 `  L- q
  7.   "Error",
    " J/ ~7 y/ K& C  c9 |$ K( E
  8.   "xiaomuzhi2",9 ^5 ~5 x2 C$ ]* M
  9.   "damuzhi",
    . Q' I1 |+ \* P* z8 c2 `3 T$ q$ f
  10. };
    ! [" _$ X6 E/ @, S; I" a& B* o
  11. float Output[4];
    4 p1 P/ y2 \( H6 ~# c
  12. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)# B2 y: l, W' Q3 s: y; U
  13. {: C4 \3 Z. R) q/ |0 A0 G; k
  14.     uint16_t yuce;2 V, z% d' X$ O. x2 z
  15.     maxim_max30102_read_fifo(&red,&ir);
    " x8 t. }0 E( e" U
  16.     IRD = ir;
    2 g( J9 f7 }# w0 v1 y2 i+ d  y
  17.     i++;
    ( P" w  W6 M3 _6 I7 _! o0 g
  18.     //printf("%d ",ir);
    ; `8 {- O3 c8 v7 H; C
  19.     if(i==128)& X7 H& a# R  U
  20.     {2 B' s3 N9 G5 |4 L
  21. ) l/ \5 V5 {7 i  j8 F6 Q* s

  22. 7 \; @! O# w4 }0 _4 O6 q
  23.       neai_classification(IRD,Output,&yuce);
    " \# G" A  J2 |9 F7 i
  24. 9 A  I1 M: i5 L$ K* P) s
  25.   i& q% }* \: X/ f' |, ?8 V8 N8 Q
  26.       printf("\n\n\n");
    : S1 `6 |4 T# e: M( B7 p
  27.       printf("zhongzhi:%.2f\r\n",Output[0]);/ F7 y; \0 i% {$ ~4 O
  28.       printf("Error:%.2f\r\n",Output[1]);6 Y' Q& B; b: b# H" A
  29.       printf("xiaomuzhi:%.2f\r\n",Output[2]);
    & a/ Q# Q/ k8 Z, H4 v) w4 D
  30.       printf("damuzhi:%.2f\r\n",Output[3]);
    . Y" @# B; O, V7 P2 v' X$ p
  31.       LeranTime++;
    : ^1 S1 L- C0 O# Y
  32.       i = 0;% V) X7 `3 W" U; U% n# O' r; C( q
  33.     }! \- x9 g8 @% y5 X( b
  34. }
复制代码

+ T! ?2 C5 I; z* J  ^8 T这里的 预测函数有三个参数,第一个参数是输入数组,第二参数是输出数组,输出数组中包含着对于各个分类的参数预测值,第三个参数输入一个指针,这个指针会指向预测最大值的索引。+ S. x1 |3 \8 y
( n% U9 C0 w7 {7 V1 E
微信图片_20240525165413.png
/ Y7 T9 A" x) ~7 {. e
% u" C2 p5 {- u' f0 C
烧入我们的代码,可以看到,空置的时候,Error的预测值是最大的。+ y# ~9 u( h& C, {

1 K. O" o$ L" E3 u7 R8 n% b
微信图片_20240525165410.png
( _* K8 v% d9 t5 c" Y4 ~
* `( I+ I( s8 A7 d7 I& m
当我们放上中指的时候,检测到中指的概率是最大的。% O7 D% J# ]& L% D9 F6 F
8 [0 g" ?! I7 a; T4 M
微信图片_20240525165405.png ) G5 F! l5 ^' [9 u9 Z

1 [% f) |( r" ^小拇指也是可以正常的检测。
% O0 q, z0 ^1 z3 G; N% }  E. t9 ?- ]; ~4 a

8 I; u& d& J3 ^# N
$ t1 j3 J8 }! }( I& z% s转载自:电路小白6 ^) O. H, c/ S$ F! i& i
如有侵权请联系删除
3 W3 O! V  V: C/ |' Z8 _$ B; O/ F/ e9 K
, ^: l1 \: ^9 A3 g0 x* o
% @$ r; r) l: p
& }3 c: h$ v! ]9 m$ X8 N* a
收藏 评论0 发布时间:2024-5-25 16:55

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版