0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在 MCU 上快速部署 TinyML

張靜 ? 來源:yoyooo ? 作者:yoyooo ? 2022-07-19 10:24 ? 次閱讀

您對人工智能 (AI) 和機器學(xué)習(xí) (ML) 感到好奇嗎?您想知道如何在您已經(jīng)使用過的微控制器上使用它嗎?在本文中,我們向您介紹了微控制器上的機器學(xué)習(xí)。該主題也稱為微型機器學(xué)習(xí) (TinyML)。準(zhǔn)備好在石頭、紙、剪刀上輸給 ESP-EYE。您將了解數(shù)據(jù)收集和處理、如何設(shè)計和訓(xùn)練 AI 以及如何使其在 MCU 上運行。這個示例為您提供了從頭到尾完成您自己的 TinyML 項目所需的一切。

我為什么要關(guān)心 TinyML?

您肯定聽說過 DeepMind 和 OpenAI 等科技公司。他們憑借專家和 GPU 能力在 ML 領(lǐng)域占據(jù)主導(dǎo)地位。為了給人一種規(guī)模感,最好的人工智能,比如谷歌翻譯使用的人工智能,需要幾個月的訓(xùn)練。他們并行使用數(shù)百個高性能 GPU。TinyML 通過變小來扭轉(zhuǎn)局面。由于內(nèi)存限制,大型 AI 模型不適合微控制器。下圖顯示了硬件要求之間的差異。

pYYBAGLVchyAPyt8AAFa_Th1MRw266.png

與在云端使用 AI 服務(wù)相比,MCU 上的機器學(xué)習(xí)有哪些優(yōu)勢?我們發(fā)現(xiàn)了七個主要優(yōu)勢。

成本

微控制器的購買和運行都很便宜。

環(huán)保

在微控制器上運行 AI 消耗的能量很少。

一體化

微控制器很容易集成到現(xiàn)有環(huán)境中,例如生產(chǎn)線。

隱私和安全

數(shù)據(jù)可以在本地、在設(shè)備上處理。數(shù)據(jù)不必通過互聯(lián)網(wǎng)發(fā)送。

快速原型制作

TinyML 使您能夠在短時間內(nèi)開發(fā)概念驗證解決方案。

自主可靠

即使沒有基礎(chǔ)設(shè)施,微型設(shè)備也可以在任何地方使用。

即時的

數(shù)據(jù)在微控制器上進行處理,沒有延遲。唯一的限制是 MCU 的處理速度。

剪刀石頭布

你有沒有在石頭、紙、剪刀上輸給人工智能?或者你想通過擊敗人工智能來給你的朋友留下深刻印象?您將使用 TinyML 與 ESP-EYE 板對戰(zhàn)。要使這樣的項目成為可能,您需要學(xué)習(xí)五個步驟。以下部分提供了必要步驟的高級概述。如果您想仔細(xì)查看,請參閱我們項目存儲庫中的文檔。它解釋了漂亮的細(xì)節(jié)。

收集資料

收集數(shù)據(jù)是機器學(xué)習(xí)的關(guān)鍵部分。為了讓事情運行起來,你需要拍攝你的手形成石頭、紙、剪刀手勢的圖像。圖片越獨特越好。AI 將了解到您的手可以處于不同的角度、位置或光線變化。數(shù)據(jù)集包含記錄的圖像和每個圖像的標(biāo)簽。這被稱為監(jiān)督學(xué)習(xí)。

最好使用與訓(xùn)練 AI 相同的傳感器和環(huán)境來運行您的 AI。這將確保模型熟悉傳入的數(shù)據(jù)。例如,考慮由于制造差異,溫度傳感器在相同溫度下具有不同的電壓輸出。就我們而言,這意味著使用 ESP-EYE 相機在統(tǒng)一的背景上記錄圖像是理想的選擇。在部署期間,人工智能將在類似的背景下工作得最好。您還可以使用網(wǎng)絡(luò)攝像頭記錄圖像,但可能會犧牲一些準(zhǔn)確性。由于 MCU 容量有限,我們記錄和處理 96×96 像素的灰度圖像。

收集數(shù)據(jù)后,將數(shù)據(jù)拆分為訓(xùn)練集和測試集非常重要。我們這樣做是為了看看我們的模型如何識別它以前從未見過的手勢圖像。該模型自然會在訓(xùn)練期間已經(jīng)看到的圖像上表現(xiàn)良好。

poYBAGLVciOAXqVeAAEU1cmBdXY077.png

以下是一些示例圖像。如果您現(xiàn)在不想收集數(shù)據(jù),可以在這里下載我們現(xiàn)成的數(shù)據(jù)集。

預(yù)處理數(shù)據(jù)

識別數(shù)據(jù)中的模式不僅對人類來說很困難。為了讓 AI 模型更容易做到這一點,通常依賴于預(yù)處理算法。在我們的數(shù)據(jù)集中,我們使用 ESP-EYE 和網(wǎng)絡(luò)攝像頭記錄圖像。由于 ESP-EYE 可以捕獲 96×96 分辨率的灰度圖像,因此我們不需要在這里進行太多進一步的處理。但是,我們需要將網(wǎng)絡(luò)攝像頭圖像縮小并裁剪為 96×96 像素,并將它們從 RGB 轉(zhuǎn)換為灰度格式。最后,我們對所有圖像進行歸一化。下面,您將看到我們處理的中間步驟。

poYBAGLVciqARajmAACXMmq_R-w005.png設(shè)計模型

設(shè)計一個模型是相當(dāng)棘手的!詳細(xì)的處理超出了本文的范圍。我們將描述模型的基本組件以及我們?nèi)绾卧O(shè)計我們的模型。在引擎蓋下,我們的 AI 依賴于神經(jīng)網(wǎng)絡(luò)。您可以將神經(jīng)網(wǎng)絡(luò)視為神經(jīng)元的集合,有點像我們的大腦。這就是為什么在僵尸末日的情況下,人工智能也會被僵尸吃掉。

當(dāng)網(wǎng)絡(luò)中的所有神經(jīng)元相互連接時,這稱為全連接或密集。這可以被認(rèn)為是最基本的神經(jīng)網(wǎng)絡(luò)類型。由于我們希望我們的 AI 能夠從圖像中識別手勢,因此我們使用了一些更先進且更適合圖像的東西,即卷積神經(jīng)網(wǎng)絡(luò) (CNN)。卷積降低了圖像的維度,提取了重要的模式并保留了像素之間的局部關(guān)系。為了設(shè)計一個模型,我們使用了TensorFlow 庫,它提供了現(xiàn)成的神經(jīng)網(wǎng)絡(luò)組件,稱為層,這使得創(chuàng)建神經(jīng)網(wǎng)絡(luò)變得容易!

創(chuàng)建模型意味著堆疊層。它們的正確組合對于開發(fā)穩(wěn)健且高精度的模型至關(guān)重要。下圖顯示了我們正在使用的不同層。Conv2D表示卷積層。批標(biāo)準(zhǔn)化layer 對上一層的輸出應(yīng)用一種歸一化形式。然后我們將數(shù)據(jù)輸入激活層,這會引入非線性并過濾掉不重要的數(shù)據(jù)點。接下來,最大池化類似于卷積減小圖像的大小。這個層塊重復(fù)了幾次;合適的量是由經(jīng)驗和實驗決定的。之后,我們使用扁平化層將二維圖像縮減為一維數(shù)組。最后,該陣列緊密連接到三個神經(jīng)元,它們分別代表石頭、紙和剪刀等類別。

def  make_model_simple_cnn (INPUT_IMG_SHAPE, num_classes= 3 ):
 輸入= keras.Input(形狀=INPUT_IMG_SHAPE)
 x = 輸入

 x = layers.Rescaling( 1.0 / 255 )(x)
 x = layers.Conv2D( 16 , 3 , strides= 3 , padding= "same" )(x)
 x = layers.BatchNormalization()(x)
 x = layers.Activation( “relu” )(x)
 x = 層數(shù).MaxPooling2D()(x)
 x = layers.Conv2D( 32 , 3 , strides= 2 , padding= "same" , activation= "relu" )(x)
 x = 層數(shù).MaxPooling2D()(x)
 x = layers.Conv2D( 64 , 3 , padding= "same" , activation= "relu" )(x)
 x = 層數(shù).MaxPooling2D()(x)
 x = 層.Flatten()(x)
 x = 層數(shù).Dropout( 0.5 )(x)


 output = layers.Dense(units=num_classes, activation= "softmax" )(x)
  return keras.Model(inputs, outputs)

訓(xùn)練模型

一旦我們設(shè)計了一個模型,我們就可以訓(xùn)練它了。最初,人工智能模型會做出隨機預(yù)測。預(yù)測是與標(biāo)簽相關(guān)的概率,在我們的例子中是石頭、紙或剪刀。我們的 AI 告訴我們它將圖像視為每個標(biāo)簽的可能性有多大。因為人工智能在一開始就在猜測標(biāo)簽,所以它經(jīng)常會弄錯標(biāo)簽。將預(yù)測標(biāo)簽與真實標(biāo)簽進行比較后進行訓(xùn)練。預(yù)測錯誤會導(dǎo)致網(wǎng)絡(luò)中神經(jīng)元之間的更新。這種學(xué)習(xí)形式稱為梯度下降。因為我們在 TensorFlow 中構(gòu)建了模型,所以訓(xùn)練就像一、二、三一樣簡單。下面,您會看到訓(xùn)練期間產(chǎn)生的輸出——準(zhǔn)確度(訓(xùn)練集)和驗證準(zhǔn)確度(測試集)越高越好!

時期1 / 6 480 / 480 [===============================] - 17秒34毫秒/步 - 損失:0.4738 - 準(zhǔn)確度:0.6579 - val_loss:0.3744 - val_accuracy:0.8718 
Epoch 2 / 6 216 / 480 [============>....... ] - ETA:7秒 - 損失:0.2753 - 準(zhǔn)確度:0.8436


在訓(xùn)練期間,可能會出現(xiàn)多個問題。最常見的問題是過擬合。當(dāng)模型一遍又一遍地暴露在相同的例子中時,它會開始記住訓(xùn)練數(shù)據(jù),而不是學(xué)習(xí)底層模式。當(dāng)然,您從學(xué)校記得理解比記憶更好!在某些時候,訓(xùn)練數(shù)據(jù)的準(zhǔn)確率可能會繼續(xù)上升,而測試集的準(zhǔn)確率則不會。這是過度擬合的明確指標(biāo)。

轉(zhuǎn)換模型

經(jīng)過訓(xùn)練,我們得到一個 TensorFlow 格式的 AI 模型。由于 ESP-EYE 無法解釋這種格式,我們將模型更改為微處理器可讀格式。我們從轉(zhuǎn)換為 TfLite 模型開始。TfLite 是一種更緊湊的 TensorFlow 格式,它使用量化導(dǎo)致模型尺寸減小。TfLite 常用于世界各地的邊緣設(shè)備,例如智能手機或平板電腦。最后一步是將 TfLite 模型轉(zhuǎn)換為 C 數(shù)組,因為微控制器無法直接解釋 TfLite。

部署模型

現(xiàn)在我們可以將模型部署到微處理器上。我們唯一需要做的就是將新的 C 數(shù)組放入預(yù)期的文件中。替換 C 數(shù)組的內(nèi)容,不要忘記替換文件末尾的數(shù)組長度變量。我們提供了一個腳本來簡化此操作。就是這樣!

嵌入式環(huán)境

讓我們回顧一下 MCU 上發(fā)生的事情。在設(shè)置過程中,解釋器被配置為我們圖像的形狀。

//初始化解釋器


靜態(tài)tflite::MicroInterpreter static_interpreter (
 模型、解析器、tensor_arena、kTensorArenaSize、error_reporter);
解釋器 = &static_interpreter;
模型輸入=解釋器->輸入(0);
模型輸出=解釋器->輸出(0);

// 斷言真實輸入與期望輸入匹配
if ((model_input->dims->size != 4) || // 形狀 (1, 96, 96, 1) 的張量具有昏暗 4 
 (model_input->dims->data[ 0] != 1) || // 每批 1 個 img 
 (model_input->dims->data[1] != 96) || // 96 x 像素
 (model_input->dims->data[2] != 96 ) || // 96 y 像素
 (model_input->dims->data[3] != 1) || // 1 通道(灰度) 
 (model_input->type != kTfLiteFloat32)) { // 單個數(shù)據(jù)的類型點,這里是一個像素
 error_reporter->Report( "Bad input tensor parameters in model\n" );
 返回;
}

設(shè)置完成后,捕獲的圖像被發(fā)送到模型,在模型中進行手勢預(yù)測。

// 從攝像頭讀取圖像到一維數(shù)組
uint8_t img[dim1*dim2*dim3]
 if (kTfLiteOk != GetImage(error_reporter, dim1, dim2, dim3, img)) {
 TF_LITE_REPORT_ERROR(error_reporter, "圖像捕獲失敗。" );
}

// 將圖像寫入模型
std :: vector < uint8_t > img_vec(img, img + dim1*dim2*dim3);
std ::向量< float_t > img_float(img_vec.begin(), img_vec.end());
標(biāo)準(zhǔn)::copy(img_float.begin(), img_float.end(), model_input->data.f);

// 應(yīng)用推理
TfLiteStatus invoke_status = 解釋器->Invoke();
}

然后模型返回每個手勢的概率。由于概率數(shù)組只是一系列介于 0 和 1 之間的值,因此需要進行一些解釋。我們認(rèn)為識別出的手勢是概率最高的手勢?,F(xiàn)在我們通過將識別的手勢與 AI 的動作進行比較來處理解釋,并確定誰贏得了回合。你沒有機會了!

// 每個類的概率

浮動紙=模型輸出->數(shù)據(jù).f[0];

浮動巖石 = model_output->data.f[1];
浮動剪刀 = model_output->data.f[2];

下面的可愛圖表說明了 MCU 上的步驟。出于我們的目的,不需要對微控制器進行預(yù)處理。

點擊查看完整大小的圖片
pYYBAGLVcjGAf0VRAAEx3Sbbuw4042.png

展開示例

來個挑戰(zhàn)怎么樣?人生的新目標(biāo)?想要給老朋友留下深刻印象或?qū)ふ倚屡笥??通過添加蜥蜴和史波克,將石頭、紙、剪刀提升到一個新的水平。你的 AI 朋友將是一項更接近世界統(tǒng)治的技能。好吧,首先你應(yīng)該看看我們的石頭、紙、剪刀存儲庫,并能夠復(fù)制上述步驟。自述文件將幫助您了解詳細(xì)信息。下圖向您展示了游戲的運作方式。您需要添加兩個額外的手勢和一些新的輸贏條件。

點擊查看完整大小的圖片
poYBAGLVcjuAKygqAAUdB--xUzc385.jpg

開始你自己的項目

如果您喜歡這篇文章并想開始自己的項目,我們會為您提供一個模板項目,它使用與我們的石頭、紙、剪刀項目相同的簡單管道。您可以在此處找到模板。不要猶豫,通過社交媒體向我們展示您的項目。我們很想看看你能創(chuàng)造什么!

您可以在這里和那里找到有關(guān) TinyML 的更多信息。Pete Warden 的書是一個很好的資源。


審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16885

    瀏覽量

    349914
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    29805

    瀏覽量

    268102
收藏 人收藏

    評論

    相關(guān)推薦

    利用TinyMLMCU實現(xiàn)AI/ML推論工作

    眾所皆知,MCU運算力有限(相對于IoT網(wǎng)關(guān)、手機、計算機),而AI/ML向來耗用運算力,如此TinyML的技術(shù)主張豈不矛盾?事實MCU的運算力也非如刻板印象中那樣一直不堪,
    發(fā)表于 09-20 11:10 ?2111次閱讀

    【先楫HPM5361EVK開發(fā)板試用體驗】:4、TinyML測試(1)

    1、TinyML簡介 TinyML是指在邊緣設(shè)備運行的機器學(xué)習(xí)模型,通常是在資源受限的嵌入式系統(tǒng)運行的輕量級模型。這些設(shè)備可以是智能手機、傳感器、微控制器或其他嵌入式設(shè)備。
    發(fā)表于 12-22 10:12

    何在嵌入式系統(tǒng)或快速原型構(gòu)建板實現(xiàn)即交即用式部署

    何在嵌入式系統(tǒng)或快速原型構(gòu)建板實現(xiàn)即交即用式部署?
    發(fā)表于 11-22 07:25

    何在esp8266 Node MCU的硬件上部署LVGL

    前言本文,介紹如何在esp8266 Node MCU的硬件上部署LVGL項目。使用的屏幕使用型號是ST7735 TFT 128x128屏幕。(一)arduinoIDE esp8266環(huán)境配置自行
    發(fā)表于 12-08 07:15

    什么是TinyML?微型機器學(xué)習(xí)

    Lite Micro)。圖4顯示了 TF Lite Micro TinyML 的通用工作流。是專門為在資源有限的設(shè)備上進行機器學(xué)習(xí)任務(wù)而設(shè)計的,其中以 mcu 為重點。TF Lite Micro
    發(fā)表于 04-12 10:20

    何在AT32F系列MCU使用FreeRTOS

    本指導(dǎo)手冊描述了如何在AT32F系列MCU使用FreeRTOS。FreeRTOS是一款開源的嵌入式實時操作系統(tǒng),目前在各種嵌入式應(yīng)用中應(yīng)用廣泛。本指導(dǎo)手冊包括FreeRTOS系統(tǒng)移植
    發(fā)表于 10-24 07:46

    何在AT32 MCU使用FPU功能

    How to use FPU描述了如何在AT32 MCU使用FPU功能。
    發(fā)表于 10-24 07:45

    何在云平臺上實現(xiàn)應(yīng)用的快速部署?

    應(yīng)用如何在云平臺上實現(xiàn)應(yīng)用的快速部署快速更新,實時監(jiān)控。云計算時代要求運維人員能夠自動化地部署應(yīng)用程序和所有支持的軟件和軟件包,然后通過生
    的頭像 發(fā)表于 10-13 16:37 ?4751次閱讀

    何在MCU上進行實際的部署

    本篇將是系列文章的最后一篇,在MCU上進行實際的部署。 小編就不再給大家復(fù)習(xí)歷史了,直接開始正題。如果想溫習(xí)前兩部分內(nèi)容,請點擊此處和此處。
    的頭像 發(fā)表于 08-11 09:02 ?1412次閱讀

    MCUTinyML變速箱故障預(yù)測開源分享

    電子發(fā)燒友網(wǎng)站提供《MCUTinyML變速箱故障預(yù)測開源分享.zip》資料免費下載
    發(fā)表于 10-27 16:21 ?3次下載
    <b class='flag-5'>MCU</b><b class='flag-5'>上</b>的<b class='flag-5'>TinyML</b>變速箱故障預(yù)測開源分享

    TinyML:ESP32 CAM和TFT的實時圖像分類

    電子發(fā)燒友網(wǎng)站提供《TinyML:ESP32 CAM和TFT的實時圖像分類.zip》資料免費下載
    發(fā)表于 02-08 10:28 ?3次下載
    <b class='flag-5'>TinyML</b>:ESP32 CAM和TFT<b class='flag-5'>上</b>的實時圖像分類

    何在FTDI FT2232H使用快速串行模式

    電子發(fā)燒友網(wǎng)站提供《如何在FTDI FT2232H使用快速串行模式.zip》資料免費下載
    發(fā)表于 06-19 14:20 ?2次下載
    如<b class='flag-5'>何在</b>FTDI FT2232H<b class='flag-5'>上</b>使用<b class='flag-5'>快速</b>串行模式

    何在KV260快速體驗Vitsi AI圖像分類示例程序

    本文首先將會對Vitis統(tǒng)一軟件平臺和Vitsi AI進行簡單介紹,然后介紹如何在KV260上部署DPU鏡像,最后在KV260 DPU鏡像運行Vitis AI自帶的圖像分類示例。通過本文,你將會
    的頭像 發(fā)表于 09-12 10:02 ?1420次閱讀
    如<b class='flag-5'>何在</b>KV260<b class='flag-5'>上</b><b class='flag-5'>快速</b>體驗Vitsi AI圖像分類示例程序

    何在AT32 MCU使用FPU功能

    何在AT32 MCU使用FPU功能
    的頭像 發(fā)表于 11-01 17:18 ?3983次閱讀
    如<b class='flag-5'>何在</b>AT32 <b class='flag-5'>MCU</b><b class='flag-5'>上</b>使用FPU功能

    何在DRA821U使用Linux實現(xiàn)快速引導(dǎo)

    電子發(fā)燒友網(wǎng)站提供《如何在DRA821U使用Linux實現(xiàn)快速引導(dǎo).pdf》資料免費下載
    發(fā)表于 09-03 10:11 ?0次下載
    如<b class='flag-5'>何在</b>DRA821U<b class='flag-5'>上</b>使用Linux實現(xiàn)<b class='flag-5'>快速</b>引導(dǎo)