
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。 Cube-AI把模型转化为一堆数组,而后将这些数组内容解析成模型,和Tensorflow里的模型转数组后使用原理是一样的。 一、环境安装和配置
02 AI神经网络模型搭建 这里使用官方提供的模型进行测试,用keras框架训练:- {3 T5 u4 h- Q: V. | @ ![]() 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,即人类行为识别。 这个模型是根据人一段时间内的3D加速度数据,来判断人当前的行为,比如走路,跑步,上楼,下楼等,很符合Cortex-M系列MCU的应用场景。使用的数据如下图所示。7 |+ D4 [; B" p' x6 I W ![]() 存储库包含以下文件
03 新建工程 1. 这里默认大家都已经安装好了STM32CubeMX软件。在STM32上验证神经网络模型(HAR人体活动识别),一般需要STM32F3/F4/L4/F7/L7系列高性能单片机,运行网络模型一般需要3MB以上的闪存空间,一般的单片机不支持这么大的空间。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![]() 然后按照下面的步骤安装好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 ![]() 这个我安装了三个,安装最新版本的一个版本就可以。9 [0 Z. a# o# g: q; D' J ![]() 接下来就是熟悉得新建工程了3 e" Z, q( j i& X: s. q6 x7 b ![]() 因为安装了AI的包,所以在这个界面会出现artificial intelligence这个选项,点击Enable可以查看哪一些芯片支持AI , y/ }3 u/ \" ^. O r( j s9 k4 ^" _* d ![]() 接下来就是配置下载接口和外部晶振了。 ![]() 7 Z2 w3 L1 w- D% ^* y: w. K ![]() 1 N; ]9 s& F. I' z4 }1 N 然后记得要选择一个串口作为调试信息打印输出。 6 @2 V0 f9 N7 I ![]() 选择Software Packs,进入后把AI相关的两个包点开,第一个打上勾,第一个选择Validation。 ![]() 7 h! e6 t# w7 u 2 d$ x% M2 P" P% E5 Y- S: q
+ Q/ ?: }* a; T& R2 {7 H ![]() ( O4 `9 d/ p3 g- T0 M( r0 f 选择刚刚配置的串口作为调试用。/ v4 M* a( F8 ]$ z% C , H0 }( s8 }9 k( w/ x F ![]() j8 f& e8 c; s! }9 O, m! } 点击add network,选择上述下载好的model点h5模型,选择压缩倍数8; ' k$ Y2 b7 S- x# _) O H $ n! q7 v" c7 q ![]() ( z, M* I' p: z: h 点击分析,可从中看到模型压缩前后的参数对比 M6 `5 b" R8 U% r5 H + W" d- F5 T5 w ![]() 点击validation on desktop 在PC上进行模型验证,包括原模型与转换后模型的对比,下方也会现在验证的结果。 & c Y! M' J5 Y% P: q4 S g% Q4 g8 u ![]() , F* u0 |7 T9 l 致此,模型验证完成,下面开始模型部署( j1 R$ x1 C o8 T2 Y 04 模型转换与部署 时钟配置,系统会自动进行时钟配置。按照你单片机的实际选型配置时钟就可以了。0 L0 d1 l- H1 r a* r' N; r ![]() % ]* T: U M0 }9 F ![]() ' c: x% }+ x# ?& l3 w; c ![]() 最后点击GENERATE CODE生成工程。) R! {! w2 ?+ M2 n& S4 Y/ d$ Y+ \ ![]() % T* N) ^9 g2 N" l6 O . H8 m6 l0 [: V {- k% q( u 然后在MDK中编译链接。 % [7 R/ G2 B0 y7 G2 v2 }- j ![]() 选择好下载器后就可以下载代码了。( h% \+ u6 S; @9 k- a: R 9 [( E: v) Q( N. z7 l3 X, s ![]() ![]() & @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 ![]() % O( D9 w& {6 w$ d- ` 6 [) }4 O% A5 _& |7 r% ?% p 代码烧写在芯片里后,回到CubeMX中下图所示位置,我们点击Validate on target,在板上运行验证程序,效果如下图,可以工作,证明模型成功部署在MCU中。: q* x* A- p, O6 E ![]() ![]() 这次就这样先跑一下官方的例程,以后再研究一下,跑跑自己的模型。! r/ y; V% \. z) k |