本期我們分享主題是如何將 AI 模型部署到嵌入式系統(tǒng)中,下一期將介紹如何在 RT-Thread 操作系統(tǒng)上運(yùn)行 Mnist Demo(手寫數(shù)字識(shí)別)。
嵌入式關(guān)聯(lián) AI
AI落地一直是一個(gè)很紅火的前景和朝陽(yáng)行業(yè)。我的好奇心也比較旺盛,所以關(guān)于任何嵌入式和 AI 相關(guān)的都是想嘗一嘗。本系列文章將帶你一步一步把 AI 模型部署在嵌入式平臺(tái),移植到 RT-Thread 操作系統(tǒng)上,實(shí)現(xiàn)你從菜鳥到起飛的第一步甚至第 n 步!
開(kāi)發(fā)環(huán)境:
后續(xù)開(kāi)發(fā)過(guò)程將基于 STM32H743ZI-Nucleo 開(kāi)發(fā)板,并且使用 STM32CubeMX.AI 工具。它可以基于訓(xùn)練好的 AI Model (僅限 Keras/TF-Lite),自動(dòng)生成嵌入式項(xiàng)目工程(包括但是不局限于 MDK、STM32CubeIDE 等)。該工具易于上手,適合嵌入式 AI 入門開(kāi)發(fā)。
STM32CubeMX 是 ST 公司推出的一種自動(dòng)創(chuàng)建單片機(jī)工程及初始化代碼的工具,適用于旗下所有 STM32 系列產(chǎn)品,現(xiàn)在其 AI 組件可以提供 AI 模型到嵌入式 C 代碼的轉(zhuǎn)換功能。
1. 準(zhǔn)備工作
1.1 安裝開(kāi)發(fā)環(huán)境
我是用的操作系統(tǒng)是 Ubuntu 18.04。本次實(shí)驗(yàn)要用到如下開(kāi)發(fā)工具,軟件的安裝過(guò)程很簡(jiǎn)單,網(wǎng)上都有很成熟的教程,在此不再贅述。該篇教程同樣適用于 Windows 環(huán)境,實(shí)驗(yàn)步驟完全相同。
STM32CubeMx
STM32CubeIDE
STM32CubeProgrammer
STM32CubeProgrammer 在 ubuntu 環(huán)境下使用可能會(huì)出現(xiàn)如下錯(cuò)誤:
安裝好之后,在終端執(zhí)行安裝包路徑下的bin文件夾下的執(zhí)行文件,會(huì)報(bào)錯(cuò)誤:找不到或無(wú)法加載主類 “com.st.app.Main”,這時(shí)候只要將 Ubuntu 默認(rèn)的 Open-JDK 換成 Oracle JDK 就好了,下面是切換成 Oracle JDK 成功的截圖:
1# Oracle 官網(wǎng)中下載 JavaSE JDK 壓縮包
2$ sudo tar zxvf jdk-8u172-linux-x64.tar.gz -C /usr/lib/jvm
3# 將下載的JDK注冊(cè)到系統(tǒng)中
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
1.2 在 PC 端搭建極簡(jiǎn)神經(jīng)網(wǎng)絡(luò)
首先將如下開(kāi)源倉(cāng)庫(kù)克隆到本地:
Github: https://github.com/Lebhoryi/Edge_AI/tree/master/Project1
在本次實(shí)驗(yàn)中我選擇了最簡(jiǎn)單的一個(gè)線性回歸( Linear Regression) Tensor Flow2 Demo 作為示例,模型相關(guān)源文件說(shuō)明如下:
tf2_linear_regression.ipynb 內(nèi)含三種不同方式搭建網(wǎng)絡(luò)結(jié)構(gòu)
tf2_線性回歸_擴(kuò)展.ipynb 內(nèi)含不同方式訓(xùn)練模型
其中,在模型搭建的時(shí)候,重新溫習(xí)了一下,有三種方式(各個(gè)方式的優(yōu)缺點(diǎn)已經(jīng)放在參考文章當(dāng)中,感興趣的同學(xué)自行查閱):
Sequence
函數(shù)式 API
子類
后面將 AI 模型導(dǎo)入到 CubeMx 的過(guò)程中,如果使用后兩種方式生成的網(wǎng)絡(luò)模型,將會(huì)遇到如下報(bào)錯(cuò):
1INVALID MODEL: Couldn‘t load Keras model /home/lebhoryi/RT-Thread/Edge_AI/Project1/keras_model.h5,
2error: Unknown layer: Functional
暫時(shí)的解決方式是采用Sequence 方式搭建神經(jīng)網(wǎng)絡(luò),訓(xùn)練好的 AI Model 會(huì)被保存為 Keras 格式,后綴為 .h5,例如 keras_model.h5。示例模型我已經(jīng)保存好了,大家可以直接下載該模型進(jìn)行實(shí)驗(yàn),下載地址如下:https://github.com/Lebhoryi/Edge_AI/tree/master/Project1/model本次示例所訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)如下:
2. 使用 CubeMX AI 生成工程
在 CubeMX 中選擇 STM32H743ZI Nucleo 開(kāi)發(fā)板,這里其實(shí)不限制開(kāi)發(fā)板型號(hào),常見(jiàn)的
2.1 打開(kāi) CubeMX
2.2 安裝 CUBE-AI 軟件包
打開(kāi)菜單欄中的 Help,選擇 Embedded Software Packages Manager,然后在 STMicroelectronics 一欄中選擇 X-CUBE-AI 插件的最新版本,安裝好之后點(diǎn)擊右下角的 Close。
在工程中導(dǎo)入 X-CUBE-AI 插件:
會(huì)出現(xiàn)如下界面:
接下來(lái)選擇用于通信的串口,這里選擇串口 3,因?yàn)樵摯诒挥糜?STlink 的虛擬串口。
2.3 導(dǎo)入 AI 模型到工程中
將 AI 模型燒錄到開(kāi)發(fā)板前,需要先分析 Model,檢查其是否可以被正常轉(zhuǎn)換為嵌入式工程,本次實(shí)驗(yàn)使用的模型比較簡(jiǎn)單,分析起來(lái)也也比較快,結(jié)果如下所示:
接下來(lái)我們要在開(kāi)發(fā)板上驗(yàn)證轉(zhuǎn)換后的嵌入式工程,在這個(gè)過(guò)程中 CubeMX AI 工具會(huì)根據(jù)你導(dǎo)入的 AI 模型,自動(dòng)生成嵌入式工程,并且將編譯后的可執(zhí)行文件燒錄到開(kāi)發(fā)板中,并通過(guò) STlink 的虛擬串口驗(yàn)證運(yùn)行的結(jié)果。我的系統(tǒng)是 Ubuntu,不支持 MDK,所以在這里選擇自動(dòng)生成 STM32CubeIDE 工程。
驗(yàn)證成功界面如下所示:
2.4 生成項(xiàng)目工程
上一步我們只是進(jìn)行了項(xiàng)目結(jié)果的驗(yàn)證,但是并沒(méi)有生成項(xiàng)目源代碼,接下來(lái)我們將生成項(xiàng)目工程,如下圖所示:
生成后的 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 # 相關(guān)圖片保存文件夾
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_線性回歸_擴(kuò)展.ipynb
至此,神功練成了一大半,剩下的就是代碼調(diào)試的工作了。
3. 代碼調(diào)試
關(guān)于 STM32CubeIDE 的初步認(rèn)識(shí):基礎(chǔ)說(shuō)明與開(kāi)發(fā)流程:https://blog.csdn.net/Naisu_kun/article/details/95935283
3.1 導(dǎo)入工程
選擇 File 選項(xiàng) --》 import:
選擇先前導(dǎo)出工程的路徑:
導(dǎo)入成功的界面如下所示:
接下來(lái)就可以使用 STM32Cube IDE 來(lái)調(diào)試生成的工程了。
3.2 生成 bin 文件
在編譯的過(guò)程中還會(huì)自動(dòng)生成相應(yīng)的 bin 文件,后續(xù)可以通過(guò) stm32cubeProgramer 工具將 bin 文件燒錄到開(kāi)發(fā)板中。
3.3 燒錄 .bin 文件
打開(kāi)STM32CubeProgramming,點(diǎn)擊右上角connect,然后選擇Open file,選擇要打開(kāi)的.bin 文件。
燒錄成功的界面:
3.4 Other
在 ubuntu 系統(tǒng)中我們可以使用串口工具cutecom 來(lái)查看最終程序的運(yùn)行結(jié)果,程序運(yùn)行結(jié)果如下:
在使用 cutecom 連接串口前,記得斷開(kāi) STM32Programer 和開(kāi)發(fā)板的連接,否則會(huì)出現(xiàn)串口打開(kāi)錯(cuò)誤的情況。
? ? ? ?責(zé)任編輯:pj
評(píng)論
查看更多