基於深度學習的農作物葉片病害檢測系統(UI介面+YOLOv5+訓練資料集)

2023-03-21 15:04:48

摘要:農作物葉片病害檢測系統用於智慧檢測常見農作物葉片病害情況,自動化標註、記錄和儲存病害位置和型別,輔助作物病害防治以增加產值。本文詳細介紹基於YOLOv5深度學習模型的農作物葉片病害檢測系統,在介紹演演算法原理的同時,給出Python的實現程式碼、PyQt的UI介面以及訓練資料集。在介面中可以選擇各種圖片、視訊進行檢測識別;可對影象中存在的多個目標進行識別分類,可識別多種農作物葉片病害型別。博文提供了完整的Python程式碼和使用教學,適合新入門的朋友參考,完整程式碼資原始檔請轉至文末的下載連結。本博文目錄如下:

➷點選跳轉至文末所有涉及的完整程式碼檔案下載頁☇

完整程式碼下載:https://mbd.pub/o/bread/ZJaXlptr

參考視訊演示:https://www.bilibili.com/video/BV1iT411r7ym/

離線依賴庫下載連結https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取碼:oy4n )


前言

        農作物病害主要發生在植物葉片,可以通過葉片病害特徵判斷出植物感染病害型別。儘早地檢測出植物病害,能夠極大程度上減少產量損失、經濟損失。然而,人工檢測需要耗費大量時間和人力成本,檢測結果受人為主觀意識影響,且依賴專業知識。其次,專門從事病害識別的人才緊缺,且難以滿足市場需求,因此,需要用一種高效、快速的人工智慧檢測方法解決這一難題。

        這裡使用基於YOLOv5的植物病害檢測演演算法,利用收集到的農作物葉片病害資料集進行訓練,驗證模型有效性後用於UI系統的預測輸出。農作物葉片病害檢測系統主要用於常見農作物葉片病害的智慧檢測,利用相機採集的作物影象,基於深度學習技術識別包括蘋果黑星病、繡葉、玉米灰葉斑病等30種常見的病害型別,輸出病害處的標記框和對應類別,以輔助自動化農作物病害防治;軟體提供登入註冊功能,可進行使用者管理;軟體能有效識別相機採集的圖片、視訊等檔案形式,檢測葉片表面病害情況,並記錄識別結果在介面表格中方便檢視;可開啟攝像頭實時監測和統計實際農作物葉片,以檢測其病害情況,系統支援結果記錄、展示和儲存。

        開發前在網上查詢了一些相關的指令碼,似乎大多關注於YOLOv5-YOLOv8等演演算法的設定修改(換個資料集訓練),不失為不錯的練習教學,但幾乎沒有人將其開發成一個可以展示的完整軟體,並不方便選擇檔案和實時檢測。對此這裡給出博主設計的介面,使用PyQt5設計和美化UI,功能也可以滿足圖片、視訊和攝像頭的識別檢測,希望大家可以喜歡,初始介面如下圖:

        檢測類別時的介面截圖(點選圖片可放大)如下圖,可識別畫面中存在的多個類別,也可開啟攝像頭或視訊檢測:

         詳細的功能演示效果參見博主的B站視訊或下一節的動圖演示,覺得不錯的朋友敬請點贊、關注加收藏!系統UI介面的設計工作量較大,介面美化更需仔細雕琢,大家有任何建議或意見和可在下方評論交流。


1. 效果演示

        軟體好不好用,顏值和功能都是重要指標,首先我們還是通過動圖看一下識別葉片病害的效果,系統主要實現的功能是對圖片、視訊和攝像頭畫面中的農作物病害進行檢測,檢測的結果視覺化顯示在介面和影象中,另外提供多處病害的顯示選擇功能,演示效果如下。

(一)使用者註冊登入介面

        這裡設計了一個登入介面,可以註冊賬號和密碼,然後進行登入。介面還是參考了當前流行的UI設計,左側是一個動圖,右側輸入賬號、密碼、驗證碼等等。

(二)選擇圖片識別

        系統允許選擇圖片檔案進行識別,點選圖片選擇按鈕圖示選擇圖片後,顯示所有農作物識別的結果,可通過下拉選框檢視單個葉片病害的識別結果。本功能的介面展示如下圖所示:

(三)視訊識別效果展示

        很多時候我們需要識別一段視訊畫面中的病害情況,這裡設計了視訊選擇功能。點選視訊按鈕可選擇待檢測的視訊,系統會自動解析視訊逐幀識別農作物,並將結果記錄在右下角表格中,效果如下圖所示:

(四)攝像頭檢測效果展示

        在真實場景中,我們往往利用裝置攝像頭獲取實時畫面,同時需要對畫面中的農作物進行識別,因此本文考慮到此項功能。如下圖所示,點選攝像頭按鈕後系統進入準備狀態,系統顯示實時畫面並開始檢測畫面中的農作物,識別結果展示如下圖:


2. 農作物葉片病害檢測

(一)系統介紹

        日常生活中常見果蔬的種類繁多,其葉片病害的類別就更多了,如何準確地自動化識別病害以提升作物產量,減少經濟損失是當前一個重要問題。對於現有的植物病害檢測方法還不能準確且快速地檢測植物葉片中病害區域問題,博主這裡採用技術已經成熟的基於YOLOv5的深度學習方法,用於檢測馬鈴薯、番茄葉片等常見病害。通過資料增強和影象標註技術構建馬鈴薯、玉米、番茄葉片病害資料集,利用YOLOv5主幹網路對病害特徵的提取能力,實現葉片病害檢測和識別。通過調閱資料和訓練測試程式碼,博主覺得YOLOv5不失為一種為蘋果、番茄葉片病害檢測的高效能解決方案,能夠以較高的準確率對植物葉片病害進行分類與定位。當然現在YOLOv6、YOLOv7、YOLOv8等演演算法也在不斷提出和改進,等其程式碼版本成熟後博主也會再設計本系統的演演算法,敬請期待。

(二)網路結構

         Yolov5網路結構是由Input、Backbone、Neck、Prediction組成。Yolov5的Input部分是網路的輸入端,採用Mosaic資料增強方式,對輸入資料隨機裁剪,然後進行拼接。Backbone是Yolov5提取特徵的網路部分,特徵提取能力直接影響整個網路效能。Yolov5的Backbone相比於之前Yolov4提出了新的Focus結構。Focus結構是將圖片進行切片操作,將W(寬)、H(高)資訊轉移到了通道空間中,使得在沒有丟失任何資訊的情況下,進行了2倍下取樣操作。

(四)資料集及訓練

        這裡我們使用的農作物葉片資料集,每張圖片除包括類別標籤外,還有一個標註的物體邊框(Bounding Box),涉及的病害種類如下所示:

Chinese_name = {'Apple Scab Leaf': "蘋果黑星病葉", 'Apple leaf': "蘋果葉", 'Apple rust leaf': "蘋果繡葉",
                'Bell_pepper leaf spot': "甜椒葉斑病", 'Bell_pepper leaf': "甜椒葉",
                'Blueberry leaf': "藍莓葉", 'Cherry leaf': "櫻桃葉", 'Corn Gray leaf spot': "玉米灰葉斑病",
                'Corn leaf blight': "玉米葉枯病", 'Corn rust leaf': "玉米鏽葉", 'Peach leaf': "桃葉",
                'Potato leaf early blight': "馬鈴薯葉早疫病", 'Potato leaf late blight': "馬鈴薯葉晚疫病",
                'Potato leaf': "馬鈴薯葉", 'Raspberry leaf': "覆盆子葉", 'Soyabean leaf': "大豆葉",
                'Soybean leaf': "大豆葉", 'Squash Powdery mildew leaf': "南瓜白粉病葉",
                'Strawberry leaf': "草莓葉", 'Tomato Early blight leaf': "番茄早疫病葉",
                'Tomato Septoria leaf spot': "番茄葉斑病", 'Tomato leaf bacterial spot': "番茄葉細菌性斑病",
                'Tomato leaf late blight': "番茄葉晚疫病", 'Tomato leaf mosaic virus': "番茄葉花葉病毒",
                'Tomato leaf yellow virus': "番茄葉黃病毒", 'Tomato leaf': "番茄葉",
                'Tomato mold leaf': "番茄黴葉", 'Tomato two spotted spider mites leaf': "番茄二斑葉蟎葉",
                'grape leaf black rot': "葡萄葉黑腐病", 'grape leaf': "葡萄葉"}

        農作物葉片病害資料集中,訓練集含有2330張圖片,測試集包含239張圖片,部分資料及標註如下圖所示。

        每張影象均使用LabelImg工具進行標註,提供了影象中農作物葉片的bounding box,農作物葉片的關鍵part資訊,以及農作物葉片病害的屬性資訊,資料集部分圖片如下圖所示。

        本專案檔案的根目錄包含的內容如下圖所示,其中train.py用於訓練自己的資料集。我們訓練和測試自己的資料集基本就是利用到這些程式碼。在資料集和組態檔等準備完成的基礎上,我們執行train.py指令碼進行訓練。

        在深度學習中,我們通常通過損失函數下降的曲線來觀察模型訓練的情況。而YOLOv5訓練時主要包含三個方面的損失:矩形框損失(box_loss)、置信度損失(obj_loss)和分類損失(cls_loss),在訓練結束後,我們也可以在logs目錄下找到生成對若干訓練過程統計圖。下圖為博主訓練農作物葉片識別的模型訓練曲線圖。

        以下是訓練過程中終端輸出的結果,整個訓練經歷300個Epoch,最終儲存最佳模型在logs資料夾中。

        一般我們會接觸到兩個指標,分別是召回率recall和精度precision,兩個指標p和r都是簡單地從一個角度來判斷模型的好壞,均是介於0到1之間的數值,其中接近於1表示模型的效能越好,接近於0表示模型的效能越差,為了綜合評價目標檢測的效能,一般採用均值平均密度map來進一步評估模型的好壞。我們通過設定不同的置信度的閾值,可以得到在模型在不同的閾值下所計算出的p值和r值,一般情況下,p值和r值是負相關的,繪製出來可以得到如下圖所示的曲線,其中曲線的面積我們稱AP,目標檢測模型中每種目標可計算出一個AP值,對所有的AP值求平均則可以得到模型的mAP值。

        以PR-curve為例,可以看到我們的模型在驗證集上的均值平均準確率為0.628。從訓練結果和資料集進行分析,其干擾樣本多,容易造成誤檢, 其中有很多植物葉片是非常接近的,由於拍攝角度和光照等,實際檢測很難區分(比如:番茄葉、馬鈴薯葉等),容易造成模型誤檢。

3. 農作物葉片檢測識別

        在訓練完成後得到最佳模型,接下來我們將幀影象輸入到這個網路進行預測,從而得到預測結果,預測方法(predict.py)部分的程式碼如下所示:

def predict(img):
    img = torch.from_numpy(img).to(device)
    img = img.half() if half else img.float()
    img /= 255.0
    if img.ndimension() == 3:
        img = img.unsqueeze(0)

    t1 = time_synchronized()
    pred = model(img, augment=False)[0]
    pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes,
                               agnostic=opt.agnostic_nms)
    t2 = time_synchronized()
    InferNms = round((t2 - t1), 2)

    return pred, InferNms

        得到預測結果我們便可以將幀影象中的目標框出,然後在圖片上用opencv繪圖操作,輸出農作物葉片的類別及農作物葉片的預測分數。以下是讀取農作物葉片圖片並進行檢測的指令碼,首先將圖片資料進行預處理後送predict進行檢測,然後計算標記框的位置並在圖中標註出來。

if __name__ == '__main__':
    img_path = "./UI_rec/test_/18183295-H_jpg.rf.a24d4bca5c28d0089402702a47506c37.jpg"
    image = cv_imread(img_path)
    image = cv2.resize(image, (850, 500))
    img0 = image.copy()
    img = letterbox(img0, new_shape=imgsz)[0]
    img = np.stack(img, 0)
    img = img[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, to 3x416x416
    img = np.ascontiguousarray(img)

    pred, useTime = predict(img)

    det = pred[0]
    p, s, im0 = None, '', img0
    if det is not None and len(det):  # 如果有檢測資訊則進入
        det[:, :4] = scale_coords(img.shape[1:], det[:, :4], im0.shape).round()  # 把影象縮放至im0的尺寸
        number_i = 0  # 類別預編號
        detInfo = []
        for *xyxy, conf, cls in reversed(det):  # 遍歷檢測資訊
            c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))
            # 將檢測資訊新增到字典中
            detInfo.append([names[int(cls)], [c1[0], c1[1], c2[0], c2[1]], '%.2f' % conf])
            number_i += 1  # 編號數+1

            label = '%s %.2f' % (names[int(cls)], conf)

            # 畫出檢測到的目標物
            plot_one_box(image, xyxy, label=label, color=colors[int(cls)])
    # 實時顯示檢測畫面
    cv2.imshow('Stream', image)
    # if cv2.waitKey(1) & 0xFF == ord('q'):
    #     break
    c = cv2.waitKey(0) & 0xff

        執行得到的結果如下圖所示,圖中農作物葉片的種類和置信度值都標註出來了,預測速度較快。基於此模型我們可以將其設計成一個帶有介面的系統,在介面上選擇圖片、視訊或攝像頭然後呼叫模型進行檢測。

        博主對整個系統進行了詳細測試,最終開發出一版流暢得到清新介面,就是博文演示部分的展示,完整的UI介面、測試圖片視訊、程式碼檔案,以及Python離線依賴包(方便安裝執行,也可自行設定環境),均已打包上傳,感興趣的朋友可以通過下載連結獲取。


下載連結

    若您想獲得博文中涉及的實現完整全部程式檔案(包括測試圖片、視訊,py, UI檔案等,如下圖),這裡已打包上傳至博主的麵包多平臺,見可參考部落格與視訊,已將所有涉及的檔案同時打包到裡面,點選即可執行,完整檔案截圖如下:

    在資料夾下的資源顯示如下,下面的連結中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟體後,複製離線依賴包至專案目錄下進行安裝,離線依賴的使用詳細演示也可見本人B站視訊:win11從頭安裝軟體和設定環境執行深度學習專案Win10中使用pycharm和anaconda進行python環境設定教學

注意:該程式碼採用Pycharm+Python3.8開發,經過測試能成功執行,執行介面的主程式為runMain.py和LoginUI.py,測試圖片指令碼可執行testPicture.py,測試視訊指令碼可執行testVideo.py。為確保程式順利執行,請按照requirements.txt設定Python依賴包的版本。Python版本:3.8,請勿使用其他版本,詳見requirements.txt檔案;

完整資源中包含資料集及訓練程式碼,環境設定與介面中文字、圖片、logo等的修改方法請見視訊,專案完整檔案下載請見參考部落格文章裡面,或參考視訊的簡介處給出:➷➷➷

完整程式碼下載:https://mbd.pub/o/bread/ZJaXlptr

參考視訊演示:https://www.bilibili.com/video/BV1iT411r7ym/

離線依賴庫下載https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取碼:oy4n )


結束語

        由於博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。