杜興
(貴州電子信息職業(yè)技術(shù)學(xué)院,貴州凱里,556000)
在生產(chǎn)生活中,存在著農(nóng)民通過觀察統(tǒng)計果實數(shù)量和位置以方便估計產(chǎn)量和收益多少情況、同時還有果蔬加工廠通過大量勞動力進行手工分揀現(xiàn)象等,這些方式都存在著大量重復(fù)式機械勞動等相似共同特征。
為了解決生產(chǎn)生活中低效率的現(xiàn)象,本系統(tǒng)設(shè)計出了一款能夠利用手機拍照上傳含有果蔬的圖片,經(jīng)過算法識別與定位后統(tǒng)計出果蔬的類別、位置及數(shù)量等信息的果蔬識別與定位APP。
系統(tǒng)前端使用以Vue.js 語言開發(fā)的uniapp 跨平臺前端框架,該框架只需提供一款程序而可以同時開發(fā)出安卓、iOS、微信小程序等多平臺的快速前端開發(fā)工具,簡稱一端開發(fā),多端編譯。前端部分使用基于uniapp 風(fēng)格的HTML、CSS 和Vue 等作為前端開發(fā)語言,同時借鑒uniapp 官方社區(qū)的前端模板構(gòu)建整個APP 頁面[1]。
系統(tǒng)后端使用基于Python 語言的Django 的Web 框架作為果蔬識別與定位軟件數(shù)據(jù)增刪改查的后端部分。其中,Django 的Web 框架是一個基礎(chǔ)的Web 框架,而本系統(tǒng)使用的是基于Django 再次開發(fā)封裝的Django rest framework 的Web 框架[2],該框架對數(shù)據(jù)庫的增刪改查有著極其簡明的操作邏輯。其中,MySQL作為數(shù)據(jù)的存儲工具。
系統(tǒng)的算法核心使用基于SSD 目標檢測與識別的神經(jīng)網(wǎng)絡(luò)對果蔬圖片進行識別與定位,從而獲取圖片中的果蔬位置、類別及數(shù)量等信息。
果蔬識別與定位APP 系統(tǒng)是采用前后端分離的設(shè)計模式進行開發(fā),包含APP 前端頁面、數(shù)據(jù)增刪改查的后端以及識別與定位的算法核心。系統(tǒng)的整體實現(xiàn)構(gòu)架如圖1 所示。
圖1 系統(tǒng)整體構(gòu)架圖
果蔬識別與定位軟件系統(tǒng)由圖中的三個模塊組成,前端APP 通過點擊對應(yīng)按鈕調(diào)用手機端攝像頭拍攝或上傳含有果蔬的圖片信息,當(dāng)后端檢測到數(shù)據(jù)庫中的字段信息發(fā)生變化時,調(diào)用識別與定位的算法核心對圖片信息進行處理,將檢測后圖片、位置和類別信息結(jié)果存儲到數(shù)據(jù)庫中的對應(yīng)字段類型中,最后在前端頁面點擊識別按鈕獲取識別與定位后的結(jié)果并在前端頁面顯示。其中,拍照上傳圖片的方式是HTTP 中的put 請求方式,獲取識別結(jié)果是get 請求方式,因此本系統(tǒng)的后端只有常見增刪改查中的改查功能。此外,本系統(tǒng)沒有設(shè)計用戶注冊登錄功能,故在后端數(shù)據(jù)庫中表的字段數(shù)量只有一個。
果蔬識別與定位的APP 的前端設(shè)計理念是功能實現(xiàn)和操作簡約。
在編程語言方面選擇目前較為流行的基于Vue.js 開發(fā)的前端多平臺應(yīng)用框架,該框架主要的特點是只需使用一套代碼就能實現(xiàn)不同平臺的設(shè)計開發(fā),并且開發(fā)流程和模式與常見的網(wǎng)頁設(shè)計高度相似,可以無學(xué)習(xí)成本的進行果蔬識別與定位的APP 開發(fā)。
在功能核心設(shè)計方面,由于本識別與定位系統(tǒng)是采用前后端分離[3]的設(shè)計模式,同時在進行前后端設(shè)計采用restful[4]風(fēng)格的設(shè)計模式故在前端只需要向后端提供對應(yīng)的請求接口以及請求方式,并且前后端數(shù)據(jù)是以JSON 數(shù)據(jù)類型進行傳輸。按照此種設(shè)計,就完成前端核心功能。在上傳圖片和識別定位按鈕分別對應(yīng)PUT 和GET 請求,該部分的功能對應(yīng)圖3 中的功能實現(xiàn)部分,由于設(shè)計采用restful風(fēng)格,故請求地址相同,方式不同,如圖2 所示(以本機IP 為例)。
圖2 請求接口和方式圖
圖3 果蔬與識別定位軟件界面圖
在界面展示方面,前端頁面主要突出簡潔夠用的原則,既能確保核心功能的完成和實現(xiàn),也要突出界面操作簡單。果蔬識別與定位的APP,如圖3 所示。軟件界面的注意事項主要包含軟件產(chǎn)品優(yōu)缺點和使用說明,軟件的功能部分是上傳圖片和識別定位的核心功能,軟件的操作流程界面主要包含軟件的操作流程,由以上的三個模塊共同組成果蔬識別定位軟件的前端界面。
在圖3 所示的功能部分中,點擊拍照按鈕提交圖片的數(shù)據(jù)是以base64 進行編碼,封裝到JSON[5]類型的數(shù)據(jù)中,向后端進行提交。
果蔬識別與定位的APP 的后端設(shè)計理念是采用基于Python 語言的Django 的web 框架進行后端設(shè)計,為了方便快速后端系統(tǒng)采用的是基于Django 框架的再封裝的Django Rest Framework 簡稱(DRF)進行主要后端主要設(shè)計框架。同時結(jié)合數(shù)據(jù)庫MySQL、圖像處理庫pillow 以及base64 解碼庫等進行輔助設(shè)計。
在圖3 所示的功能部分中,拍照和上傳按鈕分別對應(yīng)后端PUT 和GET 請求,且請求路徑相同和數(shù)據(jù)庫中的字段也相同。具體做法如下,當(dāng)點擊拍照按鈕,前端將圖片的base64 數(shù)據(jù)提交給后臺,并修改名為base64 對應(yīng)的數(shù)據(jù)內(nèi)容,其他數(shù)據(jù)內(nèi)容不做修改,請求方式為PUT。當(dāng)點擊識別按鈕,后端部分先進行圖片解碼操作,之后通過識別與定位算法計算出果蔬所在位置和類別信息,并保存在名為result 對應(yīng)的數(shù)據(jù)內(nèi)容,其他數(shù)據(jù)類型不變,并將數(shù)據(jù)以JSON 數(shù)據(jù)類型返回給前端頁面進行渲染,且請求方式為GET。其中,數(shù)據(jù)庫信息如圖4 所示。
圖4 數(shù)據(jù)庫字段
后端部分的DRF 框架如圖5 所示,使用基于DRF 框架進行快速搭建[6]。數(shù)據(jù)庫API 負責(zé)數(shù)據(jù)的增刪改查,序列化器Serializers 負責(zé)前后端數(shù)據(jù)的交互,結(jié)合參數(shù)校驗數(shù)據(jù)接口Validators 和權(quán)限校驗Permissions 組成三級接口視圖集,同時Routers 完成自動路由注冊以及包含異常處理和規(guī)范接口等功能。使用極少的程序代碼,從而注重項目的流程設(shè)計,完成復(fù)雜的后端邏輯設(shè)計。
圖5 后端DRF 設(shè)計流程圖
果蔬識別與定位使用基于深度學(xué)習(xí)的SSD 目標檢測與識別的神經(jīng)網(wǎng)絡(luò)作為識別核心。以本系統(tǒng)為例,能夠定位出果蔬在圖片中的位置、果蔬的類別以及數(shù)量信息,如圖6 所示,其界面是圖3 的功能部分的界面圖。
圖6 識別與定位效果圖
在本系統(tǒng)中,數(shù)據(jù)集分為蘋果、橘子和香蕉三個類別,樣本總數(shù)量為300。使用基于labelme[7]數(shù)據(jù)標注軟件對數(shù)據(jù)集進行標注,數(shù)據(jù)的標注格式VOC2007,之后送入到神經(jīng)網(wǎng)絡(luò)中性學(xué)習(xí)訓(xùn)練。樣本數(shù)據(jù)如圖7 所示。
圖7 部分樣本數(shù)據(jù)圖
在算法結(jié)構(gòu)中,SSD 是one-stage 的端到端目標檢測識別網(wǎng)絡(luò)[8],網(wǎng)絡(luò)結(jié)構(gòu)圖如圖8 所示。以本系統(tǒng)為例,該目標檢測識別網(wǎng)絡(luò)的特征提取網(wǎng)絡(luò)(backbone)是基于牛津大學(xué)團隊設(shè)計VGG16 卷積神經(jīng)網(wǎng)絡(luò)。通過對6 種不同尺度的特征圖進行融合,可以實現(xiàn)不同尺寸目標的檢測與識別,即淺層特征圖用于檢測小目標、深層特征圖用于檢測大目標。此外,網(wǎng)絡(luò)結(jié)構(gòu)的特征圖采用錨點(anchor)機制,每個特征圖上的每個錨點生成4 或6 個目標的先驗框,考慮到特征圖的通道數(shù),6 種不同尺度的特征圖總共生成8732 個先驗框。生成的8732 個先驗框的分類運算量,在一定程度上,相當(dāng)于輸入一張圖片生成8732 個圖片,然后再對生成的圖片做分類,這樣就會導(dǎo)致運算復(fù)雜度成倍增長。因此,需要對先驗框做數(shù)量上的減法處理,具體做法如下,采取非極大值抑制的方法減少先驗框與之重合度比較高的框,從而減少分類運算量。SSD 網(wǎng)絡(luò)的損失函數(shù)是由均方誤差和交叉熵損失的線性組合,從而對目標進行位置定位和類別分類。
圖8 SSD 網(wǎng)絡(luò)結(jié)構(gòu)圖
在網(wǎng)絡(luò)的輸入中,訓(xùn)練和預(yù)測時的圖像預(yù)處理的重要步驟之一是統(tǒng)一將圖片尺寸放縮到300×300。將圖像放縮到固定尺寸時會損失圖像的部分信息,若圖像尺寸越大這種情況會明顯。為了不損失圖像信息,本文在采取在原圖周圍padding 的方式進行放縮圖像做法,這樣做的優(yōu)點是不破壞原圖的圖像信息在圖像補一個固定像素值的點(本例補黑色像素值的點),而圖像以直接縮放的方法則會破壞原圖目標結(jié)構(gòu)和目標信息。圖像放縮效果圖,如圖9 所示。
圖9 圖像放縮效果圖
在網(wǎng)絡(luò)結(jié)構(gòu)模型中,SSD 網(wǎng)絡(luò)是以VGG16 的6 層特征圖作融合,共產(chǎn)生8732 個先驗框。以圖8 所示的Conv4_3 layer 為例,其他特征圖做法與之類似。
以輸入圖像尺寸為300*300*3 和VGG16 卷積和池化的操作為例,SSD 網(wǎng)絡(luò)生成的第一個特征圖是Conv4_3 layer,該層特征圖的尺寸為38*38,且通道數(shù)為512。該層特征圖每個錨點產(chǎn)生4 個先驗框,而該層先驗框的尺寸以21*21 作為基準大小,比例分別為1:1、1:0.5、1:2、1:(21*45)0.5,產(chǎn)生4 個不同尺寸的比例,按照此種方法產(chǎn)生5776 個先驗框。不同的是,另外5 個特征圖上的每個錨點會產(chǎn)生4 或者6 個不等的先驗框,以此種方法為例,剩下5 個特征圖分別產(chǎn)生2116、600、150、36、4 個先驗框。這些先驗框的總數(shù)量為8732。這些先驗框是以輸入圖像為基準,采取提取不同尺度特征圖的方法,從而檢測出圖像中不同尺寸的目標區(qū)域。
由于輸入一張圖片產(chǎn)生出8732 個先驗框,若不經(jīng)過減少先驗框數(shù)量的處理會產(chǎn)生大量數(shù)值運算,會增加網(wǎng)絡(luò)模型訓(xùn)練和預(yù)測的時間。SSD 網(wǎng)絡(luò)模型在產(chǎn)生8732 個框為基礎(chǔ),經(jīng)過非極大值抑制處理[9],減少先驗框的數(shù)量,降低網(wǎng)絡(luò)模型的運算量。非極大值的主要作用是在不同數(shù)量先驗框的情況下,尋找局部的最大值,從而確定最終的先驗框,從而降低總先驗框的數(shù)量。具體流程如圖10 所示。
圖10 非極大值算法流程圖
SSD 是端到端檢測與識別的神經(jīng)網(wǎng)絡(luò)模型,目標區(qū)域的定位和目標區(qū)域的分類是網(wǎng)絡(luò)模型的任務(wù)。因此,損失函數(shù)與網(wǎng)絡(luò)模型的任務(wù)相對應(yīng)。損失函數(shù)公式,如圖11 所示。損失函數(shù)由兩部分組成,分別是均方誤差損失函數(shù)(定位損失)和交叉熵損失函數(shù)(類別損失)。圖像中目標區(qū)域的位置坐標信息與均方誤差損失函數(shù)輸出值是連續(xù)的相對應(yīng)。圖像中目標區(qū)域的類別信息與交叉熵損失函數(shù)的輸出值是離散的相對應(yīng)。不同的損失函數(shù)負責(zé)目標檢測與識別的不同任務(wù)。
圖11 損失函數(shù)公式圖
SSD 網(wǎng)絡(luò)模型訓(xùn)練步驟如下:(1)數(shù)據(jù)清洗和數(shù)據(jù)標注(VOC2007 格式);(2)安裝和配置硬件環(huán)境;(3)創(chuàng)建訓(xùn)練工程項目;(4)讀取數(shù)據(jù)并數(shù)據(jù)預(yù)處理;(5)搭建網(wǎng)絡(luò)模型;(6)設(shè)置訓(xùn)練參數(shù);(7)觀察損失函數(shù)訓(xùn)練曲線圖(調(diào)優(yōu)網(wǎng)絡(luò)模型);(8)保存網(wǎng)絡(luò)模型的結(jié)構(gòu)和參數(shù)(用于預(yù)測)。SSD 網(wǎng)絡(luò)模型的訓(xùn)練損失曲線圖如圖12 所示,訓(xùn)練迭代次數(shù)是50 次。
圖12 損失函數(shù)訓(xùn)練曲線圖1
由于,網(wǎng)絡(luò)模型訓(xùn)練對硬件配置較高,訓(xùn)練環(huán)境硬件配置為:CPU 為I712 代處理器,顯卡為RTX3070TI 顯存為8G,運存為32G。以此硬件環(huán)境為例,每秒能夠預(yù)測38 張左右,以本機調(diào)用攝像頭為例,如圖13 所示。
圖13 實時檢測與識別效果圖
在完成整個果蔬識別與定位部署之前,需要將系統(tǒng)的前端打包至安卓端,系統(tǒng)的后端和識別檢測部署在云端。以騰訊云和阿里云等服務(wù)器的中低端的配置水平,在部署和調(diào)試過程中發(fā)現(xiàn),硬件水平雖然能夠完成的基礎(chǔ)功能,但是所耗時間較多,造成軟件的操作體驗不好。因此,本系統(tǒng)使用內(nèi)網(wǎng)穿透技術(shù)[11],實現(xiàn)內(nèi)網(wǎng)與外網(wǎng)的互相訪問,將后端和識別檢測部分部署在本地電腦,以增強軟件使用體驗。本系統(tǒng)使用的是神卓互聯(lián)內(nèi)網(wǎng)穿透工具,可以使用極少的成本實現(xiàn)前端與后端的數(shù)據(jù)交互以及目標的檢測與識別,解決了以外網(wǎng)為主要使用場景的手機端訪問內(nèi)網(wǎng)的難題。
由于本系統(tǒng)是由APP 前端、基于Python 語言DRF 的web 后端,以及識別與定位算法端的三個核心部分。果蔬識別與定位系統(tǒng)是前后端分離開發(fā)的設(shè)計模式,前端與后端的交互數(shù)據(jù)類型是JSON。由于,本系統(tǒng)的三個核心模塊分別單獨進行設(shè)計和開發(fā),因此,后端系統(tǒng)和識別與定位算法系統(tǒng)需要進行數(shù)據(jù)耦合。如圖4 所示,具體做法如下,采取設(shè)置數(shù)據(jù)庫中is_delete 的不同標志的為狀態(tài),來檢測和判斷APP 前端頁面提交的功能需求?;诖朔N方法實現(xiàn)果蔬識別定位系統(tǒng)的三個核心模塊的數(shù)據(jù)交互。
本系統(tǒng)使用的主要環(huán)境名及版本號如表1 所示,其中系統(tǒng)硬件環(huán)境配置在第5 部分已說明,在此不再贅述。
表1 解釋器及框架版本號