姚 強,付忠軍,李君保,呂 斌,粟 超,郭彩霞
(1.重慶市農業科學院,重慶 401239;2.酉陽縣農業技術推廣站,重慶酉陽 409800;3.重慶市農業學校,重慶 401239)
玉米具有豐富的營養價值,作為重要的糧食作物在我國被廣泛種植,其產量約占我國糧食總產量的1/4。病蟲害的發生會直接影響玉米產量,如果不能及早識別并進行防治,會造成大幅減產。在種植過程中,病蟲害的發現、診斷與防治是玉米生產中的重要環節。如何及時準確地診斷出病蟲害信息,并給出合理有效的防治措施,已成為一個重要研究方向。隨著信息技術、AI、物聯網、大數據、移動互聯網等的高速發展,越來越多的技術和產品被應用于玉米生長過程監測、病蟲害識別診斷。隨著智能手機已在國內廣泛普及使用,且性能越來越好,其自身攜帶的攝像頭為隨時拍攝圖像和視頻提供了極大的便捷。本研究基于深度學習的方法開展玉米病蟲害識別診斷模型設計與訓練,開發了基于Android 系統的玉米病蟲害智能診斷系統手機APP。
近十年,國內外農業領域越來越多地應用了圖像識別、機器視覺、深度學習等技術。深度學習以其自動提取特征、學習能力強、覆蓋范圍廣、適應性好、可移植性好等特點,越來越受到重視。在玉米病蟲害識別應用上,國內外開展了大量基于深度學習的探索和研究。例如,樊湘鵬等為解決田間環境復雜背景下病害識別困難、識別模型應用率低的問題,提出了一種基于改進卷積神經網絡的玉米病害識別方法,對田間復雜背景下的9 種玉米病害進行識別[1]。許景輝等在Image Net 數據集上對玉米病害(大斑病、銹病)使用VGG16 預訓練模型進行病害識別,提升了模型識別精度和訓練效率[2]。劉翱宇等針對玉米葉病害識別的問題,引入焦點損失函數(Focal Loss)專注于難分類的病害樣本,提出了一種深度殘差網絡TFL-Res Net,在Res Net50 網絡的基礎上利用遷移學習,對玉米4 種病害進行識別,新網絡收斂更快,效果更好[3]。王國偉等采用LeNet 模型,對玉米花葉病、灰斑病、銹病、葉斑病進行識別試驗[4]。朱家輝等對Al Challenger 比賽的農作物葉片病害數據集圖像預處理后,使用VGG16 和Res Net50 對玉米等農作物病害圖像進行分類識別[5]。Xu 等人為了提高玉米病害識別的準確性,避免參數過多導致的過擬合問題,用全局匯集層替換全連通層,提出了一種多尺度卷積全局池化的神經網絡[6]。Chen 等基于DenseNet,保留過渡層結構,使用深度可分離卷積替換傳統卷積層,并嵌入注意力模塊,提出一種基于注意力嵌入的輕量級新型玉米病害識別網絡[7]。陳桂芬等使用CNN 模型基于遷移學習方法對玉米5 種常見病害(3 種斑點病害及黑穗病、瘤黑粉病)進行識別[8]。李恩霖等使用PlantVillage 公開數據集作為病害樣本,分別基于VGG16、Inception V3、ResNet50、ResNet101、DenseNet121 等5 種深度卷積神經網絡建立病害識別模型,對銹病、葉枯病、灰斑病3 種典型玉米病害開展分類識別研究[9]。
模型設計主要包括:病蟲害種類的選取、深度學習網絡的選擇等。
2.1.1 病蟲害種類選取
模型選取10種發生在玉米植株地上部位的常見病蟲害,包括大斑病、小斑病、紋枯病、莖腐病、南方銹病、玉米螟、玉米黏蟲、玉米棉鈴蟲、玉米蚜蟲、玉米葉螨。
2.1.2 深度學習網絡選擇
深度學習網絡有很多種類,卷積神經網絡(CNN)主要用在計算機視覺(CV)中,在圖像處理方面表現十分出色,當前開展的基于深度學習的農作物病蟲害診斷識別大多采用CNN網絡。
模型采用自定義CNN 網絡和DenseNet201 網絡分別開展訓練。自定義CNN 的網絡結構如圖1 所示。DenseNet201的網絡結構如圖2所示。

圖2 DenseNet201網絡結構圖
CNN 的基本結構由輸入層(Input layer)、卷積層(Convolutional layer)、池化層(Pooling layer)、全連接層(Fully connected layer)及輸出層(Output layer)構成。卷積層提取圖像特征,池化層對特征抽樣,全連接層將提取的特征連接起來,分類器輸出結果。本研究使用的CNN 網絡有10 個輸入層神經元(對應10個玉米病蟲害分類),神經元的激活函數用Relu,輸入圖像大小為228×228 像素,圖像格式RGB,1 個卷積層和1個池化層構成1組,共設置了3組,分類輸出層使用Softmax 分類器,輸出結構是1 個長度為10 的一維數組。
DenseNet201是DenseNet網絡(Dense Convolutional Network,密集卷積網絡)系列中的一種,也是一種深度卷積神經網絡,在圖像分類時性能更好。DenseNet網絡的核心結構主要由兩個模塊組成,一個是Dense Block,一個是Transition。Dense Block 主要完成密集連接,Transition 是不同Dense Block 之間的過渡。DenseNet201網絡構建過程如下:首先構造1個卷積核為7×7、步長為2的卷積層,然后構造1個大小為3×3、步長為2 的max pool 層,再構造第1 個DenseBlock,DenseBlock 的基本單元是BN-ReLU-Conv(1x1)-BNReLU-Conv(3×3),其中的Conv(1×1)用來降維、減少計算和參數,第一個DenseBlock 包含6 個基本單元,在DenseBlock 后構造1 個Transition,Transition 的基本單元是Conv(1×1)-Avgpooling,這里的Conv(1×1)也是用來降維,Avgpooling 的大小是2×2、步長是2,用來降低特征圖大小;然后構造第二個DenseBlock,包含12個DenseBlock 基本單元,再是第二個Transition;第三個DenseBlock 包含48 個基本單元,接著是第三個Transition;第四個DenseBlock 包含32 個基本單元,最后是構造1 個大小為7×7 的global average pool,1 個全連接層和1 個softmax 分類器,構造過程中DenseBlock和Transition交替設置。
主要包括:圖像數據的采集、圖像數據的預處理、模型訓練環境的配置、圖像數據的劃分、模型訓練。
2.2.1 圖像數據采集
用于訓練玉米病蟲害智能診斷模型的圖像數據主要來源于兩個部分:一部分采集于重慶市內的玉米種植區,采集時間在2023 年5—8 月,光照條件為自然光,采集設備包括智能手機自帶攝像頭、數碼相機等。為提高圖像數據的清晰度和病蟲發生部位的聚焦度,減少圖像曝光率,部分圖像采集時使用了高清鏡頭、濾鏡等工具。另一部分為互聯網上采集的圖像數據,少量來源于公共數據集。圖像數據總量為3 733幅。
2.2.2 圖像數據的預處理
對圖像數據進行了以下預處理:
1)裁剪。很多采集的圖像數據包含了除玉米植株和病蟲害之外的無用甚至影響識別診斷準確性的部分,如植株間的雜草、田塊邊界的田埂、田邊的樹木等。對圖像數據進行裁剪,使圖像只保留發生病蟲害的玉米植株或部位。
2)切片。將圖像數據切成固定大小,將圖像數據切成228×228像素大小。
3)灰度變換。將RGB 格式的彩色圖像轉化為灰度圖像,使圖像更清晰、特征更明顯。
2.2.3 模型訓練環境配置
基于Python 語言構建模型訓練環境,具體配置如下:Python 版本使用3.7.0,集成開發環境使用PyCharm,2 種網絡結構均基于TensorFlow 實現,使用的TensorFlow 版本為2.3.0,用到了numpy、OpenCV 等程序包,numpy 的版本是1.19.2,OpenCV 的版本是4.5.1.48,在配置過程中需要安裝很多有依賴關系的程序包,為了減少因程序包之間的依賴關系造成的大量沖突和錯誤,使用了Anaconda 管理安裝這些程序包,Anaconda的版本為5.3.1。
2.2.4 圖像數據的劃分
將圖像數據劃分為訓練集、驗證集和測試集。訓練集是使用指定網絡開展深度學習和訓練的數據樣本集合,直接參與模型調參,是原始數據的一部分。網絡通過訓練集,學習數據特征,擬合生成用于預測的模型。驗證集是用于評估模型性能的數據集,也是原始數據的一部分,在訓練過程中幫助調整參數,避免過擬合或欠擬合。測試集是用于判斷模型的準確性和魯棒性,用在模型生成之后,使用模型沒有遇過的數據測試模型性能。由于采集的圖像數據總量偏少,屬于小規模樣本集,按照6∶2∶2的比例劃分為訓練集、驗證集和測試集。
2.2.5 模型訓練
要得到一個性能較好的模型,需要進行多次的訓練,通過調整batch_size、epoch、learning_rate、image_size 等參數,甚至重新清理數據樣本,重新劃分訓練集、驗證集合測試集。本次分別在兩臺x86 服務器上開展模型訓練,1 臺基于CNN 網絡開展訓練,另1臺基于DenseNet201網絡開展訓練,為了提升模型訓練速度,2臺服務器均配置32 GB內存。
訓練過程中記錄了不同參數設置下的模型訓練情況,只保留了val_accuracy 在0.8 以上的模型以供后續開發診斷系統使用。
基于自定義CNN 網絡模型、基于DenseNet201 網絡模型的訓練結果如表1 所示。可以看出,所得val_accuracy 大于0.8 的模型中,基于CNN 網絡的相對穩定,val_loss值也相對較小,說明在特定情況下基于CNN 網絡的模型收斂性相對較好,但DenseNet201 網絡更容易取得較高準確率的模型。

表1 兩種網絡模型訓練結果比較
3.1.1 功能目標設計
系統主要功能目標是讓用戶能夠方便、快捷地使用智能手機等便攜式移動設備對玉米病蟲害進行智能識別診斷,并提供相應的防治建議。系統功能設計如下:
1)調取智能手機等移動設備上的攝像頭,拍攝玉米病蟲害發生圖像。
2)從文件系統上讀取圖像數據。
3)基于深度學習模型對玉米病蟲害種類識別診斷的功能。
4)根據病蟲害種類給出防治建議的功能。
3.1.2 數據庫設計
使用SQLite 輕量級數據庫,用于管理病蟲害編碼信息、病蟲害名稱信息和病蟲害防治建議。
3.1.3 流程設計
系統工作流程如圖3所示。

圖3 系統工作流程圖
3.2.1 開發環境配置
集成開發環境為Android Studio,第三方程序庫有OpenCV 和Tensorflow-Lite。具體版本如下:Android Studio3.4,OpenCV4.5.1,TensorFlow-Lite2.3.0。引入第三方程序庫需在build.gradle 文件dependencies 段添加如下內容。
3.2.2 系統UI實現
系統UI 共包含兩個部分:1)與用戶交互(選擇圖像、拍攝圖像、啟動識別診斷)的各種按鈕;2)展示信息(待診斷圖像、診斷結果、防治建議)的各種View。調用攝像頭拍攝待診斷圖像使用ImageButton發起,調用模型開展診斷使用Button 發起,選擇本地圖像并展示使用ImageView 實現,診斷結果和防治建議使用TextView 實現。使用ConstraintLayout 布局各個組件。實現的用戶界面如圖4所示。

圖4 系統用戶界面
3.2.3 功能實現
3.2.3.1 調取攝像頭功能實現
使用Activity 的startActivityForResult()方法將調用攝像頭的意圖(Intent)傳遞給Android系統,Intent的Action 屬性需設置為ACTION_IMAGE_CAPTURE。對拍攝圖像進行處理通過Activity 的onActivityResult()方法根據requestCode實現完成。
3.2.3.2 選取本地圖像功能實現
同樣通過startActivityForResult()方法向系統傳遞意圖,Intent 的Action 屬性設為ACTION_OPEN_DOCUMENT,Type 屬性設為“image/*”。因瀏覽和選擇本地圖像需要讀取存儲設備的權限,在AndroidManifest.xml 中要做如下配置: 3.2.3.3 識別診斷功能實現 首先將圖像數據轉化為矩陣數據,然后將RGBA格式數據轉換為BGR 格式,再根據模型輸入尺寸對圖像大小進行縮放,使用OpenCV 完成數據歸一化處理,接著將矩陣數據轉換為張量(tensor)數據,最后傳遞給模型解釋器Interpreter開展識別診斷。 3.2.3.4 防治建議功能實現 診斷結果是一組數字,包含了病蟲害的類別編碼和可能性,若可能性大于80%,則根據編碼到數據庫中讀取對應編碼的防治建議,最終在TextView 中展示給用戶。數據庫的操作使用SQLiteOpenHelper 類和SQLiteDatabase的相關方法實現。 本研究在自定義CNN 網絡和DenseNet201 網絡上開展了基于深度學習的玉米病蟲害模型訓練,得到了多個val_accuracy 參數大于0.8 的模型,開發的玉米病蟲害智能診斷系統能夠在Android 系統中運行,并能使用模型開展識別診斷。經驗證,發現系統對于小斑病、紋枯病、莖腐病3 種病害的診斷錯誤率較高,主要原因與采集的圖像樣本數量較少有關;另外,模型的泛化能力較弱,主要原因與數據集劃分和訓練參數欠合理有關。后續將通過采集更多的圖像樣本、圖像預處理、調整數據集和訓練參數提升模型的準確率和泛化能力。4 結論