国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

通過機器學習開發者工程師能夠在應用中解鎖新的功能。您可以為應用所需的分類任務收集大量的數據,并訓練一個 ML 模型從數據中的模式里學習,而不是明確地定義計算機需要執行的指令和規則。

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

微控制器是低功率、獨立、經濟高效的計算機系統,日常使用的設備(如微波爐、電動牙刷或智能門鎖)中均有嵌入。基于微控制器的系統通常通過一個或多個傳感器(例如:按鈕、麥克風、運動傳感器)與周圍環境互動,并使用一個或多個執行器(例如:LED電機、揚聲器)來執行動作。

微控制器還具有隱私方面的優勢,可以在設備上開展本地推理,而無需向云端發送任何數據。對于依靠電池運行的設備來說,微控制器還具有能耗方面的優勢。

在本文中,我們將介紹如何將基于 Arm Cortex-M 的微控制器用于本地設備端 ML,以檢測周圍環境中的音頻事件。這是一篇教程式的文章,我們將指導您訓練一個基于 TensorFlow 的音頻分類模型,來檢測火災警報的聲音。

Arm Cortex-M

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

我們將介紹如何使用適用于微控制器的 TensorFlow Lite(具有 Arm CMSIS-NN 加速內核),將 ML 模型部署到基于 Arm Cortex-M0+ 的微控制器板上,來進行本地設備端 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 庫為 Arm Cortex-M 處理器提供了優化的數字信號處理 (DSP) 功能實現,同時也將用于推理前從實時音頻數據中提取特征。

CMSIS-DSP

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

雖然本指南側重于介紹火災警報聲音的檢測,但也可以適用于其他聲音分類任務。您可能還需要調整特征提取階段和/或調整 ML 模型架構,以適應您的用例。

在 Google Colab 上可查看本教程的互動版本,本指南的所有技術資料都可在 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

事前準備

開發環境

Google Colab

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

硬件

需要下列開發板之一,這些開發板均依托于 2021 年初發布的 Raspberry Pi 的 RP2040 MCU 芯片構建而成。

Raspberry Pi 的 RP2040 MCU

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

SparkFun RP2040 MicroMod 和 MicroMod ML 載板

此開發板很適合剛接觸電子行業和微控制器的人。不需要電烙鐵,不需要掌握焊接技術,也不需要掌握在電路板上接線的技術。

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

SparkFun MicroMod RP2040 處理器

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

SparkFun MicroMod 機器學習載板。它支持 USB 連接,并附帶內置的麥克風、IMU 和攝像頭連接器

SparkFun MicroMod 機器學習載板

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

一條 USB-C 數據線,用于連接開發板和計算機

一把十字螺絲刀

Raspberry Pi Pico 和 PDM 麥克風板

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

Raspberry Pi Pico

Raspberry Pi Pico

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

Adafruit PDM MEMS 麥克風分接板

Adafruit PDM MEMS 麥克風分接板

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

半尺寸或全尺寸的電路板

跳線

一條 USB-B 微數據線,用于連接開發板和計算機

電烙鐵

以上兩個選項都可以幫助您使用數字麥克風收集實時的 16 kHz 音頻,并利用開發板的 Arm Cortex-M0+ 處理器處理音頻信號,該處理器的工作頻率為 125 MHz。在 Arm Cortex-M0+ 上運行的應用將經過一個數字信號處理 (DSP) 階段,從音頻信號中提取特征。然后,將提取出的特征饋送至神經網絡,以執行分類任務,確定開發板的環境中是否存在火災警報的聲音。

數據集

我們首先使用 ESC-50:環境聲音分類數據集,通過 TensorFlow 來訓練一個聲音分類器(面向多個事件)。利用這個內容廣泛的數據集進行訓練后,我們將使用遷移學習,針對特定音頻分類任務,對分類器進行微調。

ESC-50:環境聲音分類數據集

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

遷移學習

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

利用包含 50 種聲音的 ESC-50 數據集訓練這個模型。每個聲音類別有 40 個音頻文件,每個文件時長為 5 秒。將每個音頻文件分割成 1 秒的聲音片段,并舍棄任何包含純靜音的聲音片段。

犬吠數據集中的樣本波形

聲譜圖

不同于將時間序列數據直接傳入 TensorFlow 模型,我們會將音頻數據轉換為音頻聲譜圖表征。此舉將創建音頻信號頻率內容隨時間變化的二維表征。

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

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

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

犬吠的聲譜圖表征

ML 模型

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

Keras

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

1. 輸入層

2. 預處理層,將把輸入張量從 124x129x1 調整為 32x32x1

3. 歸一化層,在 -1 和 1 之間對輸入值進行調整

4. 具有以下配置的二維卷積層:8 個過濾器,內核大小為 8x8,跨度為 2x2,使用 ReLU 激活函數

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

6. 平面化層,對二維數據進行平面化,令其變為一維

7. Dropout 層,有助于減少訓練中的過度擬合

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

以下為該模型的摘要:

請注意,此模型只有約 15,000 個參數(這相當小!)

微調

現在,我們將使用遷移學習,并改變模型的分類頭(最后一個密集層),以訓練火災警報聲的二進制分類模型。我們已從 freesound.org 和 BigSoundBank.com 收集了 10 個火災警報片段。對于非火災警報聲,我們將使用來自 SpeechCommands 數據集的背景噪音片段。此數據集很小,但足夠入門使用。數據增強技術將被用于完善我們所收集的訓練數據。

freesound.org

https://freesound.org/

BigSoundBank.com

https://bigsoundbank.com/

SpeechCommands

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

對于實際應用而言,務必要收集更大的數據集(您可以在 TensorFlow 的 Responsible AI 網站上詳細了解最佳做法)。

Responsible AI 網站

https://tensorflow.google.cn/responsible_ai

數據增強

數據增強是一套用于擴大數據集規模的技術。達成此目標的方法是,稍微修改數據集中的樣本或創建合成數據。在本例中使用的是音頻,并將創建一些函數來增加不同的樣本。我們將使用三種技術:

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

2. 在音頻中隨機添加靜音

3. 將兩個音頻樣本混合在一起

除了擴大數據集,數據增強也可以在不同的(不完美的)數據樣本上訓練模型,以此來減少過度擬合。例如,在微控制器上不可能有完美的高質量音頻,所以此類技術(例如添加白噪聲)可以幫助模型在麥克風可能經常有噪聲的情況下正常運作。

GIF:數據增強如何通過增加噪聲來微調聲譜圖

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

特征提取

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

我們可以在 Notebook 中利用 CMSIS-DSP 的 Python 封裝容器,使用 16 位定點數學在我們的訓練流水線上進行同樣的操作。在較高級別上,我們可以通過以下基于 CMSIS-DSP 的操作來復制 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,手動創建一個長度為 256 的漢寧窗。

arm_cos_f32

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

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

2. 創建一個 CMSIS-DSP arm_rfft_instance_q15 實例,并使用 CMSIS-DSP 的 arm_rfft_init_q15 API 對其進行初始化。

arm_rfft_init_q15

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

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

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

arm_mult_q15

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

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

arm_rfft_q15

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

使用 CMSIS-DSP 的 arm_cmplx_mag_q15 API 計算上一步的幅度

arm_cmplx_mag_q15

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

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

5. 由于我們的基線模型適合使用浮點輸入,而不是我們使用的 16 位量化值,CMSIS-DSP arm_q15_to_float API 可以用來將聲譜數據從 16 位定點值轉換為用于訓練的浮點值。

arm_q15_to_float

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

這個模型的完整版 Python 代碼有點長,但可以在 Google Colab notebook 的“遷移學習 -》 加載數據集”部分中加以查看。

Google Colab notebook 的“遷移學習 -》 加載數據集”部分

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

煙霧報警器聲音的波形和音頻譜圖

若要進一步了解如何使用 CMSIS-DSP 的定點操作創建音頻聲譜圖,請參見 Towards Data Science 中的“數據研究員的定點 DSP (Fixed-point DSP for Data Scientists)”指南。

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

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

加載基線模型并改變分類頭

我們之前利用 ESC-50 數據集訓練的模型預測了 50 個聲音類型的存在,這導致模型的最后密集層有 50 個輸出。我們想創建的新模型是二進制分類器,需要有單一的輸出值。

我們將加載基線模型,還將換掉最后的密集層,以滿足我們的需要:

# 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():

遷移學習

遷移學習是對一個任務開發的模型進行再訓練,以完成類似的新任務的過程。其理念是,該模型已經學會了可遷移的“技能”,其權重和偏差可以在其他模型中作為起點。

我們人類也會使用遷移學習,例如為學習走路而培養的技能也可在以后用于學習跑步。

在神經網絡中,模型的前幾層會開始進行“特征提取”,如尋找形狀、邊緣和顏色。系統會將之后的幾層用作分類器;這些層會利用提取的特征,并對特征進行分類。

正因為如此,我們可以認為前幾層已經學會了相當通用的特征提取技術,并可將其應用于類似的任務,因此我們可以凍結所有這些層,在未來的新任務中加以使用。需要根據新任務對分類器層進行訓練。

為了實現這個目標,我們將進程分為兩步:

1. 凍結模型的“主干”,以超高的學習率訓練頭部。慢慢降低學習率。

2. 解凍“主干”,以低學習率微調模型每。

若要在 TensorFlow 中凍結一個層,我們可以設置 layer.trainable=False。循環操作所有層,并執行以下操作:

for layer in fine_tune_model.layers:

layer.trainable = False

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

fine_tune_model.layers[-1].trainable = True

我們現在可以使用二進制交叉熵損失函數來訓練模型。還將使用 Keras 的早停回調(以避免過度擬合)和動態學習率調度器。

用凍結的層進行訓練后,可以對其進行解凍:

for layer in fine_tune_model.layers:

layer.trainable = True

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

Colab notebook 的“遷移學習 -》 訓練模型”部分

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

記錄您自己的訓練數據

現在已得到 ML 模型,可以對出現的火災報警聲進行分類。然而,此模型的訓練是根據公開的聲音記錄訓練而成,可能與用于推理的硬件麥克風的聲音特征不一致。

Raspberry Pi RP2040 MCU 帶有原生的 USB 功能,可以讓其像自定義 USB 設備一樣運行。可以在開發板上刷寫一個應用,讓它能夠像 USB 麥克風一樣連在我們的 PC上。然后,可以用 Google Chrome 等流行的網絡瀏覽器上的網絡音頻 API 來擴展 Google Colab 的功能,收集實時數據樣本(所有這些都可通過 Google Colab 而得!)

網絡音頻 API

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

硬件設置

SparkFun MicroMod RP2040

在組裝時,卸下載板上的螺絲,以一定的角度將 MicroMod RP2040 處理器板滑入插座,并用螺絲將其固定。更多詳情請參見 MicroMod 機器學習載板連接指南。

MicroMod 機器學習載板連接指南

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 創建 USB 麥克風”指南中的硬件設置部分的說明進行組裝。

“利用 Raspberry Pi Pico 創建 USB 麥克風”指南中的硬件設置部分

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

Fritzing 布線圖

組裝好的電路

設置固件應用工具鏈

無需在個人計算機上設置 Raspberry Pi Pico 的 SDK。我們可以利用 Colab 內置的 Linux shell 命令特征,用 CMake 和 GNU Arm 嵌入工具鏈設置 Pico SDK 開發環境。

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 實例中:

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

編譯并刷寫 USB 麥克風應用

現在可以使用 Pico 的麥克風庫中的 USB 麥克風示例。可以用 cmake 和 make 對此示例應用進行編譯。然后,通過 USB 將示例應用刷寫到電路板上,將電路板調至“啟動 ROM 模式”,這樣就可以將應用上傳到電路板上。

Pico 的麥克風庫

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

SparkFun

將 USB-C 數據線插入電路板和個人計算機,為電路板供電。

按住電路板上的 BOOT 按鈕,同時按 RESET 按鈕。

Raspberry Pi Pico

將 Micro USB 線插入個人計算機,但不要插入 Pico 一側。

按住白色 BOOTSEL 按鈕,同時將 Micro USB 線插入 Pico。

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

WebUSB API

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

從 Google Colab 和 WebUSB 中將 USB 麥克風應用下載到板上

除此之外,您還可以手動將 .uf2 文件下載到計算機,然后把它拖到 RP2040 板的 USB 磁盤上。

收集訓練數據

將 USB 麥克風應用刷寫到板上之后,它將作為 USB 音頻輸入出現在您的個人計算機上。

我們現在可以用 Google Colab 錄制火災警報的聲音,在下拉菜單中選擇“MicNode”,將其作為音頻輸入源。然后在按下煙霧報警器的測試按鈕時,點擊 Google Colab 上的錄音按鈕,錄制一個 1 秒鐘的音頻片段。將此過程重復幾次。

同樣地,我們也可以在 Google Colab 的下一個代碼單元中執行相同的操作來收集背景音頻樣本。對于非火災警報的聲音,如無聲、自己說話或任何其他正常的環境聲音,將此操作重復幾次。

最終模型訓練

現在,我們已經用麥克風收集了更多樣本,并將在推理過程中使用這些樣本。我們可以用新的數據再次對模型進行微調。

將模型轉換為在 MCU 上運行

需要把我們使用的 Keras 模型轉換為 TensorFlow Lite 格式,以便在設備上使用它進行推理。

量化

為了優化模型以便在 Arm Cortex-M0+ 處理器上運行,我們將采用一個叫做模型量化的過程。模型量化將模型的權重和偏移從 32 位浮點值轉換為 8 位值。pico-tflmicro 庫(TFLu 在 RP2040 的 Pico SDK 上的一個端口)包含 Arm 的 CMSIS-NN 庫,它支持在 Arm Cortex-M 處理器上對量化的 8 位權重進行優化的內核操作。

pico-tflmicro

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

我們可以使用 TensorFlow 的訓練時量化 (QAT) 特征,輕松地將浮點模型轉換為量化模型。

TensorFlow 的訓練時量化 (QAT)

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

將模型轉換為 TF Lite 格式

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

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 模型,我們也可以驗證量化模型的功能,并將其準確率與 Google Colab 內部的常規未量化模型進行比較。

tf.lite

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

我們要部署的電路板上的 RP2040 MCU 沒有內置的文件系統,這意味著我們不能在電路板上直接使用 .tflite 文件。然而,我們可以使用 Linux 的“xxd”命令將 .tflite 文件轉換為 .h 文件,然后可以在下一步的推理應用中進行編譯。

%%shell

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

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

echo “};”

將模型部署到設備

現在模型已經準備完成,并可部署到設備上。我們已經創建了用于推理的應用模板,可以與我們為模型生成的 .h 文件一起編譯。

用于推理的應用模板

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

這個 C++ 應用依托于 pico-sdk 構建而成,同時還配備 CMSIS-DSP、pico-tflmicro,以及 Pico 庫的麥克風庫。它的一般結構如下:

1. 初始化

配置板內置 LED 的輸出。該應用將把 LED 的亮度映射到模型的輸出(0.0 表示 LED 關閉,1.0 表示 LED 亮度全開)

設置用于推理的 TF Lite 庫和 TF Lite 模型

設置基于 CMSIS-DSP 的 DSP 流水線

設置并啟動用于實時音頻的麥克風

2. 推理循環

等待來自麥克風的 512 個新音頻樣本(共 4 組,每組 128 個)

將聲譜圖數組移動 4 列

將音頻輸入緩沖區移動 512 個樣本(共 4 組,每組 128 個)并在新樣本中復制

為更新的輸入緩沖區計算 4 個新的聲譜圖列

對聲譜圖數據進行推理

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

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

上文中使用了 128,以匹配聲譜圖中的訓練流水線采用的 128 的幅度。我們在聲譜圖中采用了 4 移位,以適應我們的實時限制。

編譯固件

現在我們可以使用 CMake 來生成編譯所需的構建文件,然后用 make 進行編譯。

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

SparkFun: cmake 。. -DPICO_BOARD=sparkfun_micromod

Raspberry Pi Pico: cmake 。. -DPICO_BOARD=pico

將推理應用刷寫到板上

您需要再次將板調至“啟動 ROM 模式”,以便將新的應用加載到板上。

SparkFun

將 USB-C 數據線插入電路板和個人計算機,為電路板供電。

按住電路板上的 BOOT 按鈕,同時按 RESET 按鈕。

Raspberry Pi Pico

將 Micro USB 線插入個人計算機,但不要插入 Pico 一側。

按住白色 BOOTSEL 按鈕,同時將 Micro USB 線插入 Pico。

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

監控板上的推理

推理應用在電路板上開始運行之后,您可以通過兩種方式觀察它的運行情況:

通過觀察板上 LED 的亮度來直觀地獲取信息。沒有火災警報聲時,LED 應該保持關閉或變暗,若有火災警報聲,LED 就會亮起:

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

Web Serial API

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

改善模型

現在已將第一版模型部署在板上,該模型正在對 16,000 kHz 的實時音頻數據進行推理!

測試一下各種聲音,看看模型是否有預期的輸出。可能會誤檢測出火災警報聲(誤報),也有可能在有警報聲時沒有檢測出來(漏報)。

如果出現這種情況,您可以將 USB 麥克風應用固件刷寫到板上,為訓練記錄數據,重新訓練模型并轉換為 TF lite 格式,以及重新編譯推理應用并刷寫到板上,以便為場景記錄更多新的音頻數據。

監督式機器學習模型的好壞通常取決于其所使用的訓練數據,所以針對這些場景的額外訓練數據可能會有助于改善模型。您也可以嘗試改變模型結構或特征提取過程,但請記住,模型必須足夠小巧快速,才能在 RP2040 MCU 上運行。

結論

本文介紹了一個端到端的流程,即如何訓練自定義的音頻分類器模型,以便在使用 Arm Cortex-M0+ 處理器的開發板上運行。就模型訓練而言,我們采用了 TensorFlow,使用了遷移學習技術以及較小的數據集和數據增強技術。我們還從麥克風中收集了自己的數據,并在推理時加以使用,其方法是將 USB 麥克風應用加載到開發板上,并通過網絡音頻 API 和 JavaScript 擴展 Colab 的特征。

項目的訓練方面結合了 Google 的 Colab 服務和 Chrome 瀏覽器,以及開源的 TensorFlow 庫。推理應用從數字麥克風采集音頻數據,在特征提取階段使用 Arm 的 CMSIS-DSP 庫,然后使用適用于微控制器的 TensorFlow Lite 與 Arm CMSIS-NN 加速內核,用 8 位量化模型進行推理,在 Arm Cortex-M0+ 處理器上對實時的 16 kHz 音頻輸入進行分類。

利用 Google Chrome 的網絡音頻 API、網絡 USB API 和網絡串行 API 功能來擴展 Google Colab 的特征,與開發板進行互動。這樣我們就能夠完全通過網絡瀏覽器對我們的應用進行實驗和開發,并將其部署到一個受限的開發板上進行設備端推理。

由于 ML 處理是在開發板 RP2040 MCU 上進行的,所以在推理時,所有音頻數據均會保留在設備上。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 音頻
    +關注

    關注

    31

    文章

    3188

    瀏覽量

    85582
  • 機器學習
    +關注

    關注

    66

    文章

    8553

    瀏覽量

    136957

原文標題:使用 Raspberry Pi RP2040 進行端到端 TinyML 音頻分類

文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    探索LPC11E6x 32位ARM Cortex - M0+微控制器:特性、應用與設計要點

    探索LPC11E6x 32位ARM Cortex - M0+微控制器:特性、應用與設計要點 在當今電子設備飛速發展的時代,
    的頭像 發表于 03-02 17:10 ?579次閱讀

    S6E1C系列32位ARM? Cortex?-M0+ FM0+微控制器深度解析

    S6E1C系列32位ARM? Cortex?-M0+ FM0+微控制器深度解析 在嵌入式系統設計領域,選擇一款合適的微控制器對于產品的性能和
    的頭像 發表于 02-27 15:25 ?164次閱讀

    深入剖析LPC1315/16/17/45/46/47:32位ARM Cortex - M3微控制器的卓越之選

    深入剖析LPC1315/16/17/45/46/47:32位ARM Cortex - M3微控制器的卓越之選 在嵌入式應用領域,一款性能優越、功能豐富且功耗低的
    的頭像 發表于 02-11 16:55 ?522次閱讀

    LPC1110/11/12/13/14/15 32 位 ARM Cortex - M0 微控制器:設計與應用指南

    /11/12/13/14/15 32 位 ARM Cortex - M0 微控制器憑借其高性能、低功耗等特性,在諸多應用場景中展現出強大的競爭力。本文
    的頭像 發表于 02-10 15:20 ?158次閱讀

    最小化ARM Cortex-M CPU功耗的方法與技巧分享

    存儲器,進一步降低整體系統功耗)。   2 中斷控制器節能技術   Cortex-M架構中的中斷控制器(Nested Vectored Interrupt Controller or NVIC)在
    發表于 01-21 06:19

    PN7462家族NFC Cortex - M0微控制器:特性、應用與設計要點

    Semiconductors的PN7462家族NFC Cortex - M0微控制器,憑借其高性能、低功耗以及豐富的功能特性,成為了眾多應用場景的理想選擇。本文深入探討PN7462
    的頭像 發表于 12-29 15:55 ?443次閱讀

    深入剖析LPC553x:一款功能強大的32位ARM Cortex - M33微控制器

    深入剖析LPC553x:一款功能強大的32位ARM Cortex-M33微控制器 在嵌入式應用的領域中,微控制器的性能和功能直接影響著產品的質量和競爭力。今天,我們要深入探討的是NXP
    的頭像 發表于 12-25 10:10 ?735次閱讀

    探秘MCXNx4x:32位Arm Cortex - M33微控制器的卓越性能與應用潛力

    探秘MCXNx4x:32位Arm Cortex-M33微控制器的卓越性能與應用潛力 在電子工程領域,高性能、高安全性且功能豐富的微控制器始終是設計創新的核心驅動力。今天,我們
    的頭像 發表于 12-24 15:00 ?338次閱讀

    深入解析PN7462家族NFC Cortex - M0微控制器

    C300Y.pdf 一、總體概述 PN7462家族是基于32位Arm Cortex - M0的NFC微控制器家族,具有高性能和低功耗的顯著優勢。與現有架構相比,它擁有簡單的
    的頭像 發表于 12-23 16:10 ?375次閱讀

    Cortex-M產品的特色

    的處理能力。 中斷控制器Cortex-M處理器內置了靈活的中斷控制器,能夠支持多種中斷優先級和高效的中斷處理機制。 訪問控制單元(ACU):ACU提供了對存儲器和外設的訪
    發表于 11-26 07:22

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

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

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

    Texas Instruments MSPM0L110x Arm^?^ Cortex ^?^ -M0微控制器 (MCU) 是MSP高度集成、超低功耗32位MSPM0 MCU系列的一部分
    的頭像 發表于 08-25 09:56 ?1004次閱讀
    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>深度解析

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

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

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

    Analog Devices MAX32672 ARM Cortex-M4F微控制器是一款超低功耗、高性價比、高度集成、高度可靠的32位微控制器。該器件支持具有復雜傳感器處理的設計,且
    的頭像 發表于 06-27 11:12 ?858次閱讀
    Analog Devices / Maxim Integrated MAX32672 <b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b>4F<b class='flag-5'>微控制器</b>特性/應用/框圖

    MAX32555 Cortex-M3閃存微控制器英文數據手冊

    電子發燒友網站提供《MAX32555 Cortex-M3閃存微控制器英文數據手冊.pdf》資料免費下載
    發表于 04-25 16:40 ?1次下載