摘要:開發高效的植物病害檢測系統對于提升農業生產效率和作物健康管理意義重大。本篇博客詳細闡述了如何運用深度學習技術構建一個植物病害檢測系統,并提供了完整的實現代碼。該系統基于先進的YOLOv8算法,對YOLOv7、YOLOv6、YOLOv5進行了性能對比,包括mAP、F1 Score等關鍵指標的分析。文章深入解釋了YOLOv8算法的原理,提供了相應的Python代碼和訓練數據集,并設計了一個基于PySide6的用戶友好UI界面。
系統能夠準確檢測和分類圖像中的植物病害,支持通過圖片、文件夾、視頻文件或實時攝像頭輸入進行檢測,功能包括熱力圖分析、標記框類別、類別統計、可調Conf、IOU參數、結果可視化等。此外,還包含了基于SQLite的用戶注冊登錄管理界面,允許通過按鈕切換不同模型和自定義UI界面。本文旨在為深度學習新手提供實用指南,文章末尾附有代碼和數據集下載鏈接,便于讀者下載和應用。本文結構如下:
文章目錄
- 前言
- 1.數據集介紹
- 2. 系統界面效果
- 3. YOLOv8算法原理
- 4. 代碼簡介
- 4.1 模型預測
- 4.2 模型訓練
- 4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8對比
- 4.4 代碼實現
- 5. 植物病害檢系統實現
- 5.1 系統設計思路
- 5.2 登錄與賬戶管理
- 下載鏈接
- 6. 總結與展望
- 結束語
?點擊跳轉至文末所有涉及的完整代碼文件下載頁?
基于YOLOv8/v7/v6/v5的植物病害檢測系統演示與介紹(深度學習模型+PySide6界面+訓練代碼)
前言
????????在當今世界,農業生產面臨諸多挑戰,其中之一便是植物病害的及時檢測與管理。隨著全球人口的增長,對糧食的需求日益增加,而植物病害的發生頻率和破壞力則直接威脅到農作物的產量和質量,進而影響到食品安全和農業可持續發展。據估計,植物病害每年造成全球農作物產量的損失高達20%至40%。因此,發展高效、準確的植物病害檢測系統不僅對于減少經濟損失、保障糧食安全具有重要意義,也是推動農業科技進步和實現精準農業管理的關鍵。
????????傳統的植物病害檢測方法主要依賴于農業專家的經驗和人工觀察,這不僅耗時耗力,而且難以實現大規模監測和早期檢測。隨著人工智能技術,特別是深度學習技術的飛速發展,基于圖像識別的植物病害檢測技術已經成為研究的熱點。YOLO(You Only Look Once)系列模型作為深度學習領域的先進算法,以其快速、準確的檢測性能引起了廣泛關注。從YOLOv5到YOLOv8,每一代的升級都在性能、速度和準確度上有了顯著提升。此外,其他最新的深度學習算法,如Transformer和Capsule Networks,也在植物病害檢測領域顯示出了潛力。這些技術的進步不僅提高了檢測的精度和效率,也大大擴展了植物病害檢測的應用范圍,如無人機監測、智能溫室管理等。
????????YOLOv51,作為系列中的一個重要版本,因其優秀的平衡性能和速度而被廣泛應用于植物病害檢中。隨后,YOLOv62和YOLOv73的發布,通過改進網絡結構和訓練策略,進一步提高了檢測的準確率和速度。YOLOv84在植物病害檢測中的應用表現出了前所未有的效率和準確性。YOLOv8通過改進網絡架構、優化訓練策略和引入更高效的特征融合技術,顯著提升了對小物體的檢測性能,這對于識別尺寸不一的植物病害尤為重要。
????????數據集的發展是推動植物病害檢測技術進步的另一個重要因素。與早期的數據集相比,最新的數據集不僅在規模上有了顯著擴展,而且在多樣性、復雜性和標注質量上也有了大幅提升。例如,PlantVillage數據集是目前最廣泛使用的植物病害圖像數據集之一,包含了多種作物和病害類型的高分辨率圖像。此外,為了適應復雜的田間環境,新的數據集開始包含從無人機和移動設備捕獲的圖像,這些圖像更接近實際應用場景中的條件。
????????盡管如此,植物病害檢測系統的研究和應用仍面臨著多方面的技術挑戰,如算法的泛化能力、實時性能的進一步提升、以及在復雜環境下的適應性等。此外,如何將這些高級算法有效集成到農業生產的實際應用中,實現智能化、自動化的植物病害管理,也是未來研究的重要方向。
????????未來的發展趨勢可能集中在幾個方面:一是算法方面,如何通過新的網絡架構或訓練策略進一步提升模型的準確性和泛化能力;二是數據集方面,開發更加多樣化、全面的數據集,以及利用弱監督學習或半監督學習技術減少對大量標注數據的依賴;三是實際應用方面,如何將這些技術更好地集成到智能農業系統中,實現自動化的植物病害監測和管理。
????????本博客通過深入探討基于YOLOv8算法構建的植物病害檢測系統,不僅展示了系統界面的效果,詳細講解了算法原理,提供了代碼實現,還分享了系統的開發過程。我們希望通過這一全面的分享,能夠為讀者提供有價值的見解,激發更多的相關研究。本文的主要貢獻可以概括為以下幾點:
- 采用最先進的YOLOv8算法進行植物病害檢測系統的開發:本文詳細介紹了如何利用當前最新的目標檢測算法—YOLOv8,進行高效準確的植物病害檢測,相較于早期的深度學習模型如CNN和ResNet等,YOLOv8在效率和精準度方面展現出顯著優勢。通過與YOLOv7、YOLOv6、YOLOv5等算法的結果對比,本文為相關領域的研究者和從業者提供了新的研究思路和實踐手段。
- 利用PySide6實現用戶界面友好的植物病害檢測系統:本文探討了如何使用Python的PySide6庫,開發一個直觀便捷的植物病害檢測系統界面,該界面的設計不僅提升了用戶體驗,而且促進了YOLOv8算法在實際應用中的推廣。
- 集成登錄管理功能,增強系統安全性:本系統設計了登錄管理功能,要求用戶完成登錄后才能使用,這不僅增強了系統的安全性,也為未來添加更多個性化功能奠定了基礎。
- 深入研究YOLOv8模型的性能:本文不僅應用了YOLOv8算法進行植物病害檢測,還對該算法的性能進行了深入研究,包括精準度、召回率等關鍵指標的評估,以及在不同環境條件下的表現分析,為YOLOv8算法的優化和改進提供了重要的參考。
- 提供完整的數據集和代碼資源包:為了讓讀者能夠更好地理解和應用YOLOv8/ v7/v6/v5算法在植物病害檢測中的操作,本文提供了包括訓練和測試用的詳細數據集以及完整的代碼實現。這些資源使讀者能夠直接復現實驗結果,并在此基礎上進行進一步的研究和開發。
1.數據集介紹
????????在深度學習和機器視覺領域,構建一個高效準確的目標檢測系統,數據集的質量和結構是成功的關鍵。我們的研究專注于植物病害檢測,這不僅對于科研具有重要意義,而且在實際的農業生產中發揮著至關重要的作用。為此,我們構建和維護了一個包含5150張圖像的豐富數據集,專門用于訓練和測試我們的植物病害檢測系統。這個數據集被精心劃分為4420張訓練圖像、366張驗證圖像和364張測試圖像,以確保模型的泛化能力和穩定性。
????????在預處理階段,我們對圖像進行了自動方向校正,并剝離了EXIF方向信息,以保證數據的一致性,這對于后續的模型訓練是非常必要的。所有圖像都被統一調整至800x800像素的分辨率,盡管這可能導致一些形狀扭曲,但是我們的算法需要能夠從不同尺寸和比例的圖像中提取有用的特征。
????????通過對數據集的深入分析,我們發現類別分布呈現出不同程度的樣本量。某些類別如特定的蘋果和葡萄病害實例數目較多,而其他類別則相對較少。這種不均衡的分布可能會影響模型訓練,因此我們必須采取策略來確保模型能夠對所有類別的病害進行有效檢測。邊界框的位置分布圖顯示了目標在圖像中的位置傾向,大部分目標集中在圖像中心,這對于錨框的設計和模型的空間偏差優化提供了重要信息。目標尺寸分布表明,我們的數據集中大多數目標較小,這要求模型必須能夠精確地識別和定位小目標,這在植物病害檢測中尤為重要。
????????每張圖像都經過了精確的標注,以確保模型能夠從中學習到如何識別和分類不同的植物病害。博主使用的標簽及其對應的中文名稱如下所示:
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": "大豆葉", "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": "葡萄葉"}
????????總的來說,這個數據集的設計和分析為我們的植物病害檢測系統提供了堅實的基礎。我們詳盡的預處理步驟、平衡的數據分割、以及對數據特性的深入理解,為模型的訓練、驗證和測試創造了有利條件。進一步的數據增強和樣本均衡策略將在后續的研究中被采納,以克服類別不平衡和模型偏置的問題,從而確保我們的系統能夠在真實世界的復雜條件下實現準確和可靠的病害檢測。
2. 系統界面效果
????????系統以PySide6作為GUI庫,提供了一套直觀且友好的用戶界面。下面,我將詳細介紹各個主要界面的功能和設計。
(1)系統提供了基于SQLite的注冊登錄管理功能。用戶在首次使用時需要通過注冊界面進行注冊,輸入用戶名和密碼后,系統會將這些信息存儲在SQLite數據庫中。注冊成功后,用戶可以通過登錄界面輸入用戶名和密碼進行登錄。這個設計可以確保系統的安全性,也為后續添加更多個性化功能提供了可能性。
(2)在主界面上,系統提供了支持圖片、視頻、實時攝像頭和批量文件輸入的功能。用戶可以通過點擊相應的按鈕,選擇要進行植物病害檢的圖片或視頻,或者啟動攝像頭進行實時檢測。在進行植物病害檢時,系統會實時顯示檢測結果,并將檢測記錄存儲在數據庫中。
(3)此外,系統還提供了一鍵更換YOLOv8/v5模型的功能。用戶可以通過點擊界面上的"更換模型"按鈕,選擇不同的YOLOv8模型進行檢測。與此同時,系統附帶的數據集也可以用于重新訓練模型,以滿足用戶在不同場景下的檢測需求。
(4)為了提供更個性化的使用體驗,這里系統支持界面修改,用戶可以自定義圖標、文字等界面元素。例如,用戶可以根據自己的喜好,選擇不同風格的圖標,也可以修改界面的文字描述。
3. YOLOv8算法原理
????????YOLOv8算法作為YOLO系列中的最新成員,是目前最先進的目標檢測算法之一。它在前代YOLOv5的基礎上進行了多項重要的技術革新和性能優化,使其在速度、準確度、魯棒性以及易用性方面都有了顯著的提升,成為了植物病害檢測等多種視覺識別任務的首選模型。
????????在YOLOv8的設計中,首先值得注意的是其繼承并優化了YOLO系列的基本架構,實現了更高效的特征提取和目標定位能力。與YOLOv5相比,YOLOv8在網絡結構上進行了一系列的創新,如引入了新的激活函數和歸一化層,這些變化使得模型可以更好地捕捉到圖像中的復雜特征,從而在各種復雜場景下提供更為準確的檢測結果。
????????YOLOv8的另一個顯著改進是在訓練策略上。它采用了一系列新穎的技術來優化訓練過程,如Task-Aligned Assigner技術,這一技術通過對訓練任務和標簽分配過程進行優化,有效提高了模型對目標的分類和定位能力。此外,YOLOv8還引入了DFL(Dynamic Focal Loss),這是一種新型的損失函數,它可以動態地調整對不同目標的關注程度,尤其是在存在類別不平衡的數據集中,這一機制能夠顯著提升小目標的檢測性能。
????????在實際應用中,YOLOv8還融入了Mosaic數據增強技術,該技術通過在訓練早期階段將多個訓練圖像拼接在一起,為模型提供更多樣化的輸入,增強了模型的泛化能力。這種數據增強技術特別適用于那些樣本多樣性很重要的任務,比如植物病害檢測,因為它可以模擬出更多樣的病害外觀和背景環境,提高模型在實際應用中的魯棒性。
????????YOLOv8繼承并改進了YOLOv7引入的CSP結構,這種結構通過將特征圖分割成兩部分,一部分通過網絡進行前向傳播和反向傳播,而另一部分則直接連接到后面的層。這種設計減少了計算量并提高了特征的利用效率。YOLOv8在CSP的基礎上進一步優化,增加了新的網絡連接策略,使其在特征提取上更為高效。
????????綜上所述,YOLOv8在結構設計、訓練策略和數據處理等多個方面進行了全面的優化和革新,這些改進不僅提升了模型的性能,也大大提高了其在實際應用中的適用性和效率。這些特點使得YOLOv8成為當前最具潛力的目標檢測算法之一,尤其在需要處理大規模和多樣化數據集的任務中,顯示出其獨特的優勢。
4. 代碼簡介
????????在本節中,我們將詳細介紹如何使用YOLOv8進行植物病害檢的代碼實現。代碼主要分為兩部分:模型預測和模型訓練。
4.1 模型預測
????????在模型預測部分,首先導入了OpenCV庫和YOLO模型。OpenCV庫是一個開源的計算機視覺和機器學習軟件庫,包含了眾多的視覺處理函數,使用它來讀取和處理圖像。YOLO模型則是要用到的目標檢測模型。
import cv2
from ultralytics import YOLO
????????接著,加載自行訓練好的YOLO模型。這個模型是在大量的圖像上預訓練得到的,可以直接用于目標檢測任務。
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
????????然后,使用OpenCV讀取了一個圖像文件,這個圖像文件作為要進行目標檢測的圖像輸入。
img_path = abs_path("test_media/test.png")
image = cv_imread(img_path)
????????在讀取了圖像文件之后,就可以使用加載的模型對圖像進行預測了。下圖為預測結果。
pred, superimposed_img = model.predict(pre_img)
4.2 模型訓練
????????這里我們開始訓練和測試自己的數據集,在cmd終端或pycharm中運行run_train_model.py進行訓練,以下是訓練過程中的結果截圖。YOLOv8的損失函數是其性能的關鍵部分,它指導模型學習如何準確地檢測和分類對象。
????????以下表格詳細介紹了YOLOv8模型訓練中使用的一些重要超參數及其設置:
超參數 | 設置 | 說明 |
---|---|---|
學習率(lr0 ) | 0.01 | 決定了模型權重調整的步長大小,在訓練初期有助于快速收斂。 |
學習率衰減(lrf ) | 0.01 | 控制訓練過程中學習率的降低速度,有助于模型在訓練后期細致調整。 |
動量(momentum ) | 0.937 | 加速模型在正確方向上的學習,并減少震蕩,加快收斂速度。 |
權重衰減(weight_decay ) | 0.0005 | 防止過擬合,通過在損失函數中添加正則項減少模型復雜度。 |
熱身訓練周期(warmup_epochs ) | 3.0 | 初始幾個周期內以較低的學習率開始訓練,逐漸增加到預定學習率。 |
批量大小(batch ) | 16 | 每次迭代訓練中輸入模型的樣本數,影響GPU內存使用和模型性能。 |
輸入圖像大小(imgsz ) | 640 | 模型接受的輸入圖像的尺寸,影響模型的識別能力和計算負擔。 |
????????在構建深度學習模型的過程中,代碼的編寫是實現理論到實際應用的重要一環。在本段博客中,我們將探討如何使用Python和PyTorch框架,結合UltraLytics的YOLO實現,來訓練一個植物病害檢測模型。這一過程不僅涉及到模型的加載和訓練,還包括了數據集的配置和路徑管理等細節。下面,我們將逐行解析這個過程的關鍵代碼部分。
????????首先,導入必要的模塊和庫是任何Python程序的起點。這里我們導入os模塊來處理文件路徑問題,torch庫是PyTorch深度學習框架的核心,yaml用于讀取數據配置文件。ultralytics提供的YOLO是一個功能強大的對象檢測模型,而QtFusion.path中的abs_path函數則用于獲取數據集配置文件的絕對路徑。
import osimport torch
import yaml
from ultralytics import YOLO # 導入YOLO模型
from QtFusion.path import abs_path
????????接下來,我們設置設備,優先使用CUDA加速(如果可用),否則使用CPU。這是為了確保模型可以在GPU上運行,從而大幅提高訓練速度。
device = "cuda:0" if torch.cuda.is_available() else "cpu"
???????? 我們確保了以下代碼只有在該模塊作為主程序運行時才會執行,并定義了工作進程數和批次大小,這些是控制數據加載和批處理的重要參數。為了定位數據集的yaml配置文件,我們使用abs_path函數,并替換路徑分隔符以適應不同操作系統的路徑規則。這個yaml文件包含了關于數據集的重要信息,如類別、路徑和數據劃分等。
if __name__ == '__main__': # 確保該模塊被直接運行時才執行以下代碼workers = 1batch = 8data_name = "PlantsDisease"data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 數據集的yaml的絕對路徑unix_style_path = data_path.replace(os.sep, '/')# 獲取目錄路徑directory_path = os.path.dirname(unix_style_path)# 讀取YAML文件,保持原有順序with open(data_path, 'r') as file:data = yaml.load(file, Loader=yaml.FullLoader)# 修改path項if 'path' in data:data['path'] = directory_path# 將修改后的數據寫回YAML文件with open(data_path, 'w') as file:yaml.safe_dump(data, file, sort_keys=False)model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 加載預訓練的YOLOv8模型# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt') # 加載預訓練的YOLOv8模型# Training.results = model.train( # 開始訓練模型data=data_path, # 指定訓練數據的配置文件路徑device=device, # 自動選擇進行訓練workers=workers, # 指定使用2個工作進程加載數據imgsz=640, # 指定輸入圖像的大小為640x640epochs=120, # 指定訓練100個epochbatch=batch, # 指定每個批次的大小為8name='train_v5_' + data_name # 指定訓練任務的名稱)model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加載預訓練的YOLOv8模型results2 = model.train( # 開始訓練模型data=data_path, # 指定訓練數據的配置文件路徑device=device, # 自動選擇進行訓練workers=workers, # 指定使用2個工作進程加載數據imgsz=640, # 指定輸入圖像的大小為640x640epochs=120, # 指定訓練100個epochbatch=batch, # 指定每個批次的大小為8name='train_v8_' + data_name # 指定訓練任務的名稱)
????????讀取yaml文件并在需要時更新路徑項是處理配置文件的常規操作。這一步驟確保了模型能夠正確地定位到數據集的位置。在加載模型并準備進行訓練之前,首先需要加載預訓練權重。這里我們加載了yolov5nu.pt作為YOLOv5模型的權重,這是從UltraLytics提供的預訓練模型開始的一個好起點。最后,我們使用train方法開始訓練模型。這里指定了數據配置文件、設備、工作進程數、圖像大小、訓練周期和批次大小。name參數用于命名訓練任務,便于后續的識別和參考。
????????在深度學習模型的訓練過程中,監控損失函數和性能指標的變化對于了解模型的學習進度至關重要。通過對YOLOv8模型訓練過程中的損失函數圖像進行分析,我們可以對模型性能做出專業且詳細的解讀。
????????首先,觀察訓練和驗證過程中的邊界框損失(box_loss)、分類損失(cls_loss)和分布式焦點損失(df1_loss)的變化。邊界框損失負責對模型預測的邊界框與真實邊界框之間的差異進行懲罰,分類損失則處理類別預測的正確性,而分布式焦點損失則是對于難以分類樣本的一種更細致的損失函數。在訓練初期,這些損失值通常較高,因為模型還未學習到足夠的特征。隨著訓練進展,我們期望看到這些損失值逐漸下降,這表明模型在逐漸改善其預測。圖中展示的趨勢符合這一預期:損失值在訓練過程中持續下降,最終趨于穩定,這是模型正常收斂的標志。
????????對于性能指標,精確度(precision)和召回率(recall)是衡量模型性能的關鍵指標。精確度表示模型預測為正的樣本中真正為正的比例,而召回率則衡量模型能夠正確識別的正樣本的比例。從圖中我們可以看出,模型的精確度和召回率在訓練過程中呈現出上升的趨勢,這意味著模型在不斷學習如何更準確地檢測和分類圖像中的目標。
????????mAP(mean Average Precision)是衡量目標檢測模型性能的一個綜合指標,通常包括mAP@0.5和mAP@0.5-0.95兩個水平,分別代表在不同的IoU(Intersection over Union)閾值下模型性能的評估。mAP@0.5更為寬容,只要預測的邊界框與真實邊界框的IoU超過0.5就認為是正確的,而mAP@0.5-0.95則覆蓋了從0.5到0.95的所有閾值,是一個更嚴格的評估。圖中的mAP值隨著訓練逐步提升,并在一定的訓練周期后達到平穩狀態,這表明模型具有良好的檢測能力,并且對于不同的IoU閾值具有較為穩定的表現。
????????在機器學習和深度學習模型的性能評估中,F1分數是一個非常重要的指標,它結合了精確度(Precision)和召回率(Recall)兩個指標的信息。具體來說,F1分數是精確度和召回率的調和平均數,能夠平衡二者的影響,為模型性能提供一個綜合的衡量。在目標檢測任務中,F1分數尤其重要,因為它直接反映了模型檢測正確目標的能力。
???????? 首先,F1曲線顯示了在不同置信度閾值(Confidence)下的模型性能。曲線上的每個點反映了在特定置信度閾值下模型的F1分數。在曲線的開始部分,隨著置信度閾值的增加,F1分數迅速上升,這意味著模型在較低置信度時將很多不準確的預測視為正樣本,導致了較低的精確度和較高的召回率。隨著置信度閾值的提高,模型開始更加謹慎地標記正樣本,因此精確度提高了,但召回率可能會略有下降。
???????? 曲線的頂部,也就是F1分數達到峰值的位置,表示了模型在精確度和召回率之間達到最佳平衡的置信度閾值。在這個案例中,最大的F1分數約為0.62,對應的置信度閾值約為0.358。這個最大值指出,在此閾值下,模型對于判斷目標是否正確的置信度和其實際性能之間達到了最佳的平衡。
????????然而,在峰值之后,隨著置信度閾值的繼續增加,F1分數開始下降,這表明模型變得過于保守,錯過了一些正確的目標(即漏檢),導致召回率下降。在置信度接近1的極端情況下,盡管模型的精確度可能很高(因為幾乎所有標記為正的預測都是正確的),但由于漏檢太多,召回率會非常低,因此F1分數降低。此外,曲線圖中還展示了多條線,可能代表不同類別或不同實驗條件下的F1分數。整體而言,這些線的趨勢相似,顯示出模型的性能在不同類別或條件下具有一定的一致性。
????????總結來說,F1分數曲線圖為我們提供了模型性能隨置信度變化的直觀視圖。它揭示了模型的最優置信度閾值,并指出了模型性能可能的瓶頸。在實際應用中,選擇一個合適的置信度閾值,可以幫助我們在保持較高精確度的同時,盡可能地提高召回率,從而優化模型的整體性能。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8對比
(1)實驗設計:
????????本實驗旨在評估和比較YOLOv5、YOLOv6、YOLOv7和YOLOv8幾種模型在植物病害目標檢測任務上的性能。為了實現這一目標,博主分別使用使用相同的數據集訓練和測試了這四個模型,從而可以進行直接的性能比較。該數據集包含植物病害的圖像。本文將比較分析四種模型,旨在揭示每種模型的優缺點,探討它們在工業環境中實際應用的場景選擇。
模型 | 圖像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 參數數量 (百萬) | FLOPs (十億) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指標:
- F1-Score:F1-Score是精確率(Precision)和召回率(Recall)的調和平均值。精確率是指模型正確識別的正例與所有識別為正例的案例之比,而召回率是指模型正確識別的正例與所有實際正例之比。F1-Score對于不平衡的數據集或者需要同時考慮精確率和召回率的任務特別重要。
- mAP(Mean Average Precision):mAP是衡量模型在多個類別上平均檢測準確度的指標。它計算了模型在所有類別上的平均精度,是目標檢測領域中常用的性能度量。
名稱 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.629 | 0.623 | 0.613 | 0.636 |
F1-Score | 0.61 | 0.60 | 0.60 | 0.62 |
(3)實驗結果分析:
??????? 首先,我們注意到mAP,即平均精度均值,它反映了模型在不同置信度閾值下的平均表現。在我們的實驗中,YOLOv8n以0.636的mAP得分最高,這表明它在整體檢測精度上優于其他版本。YOLOv5nu緊隨其后,得分為0.629,而YOLOv6n和YOLOv7-tiny的表現稍遜一些,分別為0.623和0.613。mAP作為一個整體性能的指標,更高的分數意味著模型具有更好的檢測能力和更高的可靠性。
??????? 另一個重要的指標是F1-Score,它是精確度和召回率的調和平均數,能夠綜合考慮模型檢測正確性和完整性。在這一指標上,YOLOv8n同樣以0.62的得分領先,這進一步證實了它在檢測性能上的優勢。其他三個模型的F1-Score相對較接近,分別為0.61、0.60和0.60,這說明它們在精確度和召回率的平衡上表現相似。
??????? 從這些數據我們可以得出結論,隨著YOLO系列的發展,新版本的模型在性能上確實有所提升。YOLOv8n在我們的實驗中表現最佳,不僅在整體檢測準確性上(mAP)領先,而且在檢測的準確性和完整性的平衡上(F1-Score)也具有優勢。YOLOv5nu作為較早的版本,仍然顯示出強大的性能,而YOLOv6n和YOLOv7-tiny則提供了相對較為均衡的性能。
??????? 這樣的性能對比對于實踐者來說極為重要。它不僅為選擇合適的模型提供了數據支持,而且也展示了在不同場景下可能需要權衡的性能指標。例如,在對精確度要求更高的應用場景下,YOLOv8n可能是更佳的選擇,而在對計算資源有限制的環境中,較輕量的YOLOv7-tiny可能會更加合適。
???????綜上所述,模型選擇應基于具體的應用需求和環境限制,而這些實驗數據為我們提供了進行合理選擇的依據。通過這些綜合評估指標,我們能夠更全面地理解每個模型的優勢和局限,從而為實際應用中的模型部署和優化提供指導。
4.4 代碼實現
????????在這篇博客中,我們將深入探討如何使用YOLOv8模型來構建一個植物病害檢測系統。我們將通過一段Python代碼,一步步展示從模型加載到實時檢測的整個過程。這段代碼不僅集成了深度學習和計算機視覺的核心技術,而且利用了PySide6創建了用戶友好的界面。
(1)導入必要的模塊和配置
????????首先,我們導入了幾個關鍵的Python模塊,包括用于圖像處理的OpenCV庫,以及構建圖形用戶界面(GUI)所需的PySide6模塊。通過這些工具,我們可以對圖像進行讀取和處理,同時為用戶提供一個交互窗口。
import random # 導入random模塊,用于生成隨機數
import sys # 導入sys模塊,用于訪問與Python解釋器相關的變量和函數
import time # 導入time模塊,用于處理時間
from QtFusion.config import QF_Config
import cv2 # 導入OpenCV庫,用于處理圖像
from QtFusion.widgets import QMainWindow # 從QtFusion庫中導入FBaseWindow類,用于創建窗口
from QtFusion.utils import cv_imread, drawRectBox # 從QtFusion庫中導入cv_imread和drawRectBox函數,用于讀取圖像和繪制矩形框
from PySide6 import QtWidgets, QtCore # 導入PySide6庫中的QtWidgets和QtCore模塊,用于創建GUI
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # 從YOLOv8Model模塊中導入YOLOv8Detector類,用于加載YOLOv8模型并進行目標檢測
from datasets.PlantsDisease.label_name import Label_listQF_Config.set_verbose(False)
????????在代碼中,我們使用QtFusion庫,這是一個封裝了Qt功能的庫,它提供了創建現代化窗口和控件的方法。
(2)定義類別和模型
????????接下來,我們創建了一個YOLOv8Detector對象,這是我們檢測模型的核心。通過加載預先訓練好的模型權重,我們為即將到來的圖像檢測準備好了模型。
cls_name = Label_list # 定義類名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 為每個目標類別生成一個隨機顏色model = YOLOv8Detector() # 創建YOLOv8Detector對象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加載預訓練的YOLOv8模型
(3)創建主窗口
???????我們定義了一個MainWindow類,這是我們應用程序的主窗口。在這個類中,我們設置了窗口的大小,并添加了一個QLabel組件來展示檢測結果。為了使應用程序能夠響應用戶的操作,我們還定義了keyPressEvent方法來處理鍵盤事件
class MainWindow(QMainWindow): # 自定義主窗口類def __init__(self): # 構造函數super().__init__() # 調用父類構造函數self.resize(850, 500) # 設置窗口大小self.label = QtWidgets.QLabel(self) # 創建標簽用于顯示圖像self.label.setGeometry(0, 0, 850, 500) # 設置標簽位置和大小def keyPressEvent(self, event): # 鍵盤事件處理if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q鍵時self.close() # 關閉窗口
(4)主程序流程
????????隨后,進入主函數中,我們選擇了一張測試圖像,并使用了cv_imread來讀取圖像,這是一個適配不同編碼格式的圖像讀取函數。讀取之后,我們將圖像大小調整到模型所需的640x640像素,并對其進行預處理。隨后,我們開始對圖像進行實時檢測。通過記錄開始和結束時間,我們可以計算出模型進行預測的耗時。模型的predict方法返回了預測結果和疊加在原圖上的圖像。
if __name__ == '__main__': # 如果當前模塊是主模塊app = QtWidgets.QApplication(sys.argv) # 創建QApplication對象window = MainWindow() # 創建MainWindow對象img_path = abs_path("test_media/PlantsDisease_SIXU_A00027.jpg") # 定義圖像文件的路徑image = cv_imread(img_path) # 使用cv_imread函數讀取圖像image = cv2.resize(image, (640, 640)) # 將圖像大小調整為850x500pre_img = model.preprocess(image) # 對圖像進行預處理t1 = time.time() # 獲取當前時間(開始時間)pred, superimposed_img = model.predict(pre_img) # 使用模型進行預測t2 = time.time() # 獲取當前時間(結束時間)use_time = t2 - t1 # 計算預測所用的時間det = pred[0] # 獲取預測結果的第一個元素(檢測結果)# 如果有檢測信息則進入if det is not None and len(det):det_info = model.postprocess(pred) # 對預測結果進行后處理for info in det_info: # 遍歷檢測信息# 獲取類別名稱、邊界框、置信度和類別IDname, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id']label = '%s %.0f%%' % (name, conf * 100) # 創建標簽,包含類別名稱和置信度# 畫出檢測到的目標物image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在圖像上繪制邊界框和標簽print("推理時間: %.2f" % use_time) # 打印預測所用的時間window.dispImage(window.label, image) # 在窗口的label上顯示圖像# 顯示窗口window.show()# 進入 Qt 應用程序的主循環sys.exit(app.exec()))
????????檢測結果會包含諸如類別名稱、邊界框、置信度等信息。我們使用drawRectBox函數在圖像上繪制這些邊界框和標簽,并為每個檢測到的對象分配一個隨機顏色。最后,我們將處理后的圖像展示在GUI上,并將應用程序的執行流交給Qt的事件循環。
????????通過這段代碼,我們展示了如何實現一個完整的目標檢測應用程序。從模型的加載到最終的用戶交互,這個過程體現了現代深度學習應用的開發模式,將先進的算法與用戶友好的界面結合起來,以滿足實際應用場景的需求。
5. 植物病害檢系統實現
????????在設計交互式植物病害檢與識別系統的過程中,我們采取了一個模塊化和層次化的方法,以確保系統既高效又易于維護。我們的系統設計思路是圍繞用戶體驗來構建的,旨在提供一個直觀、響應迅速的用戶界面,同時在后臺執行復雜的圖像處理和目標檢測任務。
5.1 系統設計思路
????????在我們的系統設計中,我們將詳細探討設計一個交互式植物病害檢測系統的思路。我們的目標是創建一個易于使用的GUI應用程序,該應用程序能夠利用深度學習模型識別和定位圖像中的植物病害。為了實現這一目標,我們采用了一個整合界面、媒體處理和模型預測的全面設計方案。
(1)架構設計
????????在開發交互式植物病害檢與識別系統的過程中,我們的核心理念是將高效的圖像識別技術與直觀的用戶界面(UI)相結合,從而提供一個即插即用的解決方案,它能夠快速且準確地識別各種植物病害。此系統設計采用了模塊化的架構,每一部分都承擔著特定的職責,確保整個系統既高效又易于維護。
????????在我們的系統中,界面的簡潔性和直觀性至關重要,因此在界面層,我們設計了一系列用戶交互元素,使得用戶能夠輕松上傳圖像、開始檢測過程,并查看檢測結果。界面的設計不僅僅是為了美觀,更多的是為了提升用戶體驗,減少操作復雜性,確保用戶能夠在沒有技術背景的情況下也能順利使用系統。
????????為了實現圖像中植物病害的準確檢測,我們在處理層引入了YOLOv8Detector類,這是一個封裝了YOLOv8模型的處理器,能夠處理輸入的圖像并輸出檢測結果。這個預訓練的模型經過大量數據的訓練,已經具備了高精度識別植物病害的能力。在檢測過程中,系統會將圖像傳遞給這個處理器,然后快速返回包含了病害類型和位置信息的結果。
????????在控制層,我們設計了一系列槽函數,這些函數響應界面層的用戶操作,如“檢測”按鈕的點擊事件。控制層會指揮處理層執行圖像的檢測任務,并將結果反饋給界面層,更新界面上的信息顯示。我們利用PySide6的信號和槽機制來實現這種層間的通信,這種機制不僅使得代碼的組織更加清晰,還提高了各個模塊間的數據處理效率。
????????通過這種分層的設計,我們的系統不僅提高了代碼的可讀性和可維護性,而且也增強了系統的穩定性和擴展性。用戶可以直觀地進行植物病害檢測,而開發者也可以在不影響用戶體驗的情況下,輕松地對模型和界面進行升級和維護。這樣的設計思路確保了我們的系統能夠適應未來技術的發展,同時也滿足了當前用戶對于高效率和高準確率檢測系統的需求。
(2)系統流程
????????在本篇博客中,我們將探討如何使用先進的深度學習技術構建一個交互式植物病害檢測系統。這個系統能夠實時地識別和定位圖像中的植物病害,并通過友好的用戶界面顯示結果,從而為用戶提供一個全面的解決方案。
-
系統的入口是MainWindow類的實例化,它負責加載用戶界面和初始化必要的參數配置。界面的設計直觀易懂,允許用戶方便地選擇圖像輸入源。輸入源的靈活性是這個系統的一大亮點,用戶可以從實時攝像頭捕獲、視頻文件或是本地圖像庫中選擇。這為用戶在不同場景下的需求提供了廣泛的選擇。
-
一旦輸入源被選定,系統就會激活對應的媒體處理器,這些處理器負責圖像的獲取和預處理。這一階段是為了確保輸入的數據符合YOLOv8模型的要求,通過對圖像進行縮放、色彩空間轉換和歸一化等操作,為后續的檢測階段做好準備。
-
當媒體輸入源被準備好后,系統進入到連續幀處理的環節。在這個環節中,每一幀圖像都會經過預處理,然后被送入YOLOv8模型進行精確的植物病害檢測和識別。利用深度學習的強大能力,模型能夠識別出圖像中的病害特征,并給出具體的類別和位置信息。
-
隨著結果的生成,系統的界面會實時更新,不僅展示了檢測框和類別標簽,還會在界面上的圖表或條形圖中展示出檢測結果的統計數據。這樣的實時反饋使得用戶可以直觀地觀察系統的性能,并能夠根據檢測結果進行進一步的操作。
-
用戶交互是這個系統的另一個重要特點。系統提供了多種交互按鈕和菜單,用戶可以通過這些功能保存結果、查詢系統信息,甚至是篩選和分析特定的檢測數據。此外,媒體控制選項讓用戶能夠按需暫停和恢復圖像捕獲或分析,提供了更高的操作靈活性。
????????綜上所述,交互式植物病害檢測系統通過精心設計的用戶界面和強大的后端算法,實現了從數據輸入到結果輸出的全過程自動化,極大地降低了用戶操作的復雜性,提高了檢測的效率和準確性。它不僅能夠幫助用戶快速識別和處理植物病害問題,而且其設計理念和流程對于未來類似系統的開發提供了寶貴的參考。
5.2 登錄與賬戶管理
????????在當今信息化時代,賬戶管理與數據安全變得尤為重要。我們的植物病害檢測系統深刻理解到這一點,并在系統中集成了一套完善的用戶登錄與賬戶管理功能。這個功能不僅保證了用戶數據的安全性,也極大地提升了用戶體驗。
????????系統的賬戶管理是基于PySide6——一個強大的Python庫,以及SQLite——一個輕量級的數據庫系統構建的。這一結合不僅保障了系統的穩定性和數據的安全性,同時也使得界面操作直觀且響應迅速。用戶首次使用系統時,可以通過簡單的注冊流程創建自己的賬戶。注冊過程設計得既簡潔又包含必要的安全性考量,如密碼強度驗證等。
????????一旦完成注冊,用戶就能通過登錄界面訪問系統的主要功能。登錄界面的設計旨在為用戶提供一個簡單、無縫的入口,進而進入到植物病害檢測的核心功能。此外,賬戶管理系統還支持用戶在使用過程中更新個人信息,如修改密碼、設置個性化頭像,以及在需要時注銷賬戶。這些細節的考慮使得每個用戶都能擁有一個個性化且安全的使用環境,他們可以在其中保存個人的檢測記錄和偏好設置。
????????而在主界面中,用戶可以體驗到實時的植物病害檢測,系統能夠處理圖片、視頻、實時攝像頭捕獲的圖像以及批量文件輸入,并展示包括檢測框、類別和置信度在內的詳細信息。所有這些功能都緊密結合,確保用戶能夠無縫地在注冊、登錄、檢測和管理個人賬戶之間切換,從而優化整個用戶的操作流程。
????????這樣的系統設計允許用戶專注于植物病害的檢測任務,而不必擔心個人數據的安全問題。無論是在家庭農場還是在工業農業環境中,用戶都能依賴這個系統來幫助他們監測和管理植物健康。賬戶管理系統的加入,不僅讓用戶能夠保留自己的操作歷史,還能夠讓管理者在需要時進行審計和監督。這種設計思想和實現,不僅提高了系統的實用性和安全性,還為未來可能的拓展提供了堅實的基礎。
下載鏈接
????若您想獲得博文中涉及的實現完整全部資源文件(包括測試圖片、視頻,py, UI文件,訓練數據集、訓練代碼、界面代碼等),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時打包到里面,點擊即可運行,完整文件截圖如下:
完整資源中包含數據集及訓練代碼,環境配置與界面中文字、圖片、logo等的修改方法請見視頻,項目完整文件下載請見演示與介紹視頻的簡介處給出:???
演示與介紹視頻:https://www.bilibili.com/video/BV1Mr421W788/
????在文件夾下的資源顯示如下,下面的鏈接中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟件后,復制離線依賴包至項目目錄下進行安裝,另外有詳細安裝教程:(1)Pycharm軟件安裝教程;(2)Anaconda軟件安裝教程;(3)Python環境配置教程;
離線依賴安裝教程:https://www.bilibili.com/video/BV1hv421C7g8/
離線依賴庫下載鏈接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取碼:33z5)
6. 總結與展望
????????在本博客中,我們詳細介紹了一個基于YOLOv8模型的植物病害檢系統,還實驗了YOLOv7、YOLOv6、YOLOv5等模型。系統以模塊化的方式設計,充分采用了合理的架構設計,帶來良好的可維護性和可擴展性。其用戶界面友好,能夠提供實時的植物病害檢和識別結果展示,同時支持用戶賬戶管理,以便于保存和管理檢測結果和設置。
????????該系統支持攝像頭、視頻、圖像和批量文件等多種輸入源,能夠滿足用戶在不同場景下的需求。在后面可以添加更多預訓練模型,增加檢測和識別的種類;優化用戶界面,增強個性化設置;并積極聆聽用戶反饋,以期不斷改進系統,以更好地滿足用戶的需求。
結束語
????????由于博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ??
Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ??
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ??
Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ??