牟曉東
我們利用機(jī)器學(xué)習(xí)中的“圖片分類”功能,開發(fā)實(shí)現(xiàn)了能夠智能識別開發(fā)板的“開發(fā)板分類器”。其實(shí),只要前期的模型學(xué)習(xí)過程中進(jìn)行了足夠多的“訓(xùn)練”,后期的分類識別功能就會(huì)更強(qiáng)大,能“認(rèn)識”更多的物品,而且識別準(zhǔn)確率(稱為“置信度”)也更高。不過,“圖片分類”只限于識別單獨(dú)的一個(gè)物體,如果攝像頭畫面中有多個(gè)待識別物體同時(shí)存在,就要用到“物體分類”功能來實(shí)現(xiàn)。以開發(fā)制作一個(gè)超市商品“計(jì)價(jià)提醒儀”為例,我們在樹莓派上通過圖形化編程和Python代碼編程分別實(shí)現(xiàn)自動(dòng)計(jì)價(jià)和多物體同時(shí)識別。
實(shí)驗(yàn)器材包括樹莓派3B+及古德微擴(kuò)展板一塊,USB接口的攝像頭一個(gè),音箱一個(gè),HC-SR04超聲波傳感器一個(gè);作為“道具”的圓珠筆兩支,塑料夾兩個(gè),鉛筆刀一把,釘書針一盒,“購物托盤”一個(gè),A4白紙若干。首先將攝像頭插入臺式機(jī)的USB接口,在平整的桌面上鋪好白紙,將購物托盤水平放置并調(diào)整好攝像頭的拍攝角度,四件文具商品各取一件放入購物托盤;然后,將超聲波傳感器的四個(gè)引腳插入擴(kuò)展板的20號和21號引腳,注意方向朝外;最后,將音箱數(shù)據(jù)線插入樹莓派的音頻輸出孔,給樹莓派通電,啟動(dòng)操作系統(tǒng)。
基本操作與“圖片分類”相似,“物體分類”的前期準(zhǔn)備工作如下:
首先,在古德微機(jī)器人網(wǎng)站點(diǎn)擊“更多功能”進(jìn)入“機(jī)器學(xué)習(xí)”界面,點(diǎn)擊右側(cè)“物體檢測”中的“開始物體識別”按鈕(如圖1)。
在彈出的“機(jī)器學(xué)習(xí)—物體檢測”頁面中點(diǎn)擊“拍照”按鈕,用鼠標(biāo)分別框選每件文具商品后為其添加類別:“鉛筆刀”、“圓珠筆”、“釘書針”和“塑料夾”,完成后點(diǎn)擊“保存并切換下一張圖片”按鈕。
繼續(xù)在購物托盤上變換文具商品,比如只放置一把鉛筆刀,或是同時(shí)放置兩支圓珠筆和一盒釘書針等等,重復(fù)拍照并進(jìn)行物體的類別標(biāo)注。這個(gè)過程需要耗費(fèi)一定的時(shí)間,進(jìn)行至少16張標(biāo)記圖片的采集,并且在每張圖片上都要對其中的文具商品進(jìn)行正確的標(biāo)注——包括同一張圖片上有兩件及以上相同的文具商品也要一一標(biāo)注。
接下來,點(diǎn)擊中間的“開始訓(xùn)練”按鈕,平臺開始進(jìn)行模型的訓(xùn)練,五六分鐘之后會(huì)提示“模型訓(xùn)練完成!”;此時(shí),在右側(cè)的“預(yù)覽”窗口中也會(huì)實(shí)時(shí)對攝像頭所拍攝到的文具商品進(jìn)行名稱及置信度的百分比顯示(如圖2)。
點(diǎn)擊“下載樹莓派上使用的模型”按鈕,將模型文件model.tflite通過Windows的遠(yuǎn)程桌面連接復(fù)制并粘貼至樹莓派的/home/pi/model/object_detec
tion目錄下;接著,在此目錄中新建一個(gè)名為labels.txt的文本型標(biāo)簽文件,將之前的四種文具商品名稱信息標(biāo)注逐條輸入并保存——如果后期測試時(shí)發(fā)現(xiàn)標(biāo)注信息有錯(cuò)誤的話,可在此標(biāo)簽文件中進(jìn)行文具商品名稱的位置調(diào)換。
返回古德微機(jī)器人平臺,點(diǎn)擊“積木”切換至圖形化編程界面,開始進(jìn)行編程:
首先,輸出調(diào)試信息“程序開始運(yùn)行”作為程序開始運(yùn)行的提示;接著,建立一個(gè)名為“文具價(jià)目表”的空字典,通過四個(gè)連續(xù)的“為字典添加或更新數(shù)據(jù)”模塊語句為其賦值:鉛筆刀1元、塑料夾2元、釘書針5元、圓珠筆3元;然后,建立變量“文具識別模型”,賦值為“加載物體檢測模型”,對應(yīng)的模型文件和標(biāo)簽文件即準(zhǔn)備工作中已經(jīng)訓(xùn)練并下載至樹莓派/home/pi/model/object_detection目錄下的model.tflite和labels.txt;最后,輸出調(diào)試信息“模型加載”(如圖3)。
首先,建立一個(gè)名為“文具數(shù)量統(tǒng)計(jì)”的空字典;接著,建立一個(gè)“為每個(gè)項(xiàng)目在列表中執(zhí)行”的循環(huán)結(jié)構(gòu),為變量“文具名稱”賦值為“從字典‘單項(xiàng)識別結(jié)果’中獲取鍵‘name’所對應(yīng)的值”,實(shí)現(xiàn)從變量“文具名稱”中提取對應(yīng)物體名稱的功能;再將從字典“文具價(jià)目表”獲取鍵為“文具名稱”所對應(yīng)的值(即該文具商品的售價(jià))取出,通過“自增”模塊語句增加至變量“總價(jià)”中;然后,通過一個(gè)“如果…執(zhí)行…否則…”雙分支選擇結(jié)構(gòu)對剛剛識別出的“文具名稱”進(jìn)行判斷——是否在字典“文具數(shù)量統(tǒng)計(jì)”中已經(jīng)存在,條件成立的話,說明之前的循環(huán)已經(jīng)統(tǒng)計(jì)過該文具商品的數(shù)量,則將其數(shù)量在原基礎(chǔ)上進(jìn)行“個(gè)數(shù)加1”;否則,說明該文具商品是第一次被識別到,對應(yīng)的“個(gè)數(shù)”值就是1(如圖4)。
首先,調(diào)用“初始化”函數(shù);接著,建立一個(gè)“重復(fù)當(dāng)‘真’執(zhí)行”的循環(huán)結(jié)構(gòu),為變量“超聲波測距”賦值為“智能硬件”-“常用”-“超聲波測距”;在“如果…執(zhí)行…”選擇結(jié)構(gòu)中對“超聲波測距”的值進(jìn)行是否“小于30”(單位:厘米)的判斷,條件成立,則進(jìn)行以下操作:
將計(jì)算文具商品最終付款金額的“總價(jià)”賦值為0,再通過變量“照片路徑”實(shí)現(xiàn)控制USB攝像頭拍攝一張相片,為變量“識別結(jié)果”賦值——“用物體檢測模型‘文具識別模型’對圖片‘照片路徑’進(jìn)行物體檢測”,并且通過輸出調(diào)試信息進(jìn)行顯示;接著,調(diào)用“計(jì)算文具數(shù)量和總價(jià)”函數(shù),實(shí)現(xiàn)將正確識別出的文具商品數(shù)量與總價(jià)進(jìn)行統(tǒng)計(jì)的功能;然后,建立一個(gè)名為“識別到的文具名稱列表”的變量,為其賦值為“獲取字典‘文具數(shù)量統(tǒng)計(jì)’的所有鍵”,并且再通過一個(gè)“為每個(gè)項(xiàng)目在列表中執(zhí)行”的循環(huán)結(jié)構(gòu),實(shí)現(xiàn)變量“文具清單”的賦值、語音播報(bào)及LOG調(diào)試區(qū)的文字信息輸出,格式為:“X的選購數(shù)量:Y元?!?最后,再建立一個(gè)名為“文具總計(jì)”的變量,同樣也是通過“建立字符串使用”模塊語句,實(shí)現(xiàn)賦值、語音播報(bào)及信息輸出,格式為:“您應(yīng)付款Z元。”(如圖5)。
將程序保存為“超市商品‘自動(dòng)計(jì)價(jià)提醒儀’”,并且要將USB攝像頭從臺式機(jī)上拔出,插至樹莓派的USB接口;點(diǎn)擊“連接設(shè)備”后再點(diǎn)擊“運(yùn)行”按鈕,開始測試:
先嘗試將1把鉛筆刀和2支圓珠筆放置于購物托盤中,再用手掌靠近超聲波傳感器模擬購物者靠近收銀臺,LOG調(diào)試區(qū)先是輸出“程序開始運(yùn)行”和“模型加載”的提示信息,接著又以列表內(nèi)嵌套字典的形式輸出“識別結(jié)果”:[{"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}],表示在對應(yīng)區(qū)域分別進(jìn)行了物體識別;然后再分別輸出“文具清單”和“文具總計(jì)”信息——鉛筆刀 的選購數(shù)量:1,圓珠筆 的選購數(shù)量:2,您應(yīng)付款7元。與此同時(shí),音箱也會(huì)進(jìn)行文具商品選購情況及最終付款金額數(shù)目的語音播報(bào)。接下來,再分別測試“鉛筆刀1把、釘書針1盒、圓珠筆1支”和“塑料夾1個(gè)、釘書針1盒、鉛筆刀1把”的選購情況,最終分別得到“您應(yīng)付款9元”和“您應(yīng)付款8元”的正確識別結(jié)果顯示與語音播報(bào)提醒。
與“圖片分類”類似,我們?nèi)匀皇窃L問Github頁面(https://github.com/tensorflow/examples/
tree/master/lite/examples/object_detection/rasp
berry_pi)查找和下載object_detector.py文件,改寫另存為object_detection_with_usbcamera.py,同樣也是改寫成用USB接口的攝像頭,而且將調(diào)用的模型文件和標(biāo)簽文件重新定位至準(zhǔn)備工作中訓(xùn)練好并下載到樹莓派的model.tflite和labels.txt。
通過Windows的遠(yuǎn)程桌面連接進(jìn)入樹莓派,在Thonny編輯器中打開/home/pi/pycode目錄中的object_detection_with_usbcamera.py文件,點(diǎn)擊“運(yùn)行”按鈕進(jìn)行多物體識別測試——比如在攝像頭下的購物托盤中先放置“一支圓珠筆、一盒釘書釘、一把鉛筆刀”時(shí),程序彈出的frame視頻窗口中就會(huì)對這三種文具商品進(jìn)行正確的識別,包括名稱及置信度(百分比);同樣,如果再放置“一支圓珠筆、兩個(gè)塑料夾、一把鉛筆刀”的話,程序同樣也會(huì)進(jìn)行識別和置信度的標(biāo)識(如圖6)。
如果想要實(shí)現(xiàn)使用圖形化編程時(shí)的文具商品數(shù)量統(tǒng)計(jì)與總價(jià)合計(jì)的話,就需要在程序中建立對應(yīng)的變量,同時(shí)結(jié)合字典及列表等相關(guān)的Python編程知識進(jìn)行物體識別信息的提?。ò▽Ω鞣N文具商品進(jìn)行定價(jià)、對超聲波傳感器進(jìn)行測距判斷等),同樣也會(huì)實(shí)現(xiàn)“自動(dòng)計(jì)價(jià)提醒儀”的其他功能,大家不妨一試。