通过 STlink 的虚拟串口验证运行的结果测试

通过 STlink 的虚拟串口验证运行的结果测试,第1张

本期我们分享主题是如何将 AI 模型部署到嵌入式系统中,下一期将介绍如何在 RT-Thread *** 作系统上运行 Mnist Demo(手写数字识别)。

嵌入式关联 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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第2张

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

首先将如下开源仓库克隆到本地:

Github: https://github.com/Lebhoryi/Edge_AI/tree/master/Project1

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第3张

在本次实验中我选择了最简单的一个线性回归( 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本次示例所训练的神经网络模型结构如下:

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第4张

2. 使用 CubeMX AI 生成工程

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

2.1 打开 CubeMX

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第5张

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第6张

2.2 安装 CUBE-AI 软件包

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第7张

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第8张

会出现如下界面:

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第9张

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第10张

2.3 导入 AI 模型到工程中

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第11张

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第12张

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第13张

验证成功界面如下所示:

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第14张

2.4 生成项目工程

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第15张

生成后的 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:

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第16张

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第17张

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第18张

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

3.2 生成 bin 文件

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第19张

3.3 烧录 .bin 文件

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

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第20张

烧录成功的界面:

通过 STlink 的虚拟串口验证运行的结果测试,通过 STlink 的虚拟串口验证运行的结果测试,第21张

3.4 Other

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

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

       责任编辑:pj

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2494326.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-04
下一篇 2022-08-04

发表评论

登录后才能评论

评论列表(0条)

保存