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

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

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

1 E) b- t2 n. t( O# I2 n
嵌入式关联 AI
$ z4 B! }# C3 }# k
AI落地一直是一个很红火的前景和朝阳行业。我的好奇心也比较旺盛,所以关于任何嵌入式和 AI 相关的都是想尝一尝。本系列文章将带你一步一步把 AI 模型部署在嵌入式平台,移植到 RT-Thread 操作系统上,实现你从菜鸟到起飞的第一步甚至第 n 步!
( [, {) k/ Y9 _2 t8 R6 K. q
开发环境:
后续开发过程将基于 STM32H743ZI-Nucleo 开发板,并且使用 STM32CubeMX.AI 工具。它可以基于训练好的 AI Model (仅限 Keras/TF-Lite),自动生成嵌入式项目工程(包括但是不局限于 MDK、STM32CubeIDE 等)。该工具易于上手,适合嵌入式 AI 入门开发。
STM32CubeMX 是 ST 公司推出的一种自动创建单片机工程及初始化代码的工具,适用于旗下所有 STM32 系列产品,现在其 AI 组件可以提供 AI 模型到嵌入式 C 代码的转换功能。
4 F: f3 f0 |$ m9 p# V7 q( p
1. 准备工作
( q1 q* x7 R; E
1.1 安装开发环境
笔者用的操作系统是 Ubuntu 18.04。本次实验要用到如下开发工具,软件的安装过程很简单,网上都有很成熟的教程,在此不再赘述。该篇教程同样适用于 Windows 环境,实验步骤完全相同。
STM32CubeMx
STM32CubeIDE
STM32CubeProgrammer
1# Oracle 官网中下载 JavaSE JDK 压缩包
' P: s0 g2 ~# ?1 A& v2 ~; p/ B/ {( X2$ sudo tar zxvf jdk-8u172-linux-x64.tar.gz -C /usr/lib/jvm
' ?& B5 s& |* ]. Q: Y3# 将下载的JDK注册到系统中3 f2 t  S1 J7 F# ?  B
4$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_172/bin/java 300; H! N: H# ]8 W
5# 切换JDK
( j% a7 n4 I; n( @* P6$ sudo update-alternatives --config java
! N1 O/ R0 C# Z' n+ p7# 查看JDK 版本$ u* G$ d8 n- R$ b* Z- R
8$ java -version

3 U& l8 n$ J3 A' G" A  v
22.png
1.2 在 PC 端搭建极简神经网络
首先将如下开源仓库克隆到本地:

* F" u4 y; s) F2 M( p" O1 U
33.png
5 P  D, K+ e9 {. _  \- I* g& ]( F
在本次实验中我选择了最简单的一个线性回归( Linear Regression)Tensor Flow2 Demo 作为示例,模型相关源文件说明如下:
· tf2_linear_regression.ipynb 内含三种不同方式搭建网络结构
· tf2_线性回归_扩展.ipynb 内含不同方式训练模型
* e: K# c& q1 j: _, ]% }
其中,在模型搭建的时候,重新温习了一下,有三种方式(各个方式的优缺点已经放在参考文章当中,感兴趣的同学自行查阅):
· Sequence
· 函数式 API
· 子类
后面将 AI 模型导入到 CubeMx的过程中,如果使用后两种方式生成的网络模型,将会遇到如下报错:
1INVALID MODEL: Couldn't load Keras model /home/lebhoryi/RT-Thread/Edge_AI/Project1/keras_model.h5, , i% x! w7 |1 `2 T
2error: Unknown layer: Functional
' c% h# W) P, g% a! a  J
暂时的解决方式是采用Sequence 方式搭建神经网络,训练好的 AI Model 会被保存为 Keras 格式,后缀为 .h5,例如 keras_model.h5。
示例模型我已经保存好了,大家可以直接下载该模型进行实验,下载地址如下:
( o/ u9 y- ^7 ?. ]
本次示例所训练的神经网络模型结构如下:
6 p- S0 y! F8 H( A+ s" e& V0 H
44.png
' v5 F2 M4 _1 t2 z1 k& |. B
2. 使用 CubeMX AI 生成工程
在 CubeMX 中选择STM32H743ZI Nucleo 开发板,这里其实不限制开发板型号,常见的

/ N, u/ N( h: X1 |
2.1 打开 CubeMX

- ?& N4 W* p  o: m7 m( a' t3 O( D
55.png

9 g& l# G6 e  \" _9 E  R, T/ P% f
2.2 安装 CUBE-AI 软件包
打开菜单栏中的 Help,选择Embedded Software Packages Manager,然后在STMicroelectronics 一栏中选择 X-CUBE-AI 插件的最新版本,安装好之后点击右下角的 Close。
在工程中导入 X-CUBE-AI 插件:
- n! u: C( Y$ ]$ f* w7 j# [& M
66.png

! E6 H  Q/ V! B6 c1 _  n0 U/ O8 H
会出现如下界面:

  `; U2 q" z8 q
77.png
( C/ {+ @0 T- M! q# i
接下来选择用于通信的串口,这里选择串口 3,因为该串口被用于 STlink 的虚拟串口。

3 [: ]& r6 ?; @7 q6 l
88.png
$ N* G3 j) Y, X
2.3 导入 AI 模型到工程中

( X3 i) A: p# @* O; U0 t
99.png
4 y( Y! W; Z# s4 J) A' F
将 AI 模型烧录到开发板前,需要先分析 Model,检查其是否可以被正常转换为嵌入式工程,本次实验使用的模型比较简单,分析起来也也比较快,结果如下所示:
; U1 o' U7 |' m+ {
10.png

7 f7 l2 X! X7 W- X, b# L7 C
接下来我们要在开发板上验证转换后的嵌入式工程,在这个过程中 CubeMX AI 工具会根据你导入的 AI 模型,自动生成嵌入式工程,并且将编译后的可执行文件烧录到开发板中,并通过STlink 的虚拟串口验证运行的结果。我的系统是 Ubuntu,不支持 MDK,所以在这里选择自动生成 STM32CubeIDE 工程。

/ I2 j4 R! Z; A& }/ M  d
111.png
. {( ]; `( }( N2 M$ n( Q
验证成功界面如下所示:
9 b6 b; o% Q2 d* P+ {8 G
222.png
% j! ~/ @- ?, \4 N, c3 l8 v
2.4 生成项目工程
上一步我们只是进行了项目结果的验证,但是并没有生成项目源代码,接下来我们将生成项目工程,如下图所示:

; b8 x0 z2 ^4 `: ]# [  a, a9 U
333.png

- _; [. U+ w* L4 e$ \4 h+ R, l  f
生成后的 Project 文件夹树如下所示:
1(base) #( 07/03/20@10:51上午 )( lebhoryi@RT-AI ):~/RT-Thread/Edge_AI@master✗✗✗
/ l) T% Y* H/ ?% G3 {. ^ 2   tree -L 2 ./Project1
! P+ k9 v2 o( g 3./Project1
; Y) x2 M8 A. u2 l2 v 4├── DNN  # CubeMX 生成工程路径1 j9 L# B# p" N7 \4 D* q
5│   ├── DNN.ioc  # CubeMX 类型文件) u& }: h7 w, c& u/ x0 V( `
6│   ├── Drivers
; u8 ]+ }7 j+ w& p& P 7│   ├── Inc
; K! I: e% v; ?9 C+ v8 S8 Y 8│   ├── Middlewares0 H1 B& _$ j; ^
9│   ├── network_generate_report.txt; p  n. c, ^1 p/ `! j
10│   ├── Src0 j; O) `% T+ P: }
11│   ├── Startup
+ d4 B, N* z- }' ^12│   ├── STM32CubeIDE
2 H2 |: E( ^& P13│   ├── STM32H743ZITX_FLASH.ld, `% A+ W7 b. K5 w/ Y5 S8 u
14│   └── STM32H743ZITX_RAM.ld
8 ~. z  R  G1 l: X: [+ `15├── image  # 相关图片保存文件夹4 z( j5 \5 A. O2 o& N
16│   ├── mymodel1.png   # model
  o8 h1 M4 A* @5 L4 @5 k! ?17│   └── STM32H743.jpg  # H743* D9 k" r) f( Z4 `: Z$ j4 B+ a( R* W
18├── model  # model 保存路径  _) O8 h3 m& o4 n. Q
19│   └── keras_model.h53 K8 R" C* N- h* b, V$ d- b: C) V
20├── Readme.md/ H5 K# x2 E$ S* j" r' {4 k* |/ n
21├── tf2_linear_regression.ipynb
1 Z: S' b' b( s, u* \22└── tf2_线性回归_扩展.ipynb

7 f1 w6 Q$ k- ^9 Q, \/ c& w# Z
至此,神功练成了一大半,剩下的就是代码调试的工作了。

1 c9 \8 `$ O) X  E9 ^+ i! B+ {/ T
3. 代码调试

+ Q! w: G/ o9 `) |) c1 {/ T0 \
关于 STM32CubeIDE 的初步认识:基础说明与开发流程:http://blog.csdn.net/Naisu_kun/article/details/95935283
- n2 J  @  B! |
3.1 导入工程
选择 File 选项 -->import:

* l6 D2 M, v2 R* U# m
444.png
9 y. i2 c- j; s; x
选择先前导出工程的路径:

; @% X# o4 Q- h/ a" C9 Z0 _1 Q2 h
555.png
, o1 m0 Q+ }5 S/ j
导入成功的界面如下所示:

: S# ^( j4 s" _
666.png

) A4 V3 f+ u1 r6 H; E
接下来就可以使用 STM32Cube IDE 来调试生成的工程了。

5 O. ?1 N' H6 k7 o+ C2 X' t
3.2 生成 bin 文件
在编译的过程中还会自动生成相应的 bin 文件,后续可以通过 stm32cubeProgramer 工具将 bin 文件烧录到开发板中。
) j# g% b/ |1 M% q7 d( M% k3 x
777.png
% b/ ~, h# K1 S
3.3 烧录 .bin 文件
打开STM32CubeProgramming,点击右上角connect,然后选择Open file,选择要打开的.bin 文件。

, J* x4 i/ o! }; w# z% A
888.png
+ f" D3 m1 Z9 _% _" n% ^
烧录成功的界面:

) ]4 T5 \! i/ L/ K5 N0 j' ]
999.png
# k) Q) u$ ]* t( y
3.4 Other
在 ubuntu 系统中我们可以使用串口工具cutecom 来查看最终程序的运行结果,程序运行结果如下:
在使用 cutecom 连接串口前,记得断开 STM32Programer 和开发板的连接,否则会出现串口打开错误的情况。
4 W1 X$ C7 f$ q4 |
1111.png

6 T& K  N% S% v' _9 x$ N
可以看到我们的 AI 模型已经在开发板上欢快地跑了起来 ,奥里给!!!

# r/ w# C0 y/ Q/ ^9 ?
4. 参考文章
1 J" F' G) J: M  d' i
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版