▼點擊下方名片,關注公眾號,獲取更多精彩內容▼
這里是《賀老師講嵌入式AI》,我是《嵌入式AI:讓單片機學會思考》課程主理人,專注AI在MCU上的落地實踐。
關注公眾號后,回復【嵌入式AI】,可以免費獲取更多賀老師準備的專業資料。

Arduino Nano 33 BLE Sense ×1
Edge Impulse Studio
對于 COVID-19 和其他與流感相關疾病的早期檢測,人們迫切需要價格低廉、易于部署的解決方案。最近,我們與聯合國、Hackster、Edge Impulse 以及許多其他機構共同發起了 聯合國 COVID 檢測與防護挑戰賽, 其目標是為發展中國家的流感預防和檢測創建易于部署的解決方案。
在本教程中,我們將演示如何在 Arduino Nano BLE Sense 上使用 Edge Impulse 機器學習技術,在實時音頻中檢測咳嗽聲。我們構建了一個由咳嗽聲和背景噪聲樣本組成的數據集,并使用高度優化的 TinyML 模型,構建了一個能夠在 Nano BLE Sense 上以低于 20 kB RAM 實時運行的咳嗽檢測系統。
同樣的方法也適用于許多其他嵌入式音頻模式匹配應用,例如老年人護理、安全監測和機器監測。該項目和數據集最初由 Kartik Thakore 發起,用于協助抗擊 COVID-19。
本教程有以下要求:
我們將使用 Edge Impulse,它是一個面向邊緣設備機器學習的在線開發平臺。 點擊此處注冊免費賬號。 登錄賬號后,點擊項目標題并為新項目命名。我們的項目名稱為“Arduino Cough Tutorial”。
任何機器學習項目的第一步,都是收集一個數據集,其中包含我們希望 Arduino 設備能夠匹配的已知數據樣本。為了幫助你開始,我們創建了一個小型數據集,其中包含 10 分鐘的音頻,分為“cough”和“noise”兩個類別。我們將演示如何把這個數據集導入 Edge Impulse 項目、添加自己的樣本,或者從頭開始創建自己的數據集。這個數據集規模較小,只包含數量有限的咳嗽聲樣本和較輕的背景噪聲樣本。
因此,該數據集僅適用于實驗。本教程生成的模型只能區分安靜的背景噪聲和少量類型的咳嗽聲。我們建議你使用范圍更廣的咳嗽聲、背景噪聲以及人類語音等其他類別來擴充數據集,從而提高性能。
注意:強迫自己咳嗽會對聲帶造成很大負擔,在收集數據和測試時請務必小心。
首先下載我們的咳嗽數據集,并將文件解壓到電腦上你選擇的位置: https://cdn.edgeimpulse.com/datasets/cough.zip
你可以使用 Edge Impulse CLI Uploader 將該數據集導入 Edge Impulse 項目。按照 安裝說明 安裝 Edge Impulse CLI。
打開終端或命令提示符,并進入解壓文件所在的文件夾。
運行:
edge-impulse-uploader --cleanedge-impulse-uploader --category training training/*edge-impulse-uploader --category testing testing/*
系統會提示你輸入 Edge Impulse 用戶名、密碼,以及要添加數據集的項目。隨后,這些數據集樣本會顯示在 Data acquisition 頁面中。點擊某個樣本后,我們可以查看樣本的波形,并通過點擊每個圖形下方的播放按鈕收聽音頻。
10 分鐘的咳嗽聲和噪聲數據樣本足以幫助你開始。你也可以選擇使用自己的咳嗽聲和背景噪聲樣本來擴充數據集。我們可以直接在 Data acquisition 頁面中從設備采集新的數據樣本。WAV 格式的音頻樣本也可以使用 Edge Impulse CLI Uploader 上傳。
重要說明:用于真實應用的模型,應使用盡可能多樣化的數據集進行訓練和測試。這個初始數據集規模相對較小,因此當模型遇到不同類型的背景噪聲,或者不同人員的咳嗽聲時,表現會不穩定。
最簡單的入門方式是使用手機采集音頻數據,完整教程可參閱 此處。 進入 Devices 頁面,然后點擊右上角的“+ Connect a new device”按鈕。選擇“Use your mobile phone”。系統會生成一個唯一的二維碼,用于在手機瀏覽器中打開 Web 應用。拍攝二維碼,然后選擇打開其中的鏈接。
該 Web 應用會連接到你的 Edge Impulse 項目,界面應如下所示:
現在,我們可以直接通過 Edge Impulse 的 Data acquisition 頁面,使用手機采集音頻數據樣本。在“Record new data”區域中,將標簽輸入為“cough”或“noise”,確認傳感器選擇為“Microphone”,然后點擊“Start sampling”。手機現在會采集一段音頻樣本,并將其添加到數據集中。
系統也支持直接從 Nano BLE Sense 開發板采集音頻數據。按照 這些說明 安裝 Edge Impulse 固件和守護程序。設備連接到 Edge Impulse 后,就可以像上面使用手機時一樣采集數據樣本。
接下來,我們將在 Create impulse 頁面中選擇信號處理模塊和機器學習模塊。開始時,Impulse 為空,只包含 Raw data 和 Output feature 模塊。保持默認設置:Window size 為 1000 ms,Window increase 為 500 ms。這意味著音頻數據每次按 1 秒處理,并且每隔 0.5 秒開始一個新的處理窗口。較小的窗口能夠節省嵌入式設備的內存,但這也意味著咳嗽樣本數據中的各次咳嗽之間不能存在很長的間隔。
點擊“Add a processing block”,并選擇 Audio(MFCC)模塊。然后點擊“Add a learning block”,選擇 Neural Network(Keras)模塊。點擊“Save Impulse”。音頻模塊會為每個音頻窗口提取一幅頻譜圖,神經網絡模塊則會根據訓練數據集,學習把頻譜圖分類為“cough”或“noise”。最終生成的 Impulse 應如下所示:
接下來,我們將在 MFCC 頁面中從訓練數據集生成特征。這個頁面會顯示從數據集任意樣本的每個 1 秒窗口中提取出的頻譜圖。這里可以保留默認參數。
然后點擊“Generate features”按鈕,該操作會使用這個處理模塊處理整個訓練數據集,并創建下一步訓練神經網絡時要使用的完整特征集。點擊“Generate features”按鈕開始處理,整個過程需要幾分鐘。
現在,我們可以進入 NN Classifier 頁面,設置并訓練神經網絡。默認神經網絡非常適合流水聲等連續聲音。咳嗽檢測更復雜,因此我們將使用每個窗口頻譜圖上的 二維卷積 來配置一個更豐富的網絡。二維卷積處理音頻頻譜圖的方式,與圖像分類類似。
點擊“Neural Network settings”區域的右上角,然后選擇“Switch to Keras(expert)mode”。
使用以下代碼替換“Neural network architecture”定義,并將“Minimum confidence rating”設置為“0.70”。然后點擊“Start training”按鈕。訓練過程需要幾秒鐘。
import tensorflow as tffrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2Dfrom tensorflow.keras.optimizers import Adamfrom tensorflow.keras.constraints import MaxNorm# model architecturemodel = Sequential()model.add(InputLayer(input_shape=(X_train.shape[1], ), name='x_input'))model.add(Reshape((int(X_train.shape[1] / 13), 13, 1), input_shape=(X_train.shape[1], )))model.add(Conv2D(10, kernel_size=5, activation='relu', padding='same', kernel_constraint=MaxNorm(3)))model.add(AveragePooling2D(pool_size=2, padding='same'))model.add(Conv2D(5, kernel_size=5, activation='relu', padding='same', kernel_constraint=MaxNorm(3)))model.add(AveragePooling2D(pool_size=2, padding='same'))model.add(Flatten())model.add(Dense(classes, activation='softmax', name='y_pred', kernel_constraint=MaxNorm(3)))# this controls the learning rateopt = Adam(lr=0.005, beta_1=0.9, beta_2=0.999)# train the neural networkmodel.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])model.fit(X_train, Y_train, batch_size=32, epochs=9, validation_data=(X_test, Y_test), verbose=2)
頁面會顯示訓練性能和設備端性能,具體結果取決于你的數據集,顯示內容應類似如下結果:
現在,我們的 Arduino 咳嗽檢測算法已經可以進行測試了。
Live classification 頁面允許我們使用數據集自帶的現有測試數據測試算法,也可以從手機或 Arduino 設備流式傳輸音頻數據。我們可以先進行一個簡單測試:選擇任意測試樣本,然后點擊“Load sample”。系統會對測試樣本進行分類并顯示結果:
我們也可以使用實時數據測試算法。首先刷新之前在手機上打開的瀏覽器頁面。然后在“Classify new data”區域中選擇你的設備,并點擊“Start sampling”。與采集數據時相同,當 Nano BLE Sense 通過 edge-impulse-daemon 連接到項目后,也可以從開發板流式傳輸音頻樣本。
我們可以輕松地把咳嗽檢測算法部署到手機。進入手機上的瀏覽器窗口并刷新,然后點擊“Switch to classification mode”按鈕。系統會自動把項目構建為 WebAssembly 軟件包,并在手機上持續執行。此后不再需要云端服務,甚至可以切換到飛行模式。
接下來,我們可以進入 Deployment 頁面,把算法部署到 Nano BLE Sense。在“Build firmware”下選擇“Arduino Nano 33 BLE Sense”,然后點擊“Build”。
系統將為 Nano BLE Sense 構建一份完整固件,其中包含最新算法。按照屏幕上的說明,將二進制文件燒錄到 Arduino 開發板。
Arduino 燒錄完成后,在設備通過 USB 連接時,以 115,200 波特率打開串口。串口打開后,按回車鍵顯示命令提示符,然后輸入:
> AT+RUNIMPULSEInferencing settings:Interval: 0.06 ms.Frame size: 16000Sample length: 1000 ms.No. of classes: 2Starting inferencing, press 'b' to breakRecording...Recording donePredictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):cough: 0.01562noise: 0.98438Starting inferencing in 2 seconds...Recording...Recording donePredictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):cough: 0.01562noise: 0.98438Starting inferencing in 2 seconds...Recording...Recording donePredictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):cough: 0.86719noise: 0.13281Starting inferencing in 2 seconds...Recording...Recording donePredictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):cough: 0.01562noise: 0.98438
在 Arduino 上使用 TinyML、傳感器和 Edge Impulse,可以實現的內容幾乎沒有限制。下面是一些后續工作思路:
轉載說明:文章內容轉載自網絡,
鏈接為:https://www.hackster.io/edge-impulse/cough-detection-with-tinyml-on-arduino-417f37
若侵權請聯系刪除
關注本公眾號后,回復【咳嗽檢測】,可以獲取本文涉及到的全部資料


END