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

【经验分享】我在STM32单片机上跑神经网络算法

[复制链接]
STMCU小助手 发布时间:2022-1-5 21:11
01 前言
为什么可以在STM32上面跑神经网络?简而言之就是使用STM32CubeMX中的X-Cube-AI扩展包将当前比较热门的AI框架进行C代码的转化,以支持在嵌入式设备上使用。, T4 i# @  l! w/ Z' t% }1 p
目前使用X-Cube-AI需要在STM32CubeMX版本5.0以上,支持转化的模型有Keras、TFlite、ONNX、Lasagne、Caffe、ConvNetJS。
* P2 W$ A. i3 f; v7 nCube-AI把模型转化为一堆数组,而后将这些数组内容解析成模型,和Tensorflow里的模型转数组后使用原理是一样的。
9 k4 f8 o( X5 k  H- q) \9 F一、环境安装和配置
  • STM32CubeMX
  • MDK/IAR/STM32CubeIDE
  • F4/H7/MP157开发板
      y9 z& f  Q) U
    4 ^, A+ ~2 ^' L! e, w8 V
    " F; J0 b" y  j  A- _
02 AI神经网络模型搭建
这里使用官方提供的模型进行测试,用keras框架训练:
6 d8 r# i7 q5 y6 u- {3 T5 u4 h- Q: V. |  @

) G3 ?0 o  V0 L# R& @# h
J7)_F]}QX`@W2`[U4WB2%QV.png

3 I# ~. v( f% E7 Y, n
) p/ E$ Z- b' _6 \2.1 模型介绍3 Z9 k; M+ p* ^. m
在Keras中使用CNN进行人类活动识别:此存储库包含小型项目的代码。该项目的目的是创建一个简单的基于卷积神经网络(CNN)的人类活动识别(HAR)系统。该系统使用来自3D加速度计的传感器数据,并识别用户的活动。
7 {; \2 Y; s# c6 e
例如:前进或后退。HAR意为Human Activity Recognition(HAR)system,即人类行为识别。
/ X6 y. C  L  c9 e  s! |* @2 N5 O这个模型是根据人一段时间内的3D加速度数据,来判断人当前的行为,比如走路,跑步,上楼,下楼等,很符合Cortex-M系列MCU的应用场景。使用的数据如下图所示。
7 |+ D4 [; B" p' x6 I  W
O@6JNO(_4Y5FSL29N62IG.png
. }& P2 w6 f. o7 l

5 ]1 W1 Q6 b+ F6 k; z6 Z0 X, R
存储库包含以下文件

3 k$ `1 x3 I* h& U2 l, V
  • HAR.py,Python脚本文件,包含基于CNN的人类活动识别(HAR)模型的Keras实现,
  • actitracker_raw.txt、包含此实验中使用的数据集的文本文件,
  • model.h5,一个预训练模型,根据训练数据进行训练,
  • evaluate_model.py、Python 脚本文件,其中包含评估脚本。此脚本在提供的 testData 上评估预训练 netowrk 的性能,
  • testData.npy,Python 数据文件,包含用于评估可用预训练模型的测试数据,
  • groundTruth.npy,Python 数据文件,包含测试数据的相应输出的地面真值和
  • README.md.
    1 S# b+ b) U! h7 H& H1 s3 p* K- B

    1 R: O: U4 j7 S, f) R; s
这么多文件不要慌,模型训练后得到model.h5模型,才是我们需要的。
0 q/ ~/ p* a- U( |: D- k3 y
03 新建工程
1.  这里默认大家都已经安装好了STM32CubeMX软件。在STM32上验证神经网络模型(HAR人体活动识别),一般需要STM32F3/F4/L4/F7/L7系列高性能单片机,运行网络模型一般需要3MB以上的闪存空间,一般的单片机不支持这么大的空间。
! s! k+ W3 _2 z6 Y, F
CUBEMX提供了一个压缩率的选项,可以选择合适的压缩率,实际是压缩神经网络模型的权重系数,使得网络模型可以在单片机上运行,压缩率为8,使得模型缩小到366KB,验证可以通过;
: u: M  e0 k) v, e& s
/ k0 R% s8 G  [* V; S7 E4 [8 D, ~
+ L* n- t3 Y! }2 q0 q$ R  f9 Q& i
QHIKI%T1J8G22H[[PM93P%8.png

+ [2 f6 C5 ^6 P0 s
' T% E* {- E! A( x: m然后按照下面的步骤安装好CUBE.AI的扩展包& `% f+ v+ U  o% n: n8 a2 ~+ W
) j: H$ [7 H# v7 O& K
( s, w- _, D# m8 @, o* V+ p& }/ w
KC{XU%3GPIBKF%_}F}Q4)G5.png

- a; Y" ?) m5 H6 u8 q这个我安装了三个,安装最新版本的一个版本就可以。9 [0 Z. a# o# g: q; D' J

- G' R9 q  @1 ~
A7E`ZXWE2DG2_%B[~%_UG3B.png
2 d6 A% F, Q7 C; A% |' h: W- \

# H; k# D% H! L6 K! V接下来就是熟悉得新建工程了3 e" Z, q( j  i& X: s. q6 x7 b

* @! o; [- D/ o0 X7 @6 F
KX0VC~__G@{[)]MM6(BKRUT.png

' d. g5 ~( ?; e) {5 i! N
; l1 y& o, b2 ~. S+ f
因为安装了AI的包,所以在这个界面会出现artificial intelligence这个选项,点击Enable可以查看哪一些芯片支持AI
, y/ }3 u/ \" ^. O  r
( j  s9 k4 ^" _* d
L1}`TPQZ9HXKE7UJK8ER7CN.png

- r1 }6 D7 r$ c3 M
; `. K5 o( K" r0 t9 s# U接下来就是配置下载接口和外部晶振了。
4 {2 w, ~5 p8 m' ^5 H
58@M{Z3R1BBNKMGAVHSFA.png

) F6 J' L' N! t! L7 Z2 w3 L1 w- D% ^* y: w. K
`TNJH1~FRE[W5QLQ$RO]KRE.png
0 x' _$ ~/ h4 J; X, ~4 Z, r( s: |5 ?
1 N; ]9 s& F. I' z4 }1 N
然后记得要选择一个串口作为调试信息打印输出。
: [/ u. b  d4 m$ c0 U2 E0 M
& `0 p( g7 e. K$ S- W) N5 {0 R
6 @2 V0 f9 N7 I
2JFIBWO`0H5[M@ZHBNFM`)7.png
7 M  J# H' P) W$ o+ [

. }; ~, \- q, ~" L6 w. E选择Software Packs,进入后把AI相关的两个包点开,第一个打上勾,第一个选择Validation。
: v* O8 M2 g, m2 `0 F+ q5 N( t
%C_P`2HW{D1Z2I}}46}R]DC.png

! \2 d- \1 v" p% q0 m( X% y
7 h! e6 t# w7 u
2 d$ x% M2 P" P% E5 Y- S: q
  • System Performance工程:整个应用程序项目运行在STM32MCU上,可以准确测量NN推理结果,CP∪U负载和内存使用情况。使用串行终端监控结果(e.g.Tera Term)
  • Validation工程:完整的应用程序,在桌面PC和基于STM32 Arm Cortex-m的MCU嵌入式环境中,通过随机或用户测试数据,递增地验证NN返回的结果。与 X-CUBE-A验证工具一起使用。
  • Application Template工程:允许构建应用程序的空模板项目,包括多网络支持。
    2 o- s/ Z3 w  r0 |, M

    ) _' R: \& U) t5 M8 d) X
之后左边栏中的Software Packs点开,选择其中的X-CUBE-AI,弹出的Mode窗口中两个复选框都打勾,Configuration窗口中,点开network选项卡。
8 Z2 ~( n% o9 p3 u+ Q/ ?: }* a; T& R2 {7 H

5 P1 p2 b! [1 K5 X8 ?
OPIDCC]JV]EQP1`9_SDJT%O.png

3 F, v2 o% p% c
' e4 U2 j; R3 j0 V# P( O4 `9 d/ p3 g- T0 M( r0 f
选择刚刚配置的串口作为调试用。/ v4 M* a( F8 ]$ z% C
, H0 }( s8 }9 k( w/ x  F
8Z%KCQ6GWZQA]VLR[QTWHIL.png

# W6 `* f9 C2 k. L  j8 f& e8 c; s! }9 O, m! }
点击add network,选择上述下载好的model点h5模型,选择压缩倍数8;
$ B7 p5 x' w) ~' v1 U# H9 g8 a' k$ Y2 b7 S- x# _) O  H
$ n! q7 v" c7 q
A{5HR03{KUIML}~WH9K8212.png
, J8 ~) O+ U% s# P
( z, M* I' p: z: h
点击分析,可从中看到模型压缩前后的参数对比
! s0 A3 e- {; f( I  M6 `5 b" R8 U% r5 H
+ W" d- F5 T5 w
P}Q~0UPISV%Y36QQ]7R3(PX.png
+ `5 B' e3 T, {$ \

: I6 b7 q+ ]# q6 X  s& N- `
点击validation on desktop 在PC上进行模型验证,包括原模型与转换后模型的对比,下方也会现在验证的结果。
& c  Y! M' J5 Y% P
: q4 S  g% Q4 g8 u
P(]J6HLQ4MKOI922Q~3X(IO.png
' t2 n# j; S8 T0 [
, F* u0 |7 T9 l
致此,模型验证完成,下面开始模型部署( j1 R$ x1 C  o8 T2 Y
04 模型转换与部署
时钟配置,系统会自动进行时钟配置。按照你单片机的实际选型配置时钟就可以了。
* K% K- N! H4 F1 i0 L0 d1 l- H1 r  a* r' N; r

6 r0 t4 {+ y/ J3 j- B* g
9ZPCZU{6V)EOZ2{)CR{VN%J.png

0 b: F% }# t" J1 _  x; @% ]* T: U  M0 }9 F
U(B~YS)B7BPIB`SZEHUC`6O.png

+ V% V2 r6 O, U  s: H1 M5 p; r, K' c: x% }+ x# ?& l3 w; c
ZQ8J7AD8HK4RYENM_9WQ2KC.png

" _  f" E5 f( H/ z) G7 J3 C6 i# ^最后点击GENERATE CODE生成工程。) R! {! w2 ?+ M2 n& S4 Y/ d$ Y+ \

2 M. |) K" }, o$ @! }

! A3 A  B$ S1 c
EZOU]221[5%)R[G7SUUH))Y.png

6 D0 x! a3 z$ C) P  r% T* N) ^9 g2 N" l6 O
. H8 m6 l0 [: V  {- k% q( u
然后在MDK中编译链接。
, S7 f" i- p) N6 M& S% [7 R/ G2 B0 y7 G2 v2 }- j

2 ?4 Q( S/ y/ D4 S6 {
W3700ZF`6QNZG3USI`_[JBJ.png
1 w! l% K: |" U& i8 d$ i: ]  L
选择好下载器后就可以下载代码了。( h% \+ u6 S; @9 k- a: R

; U' n; k' `& l& j: b
9 [( E: v) Q( N. z7 l3 X, s
PQ6BJ)F55}W8E@~IW4LX{`5.png
1 _5 f2 x8 y9 K5 c5 s

, L6 B" ^* r" H0 _/ X+ n
D$F~HF8C76XF%O@RK4[ZA{F.png
  v' H2 V* U6 Y9 ]

% d' l; y2 Y5 @6 ~. N6 i0 P
+ R1 S+ z3 m( }: B7 b, F) ]: ^* x
& @6 d4 v. P% U2 r
然后打开串口调试助手就可以看到一系列的打印信息了。$ f- O8 K  W- t# n# x/ V, W
/ L/ n5 |; O8 a4 x8 }( M* P
$ d' U$ `9 c7 g7 C
T9OVQU]NLJ7)7S`W}37KLP6.png

  Q9 I4 g3 {# s, W1 V# {% O( D9 w& {6 w$ d- `
6 [) }4 O% A5 _& |7 r% ?% p
代码烧写在芯片里后,回到CubeMX中下图所示位置,我们点击Validate on target,在板上运行验证程序,效果如下图,可以工作,证明模型成功部署在MCU中。: q* x* A- p, O6 E

* @3 f) b4 V! q+ m5 T
8)G0H)`65L1@UO)E`{}$F.png

7 h7 \6 h, F0 F0 V& k
0 m4 x5 Z! P8 t, T/ l% [" \9 m' e

9 [# f6 K. q' z7 x( ^
4)(Q2`~A]]I%4(~@A[~1%XM.png

% [$ B7 k3 P) X
' y: B# D* n0 _1 U$ H& A

! m! S" M5 `$ A! r这次就这样先跑一下官方的例程,以后再研究一下,跑跑自己的模型。! r/ y; V% \. z) k

' I& a2 A8 {+ U5 y; t& Y7 d
收藏 评论0 发布时间:2022-1-5 21:11

举报

0个回答

所属标签

相似分享

官网相关资源

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