你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
作者 |
張嘉鈞 |
難度 |
普通 |
材料表 |
樹梅派、Google Coral USB Accelerator |
Google Coral USB Accelerator
在我們分享的小專案中常常使用到樹莓派來做AI的應用,但是樹莓派終究沒有個人電腦的效能強,所以我們常常需要使用額外的方式來加速它。常見的可能是軟體加速,使用 Tflite、Onnx 等輕量化的模型、結構來減低硬體的負擔,除此之外硬體也需要加速,我們以往最常使用的就是Intel Movidius以及Google Coral USB Accelerator,這兩個產品都是可以透過USB連接埠連接到樹莓派上協助AI加速,而我們今天就是要使用Coral USB Accelerator幫助我們樹莓派運行AI。
我們總共提供了兩個小範例讓大家進行實作,第一個是透過之前一直在推的Teachable Machine網站來自己訓練神經網路模型並且下載到樹梅派進行Inference;第二個則是Teachable Machine搭配Coral推出的互動專案叫做Embedded Teachable Machine,透過遷移式學習的原理只需要使用少量data即可完成訓練( 實測大概拍3~4張就可以完成 )。
Teachable Machine 介紹與使用
我們在RS文章中也曾撰寫過
使用Google Teachable Machine 來實現Raspberry Pi 4 的影像分類推論
https://www.rs-online.com/designspark/google-teachable-machine-raspberry-pi-4-cn
但我們今天要著重在Raspberry Pi 4 透過Coral加速Inference的部分,詳細操作可以參考上面連結,這邊將只會簡單帶過,在主要的差別只在於匯出模型的部分。
前往Teachable Machine的網站,點選Get Started:
選擇 Image Project:
進入之後將原本Class1、Class2的標籤改成想辨識的標籤,可以選擇用Webcam拍照或是Upload照片的方式蒐集資料:
我使用攝影機拍照的方式,而我的範例是有無口罩,按下「Hold to Record」即可開始拍照:
蒐集完照片之後就可以進行訓練了,將Advanced打開可以修改一些超參數,修改好就可以按下 Train Model按鈕了:
接著可以稍微驗收一下正確率:
接著可以點擊Export Model進行匯出,這次我們選擇的是Tensorflow Lite並且勾選EdgeTPU,按下Download Model之後,它會在雲端進行轉換最後下載完記得將壓縮檔放到樹莓派當中:
可以看到壓縮檔的名稱應該與我相符「converted_edgetpu.zip」,解壓縮之後會獲得兩個檔案,「model_edgetpu.tflite」、「labels.txt」,與以往匯出tflite的模型不僅僅是名稱上有不同結構也不同了。
如果要使用coral加速需要透過他們提供的方式將Tensorflow模型轉換成EdgeTPU可用的模型,從下面的流程圖就可以看到,我們訓練完模型之後會進行匯出的動作來取出最後的模型 (Frozen Gragh),接著使用Tensorflow Lite轉換器進行轉換變成Tensorflow Lite,再使用EdgeTPU編譯器進行編譯成可兼容EdgeTPU的模型,最後才能使用Coral加速。
圖片引用於Google Coral 原廠網站
是否相當的複雜?額且Tflite to EdgeTPU這段還只支援Linux的作業系統,所以如果選擇要體驗我一定會用Teachable Machine來運行,因為它在匯出的時候可以幫助我們完成上述繁瑣的步驟。
回到正題,我們可以將剛剛解壓縮的檔案放到樹莓派當中了,要寫程式之前我們需要先進行安裝edgetpu,詳細的方式可以參考官網已經整理好給Debain用的流程。
先加入套件來源到系統當中:
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
接著就可以進行安裝了:
sudo apt-get install libedgetpu1-std
sudo apt-get install python3-pycoral
接著安裝下列套件把效能全開:
sudo apt-get install libedgetpu1-max
接著我們看到回到網頁上使用它提供的範例程式,直接新增檔案、複製貼上、稍微修改就可以用了!這邊我新增了一個程式叫tm2_edgetpu.py並且將剛剛的資料都放進edgetpu_model資料夾當中;另外的程式是為了測試fps。
一開始先導入相關套件以及撰寫常用副函式,loadLabels是負責讀取標籤檔並且輸出對應的字典:
from edgetpu.classification.engine import ClassificationEngine
from PIL import Image
import cv2
import re
import os
# the TFLite converted to be used with edgetpu
modelPath = 'test/model_edgetpu.tflite'
# The path to labels.txt that was downloaded with your model
labelPath = 'test/labels.txt'
# This function parses the labels.txt and puts it in a python dictionary
def loadLabels(labelPath):
p = re.compile(r'\s*(\d+)(.+)')
with open(labelPath, 'r', encoding='utf-8') as labelFile:
lines = (p.match(line).groups() for line in labelFile.readlines())
return {int(num): text.strip() for num, text in lines}
classifyImage則是進行辨識,
edgetpu已經幫我們包裝的很好了,有提供classification、detection兩種引擎,詳細的資訊可以上他們的官方文件查看,在這裡我們只需要呼叫它提供的圖片分類引擎即可進行辨識:
# This function takes in a PIL Image from any source or path you choose
def classifyImage(image_path, engine):
# Load and format your image for use with TM2 model
# image is reformated to a square to match training
# image = Image.open(image_path)
image = image_path
image.resize((224, 224))
# Classify and ouptut inference
classifications = engine.classify_with_image(image)
return classifications
接著在main的部分整個個流程就是,宣告edgetpu的引擎、取得標籤的字典、宣告攝影機、將每一張的圖片轉換成模型可以輸入的格式 (PIL格式、蘇放大小、翻轉)、丟進TPU引擎取得結果、將結果放置在影像上並且顯示出來,接著計算FPS並且偵測是否按下q會離開迴圈。
def main():
# Load your model onto your Coral Edgetpu
engine = ClassificationEngine(modelPath)
labels = loadLabels(labelPath)
# 取得 CPU的頻率,為了取得最準確的fps,最後要除以cpu的頻率才正確
freq = cv2.getTickFrequency()
# 用於儲存FPS的變數
frame_rate_calc = 0
# 取得攝影機物件
cap = cv2.VideoCapture(0)
# 如果攝影機開啟
while cap.isOpened():
# 先儲存一開始的時間
t1 = cv2.getTickCount()
# 取得畫面,如果沒有畫面就跳出while
ret, frame = cap.read()
if not ret:
break
# 轉成 PIL 格式,通常神經網路模型都是吃 PIL 格式
cv2_im = frame.copy()
pil_im = Image.fromarray(cv2_im)
# 縮放到模型輸入大小,並且水平反轉與訓練時相同
pil_im.resize((224, 224))
pil_im.transpose(Image.FLIP_LEFT_RIGHT)
# 進行辨識,最後獲得結果
results = classifyImage(pil_im, engine)[0]
# 遇顯示在影像上的內容
print_res = f'FPS: {frame_rate_calc:.2f} , Lable: {labels[results[0]]}'
# 將 FPS 畫在影像上並顯示
cv2.putText(frame, print_res, (30,50),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),2,cv2.LINE_AA)
cv2.imshow('frame', frame)
# 計算 FPS (framerate)
t2 = cv2.getTickCount()
time1 = (t2-t1)/freq
frame_rate_calc= 1/time1
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
運行的結果如下,基本上FPS如果在30以上人眼就會覺得順暢了:
同時,我們也與tflite的版本進行對比,可以看到有沒有加Coral的差距式顯著的,FPS平均會降到15左右,可以明顯感受到延遲:
結語
使用Teachable Machine來練習Coral是不是相當的容易呢?程式碼的地方也是相當的簡單,只需要匯入edgetpu的函式庫就可以輕鬆搞定。讓我們中場休息一下,下一篇我們再使用另一個互動式的小專案來練習!
相關文章
用 Google Coral USB Accelerator 搭配 Raspberry Pi 實作 Teachable Machine
评论