paddle lite 嵌入式linux_【嵌入式AI入门日记】将 AI 模型移植到 RTThread 上

d3573574848480be65696310643d4c90.png

本期我们分享的主题是如何将 AI 模型部署到嵌入式系统中。

d8d059fbee52aafb4c86712351b19967.png

0a05afecd9bfe74202c370e1c27993da.png

嵌入式关联 AI

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

开发环境:

后续开发过程将基于 STM32H743ZI-Nucleo 开发板,并且使用 STM32CubeMX.AI 工具。它可以基于训练好的 AI Model (仅限 Keras/TF-Lite),自动生成嵌入式项目工程(包括但是不局限于 MDK、STM32CubeIDE 等)。该工具易于上手,适合嵌入式 AI 入门开发。

STM32CubeMX 是 ST 公司推出的一种自动创建单片机工程及初始化代码的工具,适用于旗下所有 STM32 系列产品,现在其 AI 组件可以提供 AI 模型到嵌入式 C 代码的转换功能。

1. 准备工作

1.1 安装开发环境

笔者用的操作系统是 Ubuntu 18.04。本次实验要用到如下开发工具,软件的安装过程很简单,网上都有很成熟的教程,在此不再赘述。该篇教程同样适用于 Windows 环境,实验步骤完全相同。

  • STM32CubeMx
  • STM32CubeIDE
  • STM32CubeProgrammer

STM32CubeProgrammer 在 ubuntu 环境下使用可能会出现如下错误:

安装好之后,在终端执行安装包路径下的bin文件夹下的执行文件,会报错误:找不到或无法加载主类 “com.st.app.Main”,这时候只要将 Ubuntu 默认的 Open-JDK 换成 Oracle JDK 就好了,下面是切换成 Oracle JDK 成功的截图:

1# Oracle 官网中下载 JavaSE JDK 压缩包
2$ sudo tar zxvf jdk-8u172-linux-x64.tar.gz -C /usr/lib/jvm
3# 将下载的JDK注册到系统中
4$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_172/bin/java 300
5# 切换JDK
6$ sudo update-alternatives --config java
7# 查看JDK 版本
8$ java -version

a5f7cbe2d49115ce8ec600b2950c051f.png

1.2 在 PC 端搭建极简神经网络

首先 将如下 开源仓库克隆到 本地 :
  • Github: https://github.com/Lebhoryi/Edge_AI/tree/master/Project1

a5d75c8ea1eba676deac48ba3749c5b5.png

在本次实验中我选择了最简单的一个线性回归( Linear Regression) Tensor Flow2 Demo 作为示例,模型相关源文件说明如下:
  • tf2_linear_regression.ipynb 内含三种不同方式搭建网络结构
  • tf2_线性回归_扩展.ipynb 内含不同方式训练模型
其中,在模型搭建的时候,重新温习了一下,有三种方式(各个方式的优缺点已经放在参考文章当中,感兴趣的同学自行查阅):
  • Sequence
  • 函数式 API
  • 子类
后面将 AI 模型导入到 CubeMx 的过程中,如果使用后两种方式生成的网络模型,将会遇到如下报错:
1INVALID MODEL: Couldn't load Keras model /home/lebhoryi/RT-Thread/Edge_AI/Project1/keras_model.h5, 
2error: Unknown layer: Functional
暂时的解决方式是采用 Sequence  方式搭建神经网络, 训 练好的 AI Model 会被保存为 Keras 格式,后缀为 .h5,例如  keras_model.h5。 示例模型我已经保存好了,大家可以直接下载该模型进行实验,下载地址如下: https://github.com/Lebhoryi/Edge_AI/tree /master/Project1/model 本次示例所训练的神经网络模型结构如下:

9d89472f56b6f41bf848e3931dcccdaa.png

2. 使用 CubeMX AI 生成工程

在 CubeMX 中选择 STM32H743ZI Nucleo 开发板,这里其实不限制开发板型号,常见的 

2.1 打开 CubeMX

3c5afccf014e5f17e66335da7d392758.png

a2aad18b60e64fb4f964e765822a64dd.png

2.2 安装 CUBE-AI 软件包

打开菜单栏中的 Help,选择 Embedded Software Packages Manager,然后在 STMicroelectronics 一栏中选择 X-CUBE-AI 插件的最新版本,安装好之后点击右下角的 Close。

7db5e1c43f9eed28bf25d52c1f25ebb4.png

在工程中导入 X-CUBE-AI 插件:

900ea0817678893a4b210dce4201865c.png

会出现如下界面:

8e91cba4804fb793457f3004f1329a81.png

接下来选择用于通信的串口,这里选择串口 3,因为该串口被用于 STlink 的虚拟串口。

69ed011143c4428aa814e5105d432c04.png

2.3 导入 AI 模型到工程中

69d5951564405259e7f850babb5b3877.png

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

bc74685e268db65a1dd2f52e130a57c5.png

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

fc7c632b6d8a7f133590ebd4543374a3.png

验证成功界面如下所示:

65c4e7c7a6add0a1e50dada9fb72523b.png

2.4 生成项目工程

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

2e2f75de916cf0691c0f4a4498917657.png

生成后的 Project 文件夹树如下所示:

 1(base) #( 07/03/20@10:51上午 )( lebhoryi@RT-AI ):~/RT-Thread/Edge_AI@master✗✗✗
2   tree -L 2 ./Project1 
3./Project1
4├── DNN  # CubeMX 生成工程路径
5│   ├── DNN.ioc  # CubeMX 类型文件
6│   ├── Drivers
7│   ├── Inc
8│   ├── Middlewares
9│   ├── network_generate_report.txt
10│   ├── Src
11│   ├── Startup
12│   ├── STM32CubeIDE
13│   ├── STM32H743ZITX_FLASH.ld
14│   └── STM32H743ZITX_RAM.ld
15├── image  # 相关图片保存文件夹
16│   ├── mymodel1.png   # model
17│   └── STM32H743.jpg  # H743
18├── model  # model 保存路径
19│   └── keras_model.h5
20├── Readme.md
21├── tf2_linear_regression.ipynb
22└── tf2_线性回归_扩展.ipynb
至此,神功练成了一大半,剩下的就是代码调试的工作了。

3. 代码调试

关于 STM32CubeIDE 的初步认识:基础说明与开发流程:https://blog.csdn.net/Naisu_kun/article/details/95935283

3.1 导入工程

选择 File 选项 --> import:

e35f2f1f5021c9d1e86ab4484f307e44.png

选择先前导出工程的路径:

0f4934dbca6c63cfb7e56e357a3aec91.png

导入成功的界面如下所示:

5e8c93f65beb0a56358acc3387ac79d0.png

接下来就可以使用 STM32Cube IDE 来调试生成的工程了。

3.2 生成 bin 文件

在编译的过程中还会自动生成相应的 bin 文件,后续可以通过 stm32cubeProgramer 工具将 bin 文件烧录到开发板中。

77caa843f124acf6a7d0799333085567.png

3.3 烧录 .bin 文件

打开 STM32CubeProgramming ,点击右上角 connect ,然后选择 Open file ,选择要打开的 .bin 文件。

d43a4834d02753d55b62e7de6bb8599e.png

烧录成功的界面:

a9a1d4035f4d29517140548d4ef303fb.png

3.4 Other

在 ubuntu 系统中我们可以使用串口工具 cutecom 来查看最终程序的运行结果,程序运行结果如下:

在使用 cutecom 连接串口前,记得断开 STM32Programer 和开发板的连接,否则会出现串口打开错误的情况。

a64f2c26250b8bd32ad7df277408ece9.png

可以看到我们的 AI 模型已经在开发板上欢快地跑了起来 ,奥里给!!!

4. 参考文章

  • STM32CubeMX系列教程

  • Tensorflow 2.0 中模型构建的三种方式:

  • ? https://blog.csdn.net/weixin_42264234/article/d

  • Ubuntu16.04 和 Ubuntu18.04 安装 STM32CubeProgrammer 遇到的坑:

  • ? https://blog.csdn.net/lu_embedded/article/details/103032083

  • 基础说明与开发流程:

  • ? https://blog.csdn.net/Naisu_kun/article/details/95935283
f02ef5c9b9f8989c72ced838298a3d2d.gif 173c518cc352491155de79d8db58b805.png 点个“在看”,让知识流行起来 11b8d8beb087dbf2cd877fa025082bb4.gif 11b8d8beb087dbf2cd877fa025082bb4.gif
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值