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

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

[复制链接]
STMCU-管管 发布时间:2020-8-12 13:53
【嵌入式AI入门日记】将 AI 模型移植到 RT-Thread 上

4 L( F; ^9 I% E+ I
以下文章来源于RTThread物联网操作系统 ,作者lebhoryi&summer
11.png
“本期我们分享的主题是如何将 AI 模型部署到嵌入式系统中。”

* P+ Q: V4 X5 R5 ^7 O" K
嵌入式关联 AI
5 A( ^& ?8 ~- U: a4 F1 e
AI落地一直是一个很红火的前景和朝阳行业。我的好奇心也比较旺盛,所以关于任何嵌入式和 AI 相关的都是想尝一尝。本系列文章将带你一步一步把 AI 模型部署在嵌入式平台,移植到 RT-Thread 操作系统上,实现你从菜鸟到起飞的第一步甚至第 n 步!

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

) L( s4 \$ H* j* d6 _7 x: w3 q
1. 准备工作

8 _! h3 c! F7 a% M
1.1 安装开发环境
笔者用的操作系统是 Ubuntu 18.04。本次实验要用到如下开发工具,软件的安装过程很简单,网上都有很成熟的教程,在此不再赘述。该篇教程同样适用于 Windows 环境,实验步骤完全相同。
STM32CubeMx
STM32CubeIDE
STM32CubeProgrammer
1# Oracle 官网中下载 JavaSE JDK 压缩包8 N, ?, c) y$ Z% Z  {( m2 W
2$ sudo tar zxvf jdk-8u172-linux-x64.tar.gz -C /usr/lib/jvm
) X8 a% \/ U, i! s% B0 p3# 将下载的JDK注册到系统中; s% Q  u6 r/ `: E: f+ S+ w  l" U
4$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_172/bin/java 3008 o; e0 }0 R% S
5# 切换JDK
( ~4 ]) s7 X; {$ z7 V6 C6$ sudo update-alternatives --config java9 v" ~6 z# I" V/ g/ d0 I$ u
7# 查看JDK 版本# a0 D$ c6 f2 q/ [$ O
8$ java -version
  G+ \( q7 @2 s) k+ ?
22.png
1.2 在 PC 端搭建极简神经网络
首先将如下开源仓库克隆到本地:
' h6 ]2 B8 F0 [$ `( |
33.png

1 H0 }1 {! X( E- Q; a+ f3 F
在本次实验中我选择了最简单的一个线性回归( Linear Regression)Tensor Flow2 Demo 作为示例,模型相关源文件说明如下:
· tf2_linear_regression.ipynb 内含三种不同方式搭建网络结构
· tf2_线性回归_扩展.ipynb 内含不同方式训练模型
" ^' D" a) w9 H6 S; a3 @2 P  r
其中,在模型搭建的时候,重新温习了一下,有三种方式(各个方式的优缺点已经放在参考文章当中,感兴趣的同学自行查阅):
· Sequence
· 函数式 API
· 子类
后面将 AI 模型导入到 CubeMx的过程中,如果使用后两种方式生成的网络模型,将会遇到如下报错:
1INVALID MODEL: Couldn't load Keras model /home/lebhoryi/RT-Thread/Edge_AI/Project1/keras_model.h5,
0 g  f$ N/ }4 J. s0 h2error: Unknown layer: Functional

# H0 V, F) l3 B; u# |- e7 g
暂时的解决方式是采用Sequence 方式搭建神经网络,训练好的 AI Model 会被保存为 Keras 格式,后缀为 .h5,例如 keras_model.h5。
示例模型我已经保存好了,大家可以直接下载该模型进行实验,下载地址如下:
$ O! a, O( r6 c+ O7 L  n  ~& \! B
本次示例所训练的神经网络模型结构如下:

" u, d' [, C% P) l7 B+ c
44.png

# G/ p6 F& r& r* f
2. 使用 CubeMX AI 生成工程
在 CubeMX 中选择STM32H743ZI Nucleo 开发板,这里其实不限制开发板型号,常见的

- S8 w) o) x( |3 z
2.1 打开 CubeMX
& L, F% g& f2 _" {+ d1 \1 \! E
55.png

% T" l. V. R. V7 L; `  N
2.2 安装 CUBE-AI 软件包
打开菜单栏中的 Help,选择Embedded Software Packages Manager,然后在STMicroelectronics 一栏中选择 X-CUBE-AI 插件的最新版本,安装好之后点击右下角的 Close。
在工程中导入 X-CUBE-AI 插件:

* f" R9 u/ d! g
66.png
. n8 l% w$ Q# w0 [0 d) a" }9 O
会出现如下界面:
5 `1 t. v. o$ m
77.png
6 H: h9 e& u+ A0 }* C* N( M# q
接下来选择用于通信的串口,这里选择串口 3,因为该串口被用于 STlink 的虚拟串口。
5 X/ K! L. x; a- C
88.png

' p/ }3 I. q/ E! c
2.3 导入 AI 模型到工程中
( w9 w/ N7 P, q6 Q
99.png

  |0 c/ y  f8 k/ C8 M
将 AI 模型烧录到开发板前,需要先分析 Model,检查其是否可以被正常转换为嵌入式工程,本次实验使用的模型比较简单,分析起来也也比较快,结果如下所示:
* X; L5 y* B5 J0 Y" {8 C% G
10.png
4 i  ~. O& \7 }5 w& ]) ]
接下来我们要在开发板上验证转换后的嵌入式工程,在这个过程中 CubeMX AI 工具会根据你导入的 AI 模型,自动生成嵌入式工程,并且将编译后的可执行文件烧录到开发板中,并通过STlink 的虚拟串口验证运行的结果。我的系统是 Ubuntu,不支持 MDK,所以在这里选择自动生成 STM32CubeIDE 工程。
/ o) }, P& G1 k0 ~3 ^
111.png
7 o5 L, P# h. \6 L  A9 O
验证成功界面如下所示:
) W& U- l3 U7 i1 E5 r4 V+ c/ M
222.png

, I4 O1 ^$ G% G
2.4 生成项目工程
上一步我们只是进行了项目结果的验证,但是并没有生成项目源代码,接下来我们将生成项目工程,如下图所示:

6 O& E9 E7 }6 ^# T/ j4 D  x. p; X2 `
333.png

  \: Z8 ?! k; y
生成后的 Project 文件夹树如下所示:
1(base) #( 07/03/20@10:51上午 )( lebhoryi@RT-AI ):~/RT-Thread/Edge_AI@master✗✗✗; H9 F0 F/ T$ J7 {$ Y8 }6 R. ]
2   tree -L 2 ./Project1
; t* r+ A+ j% G+ x+ b6 v. C 3./Project1
* w8 A3 }9 ], F& F4 t 4├── DNN  # CubeMX 生成工程路径
5 J. P& x) P  `, s- z. I0 J 5│   ├── DNN.ioc  # CubeMX 类型文件
6 h# _) u! M' W/ }9 ] 6│   ├── Drivers
5 g. r; Q$ h) A5 \. b8 C 7│   ├── Inc& y5 z# [. }0 Q# F# L
8│   ├── Middlewares  }+ P3 J# g7 C% Y
9│   ├── network_generate_report.txt
6 D; `; z6 @; ?( d5 n10│   ├── Src7 S4 `# d* d" b+ y) J. p* g
11│   ├── Startup# h8 g3 {2 x& E
12│   ├── STM32CubeIDE. Y/ v# Q+ e8 I/ I$ S
13│   ├── STM32H743ZITX_FLASH.ld) [+ ^7 G# g9 ^1 h0 \' B5 f5 z
14│   └── STM32H743ZITX_RAM.ld
% T& ?' c! t0 C& L15├── image  # 相关图片保存文件夹- F( D8 I7 h7 {0 _0 k
16│   ├── mymodel1.png   # model
2 D8 N$ ]- ~+ m6 p3 `9 T2 O  w17│   └── STM32H743.jpg  # H743
0 v; d% T" p0 G1 e# f1 x# S18├── model  # model 保存路径
3 N( S+ |' ~3 o8 q( P, U19│   └── keras_model.h54 ~1 s4 ]1 n4 i' X% C+ a
20├── Readme.md
# X9 |$ Q  i9 n* q5 _/ c3 [21├── tf2_linear_regression.ipynb
7 L7 @! _6 v+ _& l6 J22└── tf2_线性回归_扩展.ipynb

, u( Q8 J5 h- G2 {: G4 Q: U
至此,神功练成了一大半,剩下的就是代码调试的工作了。
$ d3 s; @9 s8 W
3. 代码调试
% p; }/ j. W, t/ M. }2 r6 T
关于 STM32CubeIDE 的初步认识:基础说明与开发流程:http://blog.csdn.net/Naisu_kun/article/details/95935283
# m& D. [7 O- V
3.1 导入工程
选择 File 选项 -->import:
3 D) I9 s- Q. ^% L1 q$ [
444.png

6 f7 k( q6 a4 n/ c  x7 p; H8 a
选择先前导出工程的路径:

  @5 o& [  g% t! E
555.png

" Z  _, v4 A! L4 i4 h7 ^$ w+ Z
导入成功的界面如下所示:
! w$ I% Z5 Q3 q& {7 V1 i1 ?5 c- J) C8 p
666.png

# {: o* z+ C0 K  A$ b, G" Y0 R' Z
接下来就可以使用 STM32Cube IDE 来调试生成的工程了。

5 V+ u# R- X1 \' x0 i# T+ m4 \
3.2 生成 bin 文件
在编译的过程中还会自动生成相应的 bin 文件,后续可以通过 stm32cubeProgramer 工具将 bin 文件烧录到开发板中。
% s5 b3 R; f3 k$ _1 j
777.png
! I3 w& g. ^1 t. v: J) c
3.3 烧录 .bin 文件
打开STM32CubeProgramming,点击右上角connect,然后选择Open file,选择要打开的.bin 文件。

# F4 s; }' Q" X8 K( U1 I3 P
888.png

1 V3 e6 x) d' Z
烧录成功的界面:
1 s4 H$ B8 X( A& N; a; U
999.png

0 {& F0 r+ f/ X: f0 ]
3.4 Other
在 ubuntu 系统中我们可以使用串口工具cutecom 来查看最终程序的运行结果,程序运行结果如下:
在使用 cutecom 连接串口前,记得断开 STM32Programer 和开发板的连接,否则会出现串口打开错误的情况。

% f- e, E1 u( @# C: {* G1 }
1111.png
% H  p5 C6 b. J- X4 H
可以看到我们的 AI 模型已经在开发板上欢快地跑了起来 ,奥里给!!!

1 t/ z" I7 X* O1 F0 ]0 K; O
4. 参考文章

  O" q' f. ?. D+ o# Q* ]1 k- E5 q6 b
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 手机版