XIAOXIAO今天小編給大家帶來的是圣地亞哥的Maker Marcelo Rovai 使用 XIAO ESP32S3 Sensor 搭配Edge Impulse 實現的圖像分類的項目。
材料清單
硬件
Seeed XIAO ESP32S3 Sensor
軟件
Arduino IDE
Edge Impulse Studio
Seeed Studio 發布了一款新型經濟實惠的開發板 XIAO ESP32S3 Sense,它集成了攝像頭傳感器、數字麥克風和 SD 卡支持。該開發板結合了嵌入式 ML 計算能力和攝影功能,是啟動 TinyML(智能語音和視覺 AI)的絕佳工具。
XIAOESP32S3 Sense主要特點
MCU:采用ESP32S3 32位雙核Xtensa處理器芯片,運行頻率高達240 MHz,安裝多個開發端口,支持Arduino / MicroPython
組合設計:可拆卸 OV2640 攝像頭傳感器,分辨率為 1600*1200,兼容 OV5640 攝像頭傳感器,集成額外的數字麥克風
電源設計:鋰電池充電管理能力提供四種功耗模式,深度睡眠模式功耗低至14μA超大內存,更多可能:提供 8MB PSRAM 和 8MB FLASH,支持 SD 卡插槽用于外部 32GB FAT 內存
射頻性能:支持2.4GHz Wi-Fi和BLE雙無線通信,連接U.FL天線支持100m+遠程通信
緊湊設計:21 x 17.5mm,采用XIAO經典外形,適合可穿戴設備等空間有限的項目
引腳圖:
欲了解更多詳細信息,請參閱 Seeed Studio WiKi 頁面
Step-1 在Arduino IDE上安裝XIAO ESP32S3板載文件
在 Arduino IDE 上,導航至“文件”>“首選項”,然后填寫 UR
接下來,打開板管理器。轉到“工具”>“開發板”>“開發板管理器”...并輸入 esp32。選擇并安裝最新的軟件包:
在工具上,選擇主板 (XIAO ESP32S3):
最后使用數據線連接開發板到電腦上,選擇ESP32S3的端口即可。
Step-2 測試開發板
XIAO ESP32S3 Sense 有一個內置 LED,連接到 GPIO21。因此,您可以修改引腳編號后上傳運行 Blink 代碼。
#define LED_BUILT_IN 21 void setup() { pinMode(LED_BUILT_IN, OUTPUT); // Set the pin as output } // Remember that the pin work with inverted logic // LOW to Turn on and HIGH to turn off void loop() { digitalWrite(LED_BUILT_IN, LOW); //Turn on delay (1000); //Wait 1 sec digitalWrite(LED_BUILT_IN, HIGH); //Turn off delay (1000); //Wait 1 sec }
請注意,引腳以反轉邏輯工作:低電平打開,高電平關閉
連接Sense模塊(擴展板)
購買時,擴展板與主板是分離的,但安裝擴展板非常簡單。需要將擴展板上的連接器與XIAO ESP32S3上的B2B連接器對齊,用力按壓,聽到“咔”的一聲,安裝完成。
正如簡介中所述,擴展板或設備的“傳感”部分具有 1600x1200 OV2640 攝像頭、SD 卡插槽和數字麥克風。
麥克風測試
讓我們從聲音檢測開始。轉到 GitHub(https://github.com/Mjrovai/XIAO-ESP32S3-Sense) 項目并下載草圖:XIAOEsp2s3_Mic_Test(https://github.com/Mjrovai/XIAO-ESP32S3-Sense/tree/main/Mic_Test/XiaoEsp32s3_Mic_Test) 并在 Arduino IDE 上運行它:
當產生聲音時,您可以在串行繪圖儀上驗證它。
將錄制的聲音(.wav 音頻文件)保存到 microSD 卡。
使用板載 SD 卡讀卡器來保存 .wav 音頻文件。為此,我們需要啟用 XIAO PSRAM。
ESP32-S3 的 MCU 芯片上只有幾百 KB 的內部 RAM。對于某些用途來說,這可能不夠,因此 ESP32-S3 可以使用與 SPI 閃存芯片并聯的高達 16 MB 的外部 PSRAM(偽靜態 RAM)。外部存儲器包含在存儲器映射中,并且在有一定限制的情況下,可以與內部數據 RAM 相同的方式使用。
首先,將 SD 卡插入 XIAO,如下圖所示(SD 卡應格式化為 FAT32)。
下載示例程序“ Wav_Record ”,可以在 GitHub 上找到它。
執行代碼(Wav Record)需要使用ESP-32芯片的PSRAM功能,所以上傳前先打開:Tools>PSRAM:“OPI PSRAM”>OPI PSRAM
運行代碼Wav_Record.ino
該程序僅在用戶打開串口監視器后執行一次,錄制20秒并將錄制文件保存到microSD卡上,名稱為“arduino_rec.wav”。
當串口監視器每1秒輸出一次“ . ”程序執行完畢,可以借助讀卡器播放錄制的聲音文件。
音質非常棒!
代碼如何工作的解釋超出了本教程的范圍,但您可以在SeeedStudio的wiki 頁面上找到詳細的描述。
相機測試
要測試相機,您應該從 GitHub 下載文件夾 take_photos_command。該文件夾包含草圖 ( .ino ) 和兩個包含相機詳細信息的 .h 文件。
運行代碼:take_photos_command.ino。打開串行監視器并發送命令“ capture ”來捕獲圖像并將其保存在SD卡上:
驗證串口監視器上是否選擇了 [Both NL & CR]。
測試WiFi
XIAO ESP32S3 的優勢之一是其 WiFi 功能。那么,讓我們測試它的無線電,掃描它周圍的 WiFi 網絡。您可以通過運行板上的代碼示例之一來完成此操作。
轉到 Arduino IDE 示例并查找 WiFI ==> WiFIScan
在串行監視器上,您應該看到設備范圍內的 WiFi 網絡(SSID 和 RSSI)。這是我在家里得到的東西:
簡單的 WiFi 服務器(打開/關閉 LED)
讓我們測試一下設備作為 WiFi 服務器的能力。我們將在設備上托管一個簡單的頁面,用于發送打開和關閉 XIAO 內置 LED 的命令。
和之前一樣,去 GitHub 下載包含 sketch 的文件夾:SimpleWiFiServer。
在運行草圖之前,您應該輸入您的網絡憑據:
const char* ssid = "Your credentials here"; const char* password = "Your credentials here";
您可以使用串行監視器監視服務器的工作情況。
獲取 IP 地址并在瀏覽器中輸入:
您將看到一個頁面,其中包含可以打開和關閉 XIAO 內置 LED 的鏈接。
將視頻流傳輸至網絡
現在您知道可以從網頁向您的設備發送命令,讓我們執行相反的操作。讓我們拍攝相機捕獲的圖像并將其流式傳輸到網頁:
從 GitHub 下載包含代碼的文件夾:XIAO-ESP32S3-Streeming_Video.ino 。
請記住,該文件夾不僅包含 .ino 文件,還包含處理相機所需的幾個 .h 文件。
輸入您的憑據并運行草圖。在串行監視器上,您可以找到要在瀏覽器中輸入的頁面地址:
在瀏覽器上打開頁面(等待幾秒鐘以開始流式傳輸)效果如圖。
當您將相機定位為捕獲 ML 項目的數據集時(例如,使用代碼“take_photos_commands.ino”),簡化相機“看到”的內容可能非常重要。
當然,我們可以同時做這兩件事,在頁面上顯示相機所看到的內容,并發送命令來捕獲圖像并將圖像保存在 SD 卡上。為此,您可以使用代碼 Camera_HTTP_Server_STA,該文件夾可以從 GitHub 下載。
該程序將執行以下任務:
將相機設置為 JPEG 輸出模式。
創建一個網頁(例如==> http://192.168.4.119//)。正確的地址將顯示在串行監視器上。
如果 server.on ("/capture", HTTP_GET, serverCapture),則程序拍攝照片并將其發送到 Web。
可以使用[旋轉]按鈕旋轉網頁上的圖像
[CAPTURE]命令只會預覽網頁上的圖像,并在串行監視器上顯示其大小
[SAVE]命令將圖像保存在SD卡上,同時在網絡上顯示圖像。
保存的圖像將遵循順序命名(image1.jpg、image2.jpg。
該程序可用于圖像分類項目的圖像數據集捕獲。
檢查代碼;將會更容易理解相機的工作原理。此代碼是基于 Rui Santos 的精彩教程:ESP32-CAM 在 Web 服務器中拍照并顯示而開發的,我邀請大家訪問該教程。
Step-3圖像數據收集
現在我們已經運行了嵌入式攝像頭,是時候嘗試圖像分類了。出于比較目的,我將復制開發用于舊 ESP2-CAM 的相同圖像分類項目:
ESP32-CAM:TinyML 圖像分類 - 水果與蔬菜
我們項目的整體思路是訓練模型并在 XIAO ESP32S3 Sense 上進行推理。為了訓練,我們應該找到一些數據(大量的數據!)。
但首先,我們需要一個目標!我們想要分類什么?
對于TinyML,一組與嵌入式設備上的機器學習推理相關的技術,由于限制(在這種情況下主要是內存),我們應該將分類限制為三到四個類別。我們將區分蘋果、香蕉和土豆(你可以嘗試其他類別)。
因此,讓我們找到一個包含這些類別的圖像的特定數據集。Kaggle 是一個好的開始:
該數據集包含以下食品的圖像:
水果 - 香蕉、蘋果、梨、葡萄、橙子、獼猴桃、西瓜、石榴、菠蘿、芒果。
蔬菜 - 黃瓜、胡蘿卜、辣椒、洋蔥、土豆、檸檬、番茄、蘿卜、甜菜根、卷心菜、生菜、菠菜、大豆、花椰菜、甜椒、辣椒、蘿卜、玉米、甜玉米、紅薯、辣椒粉、墨西哥胡椒、生姜、大蒜、豌豆、茄子。
每個類別分為訓練(100 張圖像)、測試(10 張圖像)和驗證(10 張圖像)。
將數據集從 Kaggle 網站下載到您的計算機。
或者,您可也添加一些來自家庭廚房的香蕉、蘋果和土豆的新鮮照片。
Step-4 使用 Edge Impulse Studio訓練模型
我們將使用 Edge Impulse Studio 來訓練我們的模型。Edge Impulse 是邊緣設備上機器學習的領先開發平臺。
在 Edge Impulse 輸入您的帳戶憑據(或創建免費帳戶)。接下來,創建一個新項目:
數據采集
接下來,在 UPLOAD DATA 部分,從您的計算機上傳所選類別的文件:
您現在應該擁有訓練數據集,分為三類數據:
您可以上傳額外的數據以進行進一步的模型測試或拆分訓練數據。我將保留原樣,以使用盡可能多的數據。
模型設計
脈沖獲取原始數據(在本例中為圖像),提取特征(調整圖片大小),然后使用學習塊對新數據進行分類。
如前所述,對圖像進行分類是深度學習最常見的用途,但需要使用大量數據來完成此任務。每個類別我們有大約 90 張圖像。這個數量夠嗎?一點也不!我們需要數千張圖像來“教學或建模”來區分蘋果和香蕉。但是,我們可以通過使用數千張圖像重新訓練先前訓練的模型來解決這個問題。我們將這種技術稱為“遷移學習”(TL)。
通
過 TL,我們可以在數據上微調預訓練的圖像分類模型,即使對于相對較小的圖像數據集(我們的案例)也能表現良好。
因此,從原始圖像開始,我們將調整它們的大小(96x96)像素,然后將它們輸入到我們的遷移學習塊中:
預處理(特征生成)
除了調整圖像大小之外,我們還應該將它們更改為灰度以保持實際的 RGB 顏色深度。這樣,我們的每個數據樣本都將具有 9 維、216 個特征 (96x96x1)。保持 RGB 不變,這個尺寸會大三倍。使用灰度有助于減少推理所需的最終內存量。
不要忘記“保存參數”。這將生成用于訓練的特征。
模型訓練(遷移學習和數據增強)
2007 年,Google 推出了 MobileNetV1,這是一個通用計算機視覺神經網絡系列,專為移動設備而設計,支持分類、檢測等功能。MobileNet 是小型、低延遲、低功耗模型,經過參數化以滿足各種用例的資源限制。
盡管基本的 MobileNet 架構已經很小并且延遲很低,但很多時候,特定的用例或應用程序可能需要模型更小、更快。
MobileNet 引入了一個稱為寬度乘數的簡單參數 α(alpha)來構建這些更小、計算成本更低的模型。寬度乘數 α 的作用是在每一層均勻地細化網絡。
Edge Impulse Studio 提供 MobileNet V1(96x96 圖像)和 V2(96x96 和 160x160 圖像),具有多個不同的 α 值(從 0.05 到 1.0)。例如,使用 V2、160x160 圖像和 α=1.0 時,您將獲得最高的準確度。當然,這是一個權衡。精度越高,運行模型所需的內存(大約 1.3M RAM 和 2.6M ROM)就越多,這意味著延遲也就越長。
MobileNet V1 和 α=0.10 的另一個極端(大約 53.2K RAM 和 101K ROM)將獲得更小的占用空間。
當我們第一次發布這個在 ESP32-CAM 上運行的項目時,我們停留在可能性的較低水平,這保證了小延遲的推理,但不能保證高精度。對于第一遍,我們將保留此模型設計(MobileNet V1 和 α=0.10)。
深度學習使用的另一個重要技術是數據增強。數據增強是一種可以幫助提高機器學習模型的準確性、創建額外的人工數據的方法。
在下面,您可以看到 Edge Impulse 如何對您的數據實施數據增強策略:
# Implements the data augmentation policy def augment_image(image, label): # Flips the image randomly image = tf.image.random_flip_left_right(image) # Increase the image size, then randomly crop it down to # the original dimensions resize_factor = random.uniform(1, 1.2) new_height = math.floor(resize_factor * INPUT_SHAPE[0]) new_width = math.floor(resize_factor * INPUT_SHAPE[1]) image = tf.image.resize_with_crop_or_pad(image, new_height, new_width) image = tf.image.random_crop(image, size=INPUT_SHAPE) # Vary the brightness of the image image = tf.image.random_brightness(image, max_delta=0.2) return image, label
在訓練期間接觸這些變化可以幫助防止模型通過“記住”訓練數據中的表面線索來走捷徑,這意味著它可以更好地反映數據集中深層的底層模式。
我們模型的最后一層將有 16 個神經元,并具有 10% 的 dropout,以防止過度擬合。這是訓練輸出:
結果并不好。該模型達到了約 77% 的準確率,但預計在推理過程中使用的 RAM 量相對較小(約 60 KB),這非常好。
模型部署
訓練后的模型將作為 .zip Arduino 庫部署:
打開 Arduino IDE,然后在 Sketch 下,轉到 Include Library 和 add.ZIP Library。選擇您從 Edge Impulse Studio 下載的文件,就這樣!
在 Arduino IDE 的示例選項卡下,您應該在項目名稱下找到草圖代碼。
打開靜態緩沖區示例:
您可以看到第一行代碼正是對一個庫的調用,其中包含在您的設備上運行推理所需的所有必要內容。
#include
當然,這是一個通用代碼(“模板”),僅獲取一個原始數據樣本(存儲在變量:features = {} 上)并運行分類器,進行推理。結果顯示在串行監視器上。
我們應該從相機獲取樣本(圖像)并對其進行預處理(調整大小至 96x96、轉換為灰度并展平)。這將是我們模型的輸入張量。
輸出張量將是一個具有三個值(標簽)的向量,顯示每一類的概率。
返回到您的項目(選項卡圖像),復制原始數據示例之一:
將9216個特征復制到剪貼板。這是輸入張量(96x96x1 的扁平圖像),在本例中為香蕉。通過 features[] = {0xb2d77b, 0xb5d687, 0xd8e8c0, 0xeaecba, 0xc2cf67, ...}上的此輸入張量
注意:Edge Impulse 在其 SDK 中包含了 ESP NN 庫,其中包含針對各種 Espressif 芯片優化的 NN(神經網絡)功能。在本教程發布(5 月 2 日)之前,ESP NN 無法與 ESP32S3(Arduino IDE)配合使用。
如果編譯代碼并出現錯誤,則有必要修復此問題。EI 建議關閉 ESP NN 加速。為此,請在導出的 Arduino 庫文件夾中找到 ei_classifier_config.h :/scr/edge-impulse-sdk/classifier/:
找到#define EI_CLASSIFIER_TFLITE_ENABLE_ESP_NN 1 行,并將其從 1 更改為 0:
現在,在運行推理時,您應該獲得“香蕉”的最高分。
好消息!我們的設備進行推理,發現輸入圖像是香蕉。另請注意,推理時間約為 317 毫秒,如果您嘗試對視頻中的圖像進行分類,則最大幀率為 3 fps。
這是比 ESP32 CAM(525 毫秒延遲)更好的結果。
現在,我們應該結合相機并對圖像進行實時分類。
轉到 Arduino IDE 示例并從您的項目下載草圖 esp32_camera:
應該通過與我們的模型相關的數據更改第 32 至 75 行,這些行定義了相機模型和引腳:
修改后的草圖可以從 GitHub 下載:xiao_esp32s3_camera。
請注意,您可以選擇將引腳保留為 a.h 文件,就像我們在前面部分中所做的那樣。
將代碼上傳到您的 XIAO ESP32S3 Sense,您就可以開始對水果和蔬菜進行分類了!您可以在串行監視器上檢查結果。
測試模型(推理)
用相機拍照,分類結果將顯示在串行監視器上:
其他測試:
結論
XIAO ESP32S3 Sense是一種非常靈活,高性價比且易于編程的設備。該項目證明了TinyML的潛力。記憶不是問題;該設備可以處理許多后處理任務,包括通信。但是您應該考慮到高延遲(沒有ESP NN加速器)將限制一些應用程序,盡管XIAO比ESP32-CAM快50%。在我的GitHub存儲庫中,您可以找到代碼的最新版本:XIAO-ESP32S3-Sense。一如既往,我希望這個項目可以幫助其他人在人工智能、電子和物聯網的激動人心的世界中找到自己的路!
審核編輯:湯梓紅
-
傳感器
+關注
關注
2562文章
52527瀏覽量
763595 -
處理器
+關注
關注
68文章
19799瀏覽量
233502 -
攝像頭
+關注
關注
61文章
4948瀏覽量
97648 -
圖像分類
+關注
關注
0文章
96瀏覽量
12107 -
esp32s3
+關注
關注
0文章
8瀏覽量
922
原文標題:創客項目秀|基于XIAO 的圖像分類處理項目
文章出處:【微信號:ChaiHuoMakerSpace,微信公眾號:柴火創客空間】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于多通道分類合成的SAR圖像分類研究
公司項目外包:圖像處理(FPGA實現)
【Seeeduino XIAO申請】基于微控制器和激光測距的小型防撞提醒裝置
【Seeeduino XIAO申請】準備試下中控,準備帶孩子學習下Seeeduino XIAO開發板。
【Seeeduino XIAO申請】Seeeduino XIAO的PWM應用
圖像分類的方法之深度學習與傳統機器學習
圖像分類任務的各種tricks
使用CircuitPython對Seeeduino Xiao進行編程上午開源項目

評論