嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

Google Coral USB Accelerator搭配Raspberry Pi4運行Embedded Teachable Machine – 上篇

作者

張嘉鈞

難度

普通

材料表

樹梅派、Google Coral USB Accelerator

Google Coral USB Accelerator

在我們分享的小專案中常常使用到樹莓派來做AI的應用,但是樹莓派終究沒有個人電腦的效能強,所以我們常常需要使用額外的方式來加速它。常見的可能是軟體加速,使用 Tflite、Onnx 等輕量化的模型、結構來減低硬體的負擔,除此之外硬體也需要加速,我們以往最常使用的就是Intel Movidius以及Google Coral USB Accelerator,這兩個產品都是可以透過USB連接埠連接到樹莓派上協助AI加速,而我們今天就是要使用Coral USB Accelerator幫助我們樹莓派運行AI。

11_Movidius_Coral_b4a2e5f803e9c35aa3852c40ee1245a52910fd9e.png

我們總共提供了兩個小範例讓大家進行實作,第一個是透過之前一直在推的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:

01_TM_GetStarted1_67e71390f80717715f7c333ac21d401ae2a10cac.png

選擇 Image Project:

02_NewProject_dbdf8e4448495ec1546558651efceab5448b6cbc.png

進入之後將原本Class1、Class2的標籤改成想辨識的標籤,可以選擇用Webcam拍照或是Upload照片的方式蒐集資料:

03_ImageClassification_fc815b65c8ff59aacbe3c8813e3a84f1b0ac44f9.png

我使用攝影機拍照的方式,而我的範例是有無口罩,按下「Hold to Record」即可開始拍照:

04_CollectData_ab5f404ad1ee29625bc66af32bf9b49df47caed9.png

蒐集完照片之後就可以進行訓練了,將Advanced打開可以修改一些超參數,修改好就可以按下 Train Model按鈕了:

05_Train_a025b22be2942bd7f38fcbd2759cb5149eb57e24.png

接著可以稍微驗收一下正確率:

06_Inference_38a7b80b7caba8c5dc6bde5290405c25650be3af.png

接著可以點擊Export Model進行匯出,這次我們選擇的是Tensorflow Lite並且勾選EdgeTPU,按下Download Model之後,它會在雲端進行轉換最後下載完記得將壓縮檔放到樹莓派當中:

07_Export_481efc9ba6fbdfd16f0fc054bfe3e56d05c19891.png

可以看到壓縮檔的名稱應該與我相符「converted_edgetpu.zip」,解壓縮之後會獲得兩個檔案,「model_edgetpu.tflite」、「labels.txt」,與以往匯出tflite的模型不僅僅是名稱上有不同結構也不同了。

08_File_13a79b0a8ce1d94e9c847c6ad184b1fb5a8d994d.png

如果要使用coral加速需要透過他們提供的方式將Tensorflow模型轉換成EdgeTPU可用的模型,從下面的流程圖就可以看到,我們訓練完模型之後會進行匯出的動作來取出最後的模型 (Frozen Gragh),接著使用Tensorflow Lite轉換器進行轉換變成Tensorflow Lite,再使用EdgeTPU編譯器進行編譯成可兼容EdgeTPU的模型,最後才能使用Coral加速。

09_TF2Coral_8bae16e37545452923e96f59b1f9c31be90b810a.png

圖片引用於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。

10_tree_5b5f9bf6565f682198e5327717f19b72a81dce4a.png

一開始先導入相關套件以及撰寫常用副函式,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則是進行辨識,

11_Movidius_Coral1_b4a2e5f803e9c35aa3852c40ee1245a52910fd9e.png

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以上人眼就會覺得順暢了:

12_Coral_64dc7934f353564efa76520e7128024ff7bf9b91.png

同時,我們也與tflite的版本進行對比,可以看到有沒有加Coral的差距式顯著的,FPS平均會降到15左右,可以明顯感受到延遲:

13_TFlite_df2df66f71cee64765f414459e089535e2176404.png

結語

使用Teachable Machine來練習Coral是不是相當的容易呢?程式碼的地方也是相當的簡單,只需要匯入edgetpu的函式庫就可以輕鬆搞定。讓我們中場休息一下,下一篇我們再使用另一個互動式的小專案來練習!

相關文章

用 Google Coral USB Accelerator 搭配 Raspberry Pi 實作 Teachable Machine

Embedded Teachable Machine

KNN

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 Deep Learning, edge computing, App Inventor, IoT and robotics. Please check CAVEDU's website for more information: http://www.cavedu.com, http://www.appinventor.tw
DesignSpark Electrical Logolinkedin