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

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

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

0 L& O) ~/ j6 {! m( |
嵌入式关联 AI
7 _* \( T- s( C& c' N
AI落地一直是一个很红火的前景和朝阳行业。我的好奇心也比较旺盛,所以关于任何嵌入式和 AI 相关的都是想尝一尝。本系列文章将带你一步一步把 AI 模型部署在嵌入式平台,移植到 RT-Thread 操作系统上,实现你从菜鸟到起飞的第一步甚至第 n 步!
/ J6 ]+ C2 v& O! T/ g0 D. I
开发环境:
后续开发过程将基于 STM32H743ZI-Nucleo 开发板,并且使用 STM32CubeMX.AI 工具。它可以基于训练好的 AI Model (仅限 Keras/TF-Lite),自动生成嵌入式项目工程(包括但是不局限于 MDK、STM32CubeIDE 等)。该工具易于上手,适合嵌入式 AI 入门开发。
STM32CubeMX 是 ST 公司推出的一种自动创建单片机工程及初始化代码的工具,适用于旗下所有 STM32 系列产品,现在其 AI 组件可以提供 AI 模型到嵌入式 C 代码的转换功能。

/ l& l; J/ S, R) ?& u+ {; U3 H
1. 准备工作
1 b2 b* g" r- t7 C
1.1 安装开发环境
笔者用的操作系统是 Ubuntu 18.04。本次实验要用到如下开发工具,软件的安装过程很简单,网上都有很成熟的教程,在此不再赘述。该篇教程同样适用于 Windows 环境,实验步骤完全相同。
STM32CubeMx
STM32CubeIDE
STM32CubeProgrammer
1# Oracle 官网中下载 JavaSE JDK 压缩包9 F0 o  N  \' G" |7 [7 i6 J
2$ sudo tar zxvf jdk-8u172-linux-x64.tar.gz -C /usr/lib/jvm7 A! u3 P8 s1 |% H: F/ z: X
3# 将下载的JDK注册到系统中
- \- y! @: [- F' \# v- z5 S. t9 ?4$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_172/bin/java 300' @  v& b4 K! U0 J  V
5# 切换JDK
. \8 u) x% e  A9 ~; ^6$ sudo update-alternatives --config java
- J. s4 R& l% _$ w1 v7# 查看JDK 版本
& L  O# r2 }: }2 W2 Y3 L* F8$ java -version

) M% ]! g+ G) E2 a+ ]: r9 O
22.png
1.2 在 PC 端搭建极简神经网络
首先将如下开源仓库克隆到本地:
$ V: Q5 e: ?- j3 Q2 c
33.png
) a% V; ?5 L* ~, e2 v' J" U
在本次实验中我选择了最简单的一个线性回归( Linear Regression)Tensor Flow2 Demo 作为示例,模型相关源文件说明如下:
· tf2_linear_regression.ipynb 内含三种不同方式搭建网络结构
· tf2_线性回归_扩展.ipynb 内含不同方式训练模型
* A7 X: w% A0 d& l/ b- K8 K
其中,在模型搭建的时候,重新温习了一下,有三种方式(各个方式的优缺点已经放在参考文章当中,感兴趣的同学自行查阅):
· Sequence
· 函数式 API
· 子类
后面将 AI 模型导入到 CubeMx的过程中,如果使用后两种方式生成的网络模型,将会遇到如下报错:
1INVALID MODEL: Couldn't load Keras model /home/lebhoryi/RT-Thread/Edge_AI/Project1/keras_model.h5, ) `% _$ ]7 m8 }# z$ Q) Q
2error: Unknown layer: Functional
/ {, `- U6 u- ?, w5 G8 ~6 m/ `
暂时的解决方式是采用Sequence 方式搭建神经网络,训练好的 AI Model 会被保存为 Keras 格式,后缀为 .h5,例如 keras_model.h5。
示例模型我已经保存好了,大家可以直接下载该模型进行实验,下载地址如下:

) ?1 ~& N- P# b, Q
本次示例所训练的神经网络模型结构如下:
( f- {9 ^* f* ]2 F! _
44.png
2 x1 w5 h$ ~; S# z$ E
2. 使用 CubeMX AI 生成工程
在 CubeMX 中选择STM32H743ZI Nucleo 开发板,这里其实不限制开发板型号,常见的
) c1 A3 d9 k; f7 X" U& ~, X% _
2.1 打开 CubeMX

4 p) M& F. x0 s8 R4 x
55.png

) \. v2 I2 o6 j; H. N" V/ Q
2.2 安装 CUBE-AI 软件包
打开菜单栏中的 Help,选择Embedded Software Packages Manager,然后在STMicroelectronics 一栏中选择 X-CUBE-AI 插件的最新版本,安装好之后点击右下角的 Close。
在工程中导入 X-CUBE-AI 插件:

. Q6 t8 \6 g* A4 k* C/ U
66.png

* o, z/ ?7 U$ {. M
会出现如下界面:
8 E8 R! Q2 K. q5 n, J
77.png
0 s9 g: K& V3 I3 T# T
接下来选择用于通信的串口,这里选择串口 3,因为该串口被用于 STlink 的虚拟串口。
+ q) {' V% e7 c' G( {+ D: i
88.png
1 Z2 s( W; k0 C) M
2.3 导入 AI 模型到工程中
% y# j+ j& A, \4 ]. D
99.png

) S2 ]( R3 {, v" m) i" [5 _* ~
将 AI 模型烧录到开发板前,需要先分析 Model,检查其是否可以被正常转换为嵌入式工程,本次实验使用的模型比较简单,分析起来也也比较快,结果如下所示:
0 f# k  u+ M1 I& z* q# R
10.png
6 L3 K1 V/ Y& P
接下来我们要在开发板上验证转换后的嵌入式工程,在这个过程中 CubeMX AI 工具会根据你导入的 AI 模型,自动生成嵌入式工程,并且将编译后的可执行文件烧录到开发板中,并通过STlink 的虚拟串口验证运行的结果。我的系统是 Ubuntu,不支持 MDK,所以在这里选择自动生成 STM32CubeIDE 工程。

7 g: ^, j5 k3 m4 [" k, Q" F7 f
111.png
" L: H8 V1 s- s; I9 M
验证成功界面如下所示:

9 S, i+ M  q4 V) d, y/ t- R
222.png

0 Z$ V" [  J* n
2.4 生成项目工程
上一步我们只是进行了项目结果的验证,但是并没有生成项目源代码,接下来我们将生成项目工程,如下图所示:
7 J% ^- X8 T. w' p2 ?0 |! _6 m1 s" L
333.png
+ N7 o4 g: q* G. d( c
生成后的 Project 文件夹树如下所示:
1(base) #( 07/03/20@10:51上午 )( lebhoryi@RT-AI ):~/RT-Thread/Edge_AI@master✗✗✗
2 S( J4 z: f3 X6 P 2   tree -L 2 ./Project1 # \9 ?" J% X7 a9 \
3./Project15 v5 s3 }/ m9 w' d( ?7 w' z/ q$ T: P
4├── DNN  # CubeMX 生成工程路径$ p6 u3 C/ \- {1 ]
5│   ├── DNN.ioc  # CubeMX 类型文件
* @6 ]" ^: J( {* K; q$ U 6│   ├── Drivers
% w6 g( ]) i( X/ X 7│   ├── Inc
" N8 d8 r% k3 ]. Q 8│   ├── Middlewares
% w$ Z; _5 ?2 H5 k1 j' C7 X  n 9│   ├── network_generate_report.txt
  e: B/ R: f" B. U10│   ├── Src
) S: m0 W6 n1 O' l11│   ├── Startup4 x. G7 x2 D& T- Z2 o9 Y
12│   ├── STM32CubeIDE* N6 {9 L1 V8 d4 y  b, B
13│   ├── STM32H743ZITX_FLASH.ld& b6 F. d- C+ c1 r9 v8 o
14│   └── STM32H743ZITX_RAM.ld4 K6 O2 n; d- F4 x) m! [) Y
15├── image  # 相关图片保存文件夹
5 k* R+ [7 r" R3 ^" }16│   ├── mymodel1.png   # model
+ Z! m- i' r4 O  h( T1 n17│   └── STM32H743.jpg  # H743
- x- R% K: X! L18├── model  # model 保存路径5 S+ q8 E2 e9 k, Q
19│   └── keras_model.h5
# c0 V, l4 I. p0 p9 ^. u20├── Readme.md( d$ p8 V1 r/ c" e  f3 Q2 Q' p
21├── tf2_linear_regression.ipynb
8 w6 z" L" q4 W" X& `* S# O* I22└── tf2_线性回归_扩展.ipynb
' L+ W1 ~1 y5 ^( Z6 F4 F' L7 N
至此,神功练成了一大半,剩下的就是代码调试的工作了。

6 t8 n/ O7 q7 Q+ A% H
3. 代码调试
/ X, p+ T" F. W5 g
关于 STM32CubeIDE 的初步认识:基础说明与开发流程:http://blog.csdn.net/Naisu_kun/article/details/95935283

8 X, n( e  h5 x  E( D) D% y
3.1 导入工程
选择 File 选项 -->import:
1 R6 ~. y- q1 q6 A) i4 L
444.png
1 a8 g, g* }0 c' T3 e! p
选择先前导出工程的路径:
; f% C2 ?. |* p! F  D
555.png
9 Y6 g, K' I$ a  V  z4 H2 Y
导入成功的界面如下所示:

6 k( X8 J4 M2 Z  ?; R# N7 T
666.png
9 o: {- r) D  q; Q
接下来就可以使用 STM32Cube IDE 来调试生成的工程了。
) r; K' a3 X- k' F( K( v+ `
3.2 生成 bin 文件
在编译的过程中还会自动生成相应的 bin 文件,后续可以通过 stm32cubeProgramer 工具将 bin 文件烧录到开发板中。
$ u( Q5 m* I7 ^0 |
777.png

( Y# O2 U8 g9 _7 y- g" g4 h
3.3 烧录 .bin 文件
打开STM32CubeProgramming,点击右上角connect,然后选择Open file,选择要打开的.bin 文件。

' e# Y% z1 v. \$ m
888.png

# M0 H" O7 K5 B1 C2 {
烧录成功的界面:

2 v! ~% X) c) E" p" d
999.png
. A" |2 H/ x; u# \
3.4 Other
在 ubuntu 系统中我们可以使用串口工具cutecom 来查看最终程序的运行结果,程序运行结果如下:
在使用 cutecom 连接串口前,记得断开 STM32Programer 和开发板的连接,否则会出现串口打开错误的情况。

/ p1 a2 O% g. }; }( g8 R# X
1111.png
" F' X) q: R& g( N: [! d4 ?. n5 ]
可以看到我们的 AI 模型已经在开发板上欢快地跑了起来 ,奥里给!!!
6 c- E& n) B0 ~; r2 A0 W+ t! A; G
4. 参考文章
. R; T4 P; o3 B! {/ q
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 手机版