牟曉東
眾所周知,機(jī)器學(xué)習(xí)是人工智能的核心,主要目的是讓機(jī)器從使用者和輸入數(shù)據(jù)中獲得信息,從而自動(dòng)判斷和輸出對(duì)應(yīng)結(jié)果?!皥D片分類”指的是識(shí)別一張圖片(包括使用攝像頭實(shí)時(shí)拍攝的圖片)是否為某類物體(或狀態(tài)與場(chǎng)景),即識(shí)別出圖片中的主體或是狀態(tài)較為單一的某場(chǎng)景。在樹莓派中,我們可以通過采集較為少量的樣本圖片進(jìn)行訓(xùn)練和標(biāo)注,最終獲取到一個(gè)較高精度的圖像分類模型,然后分別使用“積木”圖形化和Python代碼編程,開發(fā)制作一個(gè)能夠智能識(shí)別樹莓派、掌控板和Arduino的“開發(fā)板分類器”。
實(shí)驗(yàn)器材包括樹莓派3B+一塊,USB接口的攝像頭一個(gè),音箱一個(gè);作為“道具”的樹莓派、掌控板和Arduino開發(fā)板各一塊,A4白紙若干張。首先將攝像頭插入樹莓派的USB接口,在平整的桌面上鋪好白紙,調(diào)整好拍攝角度;然后,將音箱數(shù)據(jù)線插入樹莓派的音頻輸出孔,最后給樹莓派通電,啟動(dòng)操作系統(tǒng)。
首先,訪問古德微機(jī)器人網(wǎng)站(http://www.gdwrobot.cn),登錄進(jìn)入自己的賬號(hào)后點(diǎn)擊“設(shè)備控制”進(jìn)入“積木”界面;接著,點(diǎn)擊“更多功能”按鈕,再點(diǎn)擊左下角的“機(jī)器學(xué)習(xí)”項(xiàng),頁面顯示有“圖片分類”和“物體檢測(cè)”兩類功能應(yīng)用,點(diǎn)擊“圖片分類”中的“遠(yuǎn)程使用樹莓派攝像頭進(jìn)行圖片分類”按鈕(如圖1)。
此時(shí),會(huì)彈出并進(jìn)入“機(jī)器學(xué)習(xí)——圖片分類(遠(yuǎn)程采集樹莓派圖片)”頁面,在左側(cè)系統(tǒng)默認(rèn)的“類別1”、“類別2”等項(xiàng)目中即可進(jìn)行數(shù)據(jù)的采集。
首先,將“類別1”重命名為“樹莓派”,再將樹莓派主板放置于攝像頭下,不斷變換多個(gè)位置與角度,分別點(diǎn)擊“拍照”按鈕進(jìn)行樹莓派圖片樣例的添加;接著,按照同樣的方式再將“類別2”重命名為“掌控板”,點(diǎn)擊“添加類別”按鈕增加“Arduino”和“背景”兩項(xiàng),分別在攝像頭下放置掌控板和Arduino進(jìn)行多個(gè)位置與角度變換的拍照(“背景”信息的采集直接拍攝白紙即可),每項(xiàng)均拍照采集9張圖片樣例;然后,點(diǎn)擊右上方的“開始訓(xùn)練”按鈕進(jìn)行圖片分類學(xué)習(xí)的訓(xùn)練,結(jié)束后即可在攝像頭下放置任意一種開發(fā)板(比如樹莓派)進(jìn)行驗(yàn)證預(yù)覽,下方顯示對(duì)應(yīng)的項(xiàng)目與置信度百分比:“樹莓派:80%、掌控板:2%、Arduino:17%、背景:1%”(四個(gè)置信度百分比之和為100%),其中的樹莓派置信度最高,即判定該物體為樹莓派(如圖2)。
拍照采集與訓(xùn)練驗(yàn)證均完成之后,點(diǎn)擊右下角的“下載樹莓派可用模型到樹莓派上”按鈕,很快就會(huì)有“模型轉(zhuǎn)換下載完成”的提示,相關(guān)的文件已被下載到樹莓派的/home/pi/model/image_classifica
tion目錄下,模型文件為model.tflite,對(duì)應(yīng)標(biāo)簽文件為labels.txt。通過Windows的遠(yuǎn)程桌面連接進(jìn)入樹莓派進(jìn)行查看,labels.txt的文件內(nèi)容包含四行內(nèi)容,依次對(duì)應(yīng)訓(xùn)練模型的名稱:“樹莓派、掌控板、Arduino、背景”(如圖3)。
點(diǎn)擊“積木”切換至圖形化編程界面,首先,建立一個(gè)名為“分類識(shí)別模型對(duì)象”的變量,為其賦值為“人工智能”-“機(jī)器學(xué)習(xí)”下的“加載圖片分類模型”模塊語句,保持其中默認(rèn)的模型文件和標(biāo)簽文件不變(即之前下載保存至樹莓派的model.tflite和labels.txt兩個(gè)文件);接著,建立一個(gè)重復(fù)執(zhí)行10次的循環(huán)結(jié)構(gòu),建立變量“照片路徑”,賦值為“用USB攝像頭拍一張照片”;再建立變量“識(shí)別結(jié)果”,賦值為“用圖片分類模型‘分類識(shí)別模型對(duì)象’對(duì)圖片‘照片路徑’進(jìn)行分類”,并進(jìn)行結(jié)果輸出;再建立變量“最高概率類別”和“最高概率”,分別賦值為“從圖片分類識(shí)別結(jié)果”中提取置信度最高的“類別名稱”和“置信度”,同樣也在LOG調(diào)試信息區(qū)顯示輸出;最后,構(gòu)造一個(gè)“播放語音”模塊語句,通過音箱輸出字符串信息:“這個(gè)物體百分之‘最高概率’是‘最高概率類別’”,并加上“等待5秒”,作用是等待播放語音結(jié)束。
將程序保存為“開發(fā)板分類器”后點(diǎn)擊“運(yùn)行”按鈕,此時(shí),嘗試將一塊掌控板放置于攝像頭下,很快在LOG調(diào)試信息區(qū)有了結(jié)果,前四行是以Python語言的字典形式進(jìn)行信息輸出——
[{"name":"掌控板","score":87.5},
{"name":"Arduino","score":10.2},
{"name":"樹莓派","score":2.3},
{"name":"背景","score":0}]
表示識(shí)別的四種分類結(jié)果,即每個(gè)項(xiàng)目的名稱與所對(duì)應(yīng)的置信度百分比;接著輸出的“掌控板”和“87.5”分別是變量“最高概率類別”和“最高概率”的值,表示識(shí)別出本次的目標(biāo)物體有87.5%的概率是掌控板(如圖4)。同時(shí),音箱中進(jìn)行語音播報(bào):“這個(gè)物體百分之八十七點(diǎn)五是掌控板”。接下來,測(cè)試Arduino和樹莓派,或者什么都不放(只有白紙的背景),程序都非常準(zhǔn)確地識(shí)別出了每一種物體并進(jìn)行語音播報(bào)。
Python代碼可直接到Github查找和下載(https://github.com/tensorflow/examples/tree/
master/lite/examples/image_classification/raspberry_pi),不過這個(gè)classify_picamera.py文件中調(diào)用的攝像頭不是USB接口,而是連接至樹莓派的“CAMERA”CSI卡槽接口的P5V04A SUNNY定焦攝像頭——導(dǎo)入庫:“import picamera”。
古德微機(jī)器人平臺(tái)已經(jīng)將該文件進(jìn)行了改寫(image_classify_with_usbcamera.py),一是將其中調(diào)用標(biāo)配攝像頭的代碼改為USB攝像頭,另一個(gè)是將模型文件和標(biāo)簽文件直接定位至之前下載保存至樹莓派的/home/pi/model/image_classification/目錄的model.tflite和labels.txt文件,分別通過為model_path和labels_path兩個(gè)變量賦值來實(shí)現(xiàn)。程序先是通過import調(diào)用time、numpy、cv2和PIL等相關(guān)庫模塊;接著,自定義了load_labels()和cv2ImgAddText ()兩個(gè)函數(shù),分別實(shí)現(xiàn)標(biāo)簽文件加載和在USB攝像頭拍攝的畫面上添加識(shí)別文字信息的功能;最后,進(jìn)行模型文件的加載和輸出細(xì)節(jié)的設(shè)置(包括寬度和高度等)、讀取攝像頭拍攝的畫面以及畫面顏色轉(zhuǎn)換與尺寸重設(shè)置等操作。
通過Windows遠(yuǎn)程桌面連接進(jìn)入樹莓派后,打開并運(yùn)行image_classify_with_usbcamera.py程序;同時(shí),在攝像頭下分別放置掌控板、Arduino和樹莓派開發(fā)板,程序會(huì)彈出一個(gè)名為“frame”的攝像頭實(shí)時(shí)捕捉畫面,顯示有拍攝到的開發(fā)板并標(biāo)出識(shí)別的信息,如“掌控板 accuracy:0.85”、 “樹莓派 accuracy:0.93”等,其中的“accuracy”意思是“準(zhǔn)確度”(對(duì)應(yīng)圖形化編程中的“置信度”),后面的數(shù)據(jù)即代表識(shí)別并確定的百分比(如圖5)。