Pixel:Bit 教學(六)-Edge Impulse 影像辨識實作(下):模型訓練與使用

一、前言

Pixel:Bit 教學(五) 中我們介紹了什麼是 TinyML,在 TinyMLEdge Impulse 所扮演的角色,以及 Edge Impulse 提供了哪些服務,最後更帶大家從 Pixel:Bit 收集圖片資料,轉交 Edge Impulse 做初步的資料預處理及特徵提取。這個單元將帶大家繼續完成「模型訓練&驗證」、「模型測試」、「模型部屬」三個部分,達到實際使用 Pixel:Bit 實作影像分類的功能。

二、模型訓練

Pixel:Bit 教學(五) 文章中我們已經上傳四個類別(剪刀、石頭、布、背景)的資料,並經過 Edge Impulse 提供的特徵提取功能取出資料特徵值,接著我們需要將這些有用的資料進行遷移學習(Transfer learning)訓練。

遷移學習(Transfer learning)是屬於機器學習的一種研究領域,它專注於儲存已有問題的解決模型,並將其利用在其他不同但相關問題上;比如說,用來辨識汽車的知識也可以被用來提升識別卡車的能力,因此我們可容易的從既有已訓練的模型中繼承其經驗,讓它能以少量資料學習新事物。

接下來就依照以下步驟一起進行模型訓練:

  1. 選擇左側欄 Transfer learning
  2. 訓練數值設定
    • 設定 Training Cycles 為 200 次(若訓練結果不理想可再提高次數,但須注意過擬合問題,即模型只學會了訓練資料的內容,對於未知的資料缺乏分辨的能力)。
    • Learning rate(學習速率)使用預設 0.0005。
    • Validation set size(驗證資料比例)使用預設 20%。
    • 若各類別資料數量不一,可以勾選 Auto-balance dataset 選項,它將會自動平衡所有類別資料,讓訓練過程不會因為某類資料特別多而特別偏向那一個類別。
    • 若想要增加其餘不同環境資料可勾選 Data augmentation,它將會對原始資料做特殊處理(如變色、亮度、旋轉、鏡像、加入雜訊等)以增加資料量,若訓練結果總是過擬合也可以試試此選項,加入不同環境資料可讓模型更容易學習到真正的重點(例如模型原本的學習結果可能需要在某種亮度才可正確推論結果,一旦環境亮度改變它將變得不準確),此時加入對資料亮暗度的改變,讓模型適應亮與暗的環境,盡可能去學習其他特點,例如輪廓,慢慢的讓模型學會其中的重點。
  3. 模型的選擇,經過我們反覆測試,在輸入圖像尺寸 48 x 48 下,因 RAM 限制,Pixel:Bit 最大能夠使用的模型為「MobileNetV1 96×96 0.25」,所以最終我們選擇它作為我們的遷移學習模型。
  4. 在確認好我們的模型及相關參數後我們就可按下 Start training,Edge Impulse 將會在線上幫我們訓練模型。

訓練完畢後我們可在頁面右側看到訓練完的準確度、損失及相關資訊,從下圖中我們可以看到此次訓練準確度達 86%,LOSS 0.34,並且可以看到每一類別的準確度,其中我們可以發現「剪刀(SCISSORS)」類別準確度最低只有 75%,有高達 18% 被認為是「布」類別(可能他們差異不大,難道是因為差三根手指頭而已??),但也還在可接受的範圍內;最後我們可在下方看到預估的「推論速度」、「RAM、FLASH使用量」,讓我們初步評估是否適合運行在目標裝置上。

三、模型測試

模型經過 Edge Impulse 訓練完成後接著就需要測試模型,還記得最初上傳圖片資料時我們選擇「自動拆分資料到訓練、驗證、測試階段」選項,所以每個階段會取各自的資料做處理,在訓練階段它將會針對訓練資料做訓練,訓練過程透過驗證資料驗證準確度。

其中若我們沒有透過測試階段測試模型,單純只看訓練後驗證的準確度,就有可能會產生過擬合(如上圖)的問題,即誤以為模型訓練的結果似乎很好,能夠準確分辨所有事物,但其實模型只是學會了表面工夫,對於沒有學習過的資料實際上是一竅不通,所以最終我們還是需要進一步測試模型,以確保模型對於一些未知的資料也能夠擁有較高的辨識準確度。

  1. 點選 Model testing 進到測試頁面。
  2. 點選 Classify all 將所有測試資料進行影像分類。

分類完畢後我們可以看到有哪些資料分類錯誤,並且可以進一步查看或移動資料到訓練資料集內。

從下圖我們可看到整體分類後的準確度高達 84%,並且一樣是「剪刀」類別準確度最低,只有 73%,但也還在可接受的範圍內;整體準確度與訓練後驗證準確度相符,所以我們可以有比較高的信心認為此模型應該沒有問題。

四、模型部屬

測試完模型後,最後一個步驟也是我們辛苦這麼久最期待的步驟,即模型的部屬,將訓練好的模型放入我們的 Pixel:Bit 中,實際在 Pixel:Bit 推論,現在就讓我們來看看實際的效果如何吧!

  1. 選擇左側 Deployment 選項進入模型部屬頁面。
  2. 因我們的開發平台使用 Arduino,所以選擇 Arduino Library,若是單純使用 C++ 開發可選擇 C++ Library,STM 系列 MCU 可選擇搭配 Cube.MX Library。

最終按下 Build 將我們的 Model 及相關推論所需的 Library 下載到 PC 端,並且將此 Library 解壓縮至 Arduinio 預設 Library 存放的路徑底下(C:\Users\xxxx\Documents\Arduino\libraries\)。

緊接著我們開啟上一篇中下載的 Pixel:Bit 範例程式「PixelBit_EdgeImpulse_ESP.ino」,同樣自行更改第 16、17 行 Wi-Fi 帳號密碼。

並且修改「app_httpd.cpp」檔案中第 19 行 Library 名稱,請更改為與先前下載的 Edge Impulse Library 相同名稱(名稱會依照 Edge Impulse 專案名稱),最後將程式碼上傳至 Pixel:Bit 就大功告成啦!

上傳完畢後開啟序列埠視窗,應該會看到如下圖所示畫面。

打開瀏覽器進入指示的 IP 位置即可看到如下圖所示的推論頁面(本教學的 IP 為 192.168.76)。

接下來依照以下步驟調整內容:

  1. 啟用 Edge Impulse Inference。
  2. 按下 Start Stream 啟用串流畫面即可在右側看到即時的串流畫面。
  3. 接著按下 Run inference 即可擷取照片並進行推論。
  • 按下推論後圖片將會被縮為 48×48 大小供輸入模型,並且在圖片右側顯示推論結果,如下圖我們擺出「布」的圖案,從推論結果可以發現準確度高達 99%,如下圖所示:
  • 如果擺出「剪刀」的圖案,準確度 80%,如同先前順練時的狀況,剪刀這個類別的準確度偏低,可能稍微容易被認為是「布」的類別,如下圖所示:

擺出「石頭」的圖案,準確度 99%,如下圖所示:

  • 最後使用剛剛的程式「未知」的圖案,準確度 94%,如下圖所示:

除了從網頁觀看推論結果外,也可透過序列埠視窗查看,並且可以發現每次推論花費的時間為 0.6 秒左右,如下圖所示:

五、小結

以上就是這次的 Pixel:Bit 教學,只要使用 Pixel:Bit 本身的高畫質相機並且搭配 Edge Impulse 就可玩出許多新應用,例如這次示範的辨識剪刀、石頭、布,未來可以在這個基礎上搭配 Pixel:Bit 的 TFT 衍生製作出自動猜拳機,讓我們這種邊緣人在無法做出決定的時候也能找個對手玩猜拳XD。

若您有 Pixel:Bit 研習的需求,歡迎填寫表單,日後有相關課程資訊將在第一時間通知您!