牟曉東
眾所周知,機器學習是人工智能的核心,主要目的是讓機器從使用者和輸入數據中獲得信息,從而自動判斷和輸出對應結果。“圖片分類”指的是識別一張圖片(包括使用攝像頭實時拍攝的圖片)是否為某類物體(或狀態與場景),即識別出圖片中的主體或是狀態較為單一的某場景。在樹莓派中,我們可以通過采集較為少量的樣本圖片進行訓練和標注,最終獲取到一個較高精度的圖像分類模型,然后分別使用“積木”圖形化和Python代碼編程,開發制作一個能夠智能識別樹莓派、掌控板和Arduino的“開發板分類器”。
實驗器材包括樹莓派3B+一塊,USB接口的攝像頭一個,音箱一個;作為“道具”的樹莓派、掌控板和Arduino開發板各一塊,A4白紙若干張。首先將攝像頭插入樹莓派的USB接口,在平整的桌面上鋪好白紙,調整好拍攝角度;然后,將音箱數據線插入樹莓派的音頻輸出孔,最后給樹莓派通電,啟動操作系統。
首先,訪問古德微機器人網站(http://www.gdwrobot.cn),登錄進入自己的賬號后點擊“設備控制”進入“積木”界面;接著,點擊“更多功能”按鈕,再點擊左下角的“機器學習”項,頁面顯示有“圖片分類”和“物體檢測”兩類功能應用,點擊“圖片分類”中的“遠程使用樹莓派攝像頭進行圖片分類”按鈕(如圖1)。

此時,會彈出并進入“機器學習——圖片分類(遠程采集樹莓派圖片)”頁面,在左側系統默認的“類別1”、“類別2”等項目中即可進行數據的采集。
首先,將“類別1”重命名為“樹莓派”,再將樹莓派主板放置于攝像頭下,不斷變換多個位置與角度,分別點擊“拍照”按鈕進行樹莓派圖片樣例的添加;接著,按照同樣的方式再將“類別2”重命名為“掌控板”,點擊“添加類別”按鈕增加“Arduino”和“背景”兩項,分別在攝像頭下放置掌控板和Arduino進行多個位置與角度變換的拍照(“背景”信息的采集直接拍攝白紙即可),每項均拍照采集9張圖片樣例;然后,點擊右上方的“開始訓練”按鈕進行圖片分類學習的訓練,結束后即可在攝像頭下放置任意一種開發板(比如樹莓派)進行驗證預覽,下方顯示對應的項目與置信度百分比:“樹莓派:80%、掌控板:2%、Arduino:17%、背景:1%”(四個置信度百分比之和為100%),其中的樹莓派置信度最高,即判定該物體為樹莓派(如圖2)。

拍照采集與訓練驗證均完成之后,點擊右下角的“下載樹莓派可用模型到樹莓派上”按鈕,很快就會有“模型轉換下載完成”的提示,相關的文件已被下載到樹莓派的/home/pi/model/image_classifica
tion目錄下,模型文件為model.tflite,對應標簽文件為labels.txt。通過Windows的遠程桌面連接進入樹莓派進行查看,labels.txt的文件內容包含四行內容,依次對應訓練模型的名稱:“樹莓派、掌控板、Arduino、背景”(如圖3)。

點擊“積木”切換至圖形化編程界面,首先,建立一個名為“分類識別模型對象”的變量,為其賦值為“人工智能”-“機器學習”下的“加載圖片分類模型”模塊語句,保持其中默認的模型文件和標簽文件不變(即之前下載保存至樹莓派的model.tflite和labels.txt兩個文件);接著,建立一個重復執行10次的循環結構,建立變量“照片路徑”,賦值為“用USB攝像頭拍一張照片”;再建立變量“識別結果”,賦值為“用圖片分類模型‘分類識別模型對象’對圖片‘照片路徑’進行分類”,并進行結果輸出;再建立變量“最高概率類別”和“最高概率”,分別賦值為“從圖片分類識別結果”中提取置信度最高的“類別名稱”和“置信度”,同樣也在LOG調試信息區顯示輸出;最后,構造一個“播放語音”模塊語句,通過音箱輸出字符串信息:“這個物體百分之‘最高概率’是‘最高概率類別’”,并加上“等待5秒”,作用是等待播放語音結束。
將程序保存為“開發板分類器”后點擊“運行”按鈕,此時,嘗試將一塊掌控板放置于攝像頭下,很快在LOG調試信息區有了結果,前四行是以Python語言的字典形式進行信息輸出——
[{"name":"掌控板","score":87.5},
{"name":"Arduino","score":10.2},
{"name":"樹莓派","score":2.3},
{"name":"背景","score":0}]
表示識別的四種分類結果,即每個項目的名稱與所對應的置信度百分比;接著輸出的“掌控板”和“87.5”分別是變量“最高概率類別”和“最高概率”的值,表示識別出本次的目標物體有87.5%的概率是掌控板(如圖4)。同時,音箱中進行語音播報:“這個物體百分之八十七點五是掌控板”。接下來,測試Arduino和樹莓派,或者什么都不放(只有白紙的背景),程序都非常準確地識別出了每一種物體并進行語音播報。

Python代碼可直接到Github查找和下載(https://github.com/tensorflow/examples/tree/
master/lite/examples/image_classification/raspberry_pi),不過這個classify_picamera.py文件中調用的攝像頭不是USB接口,而是連接至樹莓派的“CAMERA”CSI卡槽接口的P5V04A SUNNY定焦攝像頭——導入庫:“import picamera”。
古德微機器人平臺已經將該文件進行了改寫(image_classify_with_usbcamera.py),一是將其中調用標配攝像頭的代碼改為USB攝像頭,另一個是將模型文件和標簽文件直接定位至之前下載保存至樹莓派的/home/pi/model/image_classification/目錄的model.tflite和labels.txt文件,分別通過為model_path和labels_path兩個變量賦值來實現。程序先是通過import調用time、numpy、cv2和PIL等相關庫模塊;接著,自定義了load_labels()和cv2ImgAddText ()兩個函數,分別實現標簽文件加載和在USB攝像頭拍攝的畫面上添加識別文字信息的功能;最后,進行模型文件的加載和輸出細節的設置(包括寬度和高度等)、讀取攝像頭拍攝的畫面以及畫面顏色轉換與尺寸重設置等操作。
通過Windows遠程桌面連接進入樹莓派后,打開并運行image_classify_with_usbcamera.py程序;同時,在攝像頭下分別放置掌控板、Arduino和樹莓派開發板,程序會彈出一個名為“frame”的攝像頭實時捕捉畫面,顯示有拍攝到的開發板并標出識別的信息,如“掌控板 accuracy:0.85”、 “樹莓派 accuracy:0.93”等,其中的“accuracy”意思是“準確度”(對應圖形化編程中的“置信度”),后面的數據即代表識別并確定的百分比(如圖5)。
