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

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

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

* }) s: A$ w' r$ Y
嵌入式关联 AI

+ J) [+ a3 f9 c" ^) R/ @8 p
AI落地一直是一个很红火的前景和朝阳行业。我的好奇心也比较旺盛,所以关于任何嵌入式和 AI 相关的都是想尝一尝。本系列文章将带你一步一步把 AI 模型部署在嵌入式平台,移植到 RT-Thread 操作系统上,实现你从菜鸟到起飞的第一步甚至第 n 步!

6 M# i! ?4 Y. u7 S/ S
开发环境:
后续开发过程将基于 STM32H743ZI-Nucleo 开发板,并且使用 STM32CubeMX.AI 工具。它可以基于训练好的 AI Model (仅限 Keras/TF-Lite),自动生成嵌入式项目工程(包括但是不局限于 MDK、STM32CubeIDE 等)。该工具易于上手,适合嵌入式 AI 入门开发。
STM32CubeMX 是 ST 公司推出的一种自动创建单片机工程及初始化代码的工具,适用于旗下所有 STM32 系列产品,现在其 AI 组件可以提供 AI 模型到嵌入式 C 代码的转换功能。

9 m( S- K, D, x/ _' O
1. 准备工作

2 H0 Z+ I3 A9 F* A2 e) k& ?! N
1.1 安装开发环境
笔者用的操作系统是 Ubuntu 18.04。本次实验要用到如下开发工具,软件的安装过程很简单,网上都有很成熟的教程,在此不再赘述。该篇教程同样适用于 Windows 环境,实验步骤完全相同。
STM32CubeMx
STM32CubeIDE
STM32CubeProgrammer
1# Oracle 官网中下载 JavaSE JDK 压缩包+ o" H& q( ]6 h& X
2$ sudo tar zxvf jdk-8u172-linux-x64.tar.gz -C /usr/lib/jvm
0 s3 P& P- @! M3# 将下载的JDK注册到系统中
! ?0 ^) W. S  y$ f4$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_172/bin/java 300
" D9 e' k  ]& u$ o5# 切换JDK
# w- k2 @8 K" o1 N  }; f% H6$ sudo update-alternatives --config java' B* Q# w5 s& b0 n
7# 查看JDK 版本8 ]2 B. a: L6 ?3 u' Z
8$ java -version

# [- t; y& S4 [* k& d# f
22.png
1.2 在 PC 端搭建极简神经网络
首先将如下开源仓库克隆到本地:

+ [- x7 D8 L  }9 h3 ~  Z: }) p
33.png

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

6 a) P( w5 i8 ]* H4 F4 w
其中,在模型搭建的时候,重新温习了一下,有三种方式(各个方式的优缺点已经放在参考文章当中,感兴趣的同学自行查阅):
· Sequence
· 函数式 API
· 子类
后面将 AI 模型导入到 CubeMx的过程中,如果使用后两种方式生成的网络模型,将会遇到如下报错:
1INVALID MODEL: Couldn't load Keras model /home/lebhoryi/RT-Thread/Edge_AI/Project1/keras_model.h5, + H6 f7 Y. U6 r
2error: Unknown layer: Functional
8 Y! S0 @# h7 f% T6 {, M
暂时的解决方式是采用Sequence 方式搭建神经网络,训练好的 AI Model 会被保存为 Keras 格式,后缀为 .h5,例如 keras_model.h5。
示例模型我已经保存好了,大家可以直接下载该模型进行实验,下载地址如下:

# p) U7 _) ]- P: d. A
本次示例所训练的神经网络模型结构如下:
* Z& m/ a2 P; [: R1 D$ }0 \% i
44.png

7 s6 D7 s  d+ ~: P3 ]2 z
2. 使用 CubeMX AI 生成工程
在 CubeMX 中选择STM32H743ZI Nucleo 开发板,这里其实不限制开发板型号,常见的

* v; d! N* f; a3 D
2.1 打开 CubeMX
6 Z' P. A$ C: l" s) c) M- Q6 R( A7 {
55.png

1 D8 P) N9 @) e
2.2 安装 CUBE-AI 软件包
打开菜单栏中的 Help,选择Embedded Software Packages Manager,然后在STMicroelectronics 一栏中选择 X-CUBE-AI 插件的最新版本,安装好之后点击右下角的 Close。
在工程中导入 X-CUBE-AI 插件:
4 |( |: |) f; M$ l6 I
66.png
0 s# \3 F* C* O! ^$ s3 [# V
会出现如下界面:

9 L& R( B2 s: Y
77.png

$ @$ _, k; [; R+ t# t
接下来选择用于通信的串口,这里选择串口 3,因为该串口被用于 STlink 的虚拟串口。
1 g+ p+ f. S7 n/ ?6 `3 E3 w' c
88.png

8 s( p8 O4 @* g( }
2.3 导入 AI 模型到工程中

0 ?# u% n6 V) T1 o6 o% e
99.png

1 ?: Y4 ?" E. l4 ?2 d7 Y( J. L
将 AI 模型烧录到开发板前,需要先分析 Model,检查其是否可以被正常转换为嵌入式工程,本次实验使用的模型比较简单,分析起来也也比较快,结果如下所示:

: X* j" g, p4 G
10.png
3 V7 m) [9 G6 s* Z) q7 |) v
接下来我们要在开发板上验证转换后的嵌入式工程,在这个过程中 CubeMX AI 工具会根据你导入的 AI 模型,自动生成嵌入式工程,并且将编译后的可执行文件烧录到开发板中,并通过STlink 的虚拟串口验证运行的结果。我的系统是 Ubuntu,不支持 MDK,所以在这里选择自动生成 STM32CubeIDE 工程。
0 p5 T6 o! U: I2 _2 d4 [" g4 X
111.png

: H  O. S3 _4 X  v+ x% S9 O
验证成功界面如下所示:
. f5 @( _, A" M( `( {- E, ?
222.png
; j6 C! a% f5 M7 T  L
2.4 生成项目工程
上一步我们只是进行了项目结果的验证,但是并没有生成项目源代码,接下来我们将生成项目工程,如下图所示:
% }4 o! Z. G6 U+ d
333.png

# ]/ ?- h) }9 V. Z
生成后的 Project 文件夹树如下所示:
1(base) #( 07/03/20@10:51上午 )( lebhoryi@RT-AI ):~/RT-Thread/Edge_AI@master✗✗✗" ~% F& c+ j/ {4 U3 A# k
2   tree -L 2 ./Project1 : F/ |4 E$ K; k3 \4 R
3./Project10 ?4 i. {. J8 @% ^
4├── DNN  # CubeMX 生成工程路径
" V4 N: s; v0 K& N2 F 5│   ├── DNN.ioc  # CubeMX 类型文件
2 ]& ]4 f: A" W0 c! {' f 6│   ├── Drivers, E$ o/ ?8 u# A; z( v
7│   ├── Inc
$ s4 v/ O: c9 }6 w 8│   ├── Middlewares
0 H1 U6 h) v1 O0 q$ B9 \ 9│   ├── network_generate_report.txt
9 Y9 n: j$ i) t" `9 y. |10│   ├── Src
8 i% }, l/ ^, `11│   ├── Startup6 a& E0 R/ g. j
12│   ├── STM32CubeIDE1 n3 [7 H; o; \4 d
13│   ├── STM32H743ZITX_FLASH.ld. N! v, o- x* g) y1 R; f! @, t1 t
14│   └── STM32H743ZITX_RAM.ld
+ r. m$ D- b# q; P( ?- G4 r9 h# ^15├── image  # 相关图片保存文件夹
; f0 j' T; @- j16│   ├── mymodel1.png   # model
. H! W6 d- ?# U3 t" a+ c17│   └── STM32H743.jpg  # H743
1 O6 }4 H: A& B18├── model  # model 保存路径
: C/ ]1 `. t* i$ j$ p- R! B19│   └── keras_model.h5- d0 u2 w* l6 u9 ~! J/ a# M8 x9 U
20├── Readme.md$ ]9 t' ]1 z/ R# g  M3 ?5 M
21├── tf2_linear_regression.ipynb0 g; \6 v6 r, i
22└── tf2_线性回归_扩展.ipynb

+ |9 g0 k* _# F* y" X
至此,神功练成了一大半,剩下的就是代码调试的工作了。

; }2 q5 Y% L& @
3. 代码调试

2 C% q9 j1 D4 y# b- l$ h6 w+ c
关于 STM32CubeIDE 的初步认识:基础说明与开发流程:http://blog.csdn.net/Naisu_kun/article/details/95935283
% C' ]7 E0 {& T6 X" a! B
3.1 导入工程
选择 File 选项 -->import:
. C2 ^2 n4 x' n! z- l- i8 j
444.png
" o, d; I- w' E" f: {: X
选择先前导出工程的路径:

- F0 b; y4 p0 Y6 `, c+ _7 a
555.png

$ _. V, u: u8 L; o4 }0 ^/ M
导入成功的界面如下所示:
% R( |; p6 F9 h/ m4 X
666.png

+ `1 x: L( m1 d: F
接下来就可以使用 STM32Cube IDE 来调试生成的工程了。

! L9 m1 a) F9 B9 S2 A( @+ E
3.2 生成 bin 文件
在编译的过程中还会自动生成相应的 bin 文件,后续可以通过 stm32cubeProgramer 工具将 bin 文件烧录到开发板中。

5 r- V4 ]2 Q3 A$ G. j& |
777.png

" U$ _- |  T2 w
3.3 烧录 .bin 文件
打开STM32CubeProgramming,点击右上角connect,然后选择Open file,选择要打开的.bin 文件。
: U. D! |, C/ f7 S* W# e
888.png
$ p) i. w5 k6 b5 [' m" J& q. p
烧录成功的界面:

  T) A. u  d4 s7 m: Z! k
999.png
, z# W5 |" K0 t8 w8 I/ R
3.4 Other
在 ubuntu 系统中我们可以使用串口工具cutecom 来查看最终程序的运行结果,程序运行结果如下:
在使用 cutecom 连接串口前,记得断开 STM32Programer 和开发板的连接,否则会出现串口打开错误的情况。

7 \- [& o0 X. l# F& W" B( K
1111.png
0 o) ~' V6 n9 x( Y
可以看到我们的 AI 模型已经在开发板上欢快地跑了起来 ,奥里给!!!

  x$ ?& Y( C) z
4. 参考文章

$ L" p4 K, u; w% J% n5 W) N$ o
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版