趙建敏, 李 艷, 李 琦, 蘆建文,2
(1.內(nèi)蒙古科技大學(xué)信息工程學(xué)院,內(nèi)蒙古包頭 014010; 2.包鋼集團(tuán)公司信息服務(wù)中心,內(nèi)蒙古包頭 014010)
2006年多倫多大學(xué)Hinton等采用深層神經(jīng)網(wǎng)絡(luò)進(jìn)行特征降維,開啟了深度學(xué)習(xí)的時(shí)代[1-2]。近年來,基于卷積神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)已經(jīng)廣泛運(yùn)用于圖像識(shí)別領(lǐng)域,2012年,Hinton等采用深層網(wǎng)絡(luò)自動(dòng)提取特征,在Image Net圖像集分類問題上取得了很好的結(jié)果[3]。深度學(xué)習(xí)應(yīng)用于圖像識(shí)別避免了人工特征提取的算法消耗,并且深度學(xué)習(xí)對(duì)輸入樣本的平移、縮放、扭曲保持高度不變性,訓(xùn)練時(shí)共享權(quán)值,降低了訓(xùn)練時(shí)間,大大提高了準(zhǔn)確性[3-4]。
在國內(nèi)農(nóng)業(yè)圖像應(yīng)用領(lǐng)域,楊國國等基于卷積神經(jīng)網(wǎng)絡(luò)在復(fù)雜自然背景下定位和識(shí)別茶園害蟲,識(shí)別率達(dá)到90%以上,取得較好的效果[5]。譚文學(xué)等設(shè)計(jì)了多層卷積神經(jīng)網(wǎng)絡(luò),采用彈性動(dòng)量的參數(shù)學(xué)習(xí)方法,通過識(shí)別果體病理圖像,診斷常見病害,識(shí)別率高達(dá)95%以上[6]。張帥等搭建了8層卷積神經(jīng)網(wǎng)絡(luò)模型在Pl@antNet和自擴(kuò)展葉片庫上進(jìn)行訓(xùn)練和測(cè)試,簡(jiǎn)單背景下葉片識(shí)別率均達(dá)到90%以上[7]。魯恒等在無人機(jī)影像耕地信息提取中,利用深度神經(jīng)網(wǎng)絡(luò)提取耕地特征,達(dá)到較高的識(shí)別精度[8]。針對(duì)馬鈴薯早疫病識(shí)別,徐明珠等應(yīng)用高譜成像技術(shù),建立了多種特征波長(zhǎng)的BP神經(jīng)網(wǎng)絡(luò)和支持向量機(jī)模型,識(shí)別率高達(dá)98%以上,為早疫病快速識(shí)別提供理論依據(jù)[9]。
本研究首次將分層卷積神經(jīng)網(wǎng)絡(luò)技術(shù)應(yīng)用于馬鈴薯病害識(shí)別中,基于TensorFlow平臺(tái)設(shè)計(jì)了馬鈴薯病害特征提取和病害識(shí)別算法,并全棧式開發(fā)了病害識(shí)別系統(tǒng)的服務(wù)器和前端,實(shí)現(xiàn)了手機(jī)端采集、上傳病害圖片、服務(wù)器處理推送識(shí)別結(jié)果,經(jīng)測(cè)試可以滿足識(shí)別和訪問要求。
以馬鈴薯病害圖像為識(shí)別對(duì)象,所有原始數(shù)據(jù)均采集于內(nèi)蒙古中部周邊馬鈴薯種植區(qū)。共有4類病害圖像樣本 6 000 張,代表性樣本見圖1。4類病害圖像經(jīng)過預(yù)處理,得到4 000張圖像作為訓(xùn)練樣本,1 000張作驗(yàn)證樣本,1 000張作測(cè)試樣本。其中,驗(yàn)證樣本用來檢驗(yàn)神經(jīng)網(wǎng)絡(luò)中樣本是否出現(xiàn)過擬合現(xiàn)象。驗(yàn)證樣本與訓(xùn)練樣本同時(shí)作為神經(jīng)網(wǎng)絡(luò)的輸入,計(jì)算損失函數(shù)大小,但驗(yàn)證樣本損失函數(shù)大小僅用來判斷網(wǎng)絡(luò)是否過擬合,而不參與網(wǎng)絡(luò)參數(shù)調(diào)整。
為提高模型的特征學(xué)習(xí)能力和抗干擾能力,對(duì)原始圖像進(jìn)行隨機(jī)反轉(zhuǎn)、亮度和對(duì)比度調(diào)節(jié)等預(yù)處理,并將處理后的圖片作為訓(xùn)練集,訓(xùn)練模型網(wǎng)絡(luò),預(yù)處理函數(shù)如下:
tf. image. random_ flip_ left_ right ()隨機(jī)翻轉(zhuǎn)。
tf.image.random_flip_left_right(distorted_image)隨機(jī)亮度變換。
tf.Image.random_contrast (distorted_image) 隨機(jī)對(duì)比度變換。
最后對(duì)數(shù)據(jù)做白化處理,均衡均值與方差,降低圖像采樣中明暗、光照差異引起的影響。
TensorBoard是TensorFlow可視化平臺(tái),模型對(duì)輸入圖像進(jìn)行變換之后TensorBoard顯示的結(jié)果見圖2,從圖2可以看出,變換之后的圖像比原圖像更加光滑并且降低圖像明暗、光照差異引起的影響。
TensorFlow平臺(tái)輸入數(shù)據(jù)格式有圖片格式、二進(jìn)制格式、文本格式以及標(biāo)準(zhǔn)的TensorFlow格式。本研究采用的是二進(jìn)制格式的讀入。首先初始化讀入數(shù)據(jù)量、類別、標(biāo)簽字節(jié)大小、尺寸和通道數(shù),應(yīng)用tf.FixedLengthRecordReader()函數(shù)讀取固定長(zhǎng)度的樣本字節(jié)(包括label);之后用tf.decode_raw()函數(shù)進(jìn)行解析。
馬鈴薯病害圖像識(shí)別系統(tǒng)由服務(wù)器端和前端組成。服務(wù)器端在ubuntu操作系統(tǒng)上基于TensorFlow計(jì)算框架,搭建了多層卷積神經(jīng)網(wǎng)絡(luò)病害識(shí)別模型;后端搭建了Mysql病害數(shù)據(jù)庫,采用flask框架,異步讀寫數(shù)據(jù);手機(jī)端基于vue.js開發(fā)了Web app,完成圖像采集并通過rest API接口上傳到服務(wù)器,并實(shí)時(shí)獲取病害識(shí)別結(jié)果,總體結(jié)構(gòu)見圖3。
1.2.1 卷積神經(jīng)網(wǎng)絡(luò)模型設(shè)計(jì) 深度卷積神經(jīng)網(wǎng)絡(luò)模型設(shè)計(jì)包括樣本預(yù)處理、神經(jīng)網(wǎng)絡(luò)搭建、模型訓(xùn)練及模型評(píng)估。本研究初始馬鈴薯病害圖片樣本經(jīng)過預(yù)處理,整理得到6 000張病害樣本圖片,設(shè)計(jì)了8層CNN+Softmax神經(jīng)網(wǎng)絡(luò)模型,通過梯度下降法進(jìn)行訓(xùn)練,在單病斑樣本測(cè)試中得到了較好的準(zhǔn)確率。TensorFlow已經(jīng)廣泛用于圖像識(shí)別等多項(xiàng)機(jī)器深度學(xué)習(xí)領(lǐng)域,先后提出了AlexNet[10]、VGG[11]、GoogLeNet[12]、PReLU-net[13]等代表性網(wǎng)絡(luò)結(jié)構(gòu)。在TensorFlow平臺(tái)上,參照Alex Krizhevsky在CIFAR-10[10]數(shù)據(jù)集上應(yīng)用的深度卷積置信網(wǎng)絡(luò),搭建了3個(gè)卷積層、2個(gè)全連接層,網(wǎng)絡(luò)結(jié)構(gòu)見圖4。在卷積層中分為卷積、池化過程,全連接層包括ReLu(Rectified Linear Units)非線性映射和dropout 2個(gè)過程,網(wǎng)絡(luò)結(jié)構(gòu)見圖4。
1.2.2 服務(wù)器設(shè)計(jì) 馬鈴薯病害應(yīng)用系統(tǒng)分為服務(wù)器和前端2個(gè)部分,識(shí)別系統(tǒng)前端-后端結(jié)構(gòu)見圖5。服務(wù)器由服務(wù)進(jìn)程、神經(jīng)網(wǎng)絡(luò)識(shí)別進(jìn)程、數(shù)據(jù)庫和Web服務(wù)構(gòu)成,采用RESTful API接口。前端設(shè)計(jì)了基于Vue的web app,實(shí)現(xiàn)了手機(jī)端拍照上傳,服務(wù)器端識(shí)別病害、存儲(chǔ)信息并推送識(shí)別結(jié)果的功能。
本研究服務(wù)器的構(gòu)建采用Python Web框架Flask和Nginx Web服務(wù)器。Flask是一個(gè)輕量級(jí)的Python Web框架,通過uWSGI服務(wù)網(wǎng)關(guān)接口可實(shí)現(xiàn)Nginx和Flask的交互,執(zhí)行Python應(yīng)用[14]。
以上傳病害圖片和獲取識(shí)別結(jié)果為例,服務(wù)器軟件設(shè)計(jì)結(jié)構(gòu)和原理見圖6。用戶上傳病害照片時(shí),手機(jī)端通過網(wǎng)頁地址訪問服務(wù)器,采用標(biāo)準(zhǔn)RESTful接口,經(jīng)過網(wǎng)頁地址解析產(chǎn)生POST /pttdmap請(qǐng)求。本研究創(chuàng)建了Flask實(shí)例fapp,fapp通過路由router操作,fapp.route修飾器把修飾的函數(shù)注冊(cè)為路由,轉(zhuǎn)入執(zhí)行Insert2tab()業(yè)務(wù),將圖片存入病害數(shù)據(jù)庫。
用戶獲取病害識(shí)別結(jié)果時(shí),通過網(wǎng)頁地址訪問服務(wù)器,經(jīng)過解析產(chǎn)生GET /pttdisease請(qǐng)求,fapp通過路由執(zhí)行Getds()業(yè)務(wù)。本研究設(shè)計(jì)了病害識(shí)別線程,該線程無識(shí)別請(qǐng)求時(shí)掛起,線程中開啟SOCKET連接,方法如下:
pttdregsver=socket.socket(socket.AF_UNIX,socket.SOCK_STREAM)
if os.path.exists(“/usr/pttdreg.sock”):
os.unlink(“/usr/pttdreg.sock ”);
pttdregsver.bind(“/usr/pttdreg.sock ”);
pttdregsver.listen(0);
Getds()業(yè)務(wù)創(chuàng)建pttdregclient SOCKET,通過pttdregclient.connet(“/usr/pttdreg.sock”)連接pttdregsver[],client.send(pttdmap)將圖片送到模型并啟動(dòng)識(shí)別模型,完成Step1。之后Step2、Step3完成識(shí)別結(jié)果存儲(chǔ),并響應(yīng)手機(jī)的請(qǐng)求返回識(shí)別結(jié)果。
1.2.3 手機(jī)web app設(shè)計(jì) 為提高跨平臺(tái)、可移植性,本研究手機(jī)端應(yīng)用web app方式,采用MVVM框架Vue.js,它具有數(shù)據(jù)雙向綁定,異步實(shí)時(shí)更新數(shù)據(jù)的功能,運(yùn)行在移動(dòng)端,方便快捷??蛻舳俗R(shí)別系統(tǒng)主要采用的技術(shù)棧有vue.js、vue-recource、vue-router,Vue.js是輕巧的可組件化MVVM庫;vue-recource負(fù)責(zé)與服務(wù)器進(jìn)行數(shù)據(jù)交互;vue-router完成界面跳轉(zhuǎn)[15-16]。各項(xiàng)功能的代碼完成后用webpack打包部署到Nginx服務(wù)器,供移動(dòng)端訪問。
在圖4所示的模型結(jié)構(gòu)中,圖像通過輸入層、卷積層、全連接層自動(dòng)學(xué)習(xí)特征并送入softmax分類器,過程如下:
輸入層:CNNs具有對(duì)二維圖像的特征進(jìn)行自主學(xué)習(xí)的特性,故在此將原始圖像像素直接作為網(wǎng)絡(luò)輸入,輸入大小為227×227×3,其中3表示顏色通道,表示輸入為RGB圖像。
卷積層C1(conv1),由48個(gè)11×11卷積核,步長(zhǎng)為4,采用ReLu非線性映射激勵(lì),產(chǎn)生55×55×48個(gè)特征映射,之后輸入池化層S2(pool1),經(jīng)過3×3過濾器、步長(zhǎng)為2的max pooling重疊池化,學(xué)習(xí)到27×27×48個(gè)特征。關(guān)鍵代碼如下所示:
with tf.variable_scope(‘conv1’) as scope:
kernel=_variable_with_weight_decay(‘weights’,shape=[11,11,4,48],stddev=1e-4,wd=0.0)
對(duì)于Δt的兩個(gè)解,根據(jù)實(shí)際抓取情況進(jìn)行取舍,然后確定抓取位置和抓取路徑。如果兩個(gè)解全部符合要求,那么選擇時(shí)間比較短的解;如果兩個(gè)解全部不符合要求,那么將放棄對(duì)此工件的抓取同時(shí)做好漏抓記錄。
conv=tf.nn.conv2d(images,kernel,[1,1,1,1],padding=‘SAME’)
biases=_variable_on_gpu(‘biases’,[48],tf.constant_initializer(0.0))
bias=tf.nn.bias_add(conv,biases)
conv1=tf.nn.relu(bias,name=scope.name)
_activation_summary(conv1)
pool1=tf.nn.max_pool(conv1,ksize=[1,3,3,1],strides=[1,2,2,1],padding=‘SAME’,name=‘pool1’)
卷積層C3過濾器大小為5×5,深度為128,移動(dòng)步長(zhǎng)為1,C3特征映射大小為27×27×128,激勵(lì)函數(shù)采用Relu。池化層S4仍然采用3×3濾波器、步長(zhǎng)為2,max pooling重疊池化,輸出特征個(gè)數(shù)為13×13×128。卷積層C5過濾器大小為3×3,深度為192,移動(dòng)步長(zhǎng)為1,本層輸出矩陣大小為13×13×192。池化層S6采用3×3濾波器、步長(zhǎng)為2重疊池化,輸出特征矩陣為6×6×192。
卷積核、池化核、步長(zhǎng)大小的選取,整體的預(yù)測(cè)模型參數(shù)(包括學(xué)習(xí)率、學(xué)習(xí)策略)均是通過試驗(yàn)得到最佳。卷積核尺寸根據(jù)圖像明顯特征所占像素大小確定,奇數(shù)尺寸的濾波器能獲取到更好的中心,故特征卷積核設(shè)為奇數(shù)。重疊池化能夠在一定程度上防止過擬合[12]降低識(shí)別錯(cuò)誤率,故采用重疊池化。全連接層采用的ReLu激活函數(shù),其優(yōu)點(diǎn)為梯度不飽和、計(jì)算速度快;梯度計(jì)算公式為(1),在反向傳播過程中減輕了梯度彌散問題,神經(jīng)網(wǎng)絡(luò)前幾層的參數(shù)也可以很快地更新。正向傳播過程中ReLu函數(shù)僅須要設(shè)置閾值,加快了正向傳播的計(jì)算速度,可以極大地加快收斂速度,dropout的設(shè)置是為了防止過擬合。
本研究采用多項(xiàng)式邏輯回歸(也稱為Softmax回歸)方法進(jìn)行分類,Softmax回歸在網(wǎng)絡(luò)的輸出層上計(jì)算歸一化的預(yù)測(cè)值和標(biāo)簽的交叉熵,模型的目標(biāo)函數(shù)是求交叉熵?fù)p失和所有權(quán)重衰減項(xiàng)的和。使用cross_entropy計(jì)算交叉熵,然后計(jì)算一個(gè)batch運(yùn)算后的平均值,tf.add_to_ collection計(jì)算總損失。本研究模型使用標(biāo)準(zhǔn)的梯度下降算法來訓(xùn)練模型。
梯度下降法的迭代公式為
(1)
模型評(píng)估使用測(cè)試集樣本來評(píng)估訓(xùn)練模型的預(yù)測(cè)性能。為了得到可靠穩(wěn)定的模型及對(duì)模型性能進(jìn)行無偏估計(jì),使用交叉驗(yàn)證的方法,也就是對(duì)分類器進(jìn)行訓(xùn)練后利用測(cè)試集來測(cè)試訓(xùn)練得到的模型,以此來作為評(píng)價(jià)分類器的性能指標(biāo)。
本研究搭建的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)速率設(shè)置為0.01。訓(xùn)練過程中得到的損失函數(shù)隨迭代次數(shù)變而變化的曲線、正確率隨著迭代次數(shù)變而變化的曲線見圖7、圖8。
從圖7可以看出,隨著迭代次數(shù)增加,損失函數(shù)值越來越小,幾乎接近于0,說明函數(shù)擬合越來越好。訓(xùn)練樣本識(shí)別精度到93%時(shí)基本收斂。訓(xùn)練在服務(wù)器上進(jìn)行,CPU采用Intel i7 4核、單GPU GTX980、4 G顯存,訓(xùn)練用時(shí)不到1 h。用測(cè)試集樣本測(cè)試訓(xùn)練好的模型,測(cè)試集樣本1 000個(gè),測(cè)試時(shí)間為1.97 s,簡(jiǎn)單背景、單病斑圖像測(cè)試準(zhǔn)確率達(dá)到86%,其與迭代次數(shù)關(guān)系見圖8。
從表1可以看出,炭疽病和早疫病相互誤判率較高,灰霉病和晚疫病相互誤判率次之,炭疽病被誤判成早疫病的比率也較高,表明本研究模型針對(duì)上述病斑的特征提取效果有待進(jìn)一步提高。筆者所在課題組嘗試增加CNN層數(shù),由于樣本數(shù)量受限,當(dāng)增加到6層CNN時(shí)出現(xiàn)過擬合現(xiàn)象。通過對(duì)比,在當(dāng)前條件下設(shè)置3個(gè)卷積層的網(wǎng)絡(luò)取得的識(shí)別效果相對(duì)較好。
表1 病害分類測(cè)試準(zhǔn)確率統(tǒng)計(jì)
手機(jī)端app應(yīng)用界面見圖9。身份驗(yàn)證觸發(fā)POST請(qǐng)求,從后臺(tái)獲取token,通過驗(yàn)證后進(jìn)入系統(tǒng)。病害識(shí)別界面有拍攝病害圖像、上傳圖片功能,執(zhí)行POST函數(shù)將手機(jī)病害圖像上傳到后臺(tái)服務(wù)器,點(diǎn)擊獲取通過get請(qǐng)求將獲取識(shí)別結(jié)果顯示在客戶端。
本研究設(shè)計(jì)了8層CNN+softmax分層卷積神經(jīng)網(wǎng)絡(luò)模型,對(duì)于簡(jiǎn)單背景單一病斑識(shí)別率達(dá)到86%。但是,由于病害圖像的特殊性,局部和全局取樣對(duì)識(shí)別效果影響很大,以191農(nóng)資人上傳的呼倫貝爾某地區(qū)馬鈴薯葉片病害圖為例,系統(tǒng)識(shí)別為炭疽??;若采用局部取樣,將病斑單獨(dú)取樣,系統(tǒng)識(shí)別為早疫病,差異很大(圖10)。
針對(duì)這一問題可采用CNN物體檢測(cè)方法,Gishick等在基于神經(jīng)網(wǎng)絡(luò)的物體檢測(cè)領(lǐng)域進(jìn)行了深入研究[17],筆者所在課題組正在嘗試采用R-CNN[17]算法和Fast R-CNN[18],即Regions with Convolution Neural Network Features和快速R-CNN算法予以改進(jìn)。
此外,馬鈴薯病害種類多、分布分散,葉片、莖、塊莖等部位均有病害癥狀,病害除本研究列出的早疫病、晚疫病、灰霉病、炭疽病,還包括小葉病、青枯病、葉斑病、病毒,塊莖部位癌腫、根腐、黑痣、瘡痂病等,筆者所在課題組正在不斷搜集整理病害圖片樣本,制作樣本庫,為模型設(shè)計(jì)提供數(shù)據(jù)支撐。
本研究搭建的Nginx Web服務(wù)器,應(yīng)用flask框架開發(fā)后臺(tái)服務(wù),基于Vue.js開發(fā)手機(jī)端APP,實(shí)現(xiàn)采集、上傳、識(shí)別功能,滿足了系統(tǒng)要求,為相關(guān)應(yīng)用提供了完整全棧式解決方案。