YOLOv5[5]作為一種輕量級且高效的目標檢測模型,在農作物害蟲檢測領域表現出了卓越的性能。研究者通過對YOLOv5模型進行微調,使其更適合于檢測小型和密集的害蟲,顯著提高了檢測的準確性和速度。此外,隨著YOLOv6和YOLOv7的推出,這些版本在模型架構和檢測機制上進行了進一步的優化,如引入了更先進的特征提取網絡和注意力機制,以提高對害蟲細微特征的識別能力。

YOLOv8[1]繼續沿襲YOLO系列的高效實時檢測特性,引入了更深的網絡架構和改進的損失函數,以提高對小型和模糊害蟲的識別能力。通過采用更加精細的特征融合策略和針對性的數據增強方法,YOLOv8在多個農作物害蟲數據集上展現出了優異的性能,特別是在處理高密度害蟲和小目標檢測方面的能力得到了顯著提升。

除了YOLO系列,Transformer模型也在害蟲檢測領域展現出了巨大的潛力。基于Transformer的視覺模型,如ViT(Vision Transformer),通過引入自注意力機制,能夠捕獲圖像中的長距離依賴關系,從而提高模型對害蟲形態和大小變化的適應性。一項研究利用ViT模型在復雜背景下的農作物害蟲檢測中取得了比傳統卷積神經網絡更高的準確率,證明了Transformer架構在處理視覺任務中的有效性。

另外,基于圖卷積網絡(GCN)的方法也開始被應用于害蟲檢測,尤其是在處理害蟲間相互關系和作物環境中的上下文信息時。GCN通過在圖結構數據上進行卷積操作,能夠有效地捕獲害蟲與其周圍環境之間的復雜交互,從而提高檢測的準確性和魯棒性。

然而,盡管取得了顯著的進展,農作物害蟲檢測系統仍面臨諸多技術挑戰,如在復雜環境下的害蟲識別準確性、小型害蟲的檢測難度、算法的實時性能優化等。未來的研究趨勢可能集中在算法的進一步優化、多模態數據融合技術的應用、以及模型的輕量化和硬件優化上,以適應移動設備和邊緣計算設備,實現更廣泛的現場應用。

本博客的核心工作在于基于最先進的YOLOv8算法構建了一個先進的農作物害蟲檢測系統。通過細致地介紹算法原理、展示系統界面、提供代碼實現,并分享開發過程,本文旨在為讀者提供一份全面的指南,以促進農作物害蟲檢測技術的研究和應用。本文的主要貢獻總結如下:

  1. 采用先進的YOLOv8算法:我們不僅采用了最新的YOLOv8算法來構建農作物害蟲檢測系統,還詳細比較了YOLOv8與其前身YOLOv7[3]、YOLOv6[2]、YOLOv5等算法在效率和精準度方面的性能。這一比較為研究社區提供了寶貴的參考,顯示了YOLOv8在農作物害蟲檢測方面的優越性能。
  2. 利用PySide6實現友好的用戶界面:本文深入探討了如何利用Python的PySide6庫開發一個美觀、用戶友好的農作物害蟲檢測系統界面。通過提供直觀便捷的操作方式,該系統極大地促進了YOLOv8算法在實際應用中的普及和應用,同時推動了技術的實際落地。
  3. 集成登錄管理功能:系統設計中融入了登錄管理功能,旨在提高系統的安全性,并為將來引入更多個性化功能奠定基礎。這一設計思路不僅提升了用戶體驗,還為系統的后續升級和功能擴展提供了可能。
  4. 深入研究YOLOv8模型性能:本文不僅應用了YOLOv8算法進行農作物害蟲檢測,還對其性能進行了深入分析,包括精確度、召回率等關鍵指標的評估,以及模型在不同環境和條件下的性能分析。這些研究為深入理解YOLOv8算法提供了全面的視角,并為算法的進一步優化提供了堅實的基礎。
  5. 提供完整的數據集和代碼資源:為了讓讀者能夠更好地理解和應用YOLOv8及其前身版本在農作物害蟲檢測系統中的操作,本文提供了包含訓練和測試所需的完整數據集以及系統實現的完整代碼資源包。通過這些資源,讀者可以輕松復現實驗結果,并在此基礎上開展進一步的研究和開發工作。

1. 數據集介紹

在構建高效的農作物害蟲檢測系統時,一個詳細標注和均衡分布的數據集是至關重要的。本研究使用的數據集含有6971張圖像,這些圖像被分配為6084張訓練圖像,770張驗證圖像,以及117張測試圖像。這樣的分布確保了模型在學習過程中能接觸到足夠多的樣本,同時留有獨立的數據用于驗證和測試模型的泛化能力,確保其在未知數據上也能保持良好表現。

數據集的圖像經過了精心的預處理和增強。每張圖像都被調整到640×640像素,確保了輸入到模型中的圖像尺寸一致,這對于保持訓練過程中的穩定性非常重要。為了提高模型的魯棒性和適應性,我們對數據集應用了兩種常見的圖像增強技術:一是以50%的概率進行水平翻轉,二是進行了-15到+15度的隨機旋轉。這些變換不僅擴充了數據集,還增加了模型對于害蟲在不同方向和角度下的識別能力。

通過對數據集分布的分析圖可知,我們的數據集包括多個不同的害蟲類別,從常見的蚜蟲、葉螨到更為特殊的害蟲如白粉虱和夜蛾,確保了害蟲檢測系統能覆蓋廣泛的害蟲種類。數據集中的害蟲實例分布較為均勻,有利于避免模型在訓練時出現過于偏向某一類害蟲的情況,這也有助于提升模型在實際應用中的準確性和可靠性。

進一步的分布分析揭示了害蟲標注的位置和大小信息。從標注的邊界框中我們可以觀察到,大多數害蟲出現在圖像的中心位置,這與農作物害蟲實際出現的情況相吻合。邊界框的大小分布圖顯示,大部分害蟲在圖像中占據的面積較小,這對檢測算法提出了更高的要求,因為模型必須能夠精確識別圖像中的小目標。此外,博主使用的類別代碼如下:

Chinese_name = {"Hellula undalis": "小菜蛾", "Leaf Webber": "葉網蛾", "ash weevil": "灰象甲", "blister beetle": "水泡甲蟲",
"fruit fly": "果蠅", "fruit sucking moth": "吸果蛾","helicoverpa": "棉鈴蟲", "leucinodes": "茄果螟",
"mealy bug": "粉虱","pieris": "菜粉蝶","plutella": "小菜蛾","root grubs": "根蛆","schizaphis graminum": "禾谷縊管蚜",
"uroleucon compositae": "合頭菊蚜","whitefly": "白粉虱"}

綜上所述,本研究提供的數據集不僅豐富了農作物害蟲檢測的數據資源,也為如何構建和評估一個高效的害蟲檢測系統提供了實際的案例和有力的證據。通過本文所述的預處理和增強手段,以及對數據分布的分析,研究人員和實踐者可以更好地理解如何處理和利用這類數據,為實現精準農業和保障糧食安全做出貢獻。

2. 系統界面效果

系統以PySide6作為GUI庫,提供了一套直觀且友好的用戶界面。下面,我將詳細介紹各個主要界面的功能和設計。

(1)系統提供了基于SQLite的注冊登錄管理功能。用戶在首次使用時需要通過注冊界面進行注冊,輸入用戶名和密碼后,系統會將這些信息存儲在SQLite數據庫中。注冊成功后,用戶可以通過登錄界面輸入用戶名和密碼進行登錄。這個設計可以確保系統的安全性,也為后續添加更多個性化功能提供了可能性。

(2)在主界面上,系統提供了支持圖片、視頻、實時攝像頭和批量文件輸入的功能。用戶可以通過點擊相應的按鈕,選擇要進行農作物害蟲檢測的圖片或視頻,或者啟動攝像頭進行實時檢測。在進行農作物害蟲檢測時,系統會實時顯示檢測結果,并將檢測記錄存儲在數據庫中。

(3)此外,系統還提供了一鍵更換YOLOv8/v5模型的功能。用戶可以通過點擊界面上的”更換模型”按鈕,選擇不同的YOLOv8模型進行檢測。與此同時,系統附帶的數據集也可以用于重新訓練模型,以滿足用戶在不同場景下的檢測需求。

(4)為了提供更個性化的使用體驗,這里系統支持界面修改,用戶可以自定義圖標、文字等界面元素。例如,用戶可以根據自己的喜好,選擇不同風格的圖標,也可以修改界面的文字描述。

3. YOLOv8算法原理

YOLOv8作為最新一代的目標檢測算法,繼承并優化了YOLO系列算法的諸多特性,其中包含了一系列的創新和改進。YOLOv8的設計思想著重于提升檢測精度,加快處理速度,并且在處理大規模數據集時具有更好的穩定性。以下是YOLOv8原理的詳細介紹:

YOLOv8在繼承了YOLO系列算法的基礎上,引入了一系列新的網絡架構優化。這些優化保留了YOLO系列算法的快速檢測特性,并且通過精心設計的網絡結構,進一步提升了模型的性能。YOLOv8優化了前作YOLOv7中的CSPDarknet53網絡架構,這是一種結合了跨階段部分網絡(CSP)的設計理念和Darknet53網絡的結構,它強調了特征的重用和計算效率,從而在提升模型性能的同時,也減少了計算資源的消耗。

YOLOv8的創新之處也體現在其損失函數的設計上,它引入了一種改進的分配器——TaskAlignedAssigner,這是一個自適應的方法,它可以根據預測結果和真實標簽之間的對齊程度來調整損失。這種方法使得算法能更準確地學習到目標的大小、形狀和類別,而不僅僅是簡單地學習到害蟲的存在。此外,YOLOv8還引入了Distribution Focal Loss來改善類別不平衡問題,這是一種更為精細化的損失函數,可以更好地處理那些在數據集中出現較少,但對檢測結果影響較大的少數類別。

在性能優化方面,YOLOv8通過更智能的方式進行特征提取和特征融合,確保了模型在處理更加復雜的場景時,仍然能夠保持高效和準確。它采用了更為高級的注意力機制來強調重要特征,并通過精心設計的網絡路徑來減少計算資源的浪費。這種設計允許YOLOv8在保持高檢測準確度的同時,進一步提高模型的處理速度和穩定性。

在實際應用中,YOLOv8的這些改進確保了其在農作物害蟲檢測等實際應用場景中的高效性和準確性。它不僅可以快速準確地檢測出害蟲的存在,并且能夠在復雜的環境中保持穩定的性能。這些改進使得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框架來訓練一個YOLOv8模型,以便在農作物害蟲檢測系統中使用。這段代碼的核心思想是利用YOLOv8的強大功能,結合專為害蟲檢測準備的數據集,進行深度學習模型的訓練。接下來,我們將一步步深入解析這段代碼。

首先,我們需要引入必要的Python模塊。這包括os模塊以處理文件路徑,torch用于深度學習操作,以及yaml用于解析配置文件。此外,我們還導入了YOLO類,這是我們將要用于訓練的主要工具。接著,我們設置訓練運行的設備,自動檢測是否有可用的CUDA設備,如果沒有,則使用CPU。

import os

import torch
import yaml
from ultralytics import YOLO # 導入YOLO模型
from QtFusion.path import abs_path
device = "cuda:0" if torch.cuda.is_available() else "cpu"

然后,我們定義了工作進程的數量和批次大小,這些參數直接影響數據加載和模型訓練的速度。我們還定義了數據集的名稱,并構建了數據集配置文件的路徑。我們接下來對配置文件進行了讀取和處理,確保了模型可以找到正確的數據集路徑。

workers = 1
batch = 8

data_name = "InsectPest"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 數據集的yaml的絕對路徑
unix_style_path = data_path.replace(os.sep, '/')

緊接著的代碼段負責讀取YAML配置文件,并進行必要的修改以適配我們的數據路徑。這些細節操作確保了模型訓練中數據的正確加載。

# 獲取目錄路徑
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)

在讀取了配置文件之后,我們加載了預訓練的YOLOv8模型,并開始了訓練過程。model.train()函數被用來啟動訓練,我們傳入了數據集的路徑、設備、工作進程數量、圖像大小、訓練周期數以及批次大小等參數。

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, # 指定輸入圖像的大小為640x640
epochs=120, # 指定訓練100個epoch
batch=batch, # 指定每個批次的大小為8
name='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, # 指定輸入圖像的大小為640x640
epochs=120, # 指定訓練100個epoch
batch=batch, # 指定每個批次的大小為8
name='train_v8_' + data_name # 指定訓練任務的名稱
)

在博客的這一部分中,我們展示了從數據準備到模型訓練的整個過程。通過這一詳細的步驟介紹,讀者可以了解如何使用YOLOv8模型進行深度學習訓練,特別是在農作物害蟲檢測這一實際應用領域。

在深度學習模型的訓練過程中,損失函數和評價指標的分析是至關重要的。通過觀察這些圖像,我們可以了解模型在訓練過程中的表現及其對數據的學習效果。下面,我們將對YOLOv8模型在訓練時的損失函數圖像進行詳細分析。

首先,損失函數圖表展示了模型在訓練和驗證階段的表現。對于訓練損失,我們看到train/box_loss、train/cls_loss和train/obj_loss隨著訓練周期的增加而顯著下降,這表明模型在邊界框定位、類別識別和目標檢測方面的性能都在不斷提升。這種下降趨勢表明模型的預測與真實標簽之間的誤差正在減小,模型正在逐漸學會如何從輸入圖像中準確識別和定位害蟲。

在驗證損失中,我們觀察到與訓練損失類似的下降趨勢,val/box_loss、val/cls_loss和val/obj_loss也都表現出了下降的趨勢,這進一步表明模型在未見過的數據上也具有良好的泛化能力。這是非常重要的,因為這意味著模型不僅能在訓練數據上表現良好,也能在新的、未知的數據上取得好的結果。值得注意的是,驗證損失的下降趨勢平滑且逐漸趨于穩定,這表示模型在訓練過程中沒有出現過擬合的現象。

接下來,我們分析模型的精確度和召回率。從metrics/precision和metrics/recall的圖表中可以看出,模型的精確度和召回率都隨著訓練的進行而逐步提升,最終達到了非常高的水平。精確度的提升意味著模型在識別害蟲時越來越少地產生誤報,而召回率的提升則意味著模型漏檢害蟲的情況在減少。在害蟲檢測的應用中,高召回率尤為重要,因為漏檢可能會導致害蟲問題的延誤處理。

最后,metrics/mAP50和metrics/mAP50-95圖表顯示了模型在不同置信度閾值下的平均精確度(mAP)表現。mAP是目標檢測領域中最常用的性能評估指標之一,mAP50表示在IoU(交并比)閾值為0.5時的mAP,而mAP50-95表示在IoU從0.5到0.95的范圍內的平均mAP。這兩個指標的穩步提升表示模型在害蟲檢測任務上具有很高的準確性,能夠在不同的檢測難度上保持穩定的性能。

在使用機器學習模型,尤其是深度學習模型對目標進行分類時,評估模型性能的一個重要指標是F1分數。F1分數是精確度和召回率的調和平均,能夠平衡這兩者之間的關系,特別適合于那些正負樣本分布不平衡的情況。下圖為博主訓練農作物害蟲檢測的F1曲線圖。

從圖中我們可以看到,各個類別的F1分數在不同的置信度閾值下變化明顯。在置信度較低時,大多數類別的F1分數較高,這是因為當模型對自己的預測較不自信時,它會產生更多的正類預測,從而提高召回率,但這通常也伴隨著較低的精確度。隨著置信度閾值的提高,模型變得更加保守,只有當模型對預測較有信心時才會預測正類,這提高了精確度,但召回率可能下降,導致F1分數降低。最佳的F1分數通常出現在兩者之間的某個平衡點,對于這個特定的數據集來說,平均而言,在約0.512的置信度閾值時,所有類別的F1分數達到了0.89的高值,這是一個相對較好的結果,顯示了模型在綜合精確度和召回率方面的強大性能。

進一步觀察,每個害蟲類別的F1分數曲線呈現不同的趨勢,這反映了模型對于不同害蟲的檢測能力。例如,某些類別在較低的置信度閾值時F1分數就已經很高,而其他類別則需要更高的置信度閾值才能達到較高的F1分數。這種差異可能源自各類害蟲的視覺特征差異,一些容易識別的害蟲(如形狀、顏色具有顯著特征的害蟲)能夠被模型更準確地檢測出來,而對于那些特征不那么明顯的害蟲,則可能需要模型更加自信的預測才能達到高精度。

總結來說,這個F1分數曲線圖提供了對模型性能的深入洞察,表明了模型在各個類別上的綜合表現。一個高F1分數表明模型在保持較高召回率的同時也保持了較高的精確度,對于農作物害蟲檢測系統而言,這意味著能夠有效地減少漏檢和誤檢,為農業害蟲管理提供了有力的技術支持。

4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8對比

(1)實驗設計:

本實驗旨在評估和比較YOLOv5、YOLOv6、YOLOv7和YOLOv8幾種模型在農作物害蟲目標檢測任務上的性能。為了實現這一目標,博主分別使用使用相同的數據集訓練和測試了這四個模型,從而可以進行直接的性能比較。該數據集包含農作物害蟲的圖像。本文將比較分析四種模型,旨在揭示每種模型的優缺點,探討它們在工業環境中實際應用的場景選擇。

模型圖像大小 (像素)mAPval 50-95CPU ONNX 速度 (毫秒)A100 TensorRT 速度 (毫秒)參數數量 (百萬)FLOPs (十億)
YOLOv5nu64034.373.61.062.67.7
YOLOv8n64037.380.40.993.28.7
YOLOv6N64037.54.711.4
YOLOv7-tiny64037.46.0113.1

(2)度量指標:

名稱YOLOv5nuYOLOv6nYOLOv7-tinyYOLOv8n
mAP0.9250.9180.8840.918
F1-Score0.880.880.840.89

(3)實驗結果分析:

在本次對比分析中,我們關注的是在相同數據集上,YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n這四個版本的性能對比。通過對兩個關鍵性能指標——mAP和F1-Score的觀察,我們可以獲得每個版本在害蟲檢測任務上的性能表現。

首先,從mAP指標來看,YOLOv5nu以0.925的成績表現最優,這表明在檢測任務中,它能以較高的準確度檢測出更多的害蟲。緊隨其后的是YOLOv6n和YOLOv8n,兩者在mAP上的成績相同,均為0.918,表現出幾乎相同的高準確度。相比之下,YOLOv7-tiny的mAP為0.884,雖然略低,但考慮到它的“tiny”版本更注重速度和模型大小,這仍然是一個可接受的性能表現。

在F1-Score方面,評估模型在精確度和召回率之間的平衡性能時,YOLOv8n以0.89的分數領先,這反映了它在區分害蟲與非害蟲之間,以及減少漏檢和誤檢方面的優勢。YOLOv5nu和YOLOv6n在這一指標上表現相同,均為0.88,也體現了較好的平衡性。而YOLOv7-tiny的F1-Score為0.84,與mAP一致,顯示在保持較快速度的同時,犧牲了一些性能。

綜合來看,YOLOv5nu和YOLOv8n在性能上表現更為出色,尤其是YOLOv8n在F1-Score上的細微優勢可能對于那些要求更高準確性的應用場景來說至關重要。YOLOv6n在保持與YOLOv5nu相似的性能同時,可能在其他方面如速度或模型大小上有所優化。而YOLOv7-tiny作為一個輕量化版本,其性能自然不如其他版本,但在需要快速處理的場景下,可能是一個更合適的選擇。通過這樣的對比分析,我們可以根據實際應用的需求和限制,選擇最適合的YOLO版本來部署我們的害蟲檢測系統。

4.4 代碼實現

在本篇博客文章中,我們將深入探討如何使用YOLOv8模型結合Python和Qt進行實時的農作物害蟲檢測。我們的目標是創建一個交互式的桌面應用程序,它能夠通過攝像頭捕獲視頻流,并利用深度學習模型實時識別并標注出視頻中的害蟲。這不僅展示了YOLOv8模型的實時檢測能力,而且也為農業害蟲監測提供了一個現代化的解決方案。

(1)導入必要的模塊和配置

我們的代碼首先導入了必要的模塊,sys庫用于接入與Python解釋器相關的變量和函數,這對于構建應用程序是必須的。time庫允許我們記錄操作的時間,這對于評估模型預測的速度非常有用。cv2是OpenCV庫的Python接口,它提供了一系列強大的圖像處理功能。而QtWidgets和QtCore模塊則是創建圖形用戶界面(GUI)的基礎,用于布局和事件處理。

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.InsectPest.label_name import Label_list

QF_Config.set_verbose(False)

(2)創建主窗口

接下來,我們定義了MainWindow類,這是我們應用程序的主窗口。它繼承自QMainWindow類,并設置了窗口大小以及一個用于顯示圖像的QLabel控件。這個窗口將作為我們實時顯示檢測結果的畫布。keyPressEvent方法是對用戶交互的響應。當用戶按下’Q’鍵時,程序將退出,這是一個簡單的退出機制,確保用戶能夠方便地關閉應用程序。

class MainWindow(QMainWindow):  # 定義MainWindow類,繼承自FBaseWindow類
def __init__(self): # 定義構造函數
super().__init__() # 調用父類的構造函數
self.resize(850, 500) # 設置窗口的大小
self.label = QtWidgets.QLabel(self) # 創建一個QLabel對象,用于顯示圖像
self.label.setGeometry(0, 0, 850, 500) # 設置QLabel對象的幾何形狀

def keyPressEvent(self, event): # 定義keyPressEvent函數,用于處理鍵盤事件
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的鍵是Q鍵
self.close() # 關閉窗口

(3)圖像幀處理

frame_process函數是我們應用程序的核心。它首先調整攝像頭捕獲的圖像大小,然后將圖像傳遞給模型進行預處理和預測。預測完成后,使用drawRectBox函數在圖像上畫出邊界框并標記檢測到的害蟲,最后將處理后的圖像顯示在主窗口的標簽控件上。

def frame_process(image):  # 定義frame_process函數,用于處理每一幀圖像
image = cv2.resize(image, (850, 500)) # 調整圖像的大小
pre_img = model.preprocess(image) # 對圖像進行預處理

t1 = time.time() # 獲取當前時間
pred, superimposed_img = model.predict(pre_img) # 使用模型進行預測
t2 = time.time() # 獲取當前時間
use_time = t2 - t1 # 計算預測所用的時間

print("推理時間: %.2f" % use_time) # 打印預測所用的時間
det = pred[0] # 獲取預測結果
# 如果有檢測信息則進入
if det is not None and len(det):
det_info = model.postprocess(pred) # 對預測結果進行后處理
for info in det_info: # 遍歷檢測信息
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info[
'class_id'] # 獲取類名、邊界框、置信度和類別ID
label = '%s %.0f%%' % (name, conf * 100) # 創建標簽,包含類名和置信度
# 畫出檢測到的目標物
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在圖像上繪制矩形框,并添加標簽和顏色

window.dispImage(window.label, image) # 在窗口的label控件上顯示圖像

(4)農作物害蟲檢測

初始化部分涵蓋了模型加載、顏色設置、窗口創建和視頻流處理的初始化。YOLOv8模型通過YOLOv8Detector類被加載并準備用于檢測。MediaHandler負責處理視頻流,將每一幀圖像送入frame_process函數。

cls_name = Label_list   # 定義類名列表

model = YOLOv8Detector() # 創建YOLOv8Detector對象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加載預訓練的YOLOv8模型
colors = get_cls_color(model.names) # 獲取類別顏色

app = QtWidgets.QApplication(sys.argv) # 創建QApplication對象
window = MainWindow() # 創建MainWindow對象

videoHandler = MediaHandler(fps=30) # 創建MediaHandler對象,設置幀率為30
videoHandler.frameReady.connect(frame_process) # 當有新的幀準備好時,調用frame_process函數
videoHandler.setDevice(device=0) # 設置設備為0,即默認的攝像頭
videoHandler.startMedia() # 開始處理媒體流

# 顯示窗口
window.show()
# 進入 Qt 應用程序的主循環
sys.exit(app.exec())

在這個應用程序中,每當有新的視頻幀準備好時,frameReady信號都會觸發frame_process函數,實現了一個實時的農作物害蟲檢測系統。通過整合深度學習模型和圖形界面,我們提供了一個用戶友好且功能強大的工具,幫助農業工作者更好地監控和管理。

5. 農作物害蟲檢測系統實現

在構建我們的交互式農作物害蟲檢測與識別系統時,我們的設計理念是打造一個集成化、高效和用戶友好的桌面應用程序。該系統不僅能夠實時檢測并標注出害蟲,還能提供一個直觀的用戶界面以便于監控和操作。

5.1 系統設計思路

在我們的系統設計中,我們充分考慮了實際的農業場景需求,目標是為農業工作者提供一個強大的輔助工具,幫助他們在日常工作中提高害蟲管理的效率和準確性。

(1)架構設計

系統的核心是MainWindow類,它是用戶交互的主要界面。這個類不僅包含了圖形界面元素的布局,如顯示視頻流的標簽,還負責協調用戶指令與后端處理邏輯之間的交互。這樣的設計允許用戶通過簡單的操作,如按鈕點擊或鍵盤輸入,就能操控整個檢測流程,從視頻播放到實時農作物害蟲檢測的展示。

在架構設計上,我們將系統分為三個核心層次。首先是處理層,它是系統的“大腦”,由YOLOv8Detector類構成,這個深度學習模型經過預訓練,可以識別和定位圖像中的害蟲。模型的處理速度和準確度是該系統能否成功運行的關鍵。

其次是界面層,它是用戶與系統互動的“面孔”,通過Qt框架構建的UI提供了一系列直觀的交互元素,包括實時視頻顯示、檢測結果概覽以及快捷操作按鈕。用戶可以通過這些元素實時監控檢測情況,調整模型參數,或者對特定害蟲進行標注和記錄。

最后是控制層,它是連接處理層與界面層的“橋梁”,通過MainWindow類中實現的方法,響應用戶操作,控制視頻流的播放與停止,以及將檢測結果實時顯示在界面上。

整個系統的設計強調模塊化和低耦合,確保了各個部分可以獨立進行更新和維護,同時也便于未來功能的擴展。例如,如果未來出現了新的害蟲種類或者改進的檢測模型,我們可以輕松地在不影響其他部分的前提下,更新處理層的內容。此外,信號和槽機制在系統中發揮著至關重要的作用,這種機制允許我們以事件驅動的方式來處理用戶的操作和系統的響應,大大提高了程序運行的效率和用戶操作的便捷性。

通過這樣的系統設計思路,我們期望打造出一個既能滿足實時監控需求,又能為用戶提供高效害蟲管理工具的農作物害蟲檢測系統,為現代農業的智能化發展貢獻力量。

(2)系統流程

在本博客中,我們將詳細探討交互式農作物害蟲檢測系統的整體工作流程和用戶交互體驗。該系統以MainWindow類為核心,通過精心設計的用戶界面和背后強大的圖像處理及機器學習模型,提供了一種創新的農作物害蟲監測方案。

  1. 當用戶啟動應用程序時,MainWindow類的實例被創建,這是整個應用的起點。該實例初始化應用程序的界面和相關參數,為用戶提供一個交互的操作平臺。用戶首先會看到一個簡潔直觀的界面,可以在此選擇輸入源。輸入源可以是實時捕捉的圖像,這對于田間害蟲監測至關重要;也可以是視頻文件或靜態圖片,便于用戶在不同的場景下使用系統。
  2. 用戶選定輸入源后,系統會調用媒體處理器來捕捉和處理數據。這個過程可能包括配置攝像頭,讀取視頻文件或加載圖像文件。準備好媒體輸入源后,系統會進入連續幀處理的循環。首先,是預處理階段,系統對每一幀圖像進行必要的預處理,以確保圖像數據滿足YOLO模型的輸入要求,這通常包括圖像縮放、色彩空間轉換等步驟。
  3. 緊隨其后的是檢測與識別階段,此時預處理后的圖像將被送入先進的YOLOv8模型中。模型精確地識別圖像中的害蟲并輸出位置信息。這一階段是整個系統的核心,它直接決定了害蟲監測的準確性和效率。
  4. 隨著檢測結果的不斷產出,界面會實時更新。用戶可以看到每個害蟲被檢測框圈選出來,并標明類別。系統還將在界面上展示檢測統計數據,這些數據可能以表格或圖表的形式展示,便于用戶一目了然地掌握檢測情況。
  5. 系統的交互操作設計也十分人性化,用戶可以利用界面按鈕來執行多種操作,如保存當前的檢測結果,查詢系統的幫助文檔,以及篩選分析特定類別的害蟲。此外,媒體控制功能讓用戶可以方便地控制視頻播放狀態,比如啟動或暫停攝像頭捕捉,這對于現場操作尤為重要。

總之,交互式農作物害蟲檢測系統通過結合實時視頻處理技術和深度學習模型,不僅提高了害蟲監測的準確性和效率,還通過直觀的用戶界面大大提升了用戶體驗。這樣的系統設計思路充分展現了技術與實際應用的緊密結合,為農業害蟲管理領域帶來了新的解決方案。

5.2 登錄與賬戶管理

在本博客中,我們將深入探討一個結合了用戶賬戶管理和實時圖像處理功能的農作物害蟲檢測系統。該系統不僅能夠準確快速地進行害蟲識別,還提供了個性化的用戶體驗,從而大大提高了用戶的使用便利性和安全性。

系統的啟動流程非常直觀。用戶首先會進入一個由PySide6構建的登陸界面,這是一個精心設計的入口,為用戶提供了賬戶注冊、登錄和賬戶管理等選項。這個登錄系統背后由SQLite數據庫支持,能夠安全地存儲用戶信息,包括頭像、用戶名和加密的密碼等。這樣每個用戶就能擁有一個安全的個人空間,在這里他們可以存儲檢測結果和個人設置,同時還能夠修改密碼和頭像,甚至注銷賬戶。

一旦登錄,用戶將被引導至主界面,那里集成了多種深度學習模型,包括我們的YOLOv8,為多目標識別和檢測提供支持。這個強大的界面不僅實時顯示檢測框、類別和置信度等信息,還支持多種輸入形式,包括圖片、視頻、實時攝像頭捕捉和批量文件輸入。用戶可以通過這個界面實時地觀察和記錄檢測結果,而這一切都在用戶的賬戶管理保護之下進行。

我們系統的設計理念是為用戶提供一個綜合的解決方案,不僅僅是一個農作物害蟲檢測工具。系統的每個部分都圍繞著提升用戶體驗進行設計,讓用戶能夠在一個安全、可靠且易于操作的環境中,有效地管理害蟲檢測任務。無論是在家庭農場還是大規模的農業生產中,該系統都能夠滿足用戶在實時害蟲監測場景下的各種需求。


下載鏈接

若您想獲得博文中涉及的實現完整全部資源文件(包括測試圖片、視頻,py, UI文件,訓練數據集、訓練代碼、界面代碼等),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時打包到里面,點擊即可運行,完整文件截圖如下:

演示與介紹視頻:https://www.bilibili.com/video/BV11t421L79s/

在文件夾下的資源顯示如下,下面的鏈接中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟件后,復制離線依賴包至項目目錄下進行安裝,另外有詳細安裝教程:(1)Pycharm軟件安裝教程:https://www.bilibili.com/video/BV1Qm411U7ng/;

(2)Anaconda軟件安裝教程:https://www.bilibili.com/video/BV1ex4y1k7Yt/;

(3)Python環境配置教程:https://www.bilibili.com/video/BV1hv421C7g8/;

離線依賴安裝教程:最新版-Pycharm中使用離線依賴包安裝環境:https://www.bilibili.com/video/BV1hv421C7g8/

離線依賴庫下載鏈接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取碼:33z5)


6. 總結與展望

在本博客中,我們詳細介紹了一個基于YOLOv8模型的農作物害蟲檢測系統,還實驗了YOLOv7、YOLOv6、YOLOv5等模型。系統以模塊化的方式設計,充分采用了合理的架構設計,帶來良好的可維護性和可擴展性。其用戶界面友好,能夠提供實時的農作物害蟲檢測結果展示,同時支持用戶賬戶管理,以便于保存和管理檢測結果和設置。

該系統支持攝像頭、視頻、圖像和批量文件等多種輸入源,能夠滿足用戶在不同場景下的需求。在后面可以添加更多預訓練模型,增加檢測和識別的種類;優化用戶界面,增強個性化設置;并積極聆聽用戶反饋,以期不斷改進系統,以更好地滿足用戶的需求。


結束語

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

[1]: 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.

[2]: . 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.

[3]: 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.

[4]: Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944.

[5]: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.

文章轉自微信公眾號@AI技術研究與分享

上一篇:

保姆級教程:利用大模型與高德地圖API,輕松實現查找附近咖啡店

下一篇:

基于阿里云函數計算(FC)x 云原生 API 網關構建生產級別 LLM Chat 應用方案最佳實踐
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費