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

【嵌入式AI入门日记】将 AI 模型移植到 RT-Thread 上

[复制链接]
STMCU-管管 发布时间:2020-8-12 13:53
【嵌入式AI入门日记】将 AI 模型移植到 RT-Thread 上
& [7 P8 h+ [( g* o
以下文章来源于RTThread物联网操作系统 ,作者lebhoryi&summer
11.png
“本期我们分享的主题是如何将 AI 模型部署到嵌入式系统中。”

) f1 ]/ T: Q; a7 V" k' B- Y
嵌入式关联 AI

6 y- h: `1 q7 q  c
AI落地一直是一个很红火的前景和朝阳行业。我的好奇心也比较旺盛,所以关于任何嵌入式和 AI 相关的都是想尝一尝。本系列文章将带你一步一步把 AI 模型部署在嵌入式平台,移植到 RT-Thread 操作系统上,实现你从菜鸟到起飞的第一步甚至第 n 步!

  A$ i: [6 ?! F- c8 O1 v
开发环境:
后续开发过程将基于 STM32H743ZI-Nucleo 开发板,并且使用 STM32CubeMX.AI 工具。它可以基于训练好的 AI Model (仅限 Keras/TF-Lite),自动生成嵌入式项目工程(包括但是不局限于 MDK、STM32CubeIDE 等)。该工具易于上手,适合嵌入式 AI 入门开发。
STM32CubeMX 是 ST 公司推出的一种自动创建单片机工程及初始化代码的工具,适用于旗下所有 STM32 系列产品,现在其 AI 组件可以提供 AI 模型到嵌入式 C 代码的转换功能。
9 x- Z, c; s( R1 l; w0 x. D4 {" r2 B
1. 准备工作

8 [; C6 V% V3 M/ M  {; V9 v8 ^
1.1 安装开发环境
笔者用的操作系统是 Ubuntu 18.04。本次实验要用到如下开发工具,软件的安装过程很简单,网上都有很成熟的教程,在此不再赘述。该篇教程同样适用于 Windows 环境,实验步骤完全相同。
STM32CubeMx
STM32CubeIDE
STM32CubeProgrammer
1# Oracle 官网中下载 JavaSE JDK 压缩包
7 t) y5 k# D* S' z9 v4 b2$ sudo tar zxvf jdk-8u172-linux-x64.tar.gz -C /usr/lib/jvm" Q4 x. I1 C' V3 Z. a+ A
3# 将下载的JDK注册到系统中0 \- Q3 [  ?8 C, g8 O6 \1 ?9 A
4$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_172/bin/java 300
1 }& \7 T: L5 a4 [& P% F% W5# 切换JDK
# S3 g! N4 M4 ?& ?6$ sudo update-alternatives --config java
' \0 C3 E/ q& E; }6 V6 N  j7# 查看JDK 版本- ?- I$ e# E" p4 B! \
8$ java -version

1 m% n; w5 n% M3 x5 F
22.png
1.2 在 PC 端搭建极简神经网络
首先将如下开源仓库克隆到本地:
  M& E; U: v  B3 A' J) g
33.png

0 |' `4 r* |* Z5 \
在本次实验中我选择了最简单的一个线性回归( Linear Regression)Tensor Flow2 Demo 作为示例,模型相关源文件说明如下:
· tf2_linear_regression.ipynb 内含三种不同方式搭建网络结构
· tf2_线性回归_扩展.ipynb 内含不同方式训练模型

/ o. @" `% i) ?* I- S
其中,在模型搭建的时候,重新温习了一下,有三种方式(各个方式的优缺点已经放在参考文章当中,感兴趣的同学自行查阅):
· Sequence
· 函数式 API
· 子类
后面将 AI 模型导入到 CubeMx的过程中,如果使用后两种方式生成的网络模型,将会遇到如下报错:
1INVALID MODEL: Couldn't load Keras model /home/lebhoryi/RT-Thread/Edge_AI/Project1/keras_model.h5, 3 b% d$ T/ v# Z, E
2error: Unknown layer: Functional
+ }) i* N+ e4 r$ T# @
暂时的解决方式是采用Sequence 方式搭建神经网络,训练好的 AI Model 会被保存为 Keras 格式,后缀为 .h5,例如 keras_model.h5。
示例模型我已经保存好了,大家可以直接下载该模型进行实验,下载地址如下:
3 L- @- U: J2 y8 d: v
本次示例所训练的神经网络模型结构如下:
0 ^7 F2 K) Q8 Q1 _
44.png
! b+ b+ H' \: N- x
2. 使用 CubeMX AI 生成工程
在 CubeMX 中选择STM32H743ZI Nucleo 开发板,这里其实不限制开发板型号,常见的
+ \* }5 ^4 H% w" a
2.1 打开 CubeMX

( x) |! J* Q. ^, y& u0 ?- f, f! w
55.png
; J+ r! A' j4 F4 E
2.2 安装 CUBE-AI 软件包
打开菜单栏中的 Help,选择Embedded Software Packages Manager,然后在STMicroelectronics 一栏中选择 X-CUBE-AI 插件的最新版本,安装好之后点击右下角的 Close。
在工程中导入 X-CUBE-AI 插件:

8 `4 S3 @; R8 B4 d
66.png

8 _8 F- t& y7 j& b2 y& U! z0 B
会出现如下界面:
4 Q$ q& S5 U& w( c" F  h9 @
77.png

$ N6 Q2 s9 L. ]2 B
接下来选择用于通信的串口,这里选择串口 3,因为该串口被用于 STlink 的虚拟串口。
( ^4 o) W" H- b! w
88.png

( S/ g( n. r9 n1 l' @/ X
2.3 导入 AI 模型到工程中

2 u9 l" O5 _- r, k
99.png

5 ?; @/ q1 `3 K8 E0 a! b
将 AI 模型烧录到开发板前,需要先分析 Model,检查其是否可以被正常转换为嵌入式工程,本次实验使用的模型比较简单,分析起来也也比较快,结果如下所示:
) v1 \5 A* r4 ~% u$ G/ G- G
10.png

( _% g) X1 P3 N1 J
接下来我们要在开发板上验证转换后的嵌入式工程,在这个过程中 CubeMX AI 工具会根据你导入的 AI 模型,自动生成嵌入式工程,并且将编译后的可执行文件烧录到开发板中,并通过STlink 的虚拟串口验证运行的结果。我的系统是 Ubuntu,不支持 MDK,所以在这里选择自动生成 STM32CubeIDE 工程。

- i$ X* b* F( j- O  e0 C
111.png
3 a3 t4 p/ A) U
验证成功界面如下所示:

4 ]; N+ }+ _- j" K$ S
222.png
6 t' ?! D' b; _# d$ o' G. V9 m
2.4 生成项目工程
上一步我们只是进行了项目结果的验证,但是并没有生成项目源代码,接下来我们将生成项目工程,如下图所示:

, t# j" X* t, k# L$ ?( e
333.png
( ~: I1 ?3 B1 U
生成后的 Project 文件夹树如下所示:
1(base) #( 07/03/20@10:51上午 )( lebhoryi@RT-AI ):~/RT-Thread/Edge_AI@master✗✗✗
/ O0 t) \6 k8 |& O) o$ k 2   tree -L 2 ./Project1
% p8 p+ |3 y1 I9 w" Y$ q 3./Project1
, l3 V# l! i/ B! p9 b1 g; X 4├── DNN  # CubeMX 生成工程路径
+ g) }4 @& I+ [# d( K 5│   ├── DNN.ioc  # CubeMX 类型文件
6 x( Z: b% Y+ ^' Y! Q- G 6│   ├── Drivers- K6 f9 `, F1 s- u3 y
7│   ├── Inc* Z/ l2 x) J' n5 q
8│   ├── Middlewares0 e' g' F# _+ F, S
9│   ├── network_generate_report.txt& \7 }  o6 v: ], P( q8 g5 t( z
10│   ├── Src# T# ]: ?( [% [) F5 I" q$ v
11│   ├── Startup4 n9 a+ @$ I0 m& \" J2 s$ `9 e% M
12│   ├── STM32CubeIDE( n. a6 r! _, }+ K4 h* s
13│   ├── STM32H743ZITX_FLASH.ld4 H, z( p! s8 o" H. j8 h" i/ f
14│   └── STM32H743ZITX_RAM.ld
7 C1 u0 ^. p6 M* a) u! u2 t15├── image  # 相关图片保存文件夹4 {1 {: Q! D  |6 u9 _( S. E7 W0 o4 ]
16│   ├── mymodel1.png   # model
* m+ [9 D0 B9 M5 \7 q4 ~17│   └── STM32H743.jpg  # H743+ `) M8 e/ l8 O
18├── model  # model 保存路径
' V# E9 N) f) f1 N, w' X& u& f19│   └── keras_model.h5+ I, i7 j  l) p! l+ W( ?
20├── Readme.md
  z, C1 U  u$ H9 u. Q% G  D" N21├── tf2_linear_regression.ipynb1 A: J- g4 Z4 P2 n( J/ {
22└── tf2_线性回归_扩展.ipynb

* n5 o% D- f2 ?; [
至此,神功练成了一大半,剩下的就是代码调试的工作了。

; F. K! ]" o+ M& J
3. 代码调试

' }% [; _1 x/ e2 o4 L% k
关于 STM32CubeIDE 的初步认识:基础说明与开发流程:http://blog.csdn.net/Naisu_kun/article/details/95935283

! S  ^: r- H% n$ j* y& E- W1 m, N
3.1 导入工程
选择 File 选项 -->import:

- ]( Q9 C6 b2 f( K
444.png

- P/ h# n# p& m. }/ U/ `. U1 E
选择先前导出工程的路径:
0 n+ f8 s: u, P+ p- x5 a7 c
555.png

7 ?* R6 }& E$ c9 z) K
导入成功的界面如下所示:
6 O9 X. w0 E) t7 b/ Y7 t1 m" T
666.png
2 c. J3 y+ f0 ^1 E$ l7 R# I
接下来就可以使用 STM32Cube IDE 来调试生成的工程了。
' @* x! D, F+ q
3.2 生成 bin 文件
在编译的过程中还会自动生成相应的 bin 文件,后续可以通过 stm32cubeProgramer 工具将 bin 文件烧录到开发板中。
: ]9 I# P6 _, w/ o& Z  y# P
777.png

0 L6 R3 Y" w+ L1 r$ i* ?
3.3 烧录 .bin 文件
打开STM32CubeProgramming,点击右上角connect,然后选择Open file,选择要打开的.bin 文件。
( G, ^3 [6 y6 r( O. \+ p0 P
888.png

5 e0 W4 o: ?+ n( B' N
烧录成功的界面:
' Q$ ~  M( L" d/ d, t" B, D( i
999.png
& A0 g8 V9 l/ C: w. B/ }3 i
3.4 Other
在 ubuntu 系统中我们可以使用串口工具cutecom 来查看最终程序的运行结果,程序运行结果如下:
在使用 cutecom 连接串口前,记得断开 STM32Programer 和开发板的连接,否则会出现串口打开错误的情况。
# S  B) S+ N" ?. b% m' I$ n. a7 }; U
1111.png
; ~" v( T$ |9 a* N$ u% u
可以看到我们的 AI 模型已经在开发板上欢快地跑了起来 ,奥里给!!!
  z+ n: p" x' X) l2 j6 ~: ~& ]  p
4. 参考文章
$ f9 a2 o' y( E- ?. u. ^$ K
STM32CubeMX系列教程
Tensorflow 2.0 中模型构建的三种方式:

评分

参与人数 1 ST金币 +5 收起 理由
corez + 5 赞一个!

查看全部评分

1 收藏 2 评论5 发布时间:2020-8-12 13:53

举报

5个回答
李康1202 回答时间:2020-8-12 17:46:39
为什么图片这么模糊
corez 回答时间:2020-8-13 09:42:24
赞一个
w014017 回答时间:2020-8-15 19:33:58
学习学习
虎三可可 回答时间:2020-11-13 10:32:01
我想问一下,我打算把运行成功的AI程序移植到我其他的程序里,发现新移植好的程序陷入了汇编指令B,也就是死循环,程序是运行到ai_platform_network_create这个创建网络的函数死了,应该是无法执行到这个函数,请问这个是什么问题呢
sanyolt 回答时间:2020-12-6 09:57:56
还要看运算速度如何。

所属标签

相似分享

官网相关资源

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