牟曉東
我們利用機器學習中的“圖片分類”功能,開發實現了能夠智能識別開發板的“開發板分類器”。其實,只要前期的模型學習過程中進行了足夠多的“訓練”,后期的分類識別功能就會更強大,能“認識”更多的物品,而且識別準確率(稱為“置信度”)也更高。不過,“圖片分類”只限于識別單獨的一個物體,如果攝像頭畫面中有多個待識別物體同時存在,就要用到“物體分類”功能來實現。以開發制作一個超市商品“計價提醒儀”為例,我們在樹莓派上通過圖形化編程和Python代碼編程分別實現自動計價和多物體同時識別。
實驗器材包括樹莓派3B+及古德微擴展板一塊,USB接口的攝像頭一個,音箱一個,HC-SR04超聲波傳感器一個;作為“道具”的圓珠筆兩支,塑料夾兩個,鉛筆刀一把,釘書針一盒,“購物托盤”一個,A4白紙若干。首先將攝像頭插入臺式機的USB接口,在平整的桌面上鋪好白紙,將購物托盤水平放置并調整好攝像頭的拍攝角度,四件文具商品各取一件放入購物托盤;然后,將超聲波傳感器的四個引腳插入擴展板的20號和21號引腳,注意方向朝外;最后,將音箱數據線插入樹莓派的音頻輸出孔,給樹莓派通電,啟動操作系統。
基本操作與“圖片分類”相似,“物體分類”的前期準備工作如下:
首先,在古德微機器人網站點擊“更多功能”進入“機器學習”界面,點擊右側“物體檢測”中的“開始物體識別”按鈕(如圖1)。

在彈出的“機器學習—物體檢測”頁面中點擊“拍照”按鈕,用鼠標分別框選每件文具商品后為其添加類別:“鉛筆刀”、“圓珠筆”、“釘書針”和“塑料夾”,完成后點擊“保存并切換下一張圖片”按鈕。
繼續在購物托盤上變換文具商品,比如只放置一把鉛筆刀,或是同時放置兩支圓珠筆和一盒釘書針等等,重復拍照并進行物體的類別標注。這個過程需要耗費一定的時間,進行至少16張標記圖片的采集,并且在每張圖片上都要對其中的文具商品進行正確的標注——包括同一張圖片上有兩件及以上相同的文具商品也要一一標注。
接下來,點擊中間的“開始訓練”按鈕,平臺開始進行模型的訓練,五六分鐘之后會提示“模型訓練完成!”;此時,在右側的“預覽”窗口中也會實時對攝像頭所拍攝到的文具商品進行名稱及置信度的百分比顯示(如圖2)。

點擊“下載樹莓派上使用的模型”按鈕,將模型文件model.tflite通過Windows的遠程桌面連接復制并粘貼至樹莓派的/home/pi/model/object_detec
tion目錄下;接著,在此目錄中新建一個名為labels.txt的文本型標簽文件,將之前的四種文具商品名稱信息標注逐條輸入并保存——如果后期測試時發現標注信息有錯誤的話,可在此標簽文件中進行文具商品名稱的位置調換。
返回古德微機器人平臺,點擊“積木”切換至圖形化編程界面,開始進行編程:
首先,輸出調試信息“程序開始運行”作為程序開始運行的提示;接著,建立一個名為“文具價目表”的空字典,通過四個連續的“為字典添加或更新數據”模塊語句為其賦值:鉛筆刀1元、塑料夾2元、釘書針5元、圓珠筆3元;然后,建立變量“文具識別模型”,賦值為“加載物體檢測模型”,對應的模型文件和標簽文件即準備工作中已經訓練并下載至樹莓派/home/pi/model/object_detection目錄下的model.tflite和labels.txt;最后,輸出調試信息“模型加載”(如圖3)。

首先,建立一個名為“文具數量統計”的空字典;接著,建立一個“為每個項目在列表中執行”的循環結構,為變量“文具名稱”賦值為“從字典‘單項識別結果’中獲取鍵‘name’所對應的值”,實現從變量“文具名稱”中提取對應物體名稱的功能;再將從字典“文具價目表”獲取鍵為“文具名稱”所對應的值(即該文具商品的售價)取出,通過“自增”模塊語句增加至變量“總價”中;然后,通過一個“如果…執行…否則…”雙分支選擇結構對剛剛識別出的“文具名稱”進行判斷——是否在字典“文具數量統計”中已經存在,條件成立的話,說明之前的循環已經統計過該文具商品的數量,則將其數量在原基礎上進行“個數加1”;否則,說明該文具商品是第一次被識別到,對應的“個數”值就是1(如圖4)。

首先,調用“初始化”函數;接著,建立一個“重復當‘真’執行”的循環結構,為變量“超聲波測距”賦值為“智能硬件”-“常用”-“超聲波測距”;在“如果…執行…”選擇結構中對“超聲波測距”的值進行是否“小于30”(單位:厘米)的判斷,條件成立,則進行以下操作:
將計算文具商品最終付款金額的“總價”賦值為0,再通過變量“照片路徑”實現控制USB攝像頭拍攝一張相片,為變量“識別結果”賦值——“用物體檢測模型‘文具識別模型’對圖片‘照片路徑’進行物體檢測”,并且通過輸出調試信息進行顯示;接著,調用“計算文具數量和總價”函數,實現將正確識別出的文具商品數量與總價進行統計的功能;然后,建立一個名為“識別到的文具名稱列表”的變量,為其賦值為“獲取字典‘文具數量統計’的所有鍵”,并且再通過一個“為每個項目在列表中執行”的循環結構,實現變量“文具清單”的賦值、語音播報及LOG調試區的文字信息輸出,格式為:“X的選購數量:Y元。”;最后,再建立一個名為“文具總計”的變量,同樣也是通過“建立字符串使用”模塊語句,實現賦值、語音播報及信息輸出,格式為:“您應付款Z元。”(如圖5)。

將程序保存為“超市商品‘自動計價提醒儀’”,并且要將USB攝像頭從臺式機上拔出,插至樹莓派的USB接口;點擊“連接設備”后再點擊“運行”按鈕,開始測試:
先嘗試將1把鉛筆刀和2支圓珠筆放置于購物托盤中,再用手掌靠近超聲波傳感器模擬購物者靠近收銀臺,LOG調試區先是輸出“程序開始運行”和“模型加載”的提示信息,接著又以列表內嵌套字典的形式輸出“識別結果”:[{"box"”:[322,374,512,435],"name":"鉛筆刀","score":85.49},{"box":[219,169,554,249],"name":"圓珠筆","score":51.56},{"box":[205,260,546,328],"name":"圓珠筆","score":51.4}],表示在對應區域分別進行了物體識別;然后再分別輸出“文具清單”和“文具總計”信息——鉛筆刀 的選購數量:1,圓珠筆 的選購數量:2,您應付款7元。與此同時,音箱也會進行文具商品選購情況及最終付款金額數目的語音播報。接下來,再分別測試“鉛筆刀1把、釘書針1盒、圓珠筆1支”和“塑料夾1個、釘書針1盒、鉛筆刀1把”的選購情況,最終分別得到“您應付款9元”和“您應付款8元”的正確識別結果顯示與語音播報提醒。
與“圖片分類”類似,我們仍然是訪問Github頁面(https://github.com/tensorflow/examples/
tree/master/lite/examples/object_detection/rasp
berry_pi)查找和下載object_detector.py文件,改寫另存為object_detection_with_usbcamera.py,同樣也是改寫成用USB接口的攝像頭,而且將調用的模型文件和標簽文件重新定位至準備工作中訓練好并下載到樹莓派的model.tflite和labels.txt。
通過Windows的遠程桌面連接進入樹莓派,在Thonny編輯器中打開/home/pi/pycode目錄中的object_detection_with_usbcamera.py文件,點擊“運行”按鈕進行多物體識別測試——比如在攝像頭下的購物托盤中先放置“一支圓珠筆、一盒釘書釘、一把鉛筆刀”時,程序彈出的frame視頻窗口中就會對這三種文具商品進行正確的識別,包括名稱及置信度(百分比);同樣,如果再放置“一支圓珠筆、兩個塑料夾、一把鉛筆刀”的話,程序同樣也會進行識別和置信度的標識(如圖6)。

如果想要實現使用圖形化編程時的文具商品數量統計與總價合計的話,就需要在程序中建立對應的變量,同時結合字典及列表等相關的Python編程知識進行物體識別信息的提取(包括對各種文具商品進行定價、對超聲波傳感器進行測距判斷等),同樣也會實現“自動計價提醒儀”的其他功能,大家不妨一試。