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

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

[复制链接]
STMCU小助手 发布时间:2022-1-5 21:11
01 前言
为什么可以在STM32上面跑神经网络?简而言之就是使用STM32CubeMX中的X-Cube-AI扩展包将当前比较热门的AI框架进行C代码的转化,以支持在嵌入式设备上使用。
, w7 b, `+ }4 U2 i% R目前使用X-Cube-AI需要在STM32CubeMX版本5.0以上,支持转化的模型有Keras、TFlite、ONNX、Lasagne、Caffe、ConvNetJS。
* {4 Y! l$ E0 VCube-AI把模型转化为一堆数组,而后将这些数组内容解析成模型,和Tensorflow里的模型转数组后使用原理是一样的。) g  \2 V6 @/ c) ?& \+ C" C3 @
一、环境安装和配置
  • STM32CubeMX
  • MDK/IAR/STM32CubeIDE
  • F4/H7/MP157开发板
    - {2 }0 E* e5 Y& g1 O) n. r  p8 F% W& _5 a% E5 I) o" U2 L9 q8 p
    % X' W5 x% s1 q2 Z  Z
02 AI神经网络模型搭建
这里使用官方提供的模型进行测试,用keras框架训练:
1 v8 n7 U2 G$ f
  ]  L) @, N9 Y: {

3 O- M2 j: n- Z7 U! Z/ h  b* v
J7)_F]}QX`@W2`[U4WB2%QV.png

/ r$ i7 P# U) M1 T) h2 ?( B' ?; k! W
2.1 模型介绍
( h$ a( _' H  o在Keras中使用CNN进行人类活动识别:此存储库包含小型项目的代码。该项目的目的是创建一个简单的基于卷积神经网络(CNN)的人类活动识别(HAR)系统。该系统使用来自3D加速度计的传感器数据,并识别用户的活动。
% b+ F+ {+ a" z) g( w
例如:前进或后退。HAR意为Human Activity Recognition(HAR)system,即人类行为识别。
% c/ g- a) {1 X  I8 r% @这个模型是根据人一段时间内的3D加速度数据,来判断人当前的行为,比如走路,跑步,上楼,下楼等,很符合Cortex-M系列MCU的应用场景。使用的数据如下图所示。

- w0 Y. X" x& a4 `5 T- I5 l
O@6JNO(_4Y5FSL29N62IG.png

/ f2 u+ |$ f5 @8 G' i" D$ d8 h8 o5 G5 {' F' _3 [
存储库包含以下文件
% I8 w8 h" X- X/ F/ ?
  • 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.* L0 _: B5 U: l* y% v8 J2 ^

    1 w4 Z/ y3 f& B. }, d
这么多文件不要慌,模型训练后得到model.h5模型,才是我们需要的。5 [( Z+ g% I+ z+ a* }
03 新建工程
1.  这里默认大家都已经安装好了STM32CubeMX软件。在STM32上验证神经网络模型(HAR人体活动识别),一般需要STM32F3/F4/L4/F7/L7系列高性能单片机,运行网络模型一般需要3MB以上的闪存空间,一般的单片机不支持这么大的空间。
6 D# F( w. p/ m7 G/ ]. P* L% {
CUBEMX提供了一个压缩率的选项,可以选择合适的压缩率,实际是压缩神经网络模型的权重系数,使得网络模型可以在单片机上运行,压缩率为8,使得模型缩小到366KB,验证可以通过;
* `5 D% r: }0 M8 p5 s
  G3 w% y, \) n0 Y2 u: h

* |% ?# t+ t+ X$ a9 I9 J1 _" U" Q
QHIKI%T1J8G22H[[PM93P%8.png

+ x" W* y& S" `% C  Z7 e
5 X9 M  D. U' w5 T' c然后按照下面的步骤安装好CUBE.AI的扩展包' A0 [% @' o1 o) Z

" v: i/ ^" @) M$ c- O, ~, Z" D
/ `# X6 T! H/ N& Y% b3 d$ @7 b, J
KC{XU%3GPIBKF%_}F}Q4)G5.png
1 F! z5 X6 J- H+ I* E7 G$ Z
这个我安装了三个,安装最新版本的一个版本就可以。
1 V0 P7 `. y# @# l6 u9 [
: U' q0 W  v. M+ _+ v7 \$ e7 |1 t
A7E`ZXWE2DG2_%B[~%_UG3B.png
5 |! D1 `/ e& }1 Y

5 U+ p; d/ Q* {接下来就是熟悉得新建工程了
( O$ |# h1 }) y2 g& N( q+ O8 E+ C
% r# i$ l/ ?+ [$ N; i# V- M
KX0VC~__G@{[)]MM6(BKRUT.png
( {: p6 A, w9 M# Q

& m2 K/ E6 p; d" O. t5 I% ~  ~1 Q
因为安装了AI的包,所以在这个界面会出现artificial intelligence这个选项,点击Enable可以查看哪一些芯片支持AI
* T6 T8 q8 W/ Q3 d2 N
9 c1 P! K" r. q9 M" J$ a. x
L1}`TPQZ9HXKE7UJK8ER7CN.png
$ f3 i5 O4 E: c$ c, k
6 S# i2 P6 ^/ ]* i( y
接下来就是配置下载接口和外部晶振了。
* E0 \* |2 k/ J1 g; R' k
58@M{Z3R1BBNKMGAVHSFA.png
/ ?! D9 ~2 x& q- K5 y- N

5 E  t- f- Y' u4 H- w9 a3 \4 d
`TNJH1~FRE[W5QLQ$RO]KRE.png
. H/ k; z# w4 n' V# w

0 i( e9 o- i6 z( `% I) t0 t然后记得要选择一个串口作为调试信息打印输出。+ `2 `7 u4 D4 Y  i& C
. H% ~! ]& d3 L4 U6 @3 k% o
7 ^* t+ w( T) ^2 \  E- E6 \
2JFIBWO`0H5[M@ZHBNFM`)7.png

+ \: w8 Q1 F# V2 @: T7 R) u1 h
, [- \5 E  I& S, @% w# i3 j选择Software Packs,进入后把AI相关的两个包点开,第一个打上勾,第一个选择Validation。
! Y' F& ?2 B9 B% {$ Q4 O
%C_P`2HW{D1Z2I}}46}R]DC.png
7 K' V! ~/ x1 b

4 Y4 @" }/ x& r! S

  L/ t' `: Q+ |0 s( B' s
  • System Performance工程:整个应用程序项目运行在STM32MCU上,可以准确测量NN推理结果,CP∪U负载和内存使用情况。使用串行终端监控结果(e.g.Tera Term)
  • Validation工程:完整的应用程序,在桌面PC和基于STM32 Arm Cortex-m的MCU嵌入式环境中,通过随机或用户测试数据,递增地验证NN返回的结果。与 X-CUBE-A验证工具一起使用。
  • Application Template工程:允许构建应用程序的空模板项目,包括多网络支持。' S  c. w9 \+ M: h. u  g( e0 Y! H. u

    : c* v3 Q1 O  ?; S
之后左边栏中的Software Packs点开,选择其中的X-CUBE-AI,弹出的Mode窗口中两个复选框都打勾,Configuration窗口中,点开network选项卡。
+ M2 E0 y- e( l; P' W4 p+ Q) u* K+ t( l( p5 E
, b( M" `0 W: v2 m
OPIDCC]JV]EQP1`9_SDJT%O.png
) q1 b; |4 R4 n; ?  i- P

+ U6 X6 y8 z2 F- s0 E& E3 O  v. c8 {) W7 R" b
选择刚刚配置的串口作为调试用。
0 `, x. V1 `# k6 x8 S4 Y
3 R4 L& h$ F; d! H- |
8Z%KCQ6GWZQA]VLR[QTWHIL.png
6 D, P: e9 w2 J
- z: R/ Y9 Y) x
点击add network,选择上述下载好的model点h5模型,选择压缩倍数8;$ q( a: Q! @( c9 [: i
% ~8 @/ S* r& v- W2 A0 i
) f* j# ~% O$ \$ q, X( H
A{5HR03{KUIML}~WH9K8212.png

5 t7 U1 K5 L6 e
  Q2 }) ^1 b! B3 R% i9 i0 o点击分析,可从中看到模型压缩前后的参数对比, ~; A  p3 U& R+ l: M0 I; k

- B* ]3 Q& H1 [% R4 I  [5 s( g( n
* j* ~  q* E0 Y6 k  U6 a
P}Q~0UPISV%Y36QQ]7R3(PX.png
, T1 O/ U) `2 E  m

! M, n* u* q: w4 e# |/ P5 _
点击validation on desktop 在PC上进行模型验证,包括原模型与转换后模型的对比,下方也会现在验证的结果。
+ B2 D- b) I" T; V9 q

1 ?% \% V2 ]/ I! ^
P(]J6HLQ4MKOI922Q~3X(IO.png

7 j$ y( G2 l9 c' i8 \6 l8 w
2 C# v) i' O5 `! O致此,模型验证完成,下面开始模型部署
/ i# P% M; [/ G' g
04 模型转换与部署
时钟配置,系统会自动进行时钟配置。按照你单片机的实际选型配置时钟就可以了。
% _4 F- u" c4 y+ A4 Y8 ]9 q
9 e4 n( e+ x1 _  K

( u- G0 k( _( m
9ZPCZU{6V)EOZ2{)CR{VN%J.png
& Q( B: Q6 p( H- @

+ k/ f6 q- E1 A
U(B~YS)B7BPIB`SZEHUC`6O.png

" e1 Q" w' S+ `, N& v  t, h* ^$ I4 |5 |3 u# t. {  o  ^" ~, ~
ZQ8J7AD8HK4RYENM_9WQ2KC.png
9 N, ]( g: H* H6 @! S2 l2 c. y# t; J
最后点击GENERATE CODE生成工程。1 ]$ V! j& B3 ]0 y; U8 t
* g% T# d- b3 v
5 n1 \( C1 j: F2 L4 P
EZOU]221[5%)R[G7SUUH))Y.png

# f2 v% K' a' D0 m: K
) `" ~) J9 p: R

$ G9 Q/ v$ m& B; F6 P然后在MDK中编译链接。
. s$ Z3 \0 c+ ^
0 }' R7 E; b& R, D! I

) y: j( G0 x3 o' E; Q( T- v$ \
W3700ZF`6QNZG3USI`_[JBJ.png
) |& M6 A. ~, V8 K. s% `' r% _
选择好下载器后就可以下载代码了。5 J  Z2 a; @' U8 B! G/ r
* z- V& p- I4 j' Q; y

& K, X( _* f3 J  B  W. u: d2 j2 a
PQ6BJ)F55}W8E@~IW4LX{`5.png

2 S- {; r, P# h& I. B; l' v" k; V$ k# @' x* C0 M2 M; s' ~- E
D$F~HF8C76XF%O@RK4[ZA{F.png

! Z, Y. z4 f& C0 C! I) y" i1 L: y4 i) f" n- s- B

: a/ J# ~8 d# ~  Q8 n% |
3 e/ r9 @# ^* A$ p$ ~7 E) f. I8 C
然后打开串口调试助手就可以看到一系列的打印信息了。  i9 g  R0 Z) _$ z- C- q9 I4 U: I
( |5 V& U3 f) d% n3 y: a+ M

8 S# q9 y+ l: Q9 d5 r" R
T9OVQU]NLJ7)7S`W}37KLP6.png

1 h! e5 k6 t8 r6 C/ @5 X
, |& u4 d8 U( a: D2 l+ ?" v

7 A; z( M$ q# _" Q0 b: K代码烧写在芯片里后,回到CubeMX中下图所示位置,我们点击Validate on target,在板上运行验证程序,效果如下图,可以工作,证明模型成功部署在MCU中。2 |- a+ J* ]5 X
& o% |7 X2 _8 t) P, w. V9 E6 q
8)G0H)`65L1@UO)E`{}$F.png
) I4 e; r; |& ], c$ q- j1 K+ ], |8 Y

; Y6 f. P& g3 U/ c. g

, Q, h9 H0 R! c- Y
4)(Q2`~A]]I%4(~@A[~1%XM.png
+ C4 ?; l% m# [* [: {

! w% @" R$ u: H4 @, B' }5 M
4 }# [3 G; [  B# b; J
这次就这样先跑一下官方的例程,以后再研究一下,跑跑自己的模型。# F9 Y4 u- K6 u0 n/ j
' c- \+ l7 {" Y  A) e0 P% }
赞 收藏 评论0 发布时间:2022-1-5 21:11

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版