余小東 楊孟輯 張海清 李 丹 唐毅謙 于 曦
(1.成都大學(xué)計(jì)算機(jī)學(xué)院, 成都 610106; 2.成都大學(xué)模式識(shí)別與智能信息處理四川省高校重點(diǎn)實(shí)驗(yàn)室, 成都 610106;3.成都信息工程大學(xué)軟件工程學(xué)院, 成都 610225)
農(nóng)作物病蟲(chóng)害是農(nóng)業(yè)領(lǐng)域面臨的主要挑戰(zhàn)之一,災(zāi)難性的作物病害加劇了糧食供應(yīng)的短缺[1-2]。根據(jù)相關(guān)統(tǒng)計(jì)和分析,2006—2015年,全國(guó)農(nóng)作物病蟲(chóng)害的受災(zāi)面積為4.63億hm2到5.075億hm2。根據(jù)全國(guó)農(nóng)業(yè)技術(shù)推廣服務(wù)中心的預(yù)測(cè),2020年我國(guó)農(nóng)作物病蟲(chóng)害的受災(zāi)面積將累計(jì)達(dá)到3億hm2,這將造成巨大的糧食與經(jīng)濟(jì)損失[3]。因此,快速有效地檢測(cè)農(nóng)作物病蟲(chóng)害是采取相關(guān)防治措施及時(shí)止損的第一步。
農(nóng)作物病蟲(chóng)害的鑒別方式與途徑有多種,以前多依靠農(nóng)業(yè)專家或當(dāng)?shù)刂脖2块T(mén)。近年來(lái)隨著作物病蟲(chóng)害專家知識(shí)庫(kù)的不斷完善,建立了各種農(nóng)業(yè)相關(guān)網(wǎng)站,通過(guò)專家系統(tǒng)或自行檢索能夠得到一些防治建議。但這些方式具有一定的局限性:其一,農(nóng)作物的病蟲(chóng)害種類繁多,如馬鈴薯的相關(guān)病害就超過(guò)100多種[4],而農(nóng)業(yè)專家是有限的,有時(shí)很難找到相關(guān)病害領(lǐng)域的專家;其二,植保部門(mén)的人員有限,一些地區(qū)距離較遠(yuǎn)、交通不便,無(wú)法及時(shí)到現(xiàn)場(chǎng)對(duì)農(nóng)作物病蟲(chóng)害進(jìn)行鑒別。這些因素都容易導(dǎo)致病情延誤,無(wú)法及時(shí)得到有效的防治建議。
隨著移動(dòng)網(wǎng)絡(luò)、智能手機(jī)以及計(jì)算機(jī)技術(shù)的飛速發(fā)展,研究者選擇計(jì)算機(jī)視覺(jué)技術(shù)[5]作為開(kāi)發(fā)移動(dòng)應(yīng)用的基礎(chǔ)來(lái)檢測(cè)農(nóng)作物病蟲(chóng)害。在計(jì)算機(jī)視覺(jué)領(lǐng)域,圖像識(shí)別[6]是典型的應(yīng)用之一,而卷積神經(jīng)網(wǎng)絡(luò)[7](Convolutional neural network, CNN)可以以像素級(jí)提取圖像的特征,使CNN在圖像識(shí)別領(lǐng)域有足夠好的表現(xiàn),并深受開(kāi)發(fā)者青睞。
文獻(xiàn)[8]利用數(shù)字圖像處理技術(shù),通過(guò)對(duì)彩色圖像的分析識(shí)別香蕉葉斑病的癥狀,圖像識(shí)別的平均正確率最高為94.5%,最低為13.2%。文獻(xiàn)[9]利用支持向量機(jī)(Support vector machine, SVM)對(duì)甜菜葉片進(jìn)行檢測(cè)與分類,對(duì)健康、患病葉片的鑒別準(zhǔn)確率可達(dá)97%,但是根據(jù)疾病類型和患病程度進(jìn)行分類,準(zhǔn)確率在65%到90%之間。文獻(xiàn)[10]使用Inception v3網(wǎng)絡(luò)對(duì)木薯5種病害進(jìn)行識(shí)別,總體準(zhǔn)確率可達(dá)93%。文獻(xiàn)[11-12]利用深度學(xué)習(xí)檢測(cè)不同作物的多種病蟲(chóng)害,在識(shí)別作物-疾病組合方面均能夠達(dá)到99%的準(zhǔn)確率。傳統(tǒng)的數(shù)字圖像處理方法應(yīng)用廣泛、處理精度高、靈活性強(qiáng),但處理后的圖像需要在專業(yè)人員的指導(dǎo)下進(jìn)行觀察與評(píng)估。機(jī)器學(xué)習(xí)方法所訓(xùn)練出的模型雖然能夠自動(dòng)識(shí)別作物病害,但是在模型訓(xùn)練之前,需要經(jīng)歷復(fù)雜的特征工程,同時(shí)需要專業(yè)人員的指導(dǎo)。深度學(xué)習(xí)方法可以將上述問(wèn)題的工作量最小化,只需要專業(yè)人員對(duì)原始圖像是否存在病變進(jìn)行標(biāo)注即可。基于這些簡(jiǎn)單的標(biāo)簽可以使流程實(shí)現(xiàn)從訓(xùn)練到識(shí)別的全自動(dòng)化。一些研究注重實(shí)際的應(yīng)用開(kāi)發(fā),如文獻(xiàn)[13]采用標(biāo)準(zhǔn)區(qū)域圖技術(shù)開(kāi)發(fā)了一款iOS應(yīng)用,以評(píng)估病害的嚴(yán)重程度,但是該應(yīng)用僅適用于甜菜病害嚴(yán)重程度的分類,并且需要用戶從預(yù)先設(shè)置的列表中選擇病害類別和計(jì)算標(biāo)準(zhǔn)。文獻(xiàn)[14]利用兩種不同類型的權(quán)重對(duì)每種病害進(jìn)行加權(quán),建立了病害模型,但是并未對(duì)病害的嚴(yán)重程度進(jìn)行劃分。文獻(xiàn)[15]通過(guò)計(jì)算病害區(qū)域的面積來(lái)評(píng)估病害嚴(yán)重程度,APP的操作需要用戶具有一定的專業(yè)知識(shí)。
通過(guò)對(duì)以上研究方法與移動(dòng)應(yīng)用的總結(jié),本文提出一種基于殘差網(wǎng)絡(luò)[16](ResNet 50)的CDCNNv2算法,并結(jié)合深度遷移學(xué)習(xí)[17]開(kāi)發(fā)農(nóng)作物病蟲(chóng)害嚴(yán)重程度等級(jí)劃分系統(tǒng)(物種-病害種類-嚴(yán)重程度),以實(shí)現(xiàn)農(nóng)作物病蟲(chóng)害的實(shí)時(shí)、全自動(dòng)檢測(cè)。
本試驗(yàn)采用由“AI Challenger 2018”提供的農(nóng)作物病蟲(chóng)害公開(kāi)數(shù)據(jù)集,共包含36 261幅標(biāo)注圖像,其中訓(xùn)練集有31 721幅圖像,驗(yàn)證集包含4 540幅圖像。整個(gè)數(shù)據(jù)集共有10個(gè)物種(蘋(píng)果、桃子、草莓、玉米、辣椒、番茄、橘子、葡萄、櫻桃、馬鈴薯)、27種病害。按照物種-病蟲(chóng)害種類-嚴(yán)重程度劃分,共有61類,以番茄葉片為例,如圖1所示。
圖1 番茄葉片展示Fig.1 Example for tomato leaves
病蟲(chóng)害的識(shí)別與拍攝環(huán)境有很大關(guān)系,例如光照、角度等。圖像品質(zhì)影響識(shí)別精度,為了使模型具有更強(qiáng)的泛化能力,采用數(shù)據(jù)增強(qiáng)技術(shù)[18],對(duì)現(xiàn)有圖像進(jìn)行隨機(jī)光亮度增減、隨機(jī)旋轉(zhuǎn)與鏡面翻轉(zhuǎn)等操作。
當(dāng)隨機(jī)增減光亮度時(shí),遵循公式
φ=γα+β(α∈(0.9,1.1),β∈(-10,10))
式中φ——處理后的圖像
γ——原始圖像
α——對(duì)比度β——光亮度
當(dāng)圖像進(jìn)行了隨機(jī)光亮度增減之后,將圖像歸一化到-1~1之間,隨后設(shè)置中心點(diǎn)隨機(jī)旋轉(zhuǎn)一定角度,再進(jìn)行鏡面翻轉(zhuǎn),最后將圖像統(tǒng)一到229像素×229像素。數(shù)據(jù)增強(qiáng)的結(jié)果如圖2所示。
圖2 數(shù)據(jù)增強(qiáng)結(jié)果Fig.2 Results of data augmentation
CDCNNv2模型是基于殘差網(wǎng)絡(luò)ResNet 50改進(jìn)而來(lái),按照深度學(xué)習(xí)的效果而言,識(shí)別性能會(huì)隨著網(wǎng)絡(luò)層數(shù)的加深而提高,但識(shí)別性能會(huì)在網(wǎng)絡(luò)加深到某一個(gè)層數(shù)的時(shí)候達(dá)到飽和,此時(shí)繼續(xù)加深網(wǎng)絡(luò)層數(shù),只會(huì)使得該網(wǎng)絡(luò)在訓(xùn)練集上的表現(xiàn)有所減弱,稱此現(xiàn)象為網(wǎng)絡(luò)退化。而ResNet 50網(wǎng)絡(luò)在訓(xùn)練時(shí)并非如此,其核心殘差模塊在網(wǎng)絡(luò)達(dá)到最優(yōu)時(shí),可以通過(guò)恒等映射向后傳輸信息,理論上網(wǎng)絡(luò)將會(huì)一直處于最優(yōu)狀態(tài),ResNet 50的具體結(jié)構(gòu)與原理可參照文獻(xiàn)[16]。
為了使模型加速收斂并具有更強(qiáng)的泛化能力,選擇使用遷移學(xué)習(xí)技術(shù)。選擇合適的預(yù)訓(xùn)練模型是遷移學(xué)習(xí)成功的關(guān)鍵,最重要的一點(diǎn)就是預(yù)訓(xùn)練模型的數(shù)據(jù)集與本試驗(yàn)的數(shù)據(jù)集有一定的關(guān)聯(lián)與相似性。例如,預(yù)訓(xùn)練模型的任務(wù)是蘋(píng)果分類,它可能對(duì)本試驗(yàn)的橘子分類有幫助。
在本試驗(yàn)中,使用在ImageNet[19]上預(yù)訓(xùn)練的ResNet 50模型的權(quán)重文件。ImageNet是一個(gè)龐大的自然圖像數(shù)據(jù)庫(kù),有超過(guò)1 500萬(wàn)幅圖像與2萬(wàn)多個(gè)類別。遷移其權(quán)重將會(huì)對(duì)本試驗(yàn)的模型訓(xùn)練有極大幫助,使用原始的ResNet 50網(wǎng)絡(luò)并沒(méi)有達(dá)到預(yù)期效果,所以本試驗(yàn)保留ResNet 50的卷積部分,改變其中多層以滿足并提高識(shí)別的精確度。
在模型改進(jìn)中,使用Fine-tuning策略,其主要思想是調(diào)整預(yù)訓(xùn)練模型的其中一層或多層以達(dá)到適應(yīng)目標(biāo)任務(wù)的目的。本試驗(yàn)保留ResNet 50模型的卷積層權(quán)重,是因?yàn)榫矸e層提取的是圖像的通用特征(Generic features),這些特征對(duì)本試驗(yàn)的任務(wù)有極大幫助,其他層的具體改動(dòng)步驟如下:
(1)在圖像輸入模型之前,在圖像四周以2×2的形式填充“0”值,以便更好地提取圖像邊緣信息,控制特征圖尺寸。
(2)將預(yù)訓(xùn)練模型的卷積層權(quán)重遷移到CDCNNv2模型的卷積層,讓權(quán)重隨著訓(xùn)練同步更新。
(3)在卷積層之后添加1個(gè)平均池化層,池化窗口為2×2,計(jì)算圖像特征矩陣2×2區(qū)域的平均值,有利于保存圖像更多的細(xì)節(jié)信息。
(4)隨后使用Flatten函數(shù)將多維矩陣的輸入轉(zhuǎn)換為一維矩陣,以加速計(jì)算。
(5)Flatten層之后,存在2個(gè)全連接層,之間有1個(gè)Batch Normalization函數(shù),能夠加快訓(xùn)練同時(shí)提高精度。第1個(gè)全連接層輸出維度為1 024,采用ReLU作為激活函數(shù)。為了能夠適應(yīng)本項(xiàng)目需求,最后1個(gè)全連接層輸出維度為61,使用Softmax作為激活函數(shù)。
簡(jiǎn)明的網(wǎng)絡(luò)結(jié)構(gòu)圖以及與ResNet 50基礎(chǔ)模型的對(duì)比,如圖3所示。
圖3 CDCNNv2網(wǎng)絡(luò)框架圖Fig.3 Concise model structure of CDCNNv2
試驗(yàn)平臺(tái)使用的服務(wù)器操作系統(tǒng)為CentOS 7,處理器為Intel Xeon E5-2650 v4 2.20 GHz,運(yùn)行內(nèi)存192 GB,配備N(xiāo)VIDIA Tesla P100 GPU。使用Python 3.6.5與Keras(2.2.4)人工神經(jīng)網(wǎng)絡(luò)庫(kù),圖像預(yù)處理采用OpenCV 4.1.0 視覺(jué)庫(kù)。同時(shí)使用CUDA 10.1與cuDNN 10.1深度神經(jīng)網(wǎng)絡(luò)加速庫(kù)。
每次訓(xùn)練選取的樣本數(shù)量為64,共495次,進(jìn)行80次迭代,使用Adam優(yōu)化器,初始學(xué)習(xí)率為0.001,動(dòng)量因子為0.1,當(dāng)2個(gè)epoch過(guò)后,模型性能沒(méi)有提升,之后學(xué)習(xí)率將降低,最低的學(xué)習(xí)率為0.000 000 1。
為了驗(yàn)證CDCNNv2模型的有效性,在相同參數(shù)設(shè)置下將本模型與同樣采用遷移學(xué)習(xí)技術(shù)的ResNet 50、Xception[20]、VGG16[21]、VGG19[22]、DenseNet 121[23]原始模型進(jìn)行比較,試驗(yàn)結(jié)果見(jiàn)表1。
表1 對(duì)比試驗(yàn)結(jié)果Tab.1 Results of comparative experiments
從表1中可以看出,在相同的試驗(yàn)條件下,盡管CDCNNv2模型收斂時(shí)間不是最優(yōu),但是在可接受的范圍內(nèi);CDCNNv2模型的平均精度為91.51%,比ResNet 50模型的平均精度高3.99個(gè)百分點(diǎn),相較于其他模型也有2.78~10.93個(gè)百分點(diǎn)的提升。
同樣,從圖4中可以證明,CDCNNv2模型在大約第25次迭代就已經(jīng)收斂,在所有模型中收斂速度處于前列,僅低于Xception模型。
圖4 各模型精度收斂曲線Fig.4 Accuracy convergence curves of each model
從圖5中可以看出,CDCNNv2模型的損失值在第25次迭代達(dá)到了穩(wěn)定點(diǎn),下降到了0.20左右,為最低。從損失值的收斂情況來(lái)看,CDCNNv2模型的訓(xùn)練效果理想。
圖5 各模型損失值比較曲線Fig.5 Comparison curves of each model loss value
綜合以上結(jié)果可看出,CDCNNv2模型能夠很好地完成農(nóng)作物病蟲(chóng)害等級(jí)分類的任務(wù),具有魯棒性與高精度,這使得此模型在農(nóng)作物病蟲(chóng)害領(lǐng)域能夠成為一個(gè)非常有用的咨詢與預(yù)警工具。
本文模型的部署用到了2個(gè)重要的工具:TensorFlow Serving[24]和Docker容器[25]。TensorFlow Serving是一種高性能、靈活的機(jī)器學(xué)習(xí)服務(wù)系統(tǒng),用于部署機(jī)器學(xué)習(xí)或者深度學(xué)習(xí)模型,可以同時(shí)服務(wù)于多個(gè)模型,或者同一模型的不同版本,并且公開(kāi)gRPC和HTTP 接口 API。Docker容器的使用能夠避免與繁瑣的環(huán)境配置打交道,可以將多種服務(wù)以鏡像的形式掛載其中,本項(xiàng)目將TensorFlow Serving 掛載于Docker中,方便了模型部署。如果需要用到TensorFlow Serving掛載模型,Docker是與之配合使用的最佳選擇之一。
模型部署的環(huán)境包含操作系統(tǒng)Ubuntu 18、Docker 18、TensorFlow Serving。模型與它們之間的簡(jiǎn)略包含關(guān)系如圖6所示,Docker容器運(yùn)行在Ubuntu操作系統(tǒng)中,TensorFlow Serving以鏡像的形式掛載于Docker容器內(nèi),模型則掛載于TensorFlow Serving中。
圖6 部署工具之間的關(guān)系簡(jiǎn)圖Fig.6 Diagram of relationship between deployment tools
模型的具體部署過(guò)程較為繁雜,受限于篇幅,本文只指出部署順序并給出部分重要代碼。
首先指定服務(wù)的版本號(hào)與模型的保存位置,再定義模型的輸入與輸出格式,核心代碼如下
model_filePath = ′./my_model_resnet_v2.h5'
model = load_model(model_filePath)
export_path_base = "serving"
export_version = ′2′;
export_path=os.path.join(export_path_base,export_version)
builder=tf.compat.v1.saved_model.builder.SavedMdelBuilder(export_path)
tensor_info_input=tf.compat.v1.saved_model.utils.build_tensor_info(model.input)
tensor_info_output=tf.compat.v1.saved_model.utils.build_tensor_info(model.output)
隨后,將輸入與輸出封裝,以方便地從客戶端接收相應(yīng)格式的參數(shù),簡(jiǎn)略代碼如下
prediction_signature=
(
tf.compat.v1.saved_model.signature_def_utils.build_signature_def
(inputs={′images′:tensor_info_inpu},
outputs{′result′:tensor_info_output},
method_name=tf.saved_model.PREDICT_METHOD_NAME)
)
builder.add_meta_graph_and_variables
(K.get_session(),
[tf.saved_model.SERVING],
signature_def_map={′predict_images′:prediction_signature,})
builder.save()
下一步啟動(dòng)在線服務(wù),在這一步中使用Docker容器,具體操作步驟如下
Docker run -p port1 -p port2
-mount type = blind, source = THE SOURCE TO MOUNT, target = THE DESTINATION TO MOUNT
-t tensorflow/serving
--model_config_file=/model/models.config
‘port 1’為主機(jī)端口,可以根據(jù)需要修改,而‘port 2’為固定端口,不能修改。使用配置文件并通過(guò)Docker掛載可以實(shí)現(xiàn)多個(gè)模型的部署,只需要在配置文件中表明各個(gè)模型的路徑與名稱。
Android端的數(shù)據(jù)收發(fā)并不復(fù)雜,由以下幾個(gè)步驟組成:
(1)將接收到的圖像進(jìn)行64位編碼。
(2)創(chuàng)建一個(gè)新的Request Body實(shí)例,包含信息格式、編碼類型與字符編碼。
(3)請(qǐng)求服務(wù)器連接,使用.URL獲取服務(wù)器IP地址,.post將封裝信息發(fā)送給服務(wù)器。
(4)在定義接收的數(shù)據(jù)格式之后,通過(guò)Response實(shí)例接收數(shù)據(jù)信息。
具體流程如圖7所示。
圖7 APP調(diào)用服務(wù)器簡(jiǎn)明流程Fig.7 Simplify process of APP calling server
在4.3節(jié)中,模型的部署與調(diào)用已經(jīng)實(shí)現(xiàn),圍繞于此設(shè)計(jì)了如圖8所示的配套功能。
圖8 APP功能示意圖Fig.8 Application function diagram
各功能模塊如下:
(1)用戶管理:允許用戶權(quán)限內(nèi)的操作,如改變昵稱、密碼、郵箱、電話等。
(2)檢測(cè):允許用戶拍照、上傳和裁剪圖像,在幾秒內(nèi)獲取診斷結(jié)果,并獲得防治建議與藥物推薦。
(3)百科全書(shū):允許用戶搜索查詢農(nóng)作物相關(guān)信息。
(4)社區(qū):允許用戶在社區(qū)中交流農(nóng)作物相關(guān)信息,同時(shí)開(kāi)發(fā)專家系統(tǒng),以便向?qū)<覍で髱椭?/p>
(5)商城:后期將為第三方賣(mài)家提供平臺(tái)售賣(mài)農(nóng)作物相關(guān)產(chǎn)品,檢測(cè)模塊中的藥物推薦可以跳轉(zhuǎn)到相關(guān)商家的銷(xiāo)售頁(yè)面。
檢測(cè)模塊是該APP的核心功能,使用蘋(píng)果-黑星病-嚴(yán)重的圖像進(jìn)行測(cè)試,具體結(jié)果如圖9所示。從圖9中可以看到,返回的結(jié)果包含了病蟲(chóng)害的嚴(yán)重程度,病蟲(chóng)害的描述,檢測(cè)的可靠性,防治建議與推薦的藥物等。
圖9 檢測(cè)功能界面Fig.9 Interface of detection results
為了驗(yàn)證APP的識(shí)別準(zhǔn)確性,共進(jìn)行了200次驗(yàn)證測(cè)試,每驗(yàn)證一次將結(jié)果記錄在日志文件中,如圖10所示??梢钥闯雒看螠y(cè)試的結(jié)果獲取時(shí)間都在0.5 s以內(nèi)。隨后表2中列出了測(cè)試的具體結(jié)果(蘋(píng)果黑星病包含了一般與嚴(yán)重兩種程度,其他病害類似)。從表2中可以看出,本文APP具有一定的魯棒性和實(shí)用性。
(1)針對(duì)農(nóng)作物病蟲(chóng)害嚴(yán)重程度分類模型分類精度不夠高的問(wèn)題,結(jié)合深度遷移學(xué)習(xí)提出了一種改進(jìn)型ResNet 50模型——CDCNNv2,在精度上較ResNet 50原始模型提升了3.99個(gè)百分點(diǎn)。
(2)在同樣的試驗(yàn)條件下,與Xception、VGG16、VGG19、DenseNet 121原始模型進(jìn)行了對(duì)比試驗(yàn),本文提出的CDCNNv2模型的精度提高了2.78~10.93個(gè)百分點(diǎn),同時(shí)其損失值最低。因此,該模型具有更好的魯棒性與可靠性,其綜合性能更優(yōu)。
(3)基于CDCNNv2模型開(kāi)發(fā)了一款實(shí)時(shí)在線農(nóng)作物病蟲(chóng)害等級(jí)識(shí)別APP,該APP除了提供識(shí)別結(jié)果外,還實(shí)現(xiàn)了防治建議、藥物推薦等一系列配套功能。經(jīng)過(guò)200次的實(shí)際測(cè)試,每次測(cè)試結(jié)果返回耗時(shí)在0.5 s以內(nèi),測(cè)試最終結(jié)果表明APP具有魯棒性與實(shí)用性,可以為農(nóng)業(yè)病蟲(chóng)害檢測(cè)提供思路與方案。