呂俊霖,麥嘉銘 ,熊 浩,蔡海真
(1 中國水產(chǎn)科學研究院南海水產(chǎn)研究所,廣州 510300;2 華南農(nóng)業(yè)大學,廣州,510642)
隨著機器學習尤其是深度學習技術的迅速發(fā)展,圖像識別技術已在植物識別[1-2]、人臉識別[3-4]、交通標志識別[5]和醫(yī)學圖像等方面展開了廣泛的研究應用。圖像識別技術在魚類智能識別領域起步較晚,這是因為魚的身體是柔性的,不容易取得固定的特征,再加上水體和光照的因素,要識別并鑒定水中的魚類就顯得較為困難[6]。
在對魚類進行圖像識別研究的過程中,王文成等[7-8]應用ResNet50網(wǎng)絡模型,對巴鰹魚、大菱鲆、鯔魚等10 種魚類的分類和識別進行探索研究;陳文輝等[9]提出一種基于DCNN和遷移學習的方法,針對新圖像數(shù)據(jù)集,通過選擇訓練參數(shù),對預訓練模型進行再訓練,實現(xiàn)4種魚類的分類識別,徐嘉熠[10]基于ResNet101網(wǎng)絡的Faster RCNN算法和基于VGG16網(wǎng)絡的SSD算法對有標記的魚類圖片進行目標識別;賈玉霞[11]使用自制的數(shù)據(jù)集Fish30Image,利用ResNet模型結(jié)合遷移學習方法,對30種魚類的識別,得到了99%的準確率。
識別系統(tǒng)的設計和實現(xiàn)需要考慮樣本來源和技術框架的問題。其中,樣本來源即訓練集的圖像,這決定了最終所得的權重文件的擬合程度,訓練集的覆蓋場景越多,標注越準確,擬合程度就越好,識別就越準確,反之則相反。技術框架是指識別的前后端應采用什么樣的技術進行組合。根據(jù)識別技術的使用場景,前端技術應當是便攜的,易用的,與后端無縫集成的。根據(jù)前端的應用要求,后端為其提供功能接口,比如文件讀取、數(shù)據(jù)存取等等。根據(jù)使用場景,前端可使用微信小程序、手機應用程序或網(wǎng)頁等,后端可選擇的技術較多,基于Python 的Django[12-13],基于PHP的ThinkPHP[14-15]或基于Java的SSM均可。
提出了一種基于深度學習的魚類智能識別系統(tǒng)的設計方案。該系統(tǒng)前端采用微信小程序作為界面載體,后端采用Java的SSM框架,對用戶上傳的圖片進行識別,并將識別結(jié)果返回給前端做進一步的渲染,展現(xiàn)給用戶最終的識別結(jié)果。
卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)是一種前饋神經(jīng)網(wǎng)絡,由一個或多個卷積層、池化層和頂端的全連接層組成。這一結(jié)構(gòu)使得卷積神經(jīng)網(wǎng)絡能夠利用輸入數(shù)據(jù)的二維結(jié)構(gòu)提取圖像的特征。與其他深度學習結(jié)構(gòu)相比,卷積神經(jīng)網(wǎng)絡對圖像的某些關鍵特征能做出較為敏感的反應,因此,目前多用于大型圖像的圖像識別、圖片分割、物體檢測等方面[16-18]。
在機器學習尤其是深度學習中,Softmax是個非常常用且比較重要的函數(shù),在多分類的場景中使用廣泛。在多分類中,可能有多個預測結(jié)果,這些預測結(jié)果用概率的形式表示,概率值較大,表示預測準確度較高,反之則說明準確度較低。預測結(jié)果的概率總和是1,Softmax函數(shù)剛好符合這個性質(zhì),可以把輸出映射為0~1之間的實數(shù),并且保證輸出的概率之和為1,因此,Softmax函數(shù)在多分類的應用場景中取得了主流地位。
在本系統(tǒng)的設計中,通過運行識別腳本,得到Softmax函數(shù)的返回值,該返回值(一個或幾個)與數(shù)據(jù)庫的ID值一一對應,從而可得到該物種的詳細信息。通常,取概率值最大的ID作為物種的識別結(jié)果。
在識別的應用場景中,識別行為通常是偶發(fā)的、一次性的,微信小程序的“隨用隨走”的特點正好滿足這一需求。微信小程序的本質(zhì)是一個富單頁面的Web應用,所有的頁面渲染和事件處理都在一個頁面內(nèi)進行,但與傳統(tǒng)的WebApp不同的是,它可以調(diào)用原生的各種接口,像網(wǎng)絡狀態(tài)、羅盤、重力、手機攝像頭、手機文件接口等[19-20],因此,微信小程序非常適合應用在圖像識別的場合。
Java的SSM(Spring + Spring MVC + MyBatis)是一個輕量級的應用技術[21-23]。Spring依賴注入的方式來管理各層的組件,使用面向切面編程來管理事務、日志、權限等。Spring MVC使用Model(模型)、View(視圖)、Contoller(控制)來接收外部請求并進行分發(fā)和處理。MyBatis是基于JDBC的框架,主要用來操作數(shù)據(jù)庫,并且將業(yè)務實體和數(shù)據(jù)表聯(lián)系起來。自SSM框架推出以來,在業(yè)界獲得了較多應用,技術比較成熟,近年來在人臉識別、商品推薦等領域取得了不少應用[24-26]。因此,前端使用小程序技術,后端使用SSM框架,是一個比較常用的設計方法。
系統(tǒng)采用微信小程序+SSM作為技術框架。微信小程序作為前端,可以調(diào)用攝像頭或利用相冊進行圖片傳輸,后端采用了Java的SSM框架,具有靈活高效的特點。數(shù)據(jù)庫采用開源數(shù)據(jù)庫MySQL進行數(shù)據(jù)的管理。程序流程圖如圖1所示。
圖1 程序流程圖
在圖1中,用戶使用小程序進行拍照或直接在相冊中上傳魚類物種的圖片,后端的SpringMVC監(jiān)聽到請求后,將傳上來的圖片暫存在本地,然后調(diào)用深度學習的腳本進行圖片識別,識別結(jié)果與訓練好的模型文件進行比對,得到屬于某個物種的概率,并返回該物種的ID號,由于物種的ID號跟物種的具體信息已事先存儲在MySQL數(shù)據(jù)庫中,因此,根據(jù)該物種的ID訪問數(shù)據(jù)庫并取得該條記錄的具體信息并返回給前端。于是,用戶在網(wǎng)頁或小程序上就獲得了該圖片的識別結(jié)果和該物種的詳細資料。
系統(tǒng)的數(shù)據(jù)集訓練采用谷歌的Efficient Net網(wǎng)絡模型,該算法于2019年推出,實現(xiàn)了網(wǎng)絡模型的深度、廣度和圖片解析率的動態(tài)平衡,在同等的參數(shù)情況下,比VGG15、ResNet50和ResNet10更為優(yōu)越[27-29],因此,本系統(tǒng)采用該模型進行魚類數(shù)據(jù)集的訓練,可以取得更高的精度和更快的訓練速度。
系統(tǒng)按照功能結(jié)構(gòu)可分為系統(tǒng)管理模塊、深度學習模型調(diào)用模塊、魚類信息管理模塊、統(tǒng)計分析模塊和智能推薦模塊。系統(tǒng)管理模塊主要提供系統(tǒng)的基本功能,包含用戶、角色、權限配置等管理功能。此部分內(nèi)容比較簡單,屬于通用模塊,本文不予詳述。深度學習模型調(diào)用模塊是系統(tǒng)的關鍵點,負責與深度學習模型進行交互,達到魚類智能識別的目的。魚類信息管理模塊是本系統(tǒng)的另一個關鍵模塊,其功能包括:魚類資料錄入、縮略圖上傳、參考圖上傳等。統(tǒng)計分析模塊用于統(tǒng)計識別種類的次數(shù)、識別時間等。智能推薦模塊則根據(jù)識別結(jié)果,推薦與識別結(jié)果近緣的種類。系統(tǒng)的功能框架圖如圖2所示。
圖2 功能框架圖
前端上傳過來的圖片保存在本地后,調(diào)用深度學習的腳本文件對此圖片進行卷積處理,將卷積結(jié)果與模型文件進行比對,從而計算出屬于某個魚類(此魚類在數(shù)據(jù)庫中的ID)的概率。概率越大,屬于該種魚類的可能性越高,準確度越高。在實踐中,舍去了概率值低于0.05 的魚類,返回“很抱歉,我們暫時無法識別此生物”。
系統(tǒng)的魚類信息管理模塊的功能是為前端提供所識別的魚類的具體信息。如學名、俗名、形態(tài)特征、生活習性等等。因此,需要設計一個數(shù)據(jù)表進行管理。該數(shù)據(jù)表的設計如表1所示。
表1 魚類信息數(shù)據(jù)表
在表1中,image是指在物種詳情頁的上方所展示的圖片,該圖片在小程序上進行輪播展示,點擊可查看大圖;smallimage是指在查詢時展示的縮略圖;infomatihonsource是指信息來源,如某本論著或某個網(wǎng)站等。 表1中資料由工作人員在相關論著和維基百科、百度百科上采集而成,個別有疑問的字段,則由專業(yè)人員審查后確定。
統(tǒng)計分析模塊用于在一個時間段內(nèi)統(tǒng)計分析后臺接口被調(diào)用的次數(shù)和物種被預測識別的次數(shù),從而在宏觀角度上掌握識別系統(tǒng)被使用的情況,有利于研究團隊合理分配資源和分析識別結(jié)果。比如某些魚類被識別的次數(shù)較多,就需要把服務器資源和更多精力投入到這些魚類當中。
隨著推薦系統(tǒng)的廣泛應用,本文也增加了推薦功能,用于對識別結(jié)果的同屬物種的推薦。根據(jù)魚類學名的命名規(guī)律,相鄰的科屬往往也采用相似的名稱,因此,可以用SQL的like語句來進行鄰近種的推薦。對相鄰科屬的推薦,一方面便于用戶對所識別的物種進行細微的辨別,另一方面也增加了用戶使用程序的時間。
數(shù)據(jù)集使用EfficientNet網(wǎng)絡模型訓練完畢后,查看其精度和損失值情況。見圖3和圖4所示。
圖3 魚類訓練集的精度和損失值
由圖3a可以看出,在第20 個Epoch之前,精度(accuracy)上升較快,之后逐漸趨緩,最終停留在約95%的位置。在圖3b 可以看出,損失值(loss)在第20個Epoch 之前下降較快,之后逐漸趨緩,最終損失值0.05左右,可見整體訓練效果較好。最終獲得的模型文件為74.5MB,在服務器上的檢測時間為0.2 ms。
為了便于應用推廣,項目成員制作了“識魚”小程序。在微信中,搜索小程序“識魚”并打開,起始頁面是一張魚類的清晰大圖,起到吸引用戶的效果,可以點擊此圖,直接對此圖進行識別,也可以由用戶自行選擇圖片或使用相機進行識別,通常不到一秒即可得到識別結(jié)果,見圖4和圖5。
圖4 識魚首頁
圖5 識別結(jié)果頁
此外,項目成員還在農(nóng)貿(mào)市場、超市、酒店水族箱等對魚類進行拍照識別測試,測試次數(shù)200次,所涉及的魚類有金線魚、大眼鯛、籃子魚、金錢魚、細鱗鯻等,基本準確率在90%以上。另外,對家庭水族箱、網(wǎng)頁中的魚類圖片甚至是簡筆畫也進行了測試,見表2。表2說明,該模型對這幾種魚類在水族箱、網(wǎng)頁圖片和簡筆畫等場景的泛化程度較好。這些圖片由網(wǎng)絡隨機挑選而得,雖然不能說明全部種類的識別情況,但也有一定的代表性。
表2 不同場景下對若干魚類識別
在對圖片進行物體識別的發(fā)展過程中,前期主要側(cè)重于對物體的大類進行識別,這稱為“粗粒度識別”,與此相對,“細粒度識別”是指對同一基礎類別的不同子類對象進行識別,其難點在于不同類別間僅有細微的局部差異[30-32]。在本研究中,因為需要識別出圖片里的每條魚的分類地位,所以,這是魚類的“細粒度識別”。在細粒度識別中,所需要識別的子分類越深,科、屬內(nèi)所包含的種越多,識別的難度就越大。因此,識別同一個屬內(nèi)的若干種魚類,與識別不同科的若干屬魚類,前者的難度要更高。這也是相關研究[7-11]較為不足的地方。在本研究中,是通過收集大量能體現(xiàn)物種特征的圖片,并輔以性能更為優(yōu)越的EfficientNet來提升細粒度識別的精度。
從表2可以看出,本研究最終生成的模型不但對魚類實際圖片的識別效果較好,對簡筆畫也能做出較準確的識別。這是因為項目成員對網(wǎng)絡圖片及對最常見種類的圖片做了廣泛收集。比如,對金魚、錦鯉等最常見的種類,項目成員采集了大量在臉盆里、玻璃箱里、公園的池塘里的金魚和錦鯉的典型圖片并加以訓練,所生成的模型中包含了物種的典型特征,因此,當用戶上傳類似的圖片時,就能對此做出較為準確的識別。事實上,對一個基于深度學習的識別系統(tǒng)來說,數(shù)據(jù)集質(zhì)量的高低決定了所能達到識別準確度的上限。因此,系統(tǒng)設計人員在開發(fā)過程中,不但要考慮到技術框架的適應性,還更應注重數(shù)據(jù)集的質(zhì)量。在以往的研究中,研究人員多側(cè)重在圖像識別的技術層面,而對數(shù)據(jù)集的質(zhì)量有所忽視,這導致了在技術層面(算法、性能和功能等)的表現(xiàn)雖好,但卻難以落地的問題。
但是,質(zhì)量更高的數(shù)據(jù)集則意味著需要花費更多的時間和精力。因此,在本系統(tǒng)的研發(fā)中,花費最多精力和時間的并不是對代碼的編寫和對參數(shù)的調(diào)整,而是對圖片的反復收集和鑒定。在后續(xù)的研究中,應側(cè)重于對小樣本數(shù)據(jù)集的特征提取研究,以在一定程度上減少人力的使用[33-34]。
本研究所設計的魚類智能識別系統(tǒng),在實際的識別應用中,有些魚類可能無法識別,或者識別不準確,需要人工介入。對此,本設計已在“我的”頁增加了“聯(lián)系我們”,可使用微信小助手跟鑒定人員進行互動,以幫助用戶進行更準確地識別。但更好的形式卻是開辟討論頁,讓眾多的用戶加入到對魚類的識別和鑒定中來[35]。但此頁面的開辟,因關系到值守制度,言論管理制度的執(zhí)行,在一定程度上增加了運維成本。如何取舍,還要看各運維單位的實際情況。
設計了一種魚類智能識別系統(tǒng),對卷積神經(jīng)網(wǎng)絡技術、微信小程序技術和SSM技術進行集成,并開發(fā)了智能推薦和統(tǒng)計分析模塊,較好地完成了對魚類智能識別的設計和實現(xiàn),可對中國1 400種魚類進行智能識別,在不同場景中對魚類的識別效果良好。本研究中所提出的設計和實現(xiàn)方法,為移動端的魚類識別開發(fā)提供了一種可行的思路,可為廣大海洋科研人員和開發(fā)人員提供有益的參考。
□