2022年2月11日 星期五

Machine learning with Raspberry Pi 4 and Coral USB Accelerator (1) -- Image Classification

因全球晶片缺貨關係,最近單板電腦(raspberry pi、nvidia jetson nano、...)不是缺貨就是漲翻天,在農曆年前有機會入手 Google coral 裝置來練一下機器學習(Machine Learning, ML),順便也在久久...未出文章的部落格留個紀錄。

近年因人工智慧(AI)的熱門,導致機器學習、深度學習(Deep Learning)變成熱門學習的入門技術。不過記得AI≠ML≠DL,DL只是ML的一種方法、ML只是AI的一種方法,由於 AI 主要聚焦在 ML 而 ML 教學焦點放在 DL 上所以時常會被誤認是同一件事。

本篇主要偏向邊緣設備(Edge AI)的實作所以不討論 AI 細節而是純粹拿別人訓練好的模型來實作。我覺得直接從實作入門後在回頭了解什麼是 ML 這樣比較有趣,不然一開始遇到的是監督式學習、非監督式學習、增強式學習接著多層感知器、深度神經網路、卷積神經網路、遞迴神經網路等名詞看了就頭昏。 

上述所提到的 Edge AI 可以當作是嵌入式系統的 AI 應用,除了常見的 raspberry pi、nvidia jetson nano 還有 Arduino Nano 33 BLE Sense、ESP32 等可以拿來應用;兩者差別除了價格成本差異外,還有運算速度、記憶體大小及儲存空間等等差別。Arduino 與 ESP32 可以透過 tinyML 實現,而有 SOC 的 RPi 及 jetson nano 則可透過 Tensorflow Lite 實現 ML,在 Edge AI 上各取所需。

本篇實作所使用環境如下:

HardWare:

  • Raspberry Pi 4
  • google coral usb accelerator

SoftWare:

  • Raspberry Pi OS (64-bit, January 28th 2022)

Skill:

  • Linux operate
  • Python 3.9

1. Coral usb accelerator 安裝

Coral USB 加速器是 Google 設計的 TPU (Tensor Processing Unit) 處理器能夠加速執行機器學習模型。按照下列步驟進行安裝:

a. 按照下列指令增加 package repository :

echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update

b. 安裝 Edge TPU runtime :

sudo apt-get install libedgetpu1-std

c.將 Coral USB 加速器連接至 Raspberry pi  USB 3.0 埠上。

使用 lsusb 指令確認 Coral USB 加速器連接上 pi。


d. 最大工作頻率安裝 (可選)

如果應用程式需要提高性能可以選擇安裝以最大頻率執行。這會提高處理速度,但也會增加功耗並導致 USB 加速器變得非常燙 (請確認所接的電源足夠瓦數)。

sudo apt-get install libedgetpu1-max

如果要使用回較低頻率執行可以執行步驟b來進行切換。

注意: 使用最大頻率操作設備時,USB 加速器上的金屬摸起來會很燙。這可能會導致燙傷。為避免受傷,請在以最大頻率執行設備時將設備放在無法觸及的地方,或降低的頻率。

2. 安裝 PyCoral 函式庫

sudo apt-get install python3-pycoral

3. 在 Edge TPU 上執行模型

a.從 GitHub 下載範例程式碼:

mkdir coral && cd coral

git clone https://github.com/google-coral/pycoral.git

cd pycoral

b.下載模型、標籤和測試(鳥類)圖片

bash examples/install_requirements.sh classify_image.py

c.執行對圖片的辨識:

使用Coral USB 加速器:

python3 examples/classify_image.py \

--model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \

--labels test_data/inat_bird_labels.txt \

--input test_data/parrot.jpg

使用Coral USB 加速器最大頻率執行:

不使用Coral USB 加速器(樹梅派本身SOC來運算)

python3 examples/classify_image.py \

--model test_data/mobilenet_v2_1.0_224_inat_bird_quant.tflite \

--labels test_data/inat_bird_labels.txt \

--input test_data/parrot.jpg

根據上述結果可以得到對 test_data/parrot.jpg(512x929) 圖片正確辨識到有 75.7% 為 Ara macao (猩紅金剛鸚鵡),處理時間透過 Coral USB 加速器從 65.7ms 降至 3.8ms 有明顯的加速。

此執行結果採用的是 mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite (Coral USB 加速器) 及 mobilenet_v2_1.0_224_inat_bird_quant.tflite (樹梅派本身運算)。

可以透過 inat_bird_labels.txt 文字檔看到可以辨識鳥類的名稱。

4. examples/classify_image.py 程式碼

程式碼會應用到 PyCoral API[2],細節部分可以到官網去查詢。以下是程式碼大概的說明:

Line 69 : 載入標籤檔內容

Line 71 : 載入模型

Line 90~102: 圖像數據在運行推理之前必須經過兩次轉換:

a. 正規化:f = (input - mean) / std

b. 量化:q = f / scale + zero_point

下面的公式結合了這兩個步驟:

q = (input - mean) / (std * scale) + zero_point

Line 105~113:進行推論: 

呼叫 Invoke 進行預測並從從分類模型中獲取結果。

Line 115~117:輸出結果

輸出結果第一次比較慢是因為要載入模型到 Edge TPU 記憶體。

上述所執行的辨識過程,在 AI 應用中一般稱為圖片分類(Image Classification),常見的演算法模型有ResNet、GoogLeNet、VGG、Inception-v3、Inception-v4、MobileNet、MobileNet-v2、ShuffleNet、ShuffleNet-v2等,這裡的範例則使用的是Google的研究團隊提出的CNN模型 MobileNet [3]。

另外還有物件偵測(Object Detection),常見演算法有 YOLO、SSD、RetinaNet、EfficientDet、...,大多教學不管是模型的訓練還是如本篇拿別人訓練好的模型,第一個實作範例大多是以分類或物件偵測為開始。至於分類可以用在何處?舉個例子如果只要辨識一顆球的物體屬於RGB這三個顏色的哪一種,分類就是很好用的一個模型。而物件偵測可以應用在何處?關於此問題見下圖,如果機器人要能完成煎餅的任務,它必須知道煎餅的所在位置,才能夠將餅翻面,如果有兩張以上的餅,還需知道要翻哪一張,這就是物件偵測的應用[4]。至於其他應用地方很多可以參考 YOLO 演算法發明人 Joseph Redmon 的 TED 演講[5],下一篇將會提到物件偵測的實作。

後記:

學習人工智慧開發及應用是需要一些門檻的,好在這幾年 Python 的熱門讓 AI 學習不需要花錢買軟體就可以實作。不過呢在學習到神經網路部分多多少少還是需要一些在大學時教得數學與統計的知識,例如線性代數、微積分、統計與機率及線性規劃等。看到這都會想到「嗯!很好這些都還給老師了。」

不過,沒關係數學這些東西是運用在訓練模型過程中,目前網路上有許多大神訓練好的免費模型,數學不好想入門可以從拿別人訓練好的模型來實作。

至於入門推薦的書籍,在這推薦可以看一下"深度學習 最佳入門邁向AI專題實戰(深智)[6]"這本書也是我作為入門學習的開始。另外,如果是要準備報考人工智慧研究所的可以讀一下"Python Machine Learning - Third Edition(packt)"來當作入門,台灣好像有翻譯成上下兩冊中文版。

當然如果一昧練功沒實戰是無法進步的,要更進階點可以到 Kaggle[7] 上面找個競賽題刷一下(類似寫code要刷LeetCode)。

另外,在學習 AI 項目前,要先決定機器學習的框架(Framework),目前 ML Framework 大致以 Tensorflow 與 PyTorch 兩大陣營網路資源比較多,前者以 Google 為首後者以 Facebook 為首,以學習來說兩者以 PyTorch 入門比較容易但 Tensorflow 資源比較多且台灣的教育單位多數還是以 Tensorflow 為主,不過要注意的是 Tensorflow 2.x 版跟 1.x 版指令是不相容的需要修改程式,所以初學入門者要挑選哪個陣營是要自己量身而定而不是盲目跟從了[8]。

來源:https://www.springboard.com/blog/data-science/pytorch-vs-tensorflow/

由於本篇及後續文章以 Google 出的 Coral USB 加速器+樹梅派為主作為操作環境,所以日後將會以 Tensorflow Lite 為學習方向。  

參考:

1.Get started with the USB Accelerator

https://coral.ai/docs/accelerator/get-started/#requirements

2.PyCoral API overview

https://coral.ai/docs/reference/py/

3.MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications (論文)

https://arxiv.org/abs/1704.04861

4.Joseph Redmon, Anelia Angelova2 Real-Time Grasp Detection Using Convolutional Neural Networks, 2015(論文)

https://docs.google.com/presentation/d/1Zc9-iR1eVz-zysinwb7bzLGC2no2ZiaD897_14dGbhw/edit#slide=id.g3b4b0f6b2_1116

https://research.google/pubs/pub43875/

5. How computers learn to recognize objects instantly

https://www.ted.com/talks/joseph_redmon_how_computers_learn_to_recognize_objects_instantly

6.深度學習 最佳入門邁向AI專題實戰

https://deepmind.com.tw/product/%e6%b7%b1%e5%ba%a6%e5%ad%b8%e7%bf%92-%e6%9c%80%e4%bd%b3%e5%85%a5%e9%96%80%e9%82%81%e5%90%91ai%e5%b0%88%e9%a1%8c%e5%af%a6%e6%88%b0dm2145/

https://deepmind.com.tw/%E7%89%A9%E4%BB%B6%E5%81%B5%E6%B8%ACobject-detection/

7.Kaggle 

https://www.kaggle.com/competitions

https://zh.wikipedia.org/wiki/Kaggle

8.深度學習,從「框架」開始學起

https://makerpro.cc/2018/06/deep-learning-frameworks/

9.TensorFlow Lite 轉換工具

https://www.tensorflow.org/lite/convert?hl=zh-tw

沒有留言: