chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

如何將基于Arm Cortex-M的微控制器用于本地設(shè)備端ML

Tensorflowers ? 來(lái)源:TensorFlow ? 作者:TensorFlow ? 2021-11-08 11:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

通過(guò)機(jī)器學(xué)習(xí),開(kāi)發(fā)者工程師能夠在應(yīng)用中解鎖新的功能。您可以為應(yīng)用所需的分類(lèi)任務(wù)收集大量的數(shù)據(jù),并訓(xùn)練一個(gè) ML 模型從數(shù)據(jù)中的模式里學(xué)習(xí),而不是明確地定義計(jì)算機(jī)需要執(zhí)行的指令和規(guī)則。

訓(xùn)練通常在計(jì)算機(jī)上的云端進(jìn)行,而此類(lèi)計(jì)算機(jī)會(huì)配備一個(gè)或多個(gè) GPU。完成模型的訓(xùn)練之后,根據(jù)模型大小,可以將其部署在各種設(shè)備上進(jìn)行推理。這些設(shè)備的范圍很廣,從云端擁有數(shù)千兆字節(jié)內(nèi)存的大型計(jì)算機(jī),到通常只有數(shù)千字節(jié)內(nèi)存的微控制器(或 MCU),悉數(shù)在內(nèi)。

微控制器是低功率、獨(dú)立、經(jīng)濟(jì)高效的計(jì)算機(jī)系統(tǒng),日常使用的設(shè)備(如微波爐、電動(dòng)牙刷或智能門(mén)鎖)中均有嵌入?;谖⒖刂破鞯南到y(tǒng)通常通過(guò)一個(gè)或多個(gè)傳感器(例如:按鈕、麥克風(fēng)、運(yùn)動(dòng)傳感器)與周?chē)h(huán)境互動(dòng),并使用一個(gè)或多個(gè)執(zhí)行器(例如:LED、電機(jī)、揚(yáng)聲器)來(lái)執(zhí)行動(dòng)作。

微控制器還具有隱私方面的優(yōu)勢(shì),可以在設(shè)備上開(kāi)展本地推理,而無(wú)需向云端發(fā)送任何數(shù)據(jù)。對(duì)于依靠電池運(yùn)行的設(shè)備來(lái)說(shuō),微控制器還具有能耗方面的優(yōu)勢(shì)。

在本文中,我們將介紹如何將基于 Arm Cortex-M 的微控制器用于本地設(shè)備端 ML,以檢測(cè)周?chē)h(huán)境中的音頻事件。這是一篇教程式的文章,我們將指導(dǎo)您訓(xùn)練一個(gè)基于 TensorFlow 的音頻分類(lèi)模型,來(lái)檢測(cè)火災(zāi)警報(bào)的聲音。

Arm Cortex-M

https://developer.arm.com/ip-products/processors/cortex-m

我們將介紹如何使用適用于微控制器的 TensorFlow Lite(具有 Arm CMSIS-NN 加速內(nèi)核),將 ML 模型部署到基于 Arm Cortex-M0+ 的微控制器板上,來(lái)進(jìn)行本地設(shè)備端 ML 推理。

適用于微控制器的 TensorFlow Lite

https://tensorflow.google.cn/lite/microcontrollers

CMSIS-NN

https://arm-software.github.io/CMSIS_5/NN/html/index.html

Arm Cortex-M0+

https://developer.arm.com/ip-products/processors/cortex-m/cortex-m0-plus

Arm 的 CMSIS-DSP 庫(kù)為 Arm Cortex-M 處理器提供了優(yōu)化的數(shù)字信號(hào)處理 (DSP) 功能實(shí)現(xiàn),同時(shí)也將用于推理前從實(shí)時(shí)音頻數(shù)據(jù)中提取特征。

CMSIS-DSP

https://arm-software.github.io/CMSIS_5/DSP/html/index.html

雖然本指南側(cè)重于介紹火災(zāi)警報(bào)聲音的檢測(cè),但也可以適用于其他聲音分類(lèi)任務(wù)。您可能還需要調(diào)整特征提取階段和/或調(diào)整 ML 模型架構(gòu),以適應(yīng)您的用例。

在 Google Colab 上可查看本教程的互動(dòng)版本,本指南的所有技術(shù)資料都可在 GitHub 上找到。

Google Colab

https://colab.research.google.com/github/ArmDeveloperEcosystem/ml-audio-classifier-example-for-pico/blob/main/ml_audio_classifier_example_for_pico.ipynb

GitHub

https://github.com/ArmDeveloperEcosystem/ml-audio-classifier-example-for-pico

事前準(zhǔn)備

開(kāi)發(fā)環(huán)境

Google Colab

https://colab.research.google.com/notebooks/

硬件

需要下列開(kāi)發(fā)板之一,這些開(kāi)發(fā)板均依托于 2021 年初發(fā)布的 Raspberry Pi 的 RP2040 MCU 芯片構(gòu)建而成。

Raspberry Pi 的 RP2040 MCU

“https://www.raspberrypi.org/products/rp2040/

SparkFun RP2040 MicroMod 和 MicroMod ML 載板

此開(kāi)發(fā)板很適合剛接觸電子行業(yè)和微控制器的人。不需要電烙鐵,不需要掌握焊接技術(shù),也不需要掌握在電路板上接線(xiàn)的技術(shù)。

SparkFun MicroMod RP2040 處理器。它是操作的大腦,具有 Raspberry Pi 的 RP2040 MCU 和 16MB 的閃存

SparkFun MicroMod RP2040 處理器

https://www.sparkfun.com/products/17720

SparkFun MicroMod 機(jī)器學(xué)習(xí)載板。它支持 USB 連接,并附帶內(nèi)置的麥克風(fēng)、IMU 和攝像頭連接器

SparkFun MicroMod 機(jī)器學(xué)習(xí)載板

https://www.sparkfun.com/products/16400

一條 USB-C 數(shù)據(jù)線(xiàn),用于連接開(kāi)發(fā)板和計(jì)算機(jī)

一把十字螺絲刀

Raspberry Pi Pico 和 PDM 麥克風(fēng)板

如果您已掌握(或者想學(xué)習(xí))焊接技術(shù),那么這個(gè)選項(xiàng)非常適合您。它需要用到電烙鐵,還需要了解如何用電子元件在電路板上布線(xiàn)。您將需要:

Raspberry Pi Pico

Raspberry Pi Pico

https://www.raspberrypi.org/products/raspberry-pi-pico/

Adafruit PDM MEMS 麥克風(fēng)分接板

Adafruit PDM MEMS 麥克風(fēng)分接板

https://colab.research.google.com/notebooks/

半尺寸或全尺寸的電路板

跳線(xiàn)

一條 USB-B 微數(shù)據(jù)線(xiàn),用于連接開(kāi)發(fā)板和計(jì)算機(jī)

電烙鐵

以上兩個(gè)選項(xiàng)都可以幫助您使用數(shù)字麥克風(fēng)收集實(shí)時(shí)的 16 kHz 音頻,并利用開(kāi)發(fā)板的 Arm Cortex-M0+ 處理器處理音頻信號(hào),該處理器的工作頻率為 125 MHz。在 Arm Cortex-M0+ 上運(yùn)行的應(yīng)用將經(jīng)過(guò)一個(gè)數(shù)字信號(hào)處理 (DSP) 階段,從音頻信號(hào)中提取特征。然后,將提取出的特征饋送至神經(jīng)網(wǎng)絡(luò),以執(zhí)行分類(lèi)任務(wù),確定開(kāi)發(fā)板的環(huán)境中是否存在火災(zāi)警報(bào)的聲音。

數(shù)據(jù)集

我們首先使用 ESC-50:環(huán)境聲音分類(lèi)數(shù)據(jù)集,通過(guò) TensorFlow 來(lái)訓(xùn)練一個(gè)聲音分類(lèi)器(面向多個(gè)事件)。利用這個(gè)內(nèi)容廣泛的數(shù)據(jù)集進(jìn)行訓(xùn)練后,我們將使用遷移學(xué)習(xí),針對(duì)特定音頻分類(lèi)任務(wù),對(duì)分類(lèi)器進(jìn)行微調(diào)。

ESC-50:環(huán)境聲音分類(lèi)數(shù)據(jù)集

https://github.com/karolpiczak/ESC-50

遷移學(xué)習(xí)

https://developers.google.com/machine-learning/glossary#transfer-learning

利用包含 50 種聲音的 ESC-50 數(shù)據(jù)集訓(xùn)練這個(gè)模型。每個(gè)聲音類(lèi)別有 40 個(gè)音頻文件,每個(gè)文件時(shí)長(zhǎng)為 5 秒。將每個(gè)音頻文件分割成 1 秒的聲音片段,并舍棄任何包含純靜音的聲音片段。

犬吠數(shù)據(jù)集中的樣本波形

聲譜圖

不同于將時(shí)間序列數(shù)據(jù)直接傳入 TensorFlow 模型,我們會(huì)將音頻數(shù)據(jù)轉(zhuǎn)換為音頻聲譜圖表征。此舉將創(chuàng)建音頻信號(hào)頻率內(nèi)容隨時(shí)間變化的二維表征。

所用輸入音頻信號(hào)的采樣率將為 16 kHz,這意味著一秒鐘的音頻將包含 16,000 個(gè)樣本。通過(guò)使用 TensorFlow 的 tf.signal.stft(。..) 函數(shù),我們可以將 1 秒的音頻信號(hào)轉(zhuǎn)換為二維張量表征。我們將選擇 256 的幀長(zhǎng)和 128 的幀步長(zhǎng),所以此特征提取階段的輸出將為張量,其形狀為 (124, 129)。

TensorFlow 的 tf.signal.stft(。..) 函數(shù)

https://tensorflow.google.cn/api_docs/python/tf/signal/stft

犬吠的聲譜圖表征

ML 模型

從音頻信號(hào)中提取了特征之后,就可以使用 TensorFlow 的 Keras API 創(chuàng)建模型。上文有完整的代碼鏈接。模型由 8 層組成:

Keras

https://tensorflow.google.cn/guide/keras/sequential_model

1. 輸入層

2. 預(yù)處理層,將把輸入張量從 124x129x1 調(diào)整為 32x32x1

3. 歸一化層,在 -1 和 1 之間對(duì)輸入值進(jìn)行調(diào)整

4. 具有以下配置的二維卷積層:8 個(gè)過(guò)濾器,內(nèi)核大小為 8x8,跨度為 2x2,使用 ReLU 激活函數(shù)

5. 大小為 2x2 的二維最大池化層

6. 平面化層,對(duì)二維數(shù)據(jù)進(jìn)行平面化,令其變?yōu)橐痪S

7. Dropout 層,有助于減少訓(xùn)練中的過(guò)度擬合

8. 密集層,有 50 個(gè)輸出和一個(gè) softmax 激活函數(shù),用于輸出聲音屬于某一類(lèi)別的可能性(值在 0 到 1 之間)

以下為該模型的摘要:

請(qǐng)注意,此模型只有約 15,000 個(gè)參數(shù)(這相當(dāng)?。。?/p>

微調(diào)

現(xiàn)在,我們將使用遷移學(xué)習(xí),并改變模型的分類(lèi)頭(最后一個(gè)密集層),以訓(xùn)練火災(zāi)警報(bào)聲的二進(jìn)制分類(lèi)模型。我們已從 freesound.org 和 BigSoundBank.com 收集了 10 個(gè)火災(zāi)警報(bào)片段。對(duì)于非火災(zāi)警報(bào)聲,我們將使用來(lái)自 SpeechCommands 數(shù)據(jù)集的背景噪音片段。此數(shù)據(jù)集很小,但足夠入門(mén)使用。數(shù)據(jù)增強(qiáng)技術(shù)將被用于完善我們所收集的訓(xùn)練數(shù)據(jù)。

freesound.org

https://freesound.org/

BigSoundBank.com

https://bigsoundbank.com/

SpeechCommands

https://tensorflow.google.cn/datasets/catalog/speech_commands

對(duì)于實(shí)際應(yīng)用而言,務(wù)必要收集更大的數(shù)據(jù)集(您可以在 TensorFlow 的 Responsible AI 網(wǎng)站上詳細(xì)了解最佳做法)。

Responsible AI 網(wǎng)站

https://tensorflow.google.cn/responsible_ai

數(shù)據(jù)增強(qiáng)

數(shù)據(jù)增強(qiáng)是一套用于擴(kuò)大數(shù)據(jù)集規(guī)模的技術(shù)。達(dá)成此目標(biāo)的方法是,稍微修改數(shù)據(jù)集中的樣本或創(chuàng)建合成數(shù)據(jù)。在本例中使用的是音頻,并將創(chuàng)建一些函數(shù)來(lái)增加不同的樣本。我們將使用三種技術(shù):

1. 在音頻樣本中添加白噪聲

2. 在音頻中隨機(jī)添加靜音

3. 將兩個(gè)音頻樣本混合在一起

除了擴(kuò)大數(shù)據(jù)集,數(shù)據(jù)增強(qiáng)也可以在不同的(不完美的)數(shù)據(jù)樣本上訓(xùn)練模型,以此來(lái)減少過(guò)度擬合。例如,在微控制器上不可能有完美的高質(zhì)量音頻,所以此類(lèi)技術(shù)(例如添加白噪聲)可以幫助模型在麥克風(fēng)可能經(jīng)常有噪聲的情況下正常運(yùn)作。

GIF:數(shù)據(jù)增強(qiáng)如何通過(guò)增加噪聲來(lái)微調(diào)聲譜圖

(仔細(xì)看,可能不太容易看清)

特征提取

適用于微控制器的 TensorFlow Lite (TFLu) 提供了 TensorFlow 操作的一個(gè)子集,所以無(wú)法使用我們?cè)?MCU 上用于基線(xiàn)模型特征提取的 tf.signal.sft(。..) API。然而,我們可以利用 Arm 的 CMSIS-DSP 庫(kù),在 MCU 上生成聲譜圖。CMSIS-DSP 包含對(duì)浮點(diǎn)和定點(diǎn) DSP 操作的支持,這些操作均針對(duì) Arm Cortex-M 處理器進(jìn)行了優(yōu)化,其中便包括我們要向其部署 ML 模型的 Arm Cortex-M0+。Arm Cortex-M0+ 不包含浮點(diǎn)單元 (FPU),因此最好在開(kāi)發(fā)板上利用基于特征提取流水線(xiàn)的 16 位定點(diǎn) DSP。

我們可以在 Notebook 中利用 CMSIS-DSP 的 Python 封裝容器,使用 16 位定點(diǎn)數(shù)學(xué)在我們的訓(xùn)練流水線(xiàn)上進(jìn)行同樣的操作。在較高級(jí)別上,我們可以通過(guò)以下基于 CMSIS-DSP 的操作來(lái)復(fù)制 TensorFlow SFT API:

CMSIS-DSP 的 Python 封裝容器

https://github.com/ARM-software/CMSIS_5/tree/develop/CMSIS/DSP/PythonWrapper#readme

1. 使用漢寧窗 (Hanning Window) 公式和 CMSIS-DSP 的 arm_cos_f32 API,手動(dòng)創(chuàng)建一個(gè)長(zhǎng)度為 256 的漢寧窗。

arm_cos_f32

https://arm-software.github.io/CMSIS_5/DSP/html/group__cos.html#gace15287f9c64b9b4084d1c797d4c49d8

c0a5b774-3fa4-11ec-9195-dac502259ad0.png

2. 創(chuàng)建一個(gè) CMSIS-DSP arm_rfft_instance_q15 實(shí)例,并使用 CMSIS-DSP 的 arm_rfft_init_q15 API 對(duì)其進(jìn)行初始化。

arm_rfft_init_q15

https://arm-software.github.io/CMSIS_5/DSP/html/group__RealFFT.html#ga053450cc600a55410ba5b5605e96245d

3. 循環(huán)播放音頻數(shù)據(jù),每次 256 個(gè)樣本,跨度為 128(這與我們傳入 TF sft API 的參數(shù)一致)

使用 CMSIS-DSP 的 arm_mult_q15 API,將 256 個(gè)樣本與漢寧窗相乘

arm_mult_q15

https://arm-software.github.io/CMSIS_5/DSP/html/group__BasicMult.html#gaeeda8cdc2c7e79c8a26e905342a0bb17

使用 CMSIS-DSP 的 arm_rfft_q15 API 計(jì)算上一步輸出的 FFT

arm_rfft_q15

https://arm-software.github.io/CMSIS_5/DSP/html/group__RealFFT.html#ga00e615f5db21736ad5b27fb6146f3fc5

使用 CMSIS-DSP 的 arm_cmplx_mag_q15 API 計(jì)算上一步的幅度

arm_cmplx_mag_q15

https://arm-software.github.io/CMSIS_5/DSP/html/group__cmplx__mag.html#ga0488e185f4631ac029b02f1759b287cf

4. 每個(gè)音頻片段的 FFT 幅度代表聲譜圖的一列。

5. 由于我們的基線(xiàn)模型適合使用浮點(diǎn)輸入,而不是我們使用的 16 位量化值,CMSIS-DSP arm_q15_to_float API 可以用來(lái)將聲譜數(shù)據(jù)從 16 位定點(diǎn)值轉(zhuǎn)換為用于訓(xùn)練的浮點(diǎn)值。

arm_q15_to_float

https://arm-software.github.io/CMSIS_5/DSP/html/group__q15__to__x.html#ga5a75381e7d63ea3a3a315344615281cf

這個(gè)模型的完整版 Python 代碼有點(diǎn)長(zhǎng),但可以在 Google Colab notebook 的“遷移學(xué)習(xí) -》 加載數(shù)據(jù)集”部分中加以查看。

Google Colab notebook 的“遷移學(xué)習(xí) -》 加載數(shù)據(jù)集”部分

https://colab.research.google.com/github/ArmDeveloperEcosystem/ml-audio-classifier-example-for-pico/blob/main/ml_audio_classifier_example_for_pico.ipynb

煙霧報(bào)警器聲音的波形和音頻譜圖

若要進(jìn)一步了解如何使用 CMSIS-DSP 的定點(diǎn)操作創(chuàng)建音頻聲譜圖,請(qǐng)參見(jiàn) Towards Data Science 中的“數(shù)據(jù)研究員的定點(diǎn) DSP (Fixed-point DSP for Data Scientists)”指南。

Towards Data Science 中的“數(shù)據(jù)研究員的定點(diǎn) DSP (Fixed-point DSP for Data Scientists)”指南

https://towardsdatascience.com/fixed-point-dsp-for-data-scientists-d773a4271f7f

加載基線(xiàn)模型并改變分類(lèi)頭

我們之前利用 ESC-50 數(shù)據(jù)集訓(xùn)練的模型預(yù)測(cè)了 50 個(gè)聲音類(lèi)型的存在,這導(dǎo)致模型的最后密集層有 50 個(gè)輸出。我們想創(chuàng)建的新模型是二進(jìn)制分類(lèi)器,需要有單一的輸出值。

我們將加載基線(xiàn)模型,還將換掉最后的密集層,以滿(mǎn)足我們的需要:

# We need a new head with one neuron.

model_body = tf.keras.Model(inputs=model.input, outputs=model.layers[-2].output)

classifier_head = tf.keras.layers.Dense(1, activation=“sigmoid”)(model_body.output)

fine_tune_model = tf.keras.Model(model_body.input, classifier_head)

于是就有了以下的 model.summary():

遷移學(xué)習(xí)

遷移學(xué)習(xí)是對(duì)一個(gè)任務(wù)開(kāi)發(fā)的模型進(jìn)行再訓(xùn)練,以完成類(lèi)似的新任務(wù)的過(guò)程。其理念是,該模型已經(jīng)學(xué)會(huì)了可遷移的“技能”,其權(quán)重和偏差可以在其他模型中作為起點(diǎn)。

我們?nèi)祟?lèi)也會(huì)使用遷移學(xué)習(xí),例如為學(xué)習(xí)走路而培養(yǎng)的技能也可在以后用于學(xué)習(xí)跑步。

在神經(jīng)網(wǎng)絡(luò)中,模型的前幾層會(huì)開(kāi)始進(jìn)行“特征提取”,如尋找形狀、邊緣和顏色。系統(tǒng)會(huì)將之后的幾層用作分類(lèi)器;這些層會(huì)利用提取的特征,并對(duì)特征進(jìn)行分類(lèi)。

正因?yàn)槿绱?,我們可以認(rèn)為前幾層已經(jīng)學(xué)會(huì)了相當(dāng)通用的特征提取技術(shù),并可將其應(yīng)用于類(lèi)似的任務(wù),因此我們可以?xún)鼋Y(jié)所有這些層,在未來(lái)的新任務(wù)中加以使用。需要根據(jù)新任務(wù)對(duì)分類(lèi)器層進(jìn)行訓(xùn)練。

為了實(shí)現(xiàn)這個(gè)目標(biāo),我們將進(jìn)程分為兩步:

1. 凍結(jié)模型的“主干”,以超高的學(xué)習(xí)率訓(xùn)練頭部。慢慢降低學(xué)習(xí)率。

2. 解凍“主干”,以低學(xué)習(xí)率微調(diào)模型每。

若要在 TensorFlow 中凍結(jié)一個(gè)層,我們可以設(shè)置 layer.trainable=False。循環(huán)操作所有層,并執(zhí)行以下操作:

for layer in fine_tune_model.layers:

layer.trainable = False

然后解凍最后一層(頭部):

fine_tune_model.layers[-1].trainable = True

我們現(xiàn)在可以使用二進(jìn)制交叉熵?fù)p失函數(shù)來(lái)訓(xùn)練模型。還將使用 Keras 的早?;卣{(diào)(以避免過(guò)度擬合)和動(dòng)態(tài)學(xué)習(xí)率調(diào)度器。

用凍結(jié)的層進(jìn)行訓(xùn)練后,可以對(duì)其進(jìn)行解凍:

for layer in fine_tune_model.layers:

layer.trainable = True

然后再次進(jìn)行訓(xùn)練(最多 10 次)。您可以在 Colab notebook 的“遷移學(xué)習(xí) -》 訓(xùn)練模型”部分中查看完整的代碼。

Colab notebook 的“遷移學(xué)習(xí) -》 訓(xùn)練模型”部分

https://colab.research.google.com/github/ArmDeveloperEcosystem/ml-audio-classifier-example-for-pico/blob/main/ml_audio_classifier_example_for_pico.ipynb#scrollTo=Replace_Baseline_Model_Classification_Head_and_Train_Model

記錄您自己的訓(xùn)練數(shù)據(jù)

現(xiàn)在已得到 ML 模型,可以對(duì)出現(xiàn)的火災(zāi)報(bào)警聲進(jìn)行分類(lèi)。然而,此模型的訓(xùn)練是根據(jù)公開(kāi)的聲音記錄訓(xùn)練而成,可能與用于推理的硬件麥克風(fēng)的聲音特征不一致。

Raspberry Pi RP2040 MCU 帶有原生的 USB 功能,可以讓其像自定義 USB 設(shè)備一樣運(yùn)行??梢栽陂_(kāi)發(fā)板上刷寫(xiě)一個(gè)應(yīng)用,讓它能夠像 USB 麥克風(fēng)一樣連在我們的 PC上。然后,可以用 Google Chrome 等流行的網(wǎng)絡(luò)瀏覽器上的網(wǎng)絡(luò)音頻 API 來(lái)擴(kuò)展 Google Colab 的功能,收集實(shí)時(shí)數(shù)據(jù)樣本(所有這些都可通過(guò) Google Colab 而得?。?/p>

網(wǎng)絡(luò)音頻 API

https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API

硬件設(shè)置

SparkFun MicroMod RP2040

在組裝時(shí),卸下載板上的螺絲,以一定的角度將 MicroMod RP2040 處理器板滑入插座,并用螺絲將其固定。更多詳情請(qǐng)參見(jiàn) MicroMod 機(jī)器學(xué)習(xí)載板連接指南。

MicroMod 機(jī)器學(xué)習(xí)載板連接指南

https://learn.sparkfun.com/tutorials/micromod-machine-learning-carrier-board-hookup-guide?_ga=2.90268890.1509654996.1628608170-268367655.1627493370#hardware-hookup

Raspberry Pi Pico

按照“利用 Raspberry Pi Pico 創(chuàng)建 USB 麥克風(fēng)”指南中的硬件設(shè)置部分的說(shuō)明進(jìn)行組裝。

“利用 Raspberry Pi Pico 創(chuàng)建 USB 麥克風(fēng)”指南中的硬件設(shè)置部分

https://www.hackster.io/sandeep-mistry/create-a-usb-microphone-with-the-raspberry-pi-pico-cc9bd5#toc-hardware-setup-5

Fritzing 布線(xiàn)圖

組裝好的電路

設(shè)置固件應(yīng)用工具鏈

無(wú)需在個(gè)人計(jì)算機(jī)上設(shè)置 Raspberry Pi Pico 的 SDK。我們可以利用 Colab 內(nèi)置的 Linux shell 命令特征,用 CMake 和 GNU Arm 嵌入工具鏈設(shè)置 Pico SDK 開(kāi)發(fā)環(huán)境。

CMake

https://cmake.org”

GNU Arm 嵌入工具鏈

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm

還要用 git 將 pico-sdk 下載到 Colab 實(shí)例中:

pico-sdk

https://github.com/raspberrypi/pico-sdk

%%shell

git clone https://github.com/raspberrypi/pico-sdk.git

cd pico-sdk

git submodule init

git submodule update

編譯并刷寫(xiě) USB 麥克風(fēng)應(yīng)用

現(xiàn)在可以使用 Pico 的麥克風(fēng)庫(kù)中的 USB 麥克風(fēng)示例??梢杂?cmake 和 make 對(duì)此示例應(yīng)用進(jìn)行編譯。然后,通過(guò) USB 將示例應(yīng)用刷寫(xiě)到電路板上,將電路板調(diào)至“啟動(dòng) ROM 模式”,這樣就可以將應(yīng)用上傳到電路板上。

Pico 的麥克風(fēng)庫(kù)

https://github.com/ArmDeveloperEcosystem/microphone-library-for-pico

SparkFun

將 USB-C 數(shù)據(jù)線(xiàn)插入電路板和個(gè)人計(jì)算機(jī),為電路板供電。

按住電路板上的 BOOT 按鈕,同時(shí)按 RESET 按鈕。

Raspberry Pi Pico

將 Micro USB 線(xiàn)插入個(gè)人計(jì)算機(jī),但不要插入 Pico 一側(cè)。

按住白色 BOOTSEL 按鈕,同時(shí)將 Micro USB 線(xiàn)插入 Pico。

如果您使用的是支持 WebUSB API 的瀏覽器,如 Google Chrome,則可以直接從 Google Colab 中把圖像刷寫(xiě)到板上!

WebUSB API

https://wicg.github.io/webusb/

從 Google Colab 和 WebUSB 中將 USB 麥克風(fēng)應(yīng)用下載到板上

除此之外,您還可以手動(dòng)將 .uf2 文件下載到計(jì)算機(jī),然后把它拖到 RP2040 板的 USB 磁盤(pán)上。

收集訓(xùn)練數(shù)據(jù)

將 USB 麥克風(fēng)應(yīng)用刷寫(xiě)到板上之后,它將作為 USB 音頻輸入出現(xiàn)在您的個(gè)人計(jì)算機(jī)上。

我們現(xiàn)在可以用 Google Colab 錄制火災(zāi)警報(bào)的聲音,在下拉菜單中選擇“MicNode”,將其作為音頻輸入源。然后在按下煙霧報(bào)警器的測(cè)試按鈕時(shí),點(diǎn)擊 Google Colab 上的錄音按鈕,錄制一個(gè) 1 秒鐘的音頻片段。將此過(guò)程重復(fù)幾次。

同樣地,我們也可以在 Google Colab 的下一個(gè)代碼單元中執(zhí)行相同的操作來(lái)收集背景音頻樣本。對(duì)于非火災(zāi)警報(bào)的聲音,如無(wú)聲、自己說(shuō)話(huà)或任何其他正常的環(huán)境聲音,將此操作重復(fù)幾次。

最終模型訓(xùn)練

現(xiàn)在,我們已經(jīng)用麥克風(fēng)收集了更多樣本,并將在推理過(guò)程中使用這些樣本。我們可以用新的數(shù)據(jù)再次對(duì)模型進(jìn)行微調(diào)。

將模型轉(zhuǎn)換為在 MCU 上運(yùn)行

需要把我們使用的 Keras 模型轉(zhuǎn)換為 TensorFlow Lite 格式,以便在設(shè)備上使用它進(jìn)行推理。

量化

為了優(yōu)化模型以便在 Arm Cortex-M0+ 處理器上運(yùn)行,我們將采用一個(gè)叫做模型量化的過(guò)程。模型量化將模型的權(quán)重和偏移從 32 位浮點(diǎn)值轉(zhuǎn)換為 8 位值。pico-tflmicro 庫(kù)(TFLu 在 RP2040 的 Pico SDK 上的一個(gè)端口)包含 Arm 的 CMSIS-NN 庫(kù),它支持在 Arm Cortex-M 處理器上對(duì)量化的 8 位權(quán)重進(jìn)行優(yōu)化的內(nèi)核操作。

pico-tflmicro

https://github.com/raspberrypi/pico-tflmicro

我們可以使用 TensorFlow 的訓(xùn)練時(shí)量化 (QAT) 特征,輕松地將浮點(diǎn)模型轉(zhuǎn)換為量化模型。

TensorFlow 的訓(xùn)練時(shí)量化 (QAT)

https://tensorflow.google.cn/model_optimization/guide/quantization/training

將模型轉(zhuǎn)換為 TF Lite 格式

現(xiàn)在我們將使用 tf.lite.TFLiteConverter.from_keras_model(。..) API 將量化的 Keras 模型轉(zhuǎn)換為 TF Lite 格式,然后將其以 .tflite 文件的形式保存到磁盤(pán)。

converter = tf.lite.TFLiteConverter.from_keras_model(quant_aware_model)

converter.optimizations = [tf.lite.Optimize.DEFAULT]

train_ds = train_ds.unbatch()

def representative_data_gen():

for input_value, output_value in train_ds.batch(1).take(100):

# Model has only one input so each data point has one element.

yield [input_value]

converter.representative_dataset = representative_data_gen

# Ensure that if any ops can‘t be quantized, the converter throws an error

converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]

# Set the input and output tensors to uint8 (APIs added in r2.3)

converter.inference_input_type = tf.int8

converter.inference_output_type = tf.int8

tflite_model_quant = converter.convert()

with open(“tflite_model.tflite”, “wb”) as f:

f.write(tflite_model_quant)

由于 TensorFlow 也支持使用 tf.lite 加載 TF Lite 模型,我們也可以驗(yàn)證量化模型的功能,并將其準(zhǔn)確率與 Google Colab 內(nèi)部的常規(guī)未量化模型進(jìn)行比較。

tf.lite

https://tensorflow.google.cn/api_docs/python/tf/lite

我們要部署的電路板上的 RP2040 MCU 沒(méi)有內(nèi)置的文件系統(tǒng),這意味著我們不能在電路板上直接使用 .tflite 文件。然而,我們可以使用 Linux 的“xxd”命令將 .tflite 文件轉(zhuǎn)換為 .h 文件,然后可以在下一步的推理應(yīng)用中進(jìn)行編譯。

%%shell

echo “alignas(8) const unsigned char tflite_model[] = {” 》 tflite_model.h

cat tflite_model.tflite | xxd -i 》》 tflite_model.h

echo “};”

將模型部署到設(shè)備

現(xiàn)在模型已經(jīng)準(zhǔn)備完成,并可部署到設(shè)備上。我們已經(jīng)創(chuàng)建了用于推理的應(yīng)用模板,可以與我們?yōu)槟P蜕傻?.h 文件一起編譯。

用于推理的應(yīng)用模板

https://github.com/ArmDeveloperEcosystem/ml-audio-classifier-example-for-pico/tree/main/inference-app

這個(gè) C++ 應(yīng)用依托于 pico-sdk 構(gòu)建而成,同時(shí)還配備 CMSIS-DSP、pico-tflmicro,以及 Pico 庫(kù)的麥克風(fēng)庫(kù)。它的一般結(jié)構(gòu)如下:

1. 初始化

配置板內(nèi)置 LED 的輸出。該應(yīng)用將把 LED 的亮度映射到模型的輸出(0.0 表示 LED 關(guān)閉,1.0 表示 LED 亮度全開(kāi))

設(shè)置用于推理的 TF Lite 庫(kù)和 TF Lite 模型

設(shè)置基于 CMSIS-DSP 的 DSP 流水線(xiàn)

設(shè)置并啟動(dòng)用于實(shí)時(shí)音頻的麥克風(fēng)

2. 推理循環(huán)

等待來(lái)自麥克風(fēng)的 512 個(gè)新音頻樣本(共 4 組,每組 128 個(gè))

將聲譜圖數(shù)組移動(dòng) 4 列

將音頻輸入緩沖區(qū)移動(dòng) 512 個(gè)樣本(共 4 組,每組 128 個(gè))并在新樣本中復(fù)制

為更新的輸入緩沖區(qū)計(jì)算 4 個(gè)新的聲譜圖列

對(duì)聲譜圖數(shù)據(jù)進(jìn)行推理

將推理輸出值映射到板載 LED 的亮度并將狀態(tài)輸出到 USB 端口

為了實(shí)時(shí)運(yùn)行,推理循環(huán)的每個(gè)周期必須在 (512/16000) = 0.032 秒,即 32 毫秒以下。我們訓(xùn)練和轉(zhuǎn)換的模型需要 24 毫秒的推理時(shí)間,因此用于循環(huán)中其他操作的時(shí)間大約為 8 毫秒。

上文中使用了 128,以匹配聲譜圖中的訓(xùn)練流水線(xiàn)采用的 128 的幅度。我們?cè)诼曌V圖中采用了 4 移位,以適應(yīng)我們的實(shí)時(shí)限制。

編譯固件

現(xiàn)在我們可以使用 CMake 來(lái)生成編譯所需的構(gòu)建文件,然后用 make 進(jìn)行編譯。

必須根據(jù)您采用的板,修改“cmake 。.”行:

SparkFun: cmake 。. -DPICO_BOARD=sparkfun_micromod

Raspberry Pi Pico: cmake 。. -DPICO_BOARD=pico

將推理應(yīng)用刷寫(xiě)到板上

您需要再次將板調(diào)至“啟動(dòng) ROM 模式”,以便將新的應(yīng)用加載到板上。

SparkFun

將 USB-C 數(shù)據(jù)線(xiàn)插入電路板和個(gè)人計(jì)算機(jī),為電路板供電。

按住電路板上的 BOOT 按鈕,同時(shí)按 RESET 按鈕。

Raspberry Pi Pico

將 Micro USB 線(xiàn)插入個(gè)人計(jì)算機(jī),但不要插入 Pico 一側(cè)。

按住白色 BOOTSEL 按鈕,同時(shí)將 Micro USB 線(xiàn)插入 Pico。

如果您使用的是支持 WebUSB API 的瀏覽器,如 Google Chrome,則可以在 Google Colab 中直接將圖像刷寫(xiě)到電路板上。除此之外,您還可以手動(dòng)將 .uf2 文件下載到計(jì)算機(jī),然后把它拖到 RP2040 板的 USB 磁盤(pán)上。

監(jiān)控板上的推理

推理應(yīng)用在電路板上開(kāi)始運(yùn)行之后,您可以通過(guò)兩種方式觀察它的運(yùn)行情況:

通過(guò)觀察板上 LED 的亮度來(lái)直觀地獲取信息。沒(méi)有火災(zāi)警報(bào)聲時(shí),LED 應(yīng)該保持關(guān)閉或變暗,若有火災(zāi)警報(bào)聲,LED 就會(huì)亮起:

連接板的 USB 串行端口,查看推理應(yīng)用的輸出。如果您使用的是支持 Web Serial API 的瀏覽器,如 Google Chrome,則可以直接從 Google Colab 中完成:

Web Serial API

https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API

改善模型

現(xiàn)在已將第一版模型部署在板上,該模型正在對(duì) 16,000 kHz 的實(shí)時(shí)音頻數(shù)據(jù)進(jìn)行推理!

測(cè)試一下各種聲音,看看模型是否有預(yù)期的輸出??赡軙?huì)誤檢測(cè)出火災(zāi)警報(bào)聲(誤報(bào)),也有可能在有警報(bào)聲時(shí)沒(méi)有檢測(cè)出來(lái)(漏報(bào))。

如果出現(xiàn)這種情況,您可以將 USB 麥克風(fēng)應(yīng)用固件刷寫(xiě)到板上,為訓(xùn)練記錄數(shù)據(jù),重新訓(xùn)練模型并轉(zhuǎn)換為 TF lite 格式,以及重新編譯推理應(yīng)用并刷寫(xiě)到板上,以便為場(chǎng)景記錄更多新的音頻數(shù)據(jù)。

監(jiān)督式機(jī)器學(xué)習(xí)模型的好壞通常取決于其所使用的訓(xùn)練數(shù)據(jù),所以針對(duì)這些場(chǎng)景的額外訓(xùn)練數(shù)據(jù)可能會(huì)有助于改善模型。您也可以嘗試改變模型結(jié)構(gòu)或特征提取過(guò)程,但請(qǐng)記住,模型必須足夠小巧快速,才能在 RP2040 MCU 上運(yùn)行。

結(jié)論

本文介紹了一個(gè)端到端的流程,即如何訓(xùn)練自定義的音頻分類(lèi)器模型,以便在使用 Arm Cortex-M0+ 處理器的開(kāi)發(fā)板上運(yùn)行。就模型訓(xùn)練而言,我們采用了 TensorFlow,使用了遷移學(xué)習(xí)技術(shù)以及較小的數(shù)據(jù)集和數(shù)據(jù)增強(qiáng)技術(shù)。我們還從麥克風(fēng)中收集了自己的數(shù)據(jù),并在推理時(shí)加以使用,其方法是將 USB 麥克風(fēng)應(yīng)用加載到開(kāi)發(fā)板上,并通過(guò)網(wǎng)絡(luò)音頻 API 和 JavaScript 擴(kuò)展 Colab 的特征。

項(xiàng)目的訓(xùn)練方面結(jié)合了 Google 的 Colab 服務(wù)和 Chrome 瀏覽器,以及開(kāi)源的 TensorFlow 庫(kù)。推理應(yīng)用從數(shù)字麥克風(fēng)采集音頻數(shù)據(jù),在特征提取階段使用 Arm 的 CMSIS-DSP 庫(kù),然后使用適用于微控制器的 TensorFlow Lite 與 Arm CMSIS-NN 加速內(nèi)核,用 8 位量化模型進(jìn)行推理,在 Arm Cortex-M0+ 處理器上對(duì)實(shí)時(shí)的 16 kHz 音頻輸入進(jìn)行分類(lèi)。

利用 Google Chrome 的網(wǎng)絡(luò)音頻 API、網(wǎng)絡(luò) USB API 和網(wǎng)絡(luò)串行 API 功能來(lái)擴(kuò)展 Google Colab 的特征,與開(kāi)發(fā)板進(jìn)行互動(dòng)。這樣我們就能夠完全通過(guò)網(wǎng)絡(luò)瀏覽器對(duì)我們的應(yīng)用進(jìn)行實(shí)驗(yàn)和開(kāi)發(fā),并將其部署到一個(gè)受限的開(kāi)發(fā)板上進(jìn)行設(shè)備端推理。

由于 ML 處理是在開(kāi)發(fā)板 RP2040 MCU 上進(jìn)行的,所以在推理時(shí),所有音頻數(shù)據(jù)均會(huì)保留在設(shè)備上。

責(zé)任編輯:haq

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

    關(guān)注

    31

    文章

    3130

    瀏覽量

    84879
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8540

    瀏覽量

    136199

原文標(biāo)題:使用 Raspberry Pi RP2040 進(jìn)行端到端 TinyML 音頻分類(lèi)

文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Cortex-M產(chǎn)品的特色

    的處理能力。 中斷控制器Cortex-M處理器內(nèi)置了靈活的中斷控制器,能夠支持多種中斷優(yōu)先級(jí)和高效的中斷處理機(jī)制。 訪(fǎng)問(wèn)控制單元(ACU):ACU提供了對(duì)存儲(chǔ)器和外設(shè)的訪(fǎng)
    發(fā)表于 11-26 07:22

    靈動(dòng)微MM32F3270微控制器的音頻設(shè)備參考方案

    音頻設(shè)備系統(tǒng)的主控芯片采用靈動(dòng)微MM32F3270微控制器。微控制器內(nèi)核采用高性能的Arm?Cortex-M3 32位處理器,最高工作頻率可
    的頭像 發(fā)表于 11-04 16:09 ?180次閱讀

    STM32C031x4/x6:面向主流應(yīng)用的Arm? Cortex?-M0+ 微控制器

    STMicroelectronics的STM32C0x Arm^? ^Cortex ^?^ -M0+ 32位MCU安裝了高性能Arm Cortex-
    的頭像 發(fā)表于 10-27 15:05 ?322次閱讀
    STM32C031x4/x6:面向主流應(yīng)用的<b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex</b>?-<b class='flag-5'>M</b>0+ <b class='flag-5'>微控制器</b>

    PY32F030系列32位ARM Cortex-M0+微控制器介紹

    在嵌入式開(kāi)發(fā)領(lǐng)域,一款性能適配、成本可控且功耗優(yōu)異的 MCU,往往是項(xiàng)目成功的關(guān)鍵。今天要為大家隆重介紹的PY32F030 系列 32 位 ARM Cortex-M0 + 微控制器,正是這樣一款能
    的頭像 發(fā)表于 10-15 16:43 ?601次閱讀

    Texas Instruments MSPM0L110x Arm? Cortex?-M0微控制器深度解析

    Texas Instruments MSPM0L110x Arm^?^ Cortex ^?^ -M0微控制器 (MCU) 是MSP高度集成、超低功耗32位MSPM0 MCU系列的一部分
    的頭像 發(fā)表于 08-25 09:56 ?672次閱讀
    Texas Instruments MSPM0L110x <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex</b>?-<b class='flag-5'>M</b>0<b class='flag-5'>微控制器</b>深度解析

    MSPM0L110x Arm Cortex-M0+微控制器技術(shù)解析

    Texas Instruments MSPM0L110x Arm^?^ Cortex ^?^ -M0微控制器 (MCU) 是MSP高度集成、超低功耗32位MSPM0 MCU系列的一部分
    的頭像 發(fā)表于 08-22 14:41 ?757次閱讀
    MSPM0L110x <b class='flag-5'>Arm</b> <b class='flag-5'>Cortex-M</b>0+<b class='flag-5'>微控制器</b>技術(shù)解析

    如何將 FreeMODBUS 從屬 RTU 模式移植到 M032 系列微控制器?

    如何將 FreeMODBUS 從屬 RTU 模式移植到 M032 系列微控制器
    發(fā)表于 08-19 07:20

    極海APM32F411微控制器硬件FPU使用指南

    APM32F411是一款基于32位Arm Cortex-M4F內(nèi)核的微控制器。硬件FPU是Arm Cortex-M4F的一大優(yōu)勢(shì)。合理應(yīng)用硬
    的頭像 發(fā)表于 06-28 11:23 ?1535次閱讀
    極海APM32F411<b class='flag-5'>微控制器</b>硬件FPU使用指南

    Analog Devices / Maxim Integrated MAX32672 ARM Cortex-M4F微控制器特性/應(yīng)用/框圖

    Analog Devices MAX32672 ARM Cortex-M4F微控制器是一款超低功耗、高性?xún)r(jià)比、高度集成、高度可靠的32位微控制器。該器件支持具有復(fù)雜傳感器處理的設(shè)計(jì),且
    的頭像 發(fā)表于 06-27 11:12 ?503次閱讀
    Analog Devices / Maxim Integrated MAX32672 <b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b>4F<b class='flag-5'>微控制器</b>特性/應(yīng)用/框圖

    雅特力AT32L021系列低功耗ARM?Cortex?-M0+微控制器

    雅特力AT32L021系列低功耗ARM?Cortex?-M0+微控制器AT32L021系列是雅特力科技推出的一款高性能、低功耗的 ARM?
    發(fā)表于 06-05 08:58

    MAX32555 Cortex-M3閃存微控制器英文數(shù)據(jù)手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《MAX32555 Cortex-M3閃存微控制器英文數(shù)據(jù)手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 04-25 16:40 ?1次下載

    XMC1402-F064X0128AA——基于 ARM? Cortex?-M 的32位工業(yè)微控制器

    明佳達(dá)/XMC1402-F064X0128AA是一款基于 ARM? Cortex?-M 的32位工業(yè)微控制器,主要用于低成本嵌入式
    發(fā)表于 02-22 17:42

    Toshiba推出七款Arm Cortex-M4電機(jī)控制微控制器

    M4K組和M470組現(xiàn)有產(chǎn)品的優(yōu)秀特性,如編碼器接口和可編程電機(jī)控制功能,進(jìn)一步降低了電機(jī)控制過(guò)程中的CPU負(fù)載,還保留了閃存、RAM、AD轉(zhuǎn)換器和時(shí)鐘的檢查機(jī)制,方便用戶(hù)進(jìn)行自診斷。
    的頭像 發(fā)表于 02-06 11:10 ?992次閱讀

    東芝推出七款基于Arm Cortex-M4內(nèi)核的32位微控制器

    東芝電子元件及存儲(chǔ)裝置株式會(huì)社(“東芝”)宣布,最新推出七款配備Cortex-M4內(nèi)核的32位微控制器,進(jìn)一步擴(kuò)大其電機(jī)控制微控制器產(chǎn)品線(xiàn)。其中,六款產(chǎn)品組成新的產(chǎn)品組合——
    的頭像 發(fā)表于 01-22 18:05 ?1297次閱讀
    東芝推出七款基于<b class='flag-5'>Arm</b> <b class='flag-5'>Cortex-M</b>4內(nèi)核的32位<b class='flag-5'>微控制器</b>

    C2000微控制器用戶(hù)培訓(xùn)手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《C2000微控制器用戶(hù)培訓(xùn)手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 12-05 14:13 ?4次下載
    C2000<b class='flag-5'>微控制器用</b>戶(hù)培訓(xùn)手冊(cè)