付雪婷 ,王新鑫 ,楊凡凡 ,潘 昊
(沈陽化工大學,遼寧 沈陽 110142)
花卉識別是圖像識別的一種。圖像識別是計算機視覺領域的重要概念之一[1]。目前深度學習的突出領域主要是在圖像、音頻兩大方面。本研究介紹了使用不同深度學習算法對月季品種分類識別的方法[2]。該方法借助卷積神經(jīng)網(wǎng)絡(Convolutional Neural Networks, CNN)將其分為不同的類別,通過圖片集訓練卷積神經(jīng)網(wǎng)絡模型來提高識別不同月季品種的準確率。同時,介紹了花卉識別的背景、卷積神經(jīng)網(wǎng)絡的原理、相關研究現(xiàn)狀以及具體實驗設計,最后進行了實驗分析和總結。
傳統(tǒng)的花卉識別通常是由植物學家完成的,對于大多數(shù)人而言,當他們在這個領域的知識和經(jīng)驗不足時,將面臨著識別花卉種類的困難[3]。世界上有超過45 萬種花,我國約有3 萬種花,植物學家無法記住所有的種類。普通人要想認出這些花,就必須在不同搜索引擎的幫助下,通過書籍或互聯(lián)網(wǎng)進行單調乏味的搜索。對于以上情況,需要設計一個自動化檢測和識別花卉種類的軟件[4]。建立自動花卉識別的重要性突出在許多方面,比如為采摘機器人提供快速識別;滿足植物愛好者識別花卉種類的需求等?;ɑ茏R別技術對花卉種類識別經(jīng)驗不足的人來說,不僅能夠認出花卉種類,還能節(jié)省大量時間和精力。智能農業(yè)中的自動采花系統(tǒng)已經(jīng)被研究了很多年,需要將花朵識別任務集成為系統(tǒng)的一部分。此外,近年來人們對花卉的需求也使其成為農業(yè)中重要的商業(yè)貿易。
市面上已有諸如形色、花伴侶、百度識圖等相關的識別植物的軟件,然而這類軟件只能識別出花卉或植物的總名稱,不能識別出其具體的種類名。比如月季是薔薇科薔薇屬的一種植物,耐寒,中國是原產國之一,有兩千多年的栽培歷史,是國內52 座城市的市花。市面上沒有識別月季品種的軟件,常見的花卉識別軟件也未提供開源算法,本研究通過深度學習算法對識別月季品種進行了相關研究與分析[5]。
傳統(tǒng)機器學習方法的主要研究內容如下:Nilsback[5]最早提出了花卉圖像分割算法,用于分離前景和背景;Chai 等[6]在Nilsback 等的基礎上進行改進,提出了一種聯(lián)合過濾分割算法BiCoS;Angelova等改進了之前的算法,他們先檢測圖像的low-level位置,接著用Propagation 算法對原始的花卉圖像進行全分割。
近年來,以CNN 為基礎的深度學習方法更加主流,以GoogLeNet、ResNet、Batch Normalization 等網(wǎng)絡模型為代表[7],取得了大幅度進展。有學者采用AlexNet,用ILSVRC 數(shù)據(jù)集訓練好的網(wǎng)絡參數(shù)初始化網(wǎng)絡層(最后一層全連接層除外),以較大的學習速率訓練最后一層全連接層,以較小的學習速率微調瓶頸層;Hu 等采用GoogLeNet,先在ILSVRC 數(shù)據(jù)集上訓練網(wǎng)絡,之后替換掉最后一層全連接層,再在Oxford-102 Flower 數(shù)據(jù)集上微調網(wǎng)絡;Wu 等采用ResNet50,先在ILSVRC 數(shù)據(jù)集上訓練網(wǎng)絡,然后以一個較小的學習速率再對所有網(wǎng)絡層進行微調。
深度學習已初步展示了可以從植物圖像中學習出具有高判別力的底層紋理特征,是解決月季品種識別的有效工具[8]。許多成功的真實世界圖像識別系統(tǒng)需要成百上千的訓練示例。無論是開發(fā)更好的學習算法,還是增加訓練集的規(guī)模,都有可能提高對象分類性能。
1.3.1 圖像識別
花卉識別是圖像識別的一種。目前深度學習的突出領域主要是在圖像、音頻兩大方面?;ɑ軋D像識別流程主要有圖像預處理、圖像分割、特征提取、特征分類[9]。現(xiàn)在,圖像分割已被確立為圖像處理中的可靠技術,使用圖像處理工具可以從圖像中提取重要特征。為了從圖像中提取重要特征,分割提供了一種快速的解決方案。將圖像數(shù)字化并將其區(qū)分為多個片段以勾勒出感興趣的區(qū)域,這被稱為圖像分割[10]。圖像識別將圖像處理得到的圖像進行特征提取和分類,目前常用的分類方法包括支持向量機、神經(jīng)網(wǎng)絡等。其中任意一種方法都可以通過計算類別標簽的概率來幫助將花卉分類到各自的類別中[11]。
1.3.2 卷積神經(jīng)網(wǎng)絡
神經(jīng)網(wǎng)絡[12]是一個模仿動物神經(jīng)網(wǎng)絡行為的數(shù)學算法模型,基本單位是神經(jīng)元,也稱為節(jié)點。每個神經(jīng)元收到輸入的線性組合后,先進行簡單的線性加權,然后在每個神經(jīng)元上添加非線性激活函數(shù),經(jīng)過非線性變換后輸出[13]。一個完整的卷積神經(jīng)網(wǎng)絡結構包含輸入層、卷積層、激活層、池化層、全連接層[14]。
1)輸入層是卷積神經(jīng)網(wǎng)絡各層中的底層,其功能是處理輸入數(shù)據(jù),如去除平均值,減少數(shù)據(jù)中的過度偏差,并改善訓練效果。
2)卷積層是整個網(wǎng)絡的核心層。卷積層包含一組需要學習參數(shù)的過濾器。每個過濾器與輸入體積相結合,通過權重分配提取輸入局部區(qū)域的局部函數(shù),并計算由神經(jīng)元構成的激活圖[15]。然后,根據(jù)深度將所有濾波器的激活映射進行疊加,得到輸出結果。最后,通過一系列內核權重和激活函數(shù)生成一個輸出函數(shù)映射[11]。在神經(jīng)網(wǎng)絡領域廣泛使用的整流線性單位被用作激活函數(shù)。其輸出可以表示為以下數(shù)學方程:
式中,f表示一個激活函數(shù),k是核,Mj是對應的一個輸入,l表示網(wǎng)絡中的層次。
3)激活層常用的激活函數(shù)是Sigmoid、ReLU 和Softmax。在卷積神經(jīng)網(wǎng)絡中一般采用ReLu 激活函數(shù),其收斂速度更快。
4)池化層通常位于卷積層的后面。它作為一個子采樣,集成了類似的功能,減少了參數(shù)的數(shù)量。最大池化層的最大值計算為特征圖的每一個補丁,最大池化即取區(qū)域平均最大,如圖1 所示。
圖1 最大池化示意圖
5)全連接層可以簡單理解為一個分類器。全連接層將二維特征映射的輸出轉換為一維向量。所有神經(jīng)元都與后續(xù)層和相鄰層中的神經(jīng)元完全連接,將學習的“分布式特征表示”映射到樣本標簽空間。
本研究選取目前比較熱門的三個圖像識別算法進行對照試驗,分別是ResNet、GoogLeNet 及Inception V3,算法參數(shù)如表1 所示。
表1 算法參數(shù)
2.1.1 ResNet算法
由于存在梯度消失和梯度爆炸的問題,極其深的神經(jīng)網(wǎng)絡很難訓練。跳躍連接(Skip connection),它可以從某一網(wǎng)絡層獲取激活,然后迅速反饋給另外一層,甚至是神經(jīng)網(wǎng)絡的更深層,可以利用跳躍連接構建能夠訓練深度網(wǎng)絡的ResNet。ResNet 算法的重大創(chuàng)新在于增加了殘差塊(Residual block),不僅大大減少了模型計算量、減少了數(shù)據(jù)冗余,而且模型的訓練準確率與速度得到了提升。
2.1.2 GoogLeNet 算法
GoogLeNet 作為CNN 里比較有名經(jīng)典的算法,與其他CNN 相比,其增加了處理原始數(shù)據(jù)的層數(shù),達到了22 層。其基本思想是不用人為決定使用哪個過濾器或者是否需要池化,而是通過添加參數(shù)的所有可能值,然后把這些輸出連接起來,讓網(wǎng)絡自己對比不同參數(shù)的效果以確定采用哪些參數(shù)及組合。即Inception 網(wǎng)絡的作用就是代替人們做決定,因此網(wǎng)絡架構變得更復雜,計算量變大,但該算法表現(xiàn)卻非常好。為了減少計算成本,Inception 網(wǎng)絡中加入了1×1卷積。
2.1.3 Inception V3算法
Inception V3 算法在GoogLeNet 的基礎上,主要進行了兩方面的改造:一是引入了Factorization into small convolutions 的思想,將一個較大的二維卷積拆成兩個較小的一維卷積。二是優(yōu)化了Inception Module 的結構。好處是節(jié)約了參數(shù),加快了運算速度并減輕了過擬合,非對稱的卷積結構拆分可以處理更多的空間特征,增加特征多樣性。
本研究中實驗對象選取五種不同的月季,種類名稱分別是藍色風暴、金絲雀、自由精神、果汁陽臺和紅色龍沙寶石,如圖2 至圖6 所示。藍色風暴是藍紫色重瓣中型月季,金絲雀是黃色微型月季,自由精神是粉色藤本重瓣月季,果汁陽臺是橙黃色微型月季,紅色龍沙寶石是紅色藤本月季。其中,金絲雀和果汁陽臺顏色較為接近,作為顏色的對照組。
圖2 藍色風暴
圖3 金絲雀
圖4 自由精神
圖5 果汁陽臺
圖6 紅色龍沙寶石
實驗主要用到Anaconda、Python、PyCharm 及TensorFlow等。
2.3.1 月季圖像數(shù)據(jù)庫的建立
本實驗基于上述五個品種,收集了約1 800 張圖片。在構建圖像識別系統(tǒng)時,圖像數(shù)據(jù)收集一般不是在環(huán)境中搜索對象,就是事先收集對象實例。數(shù)據(jù)集的質量很大程度上取決于收集和注釋的性能。通過搜索引擎及公共社交網(wǎng)絡中收集了這五種不同品種的月季圖像,對圖像集進行了人工篩查,刪去了不是該品種的圖像。
將圖片放在“rose/dataset/train”文件夾中,在該文件夾再新建五個文件夾分別用來放不同種類的圖片,把藍色風暴的圖片放入命名為“blue”的文件夾,把金絲雀的圖片放入命名為“canary”的文件夾,把自由精神的圖片放入命名為“free”的文件夾中,把果汁陽臺的圖片放入命名為“juice”的文件夾中,把紅色龍沙寶石的圖片放入命名為“red”的文件夾中。
安裝imgaug 庫,對分好類別的圖片數(shù)據(jù)進行數(shù)據(jù)增強,將圖片數(shù)量擴充為原來的五倍,數(shù)據(jù)集圖片數(shù)量約9 000 張。在dataset 文件目錄下新建val 文件夾,并按種類新建五個文件夾,將數(shù)據(jù)增強后的圖片打亂隨機分為訓練集和測試集放入train 和val文件夾中。
2.3.2 安裝訓練框架
本研究采用TensorFlow+GPU 的方式對月季花卉圖像進行神經(jīng)網(wǎng)絡訓練,在進行神經(jīng)網(wǎng)絡訓練之前需要安裝顯卡驅動、CUDA、配置CuDNN 以及安裝第三方庫tf-slim。
2.3.3 圖像的預處理
為了減少訓練神經(jīng)網(wǎng)絡的計算時間,提高讀取數(shù)據(jù)的效率,對數(shù)據(jù)進行預處理,利用封裝好的create_tf_record.py 模塊將圖片數(shù)據(jù)集轉換為TFRecords(二進制)格式。
在訓練中,應用諸如隨機縮放、裁剪和翻轉之類的轉換,有助于網(wǎng)絡通用化,從而獲得更好的性能。將圖像增強后得到的數(shù)據(jù)分為訓練集和驗證集。驗證集用于測試模型在未知數(shù)據(jù)上的性能。為此,其不需要任何縮放或旋轉變換,但需要調整大小,然后裁剪圖像到適當?shù)拇笮?,如GoogLeNet 要求輸入的數(shù)據(jù)是224*224,因此需要設置存儲圖片高度為224*224。
2.3.4 搭建神經(jīng)網(wǎng)絡
在上述過程的程序中,將花朵圖片處理成適合神經(jīng)網(wǎng)絡輸入的形式,并對處理后的圖片進行標簽處理,隨機拆分成訓練集和測試集。之后就到了深度學習模型搭建的過程。
本研究主要利用TensorFlow 官方的slim 庫搭建網(wǎng)絡。谷歌把一些最新的、最重要的大型網(wǎng)絡已經(jīng)實現(xiàn)好并封裝在tf-slim 里面,可直接調用。tf-slim 是TensorFlow 中定義、訓練和評估復雜模型的輕量級庫,可實現(xiàn)精細化操控,可以多GPU 并行訓練,快速產出。
在Python 里搭建GoogLeNet、Inception V3、ResNet 的網(wǎng)絡結構。定義訓練函數(shù)的參數(shù),讀取轉換過的訓練集和測試集的TFRecords 數(shù)據(jù),利用tf.contrib.slim 定義網(wǎng)絡模型,設置默認參數(shù),指定損失函數(shù)和準確率,定義優(yōu)化方案,設置迭代參數(shù)及模型保存參數(shù)(實保存val 準確率最高的模型)。搭建完成后對月季數(shù)據(jù)集進行訓練。
此外提前新建“models”文件夾,用來保存訓練模型后得到的模型。
2.3.5 測試網(wǎng)絡模型
測試分類程序=多張圖片導入+讀取圖片+調用模型+預測結果。首先對測試圖片進行預處理,進行拉伸、縮小像素、改變縱橫比、調色、加濾鏡等操作,在測試程序中導入圖片,調用訓練好的模型進行識別,最后程序輸出月季種類預測結果,如圖7 至圖11所示。通過測試未經(jīng)訓練過的新圖像,可以很好地估計模型在全新圖像上的性能。
圖7 原圖
圖8 拉伸變形
圖9 黑白濾鏡
圖10 調色
圖11 縮小像素
通過運行測試驗證新圖像和測量準確率,不同算法對比如表2 所示,GoogLeNet 測試集的TOP-1準確率為96.36%,Inception V3 的TOP-1 準確率為97.06%,ResNet50的TOP-1準確率為96.58%。
表2 不同算法對比
通過實驗結果可見,本次實驗中對于月季品種識別準確率最高的算法是Inception V3,相同的數(shù)據(jù)集生成訓練網(wǎng)絡模型最小的是GoogLeNet。ResNet50生成的網(wǎng)絡模型最大,TOP-1 準確率略低于Inception V3,但是在迭代過程中,它比其他算法更快達到了較高、較穩(wěn)定的準確率,由圖12 至圖14 所示的準確率曲線可以明顯看出此結論(橫軸為迭代次數(shù),縱軸為準確率)。
圖12 GoogLeNet訓練準確率
圖13 Inception V3訓練準確率
圖14 ResNet50訓練準確率
本研究采用三種不同的卷積神經(jīng)網(wǎng)絡算法進行訓練,模型代碼還有進一步優(yōu)化的空間,使其更加適合識別月季花卉。相對于公開數(shù)據(jù)集的圖片數(shù)量,文中提到的數(shù)據(jù)增強后的圖片數(shù)據(jù)集數(shù)量還是較少,訓練一個準確率高的模型離不開大規(guī)模的數(shù)據(jù)集。
在對新圖片進行拉伸變形、加濾鏡、調色、縮小像素等操作進行測試時,發(fā)現(xiàn)三種算法模型對加了黑白濾鏡的圖片識別準確率很低。對大批量黑白圖片進行測試,準確率最高的是調用Inception V3 的模型,為25%。月季種類很多,本研究僅選用了五個品種。有許多月季品種的顏色、形狀、花型相近,這將是識別的難點。接下來可以增加幾個月季品種以訓練測試其準確率,并可對比更多不同算法的訓練速度和準確率。
本研究基于深度學習算法,在Python 環(huán)境中使用TensorFlow 框架搭建不同的卷積神經(jīng)網(wǎng)絡算法模型,去訓練識別不同品種的月季。通過搜集網(wǎng)絡上的有效圖片,在進行數(shù)據(jù)增強后,建立了五個不同品種月季的圖片數(shù)據(jù)集,人工篩查了圖片以提高學習正確率。接著為數(shù)據(jù)集搭建三種卷積神經(jīng)網(wǎng)絡模型進行識別預測。將來可以繼續(xù)完善,比如利用Python 搭建一個對用戶友好的軟件界面,可以幫助用戶查詢具體品種的月季,也有利于收集更多的圖像豐富數(shù)據(jù)集。由于選取的品種比較少,識別的準確率高于預期,但如果是成百上千的月季品種,將無法識別過多的相似度高的月季品種,不同品種的月季有一些極為相似,在這種復雜的情況下,經(jīng)驗豐富的植物專家都很難快速準確地識別相似品種的月季。以后可以考慮從花苞形狀、開花花型、花蕊距離、顏色等更多維度提取特征來區(qū)分、識別月季種類,進行進一步研究。