該項(xiàng)目使用在ESP32上運(yùn)行的TensorFlow Lite創(chuàng)建一個(gè)語音控制的機(jī)器人。它可以響應(yīng)簡單的單字命令:“左”,“右”,“前進(jìn)”和“后退”。
硬件部件:
樂鑫ESP32S× 1個(gè)
伺服模塊(通用)× 2
通用車輪× 2
Gerneric USB移動(dòng)電源× 1個(gè)
I2S麥克風(fēng)板× 1個(gè)
軟件應(yīng)用程序和在線服務(wù):
PlatformIO IDE
我在Google的Commands數(shù)據(jù)集上使用TensorFlow訓(xùn)練了一個(gè)模型。其中包含大約20個(gè)單詞,我選擇了一個(gè)很小的單詞子集-足以控制機(jī)器人的單詞,但數(shù)量不多,以至于模型變得難以管理。
為了生成訓(xùn)練數(shù)據(jù),我們將WAV文件加載到其中,并從每個(gè)文件中提取頻譜圖。
為了獲得足夠的數(shù)據(jù)用于命令詞,我已經(jīng)多次重復(fù)這些詞,以改變音頻的位置并添加隨機(jī)噪聲-這為我們的神經(jīng)網(wǎng)絡(luò)提供了更多訓(xùn)練數(shù)據(jù),并應(yīng)該有助于其推廣。
幾個(gè)單詞-前進(jìn)和后退的示例更少,因此我更經(jīng)常重復(fù)這些示例。
我最后得到了一個(gè)相當(dāng)簡單的卷積神經(jīng)網(wǎng)絡(luò),其中包含2個(gè)卷積層,然后是一個(gè)完全連接的層,然后是一個(gè)輸出層。
當(dāng)我們試圖識別多個(gè)不同的單詞時(shí),我們使用“ softmax”激活函數(shù),并使用“ CategoricalCrossentropy”作為我們的損失函數(shù)。
訓(xùn)練模型后,我得到的訓(xùn)練數(shù)據(jù)準(zhǔn)確度不到92%,而驗(yàn)證數(shù)據(jù)的準(zhǔn)確度則超過92%。測試數(shù)據(jù)集為我們提供了類似的性能水平。
查看混淆矩陣,我們可以看到它主要是將單詞誤分類為無效單詞。這對于我們的用例來說是相當(dāng)不錯(cuò)的,因?yàn)檫@應(yīng)該意味著機(jī)器人會(huì)誤判誤報(bào)而不是誤報(bào)。
由于模型似乎不適合,我已經(jīng)在完整的數(shù)據(jù)集上對其進(jìn)行了訓(xùn)練。這給了我們大約94%的最終精度,而在混淆矩陣上我們看到了更好的結(jié)果。但是,可能會(huì)有些過度擬合。
對于實(shí)際的機(jī)器人,我構(gòu)建了一個(gè)非常簡單的兩輪機(jī)器人。為了驅(qū)動(dòng)車輪,我使用了兩個(gè)連續(xù)的伺服系統(tǒng)和小型動(dòng)力單元。它具有相當(dāng)寬的軸距,因?yàn)閹в蠩SP32的面包板非常大。
為了在ESP32上運(yùn)行TensorFlow模型,我使用了TensorFlow Lite。我將其包裝在自己的代碼中,使其更易于使用。
要讀取音頻,我們使用I2S-它可以從模擬麥克風(fēng)的內(nèi)置ADC讀取,也可以直接從I2S數(shù)字麥克風(fēng)讀取。
命令檢測器由一個(gè)任務(wù)運(yùn)行,該任務(wù)等待音頻樣本可用,然后為命令檢測器提供服務(wù)。
我們的命令檢測器將音頻數(shù)據(jù)后退一秒鐘,獲取頻譜圖,然后運(yùn)行預(yù)測。
為了提高檢測的魯棒性,我們在多個(gè)音頻片段上對預(yù)測進(jìn)行了采樣,并且還拒絕了在先前檢測的一秒鐘內(nèi)發(fā)生的任何檢測。
如果我們檢測到命令,則將其排隊(duì)等待命令處理器處理。
我們的命令處理器運(yùn)行一個(gè)任務(wù),該任務(wù)偵聽此隊(duì)列中的命令。
當(dāng)命令到達(dá)時(shí),它將更改發(fā)送到電動(dòng)機(jī)的PWM信號,以停止電動(dòng)機(jī)或設(shè)置所需的方向。
為了向前移動(dòng),我們將兩個(gè)電機(jī)都向前驅(qū)動(dòng),對于向后,我們將兩個(gè)電機(jī)都向后驅(qū)動(dòng)。對于左,我們反轉(zhuǎn)左電動(dòng)機(jī)并向前驅(qū)動(dòng)右電動(dòng)機(jī),而對于右,我們進(jìn)行相反的,右電動(dòng)機(jī)反向,左電動(dòng)機(jī)向前。
對于我們的連續(xù)伺服器,1500us的占空比將使它們停止,低于此值應(yīng)使它們反向,而高于此值將使它們向前驅(qū)動(dòng)。
我略微調(diào)整了右馬達(dá)正向值的值,因?yàn)樗男D(zhuǎn)速度不如左馬達(dá)快,這導(dǎo)致機(jī)器人轉(zhuǎn)向一側(cè)。
請注意,因?yàn)槲覀冇姓_的電機(jī)上下顛倒驅(qū)動(dòng)它,所以我們將其反向運(yùn)行,而將其向后驅(qū)動(dòng),則我們將其向前驅(qū)動(dòng)。
您可能需要校準(zhǔn)自己的電動(dòng)機(jī)才能使機(jī)器人直線運(yùn)動(dòng)。
它運(yùn)作良好!
它偶爾會(huì)混淆單詞并左右混合。
責(zé)任編輯:pj
-
機(jī)器人
+關(guān)注
關(guān)注
210文章
28231瀏覽量
206614 -
檢測器
+關(guān)注
關(guān)注
1文章
860瀏覽量
47654 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6909瀏覽量
88849 -
頻譜
+關(guān)注
關(guān)注
7文章
878瀏覽量
45584
發(fā)布評論請先 登錄
相關(guān)推薦
評論