通過對(duì)TinyML領(lǐng)域基礎(chǔ)概念的堅(jiān)實(shí)理解,我們將把我們的知識(shí)應(yīng)用到現(xiàn)實(shí)生活中的項(xiàng)目中。nbsp;
在深入研究這個(gè)項(xiàng)目之前,我想說明一下,這個(gè)項(xiàng)目將使用現(xiàn)有的數(shù)據(jù)集,Google Colabs和由Pete Warden和哈佛大學(xué)TinyML團(tuán)隊(duì)開發(fā)的Arduino代碼。為了在我們的微控制器單元(MCU)上部署,他們的資源將為我們提供:
訪問數(shù)據(jù)集
模型架構(gòu)
培訓(xùn)腳本
量化腳本
評(píng)價(jià)工具
Arduino代碼
作為免責(zé)聲明,我們沒有開發(fā)絕大多數(shù)代碼,我們不擁有它的權(quán)利。nbsp;
所有的說和做,這個(gè)項(xiàng)目假設(shè)編程和電子的基本理解。
TinyML項(xiàng)目-構(gòu)建語(yǔ)音命令機(jī)器人子系統(tǒng)
在這個(gè)項(xiàng)目中,我們將構(gòu)建一個(gè)簡(jiǎn)單的機(jī)器人子系統(tǒng),使用機(jī)器學(xué)習(xí)來響應(yīng)語(yǔ)音命令。微控制器將收集來自麥克風(fēng)的輸入,使用ML來監(jiān)聽喚醒詞,如“向前”和“向后”,然后在命令的方向上驅(qū)動(dòng)一個(gè)小型直流電機(jī)。
由于已經(jīng)有很多關(guān)于用微控制器控制電機(jī)的好信息,本文將主要集中在演示如何:
使用現(xiàn)有資源使用TensorFlow Lite for Microcontrollers訓(xùn)練ML模型
量化并將模型部署到Arduino Nano 33 BLE Sense
在Arduino上運(yùn)行本地推理,并讓它控制由標(biāo)準(zhǔn)電池電源(AA或9 V)供電的電機(jī)
帶聲控電機(jī)的TinyML機(jī)器人子系統(tǒng)的BOM
在下面的表1中,您將找到此項(xiàng)目的物料清單(BOM)。
表1.
BOM例如TInyML聲控電機(jī)項(xiàng)目。整個(gè)項(xiàng)目將花費(fèi)不到30美元。
部分 | 例如 | 費(fèi)用 * 美元 | 注意到 |
---|---|---|---|
Arduino Nano 33 BLE Sense | 鏈路 | 二十二塊五 | 這是一個(gè)標(biāo)準(zhǔn)的TinyML開發(fā)設(shè)備。 |
L293D Dual H-Bridge Motor Driver |
鏈路 | 四元五角 | 我用這個(gè)IC,因?yàn)槲乙呀?jīng)有它躺在周圍。在您的項(xiàng)目中,這可以由您選擇的H橋代替。 |
直流電機(jī)L | 鏈路 | 一塊九毛五 | 我使用的是Elegoo Uno R3入門套件中的直流電機(jī)。任何便宜的5 VDC電機(jī)將為這個(gè)項(xiàng)目工作。 |
3x 1k電阻器 | 0.30美元 | ||
4x AA電池和連接器 | 鏈路 | 0.58美元 | 這個(gè)項(xiàng)目的輸入電壓范圍可以從4.5到21 V。在我的項(xiàng)目中,我使用了4節(jié)AA電池(~6 V),因?yàn)槲矣兴鼈儯谶@個(gè)范圍內(nèi)的9V或其他電源將工作。 |
(* 注:所有費(fèi)用均自2021年9月起計(jì)算)
對(duì)于這個(gè)特定的項(xiàng)目,我從手頭已有的部件中選擇了大部分部件,如圖1所示。
圖1.
我在這個(gè)項(xiàng)目中使用的部件
在這個(gè)項(xiàng)目中,你將有很大的自由選擇其他類似的部分來復(fù)制這個(gè)項(xiàng)目。nbsp;
設(shè)置TinyML軟件Arduino納米33 BLE感
要在我們的Arduino Nano 33 BLE Sense上運(yùn)行TinyML腳本,我們需要安裝一些包和依賴項(xiàng)。如果您的
安裝完成后,我們需要安裝Arduino Nano 33 BLE Sense的板文件。要執(zhí)行此操作,請(qǐng)從IDE中轉(zhuǎn)到Tools → Board → Boards Manager。在這里,搜索“mbed nano”并安裝“Arduino Mbed OS Nano Boards.“
如下圖2所示。
圖2.
我們需要安裝Nano 33 BLE Sense的板文件
在此之后,我們需要安裝此項(xiàng)目所需的庫(kù)。要執(zhí)行此操作,請(qǐng)轉(zhuǎn)到工具→管理庫(kù)。從那里,搜索并下載以下庫(kù):
Arduino_TensorFlowLite
哈佛_TinyMLx
完成了這些,我們就可以開始這個(gè)項(xiàng)目了!
步驟1:使用TensorFlow Lite訓(xùn)練機(jī)器學(xué)習(xí)模型
一般來說,ML工作流將從收集和標(biāo)記數(shù)據(jù)集開始開始,然后從頭開始設(shè)計(jì)模型架構(gòu)。為了時(shí)間和簡(jiǎn)單起見,我們將通過利用一些現(xiàn)成的數(shù)據(jù)集和預(yù)先訓(xùn)練的關(guān)鍵字識(shí)別模型來“作弊”,這兩個(gè)模型都是由Pete Warden開發(fā)的。為了利用這些資源并訓(xùn)練我們的模型,我們將使用哈佛大學(xué)TinyML團(tuán)隊(duì)開發(fā)的Google Colab中的腳本。nbsp;
Google Colab可以在這里找到。
首先,確保您在Colab中使用圖形處理單元(GPU)運(yùn)行時(shí)(如圖3所示),因?yàn)檫@將顯著加快訓(xùn)練時(shí)間。一旦你這樣做了,所有的代碼都可以按原樣使用了。nbsp;只需點(diǎn)擊每個(gè)單元格左上角的黑色"運(yùn)行"按鈕,按順序運(yùn)行每個(gè)單元格。& nbsp;
圖3.
您必須確保在Colab中使用GPU運(yùn)行時(shí)
我們使用的模型架構(gòu)是tiny_conv,我們將總共訓(xùn)練15,000步。前12,000個(gè)將使用0.001的學(xué)習(xí)率,最后3,000個(gè)將使用0.0001的學(xué)習(xí)率。此外,我們還將訓(xùn)練模型來理解“forwards”和“backwards”這兩個(gè)詞,Warden的關(guān)鍵字定位(KWS)數(shù)據(jù)集已經(jīng)包含了這兩個(gè)詞。這可以在圖4中看到。
圖4
.這是Colab中的一部分,我們?cè)谶@里定義要訓(xùn)練的單詞、訓(xùn)練參數(shù)和模型架構(gòu)
請(qǐng)記住,培訓(xùn)可能需要幾個(gè)小時(shí)才能完成,因此請(qǐng)確保您的計(jì)算機(jī)已插入電源,并且您的互聯(lián)網(wǎng)連接穩(wěn)定。
步驟2:量化和評(píng)估ML模型
訓(xùn)練完成后,您將到達(dá)Colab中標(biāo)記為步驟2的點(diǎn)。這里是量化開始的地方。
首先,我們凍結(jié)我們的模型,這是將所有相關(guān)的訓(xùn)練結(jié)果(圖,權(quán)重等)組合到一個(gè)文件中進(jìn)行推理的過程。一旦我們有了一個(gè)凍結(jié)的模型,我們將把模型轉(zhuǎn)換成一個(gè)TFLite模型。哈佛建立的腳本使這個(gè)過程相對(duì)容易,輸出的TFLite模型應(yīng)該是完全量化的。最終的模型大小應(yīng)該在20 kB以下。
當(dāng)完全轉(zhuǎn)換后,Colab有腳本可用于比較量化和非量化模型之間的準(zhǔn)確性。如果一切正常,準(zhǔn)確度應(yīng)該幾乎相同。
步驟3:將機(jī)器學(xué)習(xí)模型部署到Arduino
在繼續(xù)之前,我想讓你知道你可以在這里找到我的完整代碼作為參考。
一旦我們有了一個(gè)完全量化和轉(zhuǎn)換的TensorFlow Lite模型,我們需要將其部署到Arduino。我們將修改哈佛預(yù)先存在的micro_speech示例,您可以在Arduino IDE中找到:文件→示例→不兼容→哈佛_TinyMLx → micro_speech。nbsp;
您可能會(huì)有點(diǎn)不知所措,因?yàn)檫@段代碼中有很多內(nèi)容;但是,出于本項(xiàng)目的目的,我們不需要關(guān)注其中的大部分內(nèi)容。
首先,我們必須輸入新的TFLite Micro模型來代替當(dāng)前在micro_speech示例中使用的模型。nbsp;在Colab的最后一個(gè)單元格中,我們應(yīng)該輸出一個(gè)十六進(jìn)制字符的大矩陣,如圖5所示。這是我們的TensorFlow Lite for Microcontrollers模型,將用于我們的Arduino代碼。nbsp;
圖5.
Google Colab輸出的TensorFlow Lite Micro模型片段
在micro_features_model.CPP文件中,僅復(fù)制并粘貼Colab中的十六進(jìn)制字符,以取代文件中已有的字符。在Colab代碼的最底部,應(yīng)該有一行寫著unsigned int g_model_len,后面跟著一個(gè)數(shù)字。最后一件事是從Colab復(fù)制這個(gè)數(shù)字,并將其插入Arduino代碼文件底部當(dāng)前用于const int g_model_len的數(shù)字。
在此之后,與模型相關(guān)的唯一更改是在micro_features_micro_model_settings.CPP文件中。如圖6所示,將類別標(biāo)簽"yes"和"no"更改為"forwards"和"backward"。確保你不碰"沉默"或"未知"的標(biāo)簽。
圖6.
我們必須改變我們的新單詞的預(yù)期類別標(biāo)簽
步驟4:解釋推理并編寫電機(jī)驅(qū)動(dòng)程序代碼
此時(shí),TFLite Micro模型應(yīng)該按預(yù)期運(yùn)行,現(xiàn)在我們需要驅(qū)動(dòng)電機(jī)以響應(yīng)TinyML推理輸出。為此,我們將修改arduino_command_responder. CPP文件。
如圖7所示,在文件的頂部,我們將添加幾個(gè)#define語(yǔ)句來定義Arduino上的哪些引腳將連接到電機(jī)驅(qū)動(dòng)器上的哪些引腳。對(duì)于我們的項(xiàng)目,我們將使用D2作為ENABLE信號(hào),D3作為Driver1A輸入,D4作為Driver2A輸入。請(qǐng)確保還將這些引腳設(shè)置為RespondToCommand()函數(shù)中的pinMode()函數(shù)的輸出。
圖7.
我們需要定義引腳,將其設(shè)置為輸出,并編寫簡(jiǎn)單的motorCTRL函數(shù)。
從那里我們可以定義我們的運(yùn)動(dòng)控制功能。這個(gè)函數(shù)接受一個(gè)速度(我們不會(huì)為了這個(gè)項(xiàng)目的目的而改變它),以及一個(gè)Driver1A和Driver2A的邏輯值。基本上,如果驅(qū)動(dòng)程序1A是高,驅(qū)動(dòng)程序2A是低,電機(jī)將在一個(gè)方向旋轉(zhuǎn)。如果反過來,我們的馬達(dá)就會(huì)朝相反的方向旋轉(zhuǎn)。
現(xiàn)在剩下的唯一事情就是更改代碼中已經(jīng)存在的命令響應(yīng)。如圖8所示,我們將更改命令響應(yīng),以便如果找到的命令的第一個(gè)字符是"f"(即找到的命令是"Forward"),它將使電機(jī)向前旋轉(zhuǎn)。我們對(duì)"后退"命令執(zhí)行相同的操作。
圖8.
我們將根據(jù)ML模型找到的命令控制電機(jī)向前或向后移動(dòng)。
步驟5:構(gòu)建電機(jī)電路-電機(jī)驅(qū)動(dòng)器電路
有了所有的軟件的方式,我們現(xiàn)在可以建立我們的電機(jī)驅(qū)動(dòng)器電路。上面列出了BOM,示意圖如下圖9所示。
圖9.
我們的馬達(dá)驅(qū)動(dòng)電路。
我們使用4.5到21 V的電壓源為Arduino和L293D供電。接線中的D4連接到電機(jī)驅(qū)動(dòng)器2A輸入端,D3連接到電機(jī)驅(qū)動(dòng)器1A輸入端,D2連接到EN 1,2。我們?cè)诿總€(gè)信號(hào)上都有一個(gè)1 k Ω下拉電阻,以確保始終定義我們的狀態(tài),為了安全起見,我們還有一個(gè)0.1 μ F電容用于去耦。
審核編輯 黃宇
-
機(jī)器人
+關(guān)注
關(guān)注
210文章
28231瀏覽量
206614 -
BLE
+關(guān)注
關(guān)注
12文章
653瀏覽量
59345 -
語(yǔ)音控制
+關(guān)注
關(guān)注
5文章
481瀏覽量
28233 -
Arduino
+關(guān)注
關(guān)注
187文章
6464瀏覽量
186676 -
TinyML
+關(guān)注
關(guān)注
0文章
42瀏覽量
1220
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論