DesignSpark Electrical Logolinkedin
菜单 搜寻
提问问题

使用Google Teachable Machine 來實現Raspberry Pi 4 的影像分類推論

 

作者 许钰莨/曾俊霖
難度 普通
材料表
  1. Raspberry Pi 4 (4GB)   
  2. SD卡(16G)                       
  3. 網路攝影機                          
  4. Mini HDMI傳輸線     
  5. 螢幕、鍵盤、滑鼠

 

本文實現影像分類分成幾個步驟:

  • 在TM網頁中蒐集資料,訓練模型,在網站中即時影像分類。
  • 匯出模型及標籤檔。
  • 至樹莓派官網下載最新版本的RPi4映像檔。
  • 安裝模型框架Tensorflow Lite。
  • 安裝OpenCV套件。
  • 實現影像分類於RPi4。

 

了解以上步驟後,其建置RPi4環境的時間花得最久,但讀者們仍可同步進行,例如:

RPi4在燒錄SD卡或安裝套件時,又同時在TM網站蒐集資料及訓練模型。

Teachable Machine (TM)介紹

 

TM網站可供初學者認識AI人工智慧的神經網路應用平台,主要是以「監督式學習Supervised learning」建置而成的訓練平台。目前網站針對使用者提供三種不同的AI應用,分別是影像分類專案(Image Project)、聲音辨識專案(Audio Project) 與身體姿態辨識專案(Pose Project),也提供了Tensorflow、Tensorflow.js與Tensorflow Lite三種訓練模型框架,可供使用者匯入如RPi4的裝置來實現邊緣運算。

每個專案都被設計成三個步驟,分別是蒐集(Gather)、訓練(Train) 與匯出(Export)。

 

請選擇 「Image Project」開始專案

 

Step1.  在TM網頁中蒐集資料,訓練模型,在網站中即時影像分類。

進入頁面後會看到幾項操作流程,a.設定標籤及蒐集資料、b.訓練集及c及時預覽功能和匯出模型。

 

首先在a部分,可將標籤名稱Class 1更名,接著透過電腦Webcam或Upload,從電腦或Google雲端硬碟上傳圖片,及按下「Add a class」來增加類別。本文是開啟電腦Webcam來蒐集資料。

 

可直接按下「Record 10 Second」,網頁便會倒數計時持續拍攝直到10秒結束,如果認為10秒的張數太少,可以按下齒輪,可以更改秒數等相關參數。初始參數有「24FPS」 (理論值為每秒鐘拍24張)、「Hold-to-record   OFF」(關閉手動拍攝)、「Delay: 2 seconds」(2秒後才開始拍攝)、「Duration: 10 second 」(拍攝10秒鐘,理論值約可拍攝240張,但實際上要取決於網頁執行效能),本文將秒數調成25秒,可以刪掉一些拍攝失敗的照片,再者也可以使資料量豐富。

 

按下「Save Setting」à 「Record 25 seconds」,開始拍攝,拍攝完成可將拍得不好或模糊的圖片刪除。

 

本文建立了5種類別,分別是「mouse」、「nothing」、「RaspberryPi」、「PEN」、「Bruce Lee」,但有一個種類必須要建立的是「nothing」,意思是沒有照到「mouse」、「RaspberryPi」、「PEN」、「Bruce Lee」時的情形。當初筆者忘了建立「nothing」種類,當沒有照到物品時,就會一直認為「mouse」。

 

要分辨的影像張數盡量不要相差太遠,本文接近約莫300張左右,在「nothing」類別較多張是為了沒有照到的影像都要視為「nothing」,故照了很多「mouse」、「RaspberryPi」、「PEN」、「Bruce Lee」以外的照片。

接下來是訓練模型,按下「Train Model」即可。但要修改參數,請按下「Advanced」,預設參數有「Epochs :50」(50個訓練回合)、「Batch Size: 16」(批次大小)、「Learning Rate:0.001」(學習率),以下分別說明。

 

Epochs:

訓練的回合設定,訓練回合數和時間成正比,若要針對細微變化的差異進行辨識時則要提高回合數,會助於模型辨識效能,但特別要注意的是過高的回合數可能會使模型產生「過適Overfitting」的問題,若是過低的回合數會產生「乏適Underfitting」的問題,但無論是甚麼問題都會降低模型辨識效能。

 

Batch Size:

適當的批次大小設定有助於模型的優化,而且可以提高訓練的速度,及減少訓練誤差。

 

Learning Rate:

學習率設定影響著訓練模型尋找最佳解的過程中是否會收斂或發散。若設定過大,雖會快速收斂,但也可能難以收斂產生震盪甚至發散;相對的,設定過小會導致尋找最佳解時緩慢收斂。讀者們若有興趣,可以搜尋『梯度下降法』。

 

 

在訓練過程中會跑出對話框 ,提醒使用者不要更動到標籤類別以免影響訓練。

 

訓練完成後即可在網頁上作及時的影像推論,影像來源除了根據攝影機之外,還可以從電腦端及Google雲端匯入照片進行物件辨識。

 

Step2.  匯出模型及標籤檔

按下「Export Model」後可匯出模型檔及標籤檔

 

請選「Tensorflow Lite」à「Quantized」à「Download my model」。「Floating point」格式建議在個人電腦的環境操作;「Quantized」格式適合在像Raspberry Pi的單板電腦操作則有最佳效能;「Edge TPU」格式則僅限於Google Coral 的系列產品,如: Google Coral USB Accelerator 或 Google Coral Dev Board 的產品上。

 

Step3.  至樹莓派官網下載最新版本的RPi4映像檔。

請到 https://www.raspberrypi.org/downloads/raspbian/ 下載 「Raspbian Buster with desktop」,此版本為桌面簡易版,沒有多餘的軟體,且較不占SD卡空間。

 

下載至電腦後,須將檔案解壓縮,再準備一張16G的SD卡,利用Win32 Disk Imager 軟體(下載點: https://sourceforge.net/projects/win32diskimager/)燒錄至SD卡中。

a部分先選擇RPi4 的映像檔;b部分選擇燒錄SD卡的磁碟位置(要小心不要選錯,以免燒錯磁區);c部分則選擇資料到「裝置」,將映像檔燒錄至SD卡內。

燒錄完成後可將SD卡插至RPi4 卡槽後,但先別急著開機,而是先將RPi4連結到螢幕再開機,否則開機後再接螢幕是沒有畫面的,最後在接上鍵盤、滑鼠即可,這樣較好設定網路。將網路和地區都設定好之後,請開啟RPi4圖示à「Preferences」à「Raspberry Pi configuration」à「Interfaces」,將所有功能開啟後重新開機,以便可用遠端軟體控制RPi4。

 

本文所使用的遠端連線軟體為MobaXterm (下載處: https://mobaxterm.mobatek.net/download.html) ,此軟體優點除了可以遠端連線RPi4,也可以對RPi4傳輸檔案,但RPi4必須要和MobaXterm同個網域,開啟後請按「Session」à「SSH」à在「Remote host*」輸入RPi4 IP(本文IP為192.168.12.56),連線成功會出現「login as:」,請輸入預設帳號pi ,再來是預設輸入密碼raspberry(密碼不會顯示在畫面上),按下Enter即可登入成功。

之後的安裝套件步驟可直接將指令複製並貼至MobaXterm中。

 

登入RPi4成功畫面。

 

Step4.  安裝模型框架Tensorflow Lite。

請到https://www.tensorflow.org/lite/guide/python  官方網站下載套件,新下載的RPi4 映像檔的版本預設為Raspbian Buster ,Python 版本為3.7版 ,所以在MobaXterm請輸入:

$ pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_armv7l.whl 

(P.S. $指令不需要複製)

 

Step5.  安裝OpenCV套件。                             

  • 擴展文件系統到整張SD卡

首先在MobaXterm輸入

$ sudo raspi-config

選擇"7 Advanced Options" à "A1  Expand filesystem ",重開機。

  • 刪除不必要的軟體Wolfram Engine和LibreOffice,非必要做,但可以省下約1G的SD卡容量。
$ sudo apt-get purge wolfram-engine
$ sudo apt-get purge libreoffice *
$ sudo apt-get clean
$ sudo apt-get autoremove

 

  • 更新及升級所有套件包
$ sudo apt-get update && sudo apt-get upgrade

 

  • 安裝開發者套件CMake 需要用來編譯
$ sudo apt-get install build-essential cmake pkg-config

 

  • 安裝有關OpenCV的相依套件
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
$ sudo apt-get install libgtk-3-dev
$ sudo apt-get install libcanberra-gtk*
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install python3-dev

 

  • 下載OpenCV4.0版至RPi4 。
$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.0.0.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.0.0.zip

 

  • 並解壓縮檔案
$ unzip opencv.zip
$ unzip opencv_contrib.zip

 

  • 建立opencv 和 opencv_contrib資料夾及將檔案放置資料夾內
$ mv opencv-4.0.0 opencv
$ mv opencv_contrib-4.0.0 opencv_contrib

 

  • 先在opencv資料夾內建立名為build的資料夾

 

$ cd ~/opencv
$ mkdir build
$ cd build

 

  • 使用CMake來設置OpenCV 4環境(從這步驟開始是最花時間)
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF 

 

  • 調整RPi4的SWAP交換空間,來解決編譯OpenCV記憶體不足的問題。
$ sudo nano /etc/dphys-swapfile

 

請把 CONF_SWAPSIZE=100改成 2048

  • 重新開啟SWAP服務
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

 

  • 開啟四核心編譯OpenCV
$ make -j4

 

  • 安裝OpenCV
$ sudo make install
$ sudo ldconfig

 

  • 重新調整RPi4的SWAP 交換空間
$ sudo nano /etc/dphys-swapfile       

 

將CONF_SWAPSIZE=2048改成 100

  • 重新開啟SWAP服務
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

 

Step6.  實現影像分類於RPi4

  • 將Step2 下載模型及標籤檔解壓縮後透過MobaXterm傳入RPi4中

 

  • 匯入OpenCV 檔於專案資料夾內

 

  • 查詢OpenCV 版本,會顯示4.0.0版
$python3
>>> import cv2
>>> cv2.__version__
'4.0.0'
>>> exit()

 

可回到指令列

 

  • 在RPi4實現影像分類推論!
  • 在執行程式之前需要下載分類器的檔案,連結: https://reurl.cc/4R3dVL

連接上Webcam 至RPi4 USB中,本文範例是將下列指令寫入RPi4的Terminal裡執行,讀者們亦可輸入至MobaXterm。

$ python3 TM2_tflite.py --model model.tflite --labels labels.txt

則可成功開啟畫面。

 

  • 以下是辨識結果:nothing

 

  • 以下是辨識結果:RaspberryPi

 

  • 以下是辨識結果:mouse

 

  • 以下是辨識結果:Bruce Lee

 

所有步驟在此告一段落,希望讀者們能夠做出屬於自己專案或用於生活當中,謝謝大家!

 

CAVEDU Education is devoted into robotics education and maker movement since 2008, and is intensively active in teaching fundamental knowledge and skills. We had published many books for readers in all ages, topics including App Inventor, Lego robot and IoT (Arduino / Raspberry Pi). Please check CAVEDU's website for more information: http://www.cavedu.com, http://www.appinventor.tw

17 Apr 2020, 2:02