[Azure Custom Vision]如何在邊緣裝置上實作物件辨識

繼與資策會合作,開給高中生的一日AI體驗營活動結束之後,來自各方的回響非常熱烈,因此我們決定手把手教大家如何使用Microsoft的Customvision服務來訓練自己的AI,以及如何利用Anaconda實作不須聯上網路的邊緣運算!!

作者陳俊霖
時間30分鐘~60分鐘
難度  * *
材料表Azure 或 office365帳號

在開始之前,要先建立一個Azure帳號,請點此

個人使用可以有一個月的免費額度,但是需要新增信用卡號碼,這部分在建立帳號的時候需要多加留意。

建立完成之後,點擊下方連結前往Custom vision網站:

Microsoft Custom Vision

點擊登入後就可以進到以下頁面。

若您的帳號是屬於資源群組,則進入主畫面後可以看到同一個群組的其他資料,同時也可以對其進行編輯、修改、甚至是刪除。

筆者的畫面就是在一日AI實作營的同學發揮創意做出來的專題,可以看到大家都充滿創意與巧思。

接下來,今天的主題是Object Detection,也就是物件辨識。

何謂物件辨識?

物件辨識與物件分類最大的區別在於:

物件辨識(Object Detection)能夠在一張圖像中指出特定物件的位置以及種類,回傳值會包括物件的標籤、座標以及物件佔據畫面的範圍。

但是物件分類(Classification)只能夠將一張圖片分類為一個種類,無法框出物件的位置、大小等資訊。

因此,我們在實際使用的時候需要依照我們的用途、需求、以及功能來決定要使用的辨識種類。

接下來,讓我們建立一個物件辨識(Object Detection)的專案。

點擊New Project

這時候會出現如下視窗,請將專案命名,並將其他設定選擇如下:

Resource Group​:      選擇自己建立的資源群組,若尚未建立請點選create new

Project Types​:          Object Detection​

Domains:​                  General (compact)​

 

要選Compect才能夠將訓練完成的標籤檔與模型檔匯出

Export Capabilities:  Basic platforms (Tens​orflow, CoreML, ONNX, …)​

此處選擇邊緣運算使用的神經網路平台,我們這次使用Tensor flow,故選基礎平台(Basic platforms)。

點選建立之後,會出現如下的專案畫面,點選Add image即可新增照片

在這裡,同學可自由發想要讓AI辨識什麼東西,從食物、動物、植物、玩具、人臉、卡通人物……都可以辨識。

但是因為微軟的Customvision內部是如何運行的我們不得而知,所以我們唯一能改變的只有資料及的豐富程度以及準確性。

我們大致上可以想像AI是一位沒見過世面的小嬰兒,你教他蘋果是圓形的紅色果實,那他的認知就會和我們對蘋果的認知相同,但是假如同學亂餵他錯誤資料,拿香蕉的圖片跟他說這是草莓,那這個AI一輩子都會認為草莓是黃色,且長條狀的。

因此在上傳資料集(Dataset)的時候要先由人類把正確且具多樣性的照片篩選出來在做訓練比較好。

下一步,將每一張圖片個別標記並且框出欲辨識物件的大小與範圍。

請注意!這裡的標記名稱一定要使用英文,且每一個類別至少都要有15張照片作為資料集(Dataset),否則資料量太少無法訓練,除此之外,每個類別的資料量要盡量一樣多,以避免機率抽樣產生的誤差。

這一個步驟是監督式學習人工智慧最複雜繁瑣的地方,也有人戲稱這個動作是”工人智慧”。

其名的由來是因為在建立資料集(Dataset)的過程中,只有人類才能正確辨識出物品的種類與其所在的位置,因此有些大型人工智慧廠商會僱用一群工作人員專門標記(label),因此才有”工人智慧”戲稱。

在這裡跟大家分享框圖的小撇步,在框出物品時,盡量包含該物品的特徵與型狀,且在蒐集同一種標籤的資料時盡可能找各種大小不一的圖片,這樣AI才能夠知道不同距離的情況下,同一種物品的不同形狀與特徵。

標記好所有圖片之後,可點下右上角的綠色按鈕Train,並且訓練模式(Training Types)選擇快速訓練(Fast Training)。

接下來會出現如下畫面,代表AI正在訓練中。

這一個步驟是在微軟的雲端伺服器上執行的,因此我們並不知道其神經網路的層數、權重、以及其細節配置。圖中的iteration1代表這是第一次迭代。若資料集沒有變化,再次按下Train按鈕是不會有任何動作的。

 

稍等一到兩分鐘後(取決於同學的資料量),我們的AI就訓練好了!

同學會看到這樣的畫面:

讓我們來認識一下左邊兩個圈圈分別代表的意思。

引用微軟官方說明:

  • Precision(精確度)表示識別的正確分類所得到的分數。例如,如果模型識別 100 張影像為狗,而實際上有 99 張為狗,則精確度為 99%。

模型預測為狗的總數正確分類為狗 之比例。

也就是

  • Recall(召回率)表示正確識別實際分類所得到的分數。例如,如果實際上有 100 張影像為蘋果,而模型識別 80 張為蘋果,則回收為 80%。

即資料中實際正確為狗 但正確辨識 的比例。

也就是

Recall這比較符合我們直觀認知的機器的”準確率”。

但是這兩個數值都會被左上角的兩個閾值(Probability Threshold與Overlap Threshold)所影響,在實際應用上也僅供參考,因為真實環境中的變數非常多,包括攝影機的角度、光線、影像的白平衡都會改變他的判斷結果。

在機器學習應用上,我們一般會參考Recall值來作為我們判斷模型好壞的依據,畢竟我們的最終期許是希望機器取代人類做一些簡單的工作,所以機器跟人類辨識出一樣的東西的比例要越高越好。

附註:這裡的”張”指的並不一定是照片的張數,只是一個比較好理解的單位,因為在物件辨識(Object Detection)中,標記的面積也會影響到準確度的數值,這裡不多做篇幅介紹,好奇的讀者可以搜尋”檢測評價函數IoU”)

完成的同學可以點選Performance下方,標籤欄位可以看到機器取樣並自我檢測的結果。

機器認為的地方會用紅色框框框起來,而人工標記的地方是白色框框。

接下來回到Customvision,按下Export(匯出)

接下來選取TF(Tensor flow)並點選Export -> Download

下載完成並解壓縮之後會得到兩個檔案,分別是label.txt 與model.pb

成功下載並解壓縮後,我們要用邊緣運算裝置來執行不須連網路的AI辨識,這邊為了方便沒有樹莓派的讀者使用,我們用Anaconda作為執行的環境。

尚未安裝Anaconda的同學可以到這裡,有Anaconda安裝教學文

本身已有安裝Anaconda的同學,請先開啟虛擬環境的prompt視窗,

或者進入Anaconda prompt後輸入:

>conda activate (虛擬環境的名稱)

閱讀我們教學文的同學可以直接輸入:

>conda activate testAI

或者直接在windows的開始視窗中選取虛擬環境的prompt視窗(如下圖)

啟動Anaconda虛擬環境後,先將虛擬環境的目錄移動到C槽的testAI資料夾

>cd C:\testAI

接下來,我們把剛剛解壓縮好的所有檔案複製到這個資料夾裡。

完成後,把python資料夾內的predict.py 與object_detection.py拖曳出來放到testAI內,並且到網路上找一張AI沒看過的圖片放到testAI資料夾中。

你的資料夾看起來要像這樣:

這裡的01.jpg與02.jpg是我要用來測試的檔案,同學也可以自己改檔名。

複製完成後我們回到Anaconda Prompt,並輸入

>python predict.py 01.jpg

此命令意思是用python軟體執行predict.py檔,且此檔案需要的附加檔案檔名為01.jpg。

因此讀者的測試圖檔檔名若不是”01.jpg”,亦可更改為其他檔名,但是副檔名只支援”jpg”、”png”、”bmp”,且檔案大小不可超過4MB。

執行成功會出現如下畫面:

Prompt視窗會顯示所有Bounding Box的起始座標、高度、寬度、信心指數,以及辨識出來的標籤。

當然同學可以自己利用opencv的功能將Bounding Box繪製在測試圖片上,甚至也可以在Bounding Box的左上角顯示標籤名稱:

體驗到這麼強大的人工智慧,你有甚麼想法或應用呢? 又或者,這麼方便的視覺辨識功能可以為你解決甚麼困擾? 都歡迎與我們聯繫唷!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *