OpenVINO 結合 Teachable Machine 蹦出新滋味!?

一、前言

1.Teachable Machine

Google 於2017年製作了Teachable Machine 網頁版本的AI 軟體工具,甫一推出就受到相當好的好評與回響,原因在於這個網站幾乎可以不需要任何說明與敘述,就可以自行摸索搞懂原來用AI 實踐電腦視覺是這麼一回事!之後更於2019年推出Teachable Machine V2,除了將原有的Image Classification(影像分類)由固定三個分類擴充為自定義分類數量,並且增加了Audio(聲音)與Pose(人體姿勢)兩個類別的分類器,此外更支援專案的存檔與轉匯出功能,不但能保留資料於日後繼續編輯,同時還能匯出Keras、TensorFlow、tf.js等不同格式的模型檔案,大幅提高了後續轉應用的可玩性!

2.OpenVINO

https://software.intel.com/content/dam/develop/public/us/en/images/diagrams-infographics/diagram-v1openvino-homepage-16x9.png
OpenVINO 執行模型最佳化後能跨平台佈署AI推論(圖片來源: Intel)

OpenVINOIntel於2018年推出的AI 佈署工具套件,支援不同深度學習軟體框架如TensorFlow、PyTorch、Caffe等的模型輸入,並對模型進行最佳化與調教後,佈署於不同作業系統進行推論。其初版發布時間和Intel推出NCS2(Neural Compute Stick 2)的時間點相當接近,而一直讓筆者有著「OpenVINO就是要來搭配NCS2進行AI推論最佳化」的一種錯覺。

直到後來OpenVINO版本持續更新提高支援完整性與提高了易用性,才讓筆者確實看清,以目前Intel CPU/GPU的處理效能,已經足以負荷多數情境的AI應用推論了!如下方長條圖顯示著Intel的不同世代顯示晶片在的AI推論效能比較,分別以第九代iGPU與第12代iGPU執行不同模型之間的效能差異。其中光是Gen12相比Gen9跑FP16模型推論FPS就已超過兩倍之譜,若是將模型轉換為INT8進行推論更可以再將效能再拉升至一倍左右!若要進一步了解OpenVINO各AI模型對應不同處理器的效能,也可以參照OpenVINO Benchmark Result

https://miro.medium.com/max/700/0*ZQecOfQjMHIeiYpU.png
Intel Gen9 與 Gen12 iGPU AI推論效能比較 (圖片來源: OpenVINO-toolkit)

在分別接觸了 Teachable Machine 與 OpenVINO 之後,不禁讓人聯想,是否能讓這兩個簡單易用的酷工具結合在一起?一個負責處理模型訓練,另一個負責處理推論與應用,若能成功便可讓大夥享齊人之福,把複雜事情簡單化,短時間內即可完成應用雛形。不囉嗦即刻來做測試!

二、OpenVINO 結合 Teachable Machine

我們先到 Teachable machine 網站上去訓練模型,至於要辨識的影像就直接就地取材-使用我們的雙手做手勢的分類。這裡筆者做了五個手勢分類,分別為剪刀、石頭、布、讚、以及數字7的手勢,各取得約略350張的影像資料作為輸入的dataset。訓練參數則直接用預設參數:EPOCH: 50,Batch Size: 16,Learning Rate: 0.001 進行訓練。最後我們就選擇Export Model將模型匯出,選擇的格式為 TensorFlow Savedmodel 方便 OpenVINO 進行轉換,順利取得「converted_savedmodel.zip」檔案即完成模型訓練的步驟啦!

在Teachable Machine訓練影像分類模型

接著我們要將從 Teachable Machine 取得的 TensorFlow 模型檔(.pb),使用 OpenVINO 進行轉換。筆者的測試環為 Ubuntu20.04 作業系統,OpenVINO Tookit 使用2021.4 LTS版本,處理器為 Intel i7-1185GRE(搭載Iris Xe顯示晶片)。要建置 OpenVINO 開發環境除了在原生系統下載安裝包執行所有套件的安裝外,現在也可以使用docker快速建置環境,過程其實沒什麼難度,按照官方文件指引Step by Step就可以了,或是參考Jack大的 docker建置教學都是很棒的資源,這裡就不多做贅述了。

為了方便建立一個名為tm的資料夾,存放 Teachable machine 模型資料,並且解壓縮得到「saved_model.pb」與「labels.txt」等檔案。

接著執行model optimizer進行模型最佳化轉換,指定目前資料夾取得pb檔,這邊要注意input_shape參數必須指定為[1,224,224,3],其意義為[N,H,W,C]:

  • N:一次抓取多少數量的影像。
  • H:影像的高度,單位為象素。
  • W:影像的寬度,單位為象素。
  • C:通道數量。若是彩色圖像則有RGB三個通道。

上述若N為未知數值(負值)會造成轉換上的錯誤,而在TensorFlow上預設輸入的shape為[-1,224,224,3],因此要手動進行shape調整。此外,Teachable Machine 使用MobileNet 神經網路架構,轉換的scale 依據 OpenVINO轉換TensorFlow文件 得知為127.5,我們便以此數值代入。最後筆者希望可以得到較佳的推論速度,帶入data_type參數,並指定模型權重值以FP16的數值格式進行量化。輸入以下指令進行模型轉換:

執行成功後會在當前目錄得到 IR(Intermediate Representation)檔 saved_model.xml 與 saved_model.bin。我們就能使用這個IR模型中繼檔在 OpenVINO 上進行推論。

推論的部分在邊緣裝置的推論我們使用 OpenVINO toolkit 內建的 Classification 的 Demo 來做測試,看看實際結果如何。因影像分類 Demo 目前僅提供C++語言版本,我們需要先行做編譯:

編譯完成後會看到提示訊息說明可執行檔的路徑,同時我們將額外的手勢照片存放到~/tm/pic的路徑,讓範例程式可以用這些圖像作為測試資料。執行下方指令啟動範例程式,相關參數說明如下:

  • -i: <必要參數>,輸入影像資料的檔案路徑或資料夾路徑
  • -m:<必要參數>,IR模型檔xml的檔案路徑
  • -labels:<必要參數>,分類標籤文字檔的路徑
  • -d:執行推論的硬體裝置進行推論,可選CPU, GPU,也可以設定MULTI:CPU,GPU同時使用CPU與GPU執行推論。預設為CPU。
  • -time:重複執行推論的時間,預設為-1,代表執行到使用者中斷為止。
  • -no_show:不顯示影像推論結果。
  • -nt:取得前n個最大可能的類別,預設為5。

待模型載入後會跳出一個圖形化視窗,顯示著目前進行影像分類識別的結果。我們可以看到大部分判定的結果是符合我們的預期的,而少部分判定錯誤的圖像經測試後是在 Teachable Machine 上就辨識度不佳的圖片,整體而言推論分類結果令人滿意!

左上角同時顯示著當前的效能指標Latency與FPS,因為需要額外處理影像輸出的辨識結果,這會降低非常多FPS,所以此數值僅能做參考之用。若想要知道不做輸出影像的效能可以每秒幾張圖像,只要在剛剛執行的命令後面,再加上-no_show –time 10,意思就是不輸出推論的影像,並且在模型啟動推論10秒後結束程式。當DEMO程式返回時就會顯示Latency與FPS,筆者在僅使用GPU的情況下,效能測時得到的結果就高達654.9 FPS7.2 ms Latency!

此外再補充一點,若我們在 Teachable Machine 上訓練的影像分類數量少於5個分類,在執行DEMO程式時可能會出現"[ ERROR ] The model provides 2 classes, but 5 labels are requested to be predicted"此錯誤訊息,原因在於DEMO程式預設會去抓取可能性最高的前5個分類,而實際模型輸出的分類數量卻少於5個分類而產生錯誤。可以再加上參數”-nt 1”指定DEMO程式只取得可能性最高的分類即可。

Image classification推論測試結果

三、小結

各位看過以上流程之後,是不是覺得訓練影像分類模型並且佈署在自己的裝置上執行不再遙不可及,而且是既簡單又容易的事!藉由這類簡單工具組件幫助我們完成邊緣運算的訓練、轉換、到佈署總體時間約略在半小時內即可完成。雖然距離實際應用可能還有一小段差距,但藉由把複雜的事情拆解成各個簡單的組件與任務,短時間內就能綜觀全局而找到對的方向努力,各位腦中是否已浮現出各種應用可能性的想像了呢!?

(本篇同步刊登於 MakerPro