Teachable Machine(以下簡稱TM)是Google新推出的平台,相同功能的工具如Azure的Custom Vision,兩者剛好有市場區隔,Google的強項是肢體辨識,但Google目前只能做分類器,而Azure有物件識別,可以在一張照片內識別多個物件,這個目前Google的TM不支援,但GCP內部的AI Platform是支援的,只是很貴...不用也要收錢。Azure則是以次計費,還有免費額度。

這次我利用TM來做一個手勢分類器,主要是預測剪刀石頭布,下一篇則會做成一個猜拳遊戲,來看看你能在30內猜贏幾次?

本篇分成以下幾個部份

一、TM平臺訓練模型

二、下載模型

三、在Python中應用模型

四、使用Webcam即時分析


一、TM平臺訓練模型

首先進入TM平台:https://teachablemachine.withgoogle.com/,平台可以直接用Google帳號登入,免費建立模型,可下載tnesorflow檔案,進行邊緣運算。

1.收集訓練資料

選擇Image Project

在此頁面中可以看到整個流程只有三個步驟:1.資料2.訓練3.預測

image

我們先針對第一類Class1,可以修改名稱為「石」,然後將已有的圖片全部拉入成訓練資料,或者使用Webcam即時取得訓練資料

image

使用Webcam請記得,雖然同樣是「石頭」時,要自己模擬各種角度各種可能,例如「鬆鬆的石頭」、「小小的石頭」、「邊邊角角的石頭」、「翻過來的石頭」等等。

完成剪刀石頭布三類之後,一定要記得還有一類叫做「沒有」,是當手還沒進入畫面時,空白的,這樣就合計四類

image

2.開始訓練

完成資料收集後,就可以準備訓練模型,訓練有三個選項可以調整,點選Andvance進階,可以看到有Epochs(世代):50、Batch Size(批次):16、Learning Rate(學習率):0.001,一般來說,如果不是太複雜的東西,這三個選項可以不用調整。

image

點選中間的Train Model即可開始訓練,訓練是用你自己電腦的資源訓練,所以電腦等級太爛就必須等比較多時間,訓練時頁面必須開著,而且保持在可見狀態,不要切到別的頁面,否則訓練會暫停

訓練過程會一直看到頁面沒有反應的訊息,這時千萬要按Wait等候,不然會前功盡棄

image

開始訓練了...

image

完成後,會開啟預覽視窗,讓你測試辨識效果。

.

如果想看更細部的模型學習過程,可以點選Under the hood查看

這是混淆矩陣,可以查看錯誤分佈

image

下圖示學習歷史,可以看到正確率很高,而損失也下降的很快

完成訓練後,如果結果合乎需求,就可以下一步來下載完成訓練的模型


二、下載模型

雖然現在已經可以玩了,但是辨識結果顯示在TM平台,如果我需要使用模型來控制一些裝置,就必須把模型下載下來

點選右上角的Export Model,選擇中間的Tensorflow,然後選擇Keras,再Download my model即可下載

另外TM也有告訴使用者如何使用模型,範例程式在下方,複製起來後,先找一個記事本貼上

檔案下載並解壓縮後,內容包含兩個檔案,labels.txt是我們在訓練時建立的類別名稱,而keras_model.h5則是Keras的模型檔案格式

最後我們可以將專案儲存起來,放在自己的Google Drive中

完成存檔後,可以在自己的Google Drive中找到,附檔名為.tm

接下來則是在Python中使用這個模型檔


三、在Python中應用模型

首先設定好你的Python開發環境,筆者採用Anaconda+VSCode+Python3.8+OpenCV+Tensorflow 2.3等套件,環境建立這裡就不贅述,請自行參考其他文件。

開啟VSCode,建立一個資料夾來存放相關檔案,包括把上述的h5檔案解壓縮放在這個資料夾

將上述的範例程式複製到空的Python檔,存檔為剪刀石頭布.py(讀者可自行決定名稱)。

image

範例程式是以照片做測試,所以先自己拍一張照片並存成「test_photo.jpg」,檔案只能jpg格式不可png或bmp等其他格式,下一節我們會導入webcam做即時分類。

檔案路徑對於初學者來說是一個問題,VSCode採用資料夾為路徑的root方式的相對路徑,初學者會搞不清楚路徑要怎麼寫,建議讀者可以在檔案/右鍵/複製相對路徑的方式,取得路徑寫法,在將他貼到路徑的位置。

請記得在Windows環境"\"要改成"\\"喔

image

按F5執行這個程式,模型載入會花很多時間,要耐心等候。

一開始會先跳出照片,最後也會在下方的終端機顯示預測結果。

image

預測結果是一個機率矩陣,使用方式是看機率最大的那個是第幾個,然後去看labels.tex的編號,例如上圖中機率最大為第一個:1,其餘都是0或接近0,因此判斷為第一個labels標籤,所以是「布」

image

不過呢,要先拍照存檔照片,然後才能分析,每次開模型又要很多時間,這樣未免也太不實用了。其實我們可以改成即時分析,這樣模型只會再第一次開啟時載入,之後就只有預測時間了


四、使用Webcam即時分析

讀者可以直接下載我完成的python檔案:https://t.ly/qDvL

如何在機率矩陣中獲得預測結果?

 


maxindex = np.argmax(prediction)#找出機率最大的輸出

    if prediction.max()>0.5: #如果最大的機率都<0.5就當作無法判斷       

        if maxindex==0 :

            print("布")

            showtext="布"

        elif maxindex==1 :

            print("刀")

            showtext="刀"

        elif maxindex==2 :

            print("石")

            showtext="石"

        elif maxindex==3 :

            print("無")      

            showtext="無"

    else:

        print('無法辨識')


    夜市 小霸王 發表在 痞客邦 留言(1) 人氣()