文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.190639
中文引用格式: 張璘,楊豐墑. 基于深度學習的圖像分類搜索系統[J].電子技術應用,2019,45(12):51-55.
英文引用格式: Zhang Lin,Yang Fengshang. Image classification search system based on deep learning method[J]. Application of Electronic Technique,2019,45(12):51-55.
0 引言
Caffe(Convolutional Architecture for Fast Feature Embedding)是由伯克利大學的賈楊清等人開發的一個開源的深度學習框架[1],采用高效的C++語言實現,并內置有Python和MATLAB接口,以供開發人員開發和部署以深度學習為核心算法的應用。本文從基本的深度學習概念出發,以mnist手寫識別數據集為基礎,通過Caffe框架設計的LeNet卷積網絡對數據集進行訓練分析,提取目標圖像特征信息,訓練出一個模型進行測試以及網絡結構的圖解[2]。為了更好地展示深度學習的應用效果,使用bvlc_reference_caffenet.caffemodel來作為基本模型進行圖片識別分類,實現了一個簡單的“以圖搜圖”Web應用。
1 深度學習的介紹
深度學習的概念由HINTON G E等人于2006年提出[3],基于深度置信網絡(DBN)提出非監督貪心逐層訓練算法,多非線性層級系統有效解決了深度學習在訓練過程中的過擬合問題,通過在圖像層次稀疏表示中引入圖像顯著信息,加強了圖像特征的語義信息,得到圖像顯著特征表達。
1.1 卷積過程
對于一維信號,卷積定義為:
其中,f表示Mr×Nc的二維圖像矩陣,g表示Nr×Nc的二維圖像矩陣,卷積結果y的大小為(Mr+Nr-1)×(Mc+Nc-1),即0≤m<Mr+Nr-1,0≤n<Mc+Nc-1。以具體圖像處理為例,卷積過程其實還是基于一個固定的矩陣,將另外一個矩陣一格一格掃過去得到數值的和,如圖1所示。
如果輸入的圖像是6×6的一組矩陣,其前3×3格的數據經過權值weight的加權求和后可以得到429,得到第一個卷積后的數據;輸入矩陣每次運算向后移動一小格,并與權值weight進行加權求和,掃完整個數據可以得到一個4×4的數據,卷積的結果是維數降低了,如圖2所示。
1.2 卷積核
卷積核為圖1中3×3矩陣的數量,因為有時要提取的特征非常多且廣泛,所以需要用更多不同的矩陣來掃(多掃幾遍),那么矩陣的個數就是卷積核個數。
輸出的矩陣公式為:
當使用n個不同權重的矩陣卷積6×6矩陣時,可以將6×6的一個矩陣轉變成n個4×4的矩陣,即6×6-->n×4×4的矩陣。
1.3 池化(pooling)
池化與卷積非常相似,簡單來說就是下采樣,都是使用一個矩陣與另一個矩陣的加權和得到最后的數據。池化與卷積最大的不同是卷積重復使用一個數據,而池化是每個數據只加權求和使用一次。當原來的矩陣是m×m、采樣窗口是n×n時,卷積能夠取得(m-n+1)×(m-n+1)的矩陣結果,而池化在不重復使用數據加權求和的情況下,一共只能采樣(m/n)×(m/n)的結果矩陣。之所以這么做,是因為即使做完了卷積,圖像仍然很大(因為卷積核比較小),所以為了降低數據維度,就進行下采樣。之所以能這么做,是因為即使減少了許多數據,特征的統計屬性仍能夠描述圖像,而且由于降低了數據維度,有效地避免了過擬合[4-5]。池化的過程如圖3所示,原始圖片大小是12×12 維度,對其進行下采樣,采樣窗口為10×10,通過池化將其下采樣成為一個2×2大小的特征圖。
1.4 訓練流程
訓練的主要流程是訓練卷積神經網絡(CNN)的某一個卷積層時,實際上是在訓練一系列的濾波器(filter)。簡單來說,訓練CNN在相當意義上是在訓練每一個卷積層的濾波器,讓這些濾波器組對特定的模式特征有較高的激活,從而達到CNN網絡的分類/檢測等目的[6]。因此,在相當程度上,構建卷積神經網絡的任務就在于構建這些濾波器,也就是改變濾波器矩陣的值,即改變權值weight,用來識別特定的特征[7]。這個過程叫做訓練,圖4是深度學習訓練流程圖。
其中weight權值即圖4中的W0、W1、W2,其值由初始權值隨著學習訓練的過程由損失函數來控制和調整,從而達到學習的目的。
2 LeNet卷積網絡的mnist手寫識別模型
2.1 訓練過程
由LECUN Y等人于1998年提出的LeNet網絡[8]是最早的卷積神經網絡之一,它在手寫數字的識別問題中取得成功。本文使用的mnist圖片數據來源于官網http://yann.lecun.com/exdb/mnist/,數據分成了訓練集(60 000張共10類)和測試集(共10 000張10類),每個類別放在一個單獨的文件夾里,并將所有的圖片都生成txt列表清單(train.txt和test.txt)[9]。
環境說明:采用VMware Workstation14下的Linux(Ubuntu16.04)操作系統系統,Python環境:Anaconda2.7,Caffe 以及Caffe所需要的Opencv(3.4)支持。環境搭建如圖5所示。
2.2 測試結果
本文使用mnist官方提供的測試集對訓練好的模型進行訓練,每類數字有1 000張共10個分類10 000張圖片,判斷正確結果較多,因此這里跳過了判斷正確結果的輸出,圖6依次為0~9的測試出錯結果:頭頂標記為模型對圖片預測分類的結果。
從測試的結果可以看出:
(1)測試大概10 000張圖片,共用時不到10 s(僅使用CPU運算,且不同性能計算機用時差異較大,僅作參考),其中判斷錯誤數量為80張左右,正確率大概有99.2%,每張的測試時間不到1 ms。
(2)分析輸出的錯誤圖像判斷結果,可知有些錯誤原因是手寫字跡潦草、部分較為模糊、手寫有歧義(即使人為判斷也無法準確斷定數字具體分類)。
(3)部分的測試結果在人眼識別過程中沒有太大的問題,在字跡方面也算可以清晰顯示出數字的具體信息,而此模型卻給出了一個錯誤的結果。這些識別結果只顯示了概率最大的分類,可能在識別的部分特征過于相似,導致并不能得到最好的分類結果,這應該屬于深度學習的訓練缺陷的一部分,原因是由于訓練集的質量和數量決定的。
3 圖片識別的一個簡單應用:以圖搜圖
百度上線了其最新的搜索功能——“識圖”,該功能基于相似圖片識別技術,讓用戶通過上傳本地圖片或者輸入圖片的URL地址后,根據圖像特征進行分析,進而從互聯網中搜索出與此相似的圖片資源及信息內容。根據前面的深度學習圖片分類的學習結果,設計出一款類似百度“識圖”的應用。
3.1 總體設計思路
使用Web前端獲取用戶所上傳(POST)的圖片文件或者URL,服務器接收到用戶圖片后調用bvlc模型進行處理,載入模型識別出圖片分類信息,后臺根據這個分類信息使用requests爬蟲庫搜索Bing上相似的圖片,獲取到相關的圖片鏈接并傳給前端瀏覽器,瀏覽器根據所給的圖片鏈接進行訪問請求,并顯示在用戶瀏覽界面中,從而達到以圖搜圖的功能。處理流程圖如圖7所示。
3.2 模型框架說明
后臺服務器Django:Django是一個開放源代碼的Web應用框架,由Python寫成,較適合中等規模的Web項目,本圖片搜索系統是基于Django搭建并部署Web應用。
Web前端框架Bootstrap:Bootstrap是當前比較流行的前端框架,起源于推特,提供了簡潔的層疊樣式表和HTML規則,以及更為完善的人性化網站風格。根據此框架能夠較好較快地搭建前端Web UI界面,且很符合該圖片展示模塊的風格。
搜索分類依據bvlc模型:該模型由Caffe團隊使用imagenet圖片集迭代訓練30多萬次而成,共有1 000種的分類,是一個可應用級別的model。此次分析圖片的具體分類就是通過這個模型得到分類的關鍵字。
3.3 搜圖流程
前端界面:這里提供了兩種圖片的上傳方式,即圖片的本地文件以及圖片的URL地址,選擇上傳一張小貓圖片,如圖8所示。
后臺分類:后臺將圖片載入bvlc模型進行運算,如圖9展示的是第一個卷積層的卷積核與進行第一次卷積后的圖片。
最終后臺經過分析特征得到圖片分類的概率分布圖,如下結果最可能的分類為283,再通過查找label文件得到283類為label:n02123394 Persian cat,如圖10所示。
也可以查看前5個最有可能的分類結果:
[(0.99606931,′n02123394 Persian cat′),
(0.0019333176,′n02127052 lynx,catamount′),
(0.0013805312,′n02123159 tiger cat′),
(0.00041564793,′n02123045 tabby,tabby cat′),
(8.5782471e-05,′n02124075 Egyptian cat′)]
更多圖片搜索的實現:得到關鍵字后,通過requests爬蟲庫爬取Bing圖片(https://cn.bing.com/images),對網頁HTML源碼進行分析,因此得到了一個API接口:https://cn.bing.com/images/async?q={%s}&mmasync=1。
該接口提供一個搜索關鍵詞的參數代替URL中的%s,因而得到想要的圖片數據,再使用xpath:’//*[@id="mmComponent_images_1"]/ul/li/div/div/div/div[1]/ul/li[2]/text()’,從而提取到想要的圖片地址以及圖片源信息。獲得圖片的URL信息后,后臺系統會整理好數據以JSON方式傳送給瀏覽器,瀏覽器便可依據此地址展示給用戶更多的相似圖片。
前端圖片展示頁面:第一張圖片為搜索的原圖以及其分類的信息,其他圖片為向用戶提供的更多相似圖片的結果,并且有查看大圖(view)和下載功能(download),如圖11所示。
4 結論
圖片識別分類系統在應用級別的構建需要大量圖片作為訓練的基礎,不斷迭代學習才能得到一個較好的模型。本文使用的模型為Caffe官方提供的bvlc_reference_caffenet.caffemodel,使用的訓練集imagenet數據集是一個強大的模型。但若以人工智能應用部署在計算機視覺領域上還遠遠不夠,仍需要更多的大數據作為基礎。同時,即使有這樣一個強大模型在實際應用中,還需要動態一步步地修正和完善其模型與參數配置,這點現在的Caffe還無法很好地給出解決方案。本文最終的圖片搜索應用功能依賴于識別的分類結果,本質上還是為以分類關鍵詞搜圖作為結果,若是相同分類的不同圖片,搜到的結果可能相似度過高,不夠智能化。可參考的解決方案是使用多個訓練模型分析所選圖片的各方面信息,如色調、風格、其他分類等綜合結果,再加以搜索會更加智能化,但同時對訓練的數據集和訓練網絡的學習效率會有更高的要求。
參考文獻
[1] Jia Yangqing,SHELHAMER E,DONAHUE J,et al.Caffe:convolutional architecture for fast feature embedding[C].ACM International Conference on Multimedia ACM,2014:675-678.
[2] 王茜,張海仙.深度學習框架Caffe在圖像分類中的應用[J].現代計算機(專業版),2016(5):72-75,80.
[3] HINTON G E,OSINDERO S,THE Y W.A fast learning algorithm for deep belief nets[J].Neural Computation,2006,18(7):1527-1554.
[4] 魏正.基于Caffe平臺深度學習的人臉識別研究與實現[D].西安:西安電子科技大學,2015.
[5] 許少尉,陳思宇.基于深度學習的圖像分類方法[J].電子技術應用,2018,44(6):116-119.
[6] 張順,龔怡宏,王進軍.深度卷積神經網絡的發展及其在計算機視覺領域的應用[J].計算機學報,2017,42(3):453-462.
[7] 孫志軍,薛磊,許陽明,等.深度學習研究綜述[J].計算機應用研究,2012,29(8):2806-2810.
[8] LECUN Y,BOTTOU L,BENGIO Y,et al.Gradient-based learning applied to document recognition[J].Proceedings of the IEEE,1998,86(11):2278-2324.
[9] 黃睿,陸許明,鄔依林.基于Ten-sorFlow深度學習手寫體數字識別及應用[J].電子技術應用,2018,44(10):6-10.
作者信息:
張 璘,楊豐墑
(廈門理工學院 光電與通信工程學院,福建 廈門361024)