摘要:開發番茄成熟度檢測系統對于提高農業產量和食品加工效率具有重大意義。本篇博客詳細介紹了如何利用深度學習構建一個番茄成熟度檢測系統,并提供了完整的實現代碼。該系統基于強大的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界面+數據集)
前言
????????隨著全球人口的持續增長和食品需求的日益增加,農業生產的自動化和智能化變得尤為重要。在此背景下,精確監測作物的成熟度不僅對提高農產品的質量和產量至關重要,也對減少浪費、提高食品加工和分配效率具有顯著影響。特別是對于番茄這種廣泛種植且在全球范圍內消費量巨大的農產品,其成熟度的準確檢測對于確保產品質量、優化收獲時間和提升加工效率具有重要意義。利用先進的圖像處理和深度學習技術,如YOLO(You Only Look Once)系列算法,開發的番茄成熟度檢測系統,標志著在這一領域的技術進步。這種系統能夠實時、高效地識別不同成熟度階段的番茄,從而為農業生產提供科學的指導和決策支持。
????????隨著YOLO(You Only Look Once)系列目標檢測算法的出現和發展,已經提出了更高效、更精準的目標檢測工具。從最早的YOLO1,到YOLO90002,再到YOLOv43,YOLOv5等,這一系列的發展都在推動著目標檢測技術的進步。YOLOv64通過引入更高效的網絡架構和優化算法,進一步提高了目標檢測的速度和準確率。隨后,YOLOv75在此基礎上加入了更先進的特征融合技術和自適應錨點匹配機制,顯著提升了模型在復雜環境下的泛化能力和穩定性。YOLOv86則是在此之上,通過深度學習算法的細粒度優化,如自動學習的損失函數和動態數據增強技術,進一步提升了檢測的準確性和模型的魯棒性。
????????視覺變換器(ViT),作為一種基于自注意力機制的圖像處理模型,通過對圖像分塊處理并將其視為序列數據,展示了與傳統卷積神經網絡(CNN)不同的視角和優勢。ViT在處理大規模圖像數據集時顯示出了優異的性能,其對于圖像中各部分的全局理解能力,使其在細粒度的圖像識別任務中,例如精確區分不同成熟度階段的番茄,具有潛在的應用價值。
????????注意力機制,尤其是在Transformer架構中的應用,通過賦予模型對圖像特定部分的“關注”能力,極大地提升了模型對圖像細節的識別能力。這一機制在處理復雜背景中的目標檢測任務時表現出了巨大的潛力,使模型能夠更加聚焦于與任務密切相關的圖像區域,從而提高檢測的準確率和效率。
????????除上述技術外,其他目標檢測算法如Faster R-CNN、SSD(Single Shot MultiBox Detector)和Mask R-CNN等,通過不同的機制實現對圖像中目標的精確識別和定位。這些算法各有特點,如Faster R-CNN在準確率上的優勢、SSD在速度和效率上的平衡、Mask R-CNN在實例分割方面的應用能力,均為農業目標檢測任務提供了多樣化的技術選擇。
????????近年來,研究者通過對這些算法的改進和優化,以及訓練數據集的擴充和精細化,顯著提升了農業目標檢測的性能。然而,將這些先進技術應用于實際的農業生產中,尤其是在復雜多變的自然環境下進行高效的番茄成熟度檢測,仍然面臨著一系列技術挑戰。這包括如何進一步提高算法的檢測準確率和實時性,如何優化模型以適應不同的光照條件和背景干擾,以及如何降低系統的整體成本以便于大規模應用。
????????本博客通過詳盡地探討YOLOv8算法在番茄成熟度檢測系統中的應用,為相關領域的研究者和技術實踐者提供了一份寶貴的資源和深入的見解。本文的貢獻不僅體現在采用先進的深度學習算法進行精確檢測,還在于為讀者呈現了一個結合了技術深度與實用性的全面研究。具體貢獻如下:
- 采用最先進的YOLOv8算法:本文不僅引入了當前最先進的目標檢測算法YOLOv8進行番茄成熟度的精確檢測,而且還對比了該算法與其前版本YOLOv7、YOLOv6、YOLOv5的性能。通過這種對比,本文展示了YOLOv8在處理速度、準確率等關鍵性能指標上的顯著優勢,為番茄成熟度檢測提供了更為高效和精準的技術方案。
- 利用PySide6實現友好的用戶界面:通過采用PySide6庫,本文成功開發了一個用戶友好的界面,使得番茄成熟度檢測變得更加直觀和便捷。這一創新不僅提高了系統的可用性,也為推廣YOLOv8算法及其在農業領域的應用奠定了基礎。
- 集成登錄管理功能:本文設計的登錄管理功能,增強了系統的安全性,并為將來引入更多個性化服務提供了擴展性。這一設計思路體現了對用戶體驗的深入考慮,以及對系統可持續發展的前瞻性規劃。
- 對YOLOv8模型的深入研究:本文不僅應用了YOLOv8算法,還對其性能進行了全面的評估和分析,包括精準度、召回率等關鍵指標的細致探討。這種深入的技術研究為了解和優化YOLOv8算法提供了堅實的基礎,對于促進該算法在農業視覺系統中的廣泛應用具有重要意義。
- 提供完整的數據集和代碼資源包:本文所提供的詳細數據集和完整的代碼資源包,極大地降低了技術門檻,使得讀者能夠輕松復現研究結果,并在此基礎上進行進一步的研究和開發。這種開放的資源分享精神,不僅促進了學術交流,也為技術創新提供了動力。
1. 數據集介紹
????????在這個博客章節中,我們將詳細介紹為番茄成熟度檢測系統構建的專用數據集。我們的數據集涵蓋了6371張精選圖像,分布在訓練集(5520張)、驗證集(566張)和測試集(285張)中。這一數據集的規模確保了深度學習模型能夠在多樣化的數據上進行訓練,學習到復雜的特征,從而提升其在實際應用中的準確度和魯棒性。
????????數據集中的圖像經過了仔細的預處理,包括自動校正像素數據的定向,并剝離了EXIF方向信息,保證圖像的統一性和方向的一致性。為了適應YOLOv8算法的需求,所有圖像都被調整到640x640像素的統一尺寸,雖然這一調整可能會導致形狀的略微變形,但實驗表明,深度學習模型能夠適應這種變化,并從中學習到有效的特征。
????????在數據增強方面,我們采取了多項措施來提升模型的泛化能力。圖像在處理過程中有50%的概率會進行水平翻轉,以及有均等的概率進行90度的旋轉(無旋轉、順時針、逆時針)。這樣的隨機性處理不僅模擬了現實世界中物體可能出現的各種方向,也使得模型在遇到不同方向的圖像時能夠保持穩定的檢測性能。
????????通過對邊界框分布的分析,我們發現數據集中的對象大多位于圖像中心,這種集中趨勢可能會使得模型在識別邊緣區域的對象時效果不佳。因此,我們考慮引入圖像平移等數據增強方法,以確保模型能夠均衡地學習到圖像各個部位的特征。此外,邊界框的形狀分布分析顯示了圖像中對象的高度和寬度比例偏向于寬型,這反映出數據集中的番茄多以水平方向拍攝。為了培養模型對各種形狀邊界框的識別能力,我們將在后續工作中引入不同比例的邊界框,以進一步增強模型的適應性。
????????我們的數據集聚焦于三個主要類別:綠色未成熟番茄、紅色成熟番茄和受損番茄。類別分布呈現出紅色番茄數量最多,受損番茄次之,綠色番茄最少。這種不均勻的分布可能導致模型在訓練過程中對紅色番茄的識別能力更強。因此,我們可能需要在后續的研究中采用樣本平衡技術,以避免模型對某一類別過度擬合。博主使用的類別代碼如下:
Chinese_name = {"Green": "綠色", "Red": "紅色", "damaged": "損壞"}
????????綜合這些特點,本數據集不僅在數量上滿足深度學習模型的訓練需求,而且在質量上也進行了深思熟慮的設計。經過精細的預處理和增強,數據集能夠支持番茄成熟度檢測系統的開發,幫助模型在各種條件下都能準確判斷番茄的成熟度。
2. 系統界面效果
????????系統以PySide6作為GUI庫,提供了一套直觀且友好的用戶界面。下面,我將詳細介紹各個主要界面的功能和設計。
(1)系統提供了基于SQLite的注冊登錄管理功能。用戶在首次使用時需要通過注冊界面進行注冊,輸入用戶名和密碼后,系統會將這些信息存儲在SQLite數據庫中。注冊成功后,用戶可以通過登錄界面輸入用戶名和密碼進行登錄。這個設計可以確保系統的安全性,也為后續添加更多個性化功能提供了可能性。
(2)在主界面上,系統提供了支持圖片、視頻、實時攝像頭和批量文件輸入的功能。用戶可以通過點擊相應的按鈕,選擇要進行番茄成熟度檢測的圖片或視頻,或者啟動攝像頭進行實時檢測。在進行檢測時,系統會實時顯示檢測結果,并將檢測記錄存儲在數據庫中。
(3)此外,系統還提供了一鍵更換YOLOv8模型的功能。用戶可以通過點擊界面上的"更換模型"按鈕,選擇不同的YOLOv8模型進行檢測。與此同時,系統附帶的數據集也可以用于重新訓練模型,以滿足用戶在不同場景下的檢測需求。
(4)為了提供更個性化的使用體驗,這里系統支持界面修改,用戶可以自定義圖標、文字等界面元素。例如,用戶可以根據自己的喜好,選擇不同風格的圖標,也可以修改界面的文字描述。
3. YOLOv8算法原理
????????YOLO(You Only Look Once)算法自從提出以來,就以其快速的檢測速度和良好的實時性能,在目標檢測領域引起了廣泛的關注。YOLOv8作為這一系列算法的最新迭代版本,它在原有YOLOv7的基礎上進行了一系列的創新和優化,致力于進一步提高目標檢測的準確性和速度,同時減少計算資源的消耗。
????????YOLOv8沿用了YOLO系列的核心設計思想,即在單次前向傳播過程中同時預測目標的類別和位置。它繼承了YOLOv5的多尺度預測結構,通過不同尺寸的特征圖來檢測不同大小的對象,但在此基礎上進行了關鍵的技術革新。YOLOv8通過引入更先進的網絡架構,如ELAN(Efficient Layer Aggregation Network)和更復雜的損失函數,例如Distribution Focal Loss,進一步提升了檢測的準確性。
????????在YOLOv8中,ELAN網絡架構通過更高效的層級聚合機制,加強了不同尺度特征的信息融合。與傳統的特征金字塔網絡(FPN)相比,ELAN能夠在保持網絡深度和寬度的同時,更有效地促進了不同層級特征之間的交流,這有助于模型捕獲更豐富的語義信息和細節特征。這種設計尤其對于檢測小目標和在復雜背景中的目標具有顯著優勢。
????????另一方面,Distribution Focal Loss為YOLOv8帶來了另一項創新。與傳統的Focal Loss不同,它不僅關注于區分正負樣本,而且還關注于正樣本的概率分布。通過調整模型預測的概率分布,使其更接近實際的目標分布,從而減少了模型在學習中的不確定性,并增強了模型對不同類別目標的區分能力。
????????此外,YOLOv8在算法內部還采用了TaskAlignedAssigner,這是一種任務對齊分配器,它優化了目標與錨點(Anchor Boxes)之間的對齊過程。通過這種精細的錨點分配機制,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/val_178.jpg")
image = cv_imread(img_path)
????????在讀取了圖像文件之后,將圖像大小調整為850x500,并對圖像進行預處理,就可以使用模型進行預測了。
image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image)
pred, superimposed_img = model.predict(pre_img)
4.2 模型訓練
????????在模型訓練部分,首先導入YOLO模型,并加載了預訓練的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
????????賦值data_name,獲取數據集的yaml的絕對路徑。
data_name = "TomatoRipeness"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 數據集的yaml的絕對路徑
unix_style_path = data_path.replace(os.sep, '/')
????????接著開始訓練模型。其中指定了訓練數據的配置文件路徑,使用CPU進行訓練,使用2個工作進程加載數據,輸入圖像的大小為640x640,訓練100個epoch,每個批次的大小為8。
results = model.train( data=data_path, device='cpu', workers=2, imgsz=640, epochs=100, batch=8, name='train_v8_' + data_name
)
????????在深度學習模型的訓練過程中,損失函數的趨勢和最終評價指標是評估模型性能的關鍵。通過對YOLOv8模型訓練過程中的各項損失和性能指標的分析,我們可以深入理解模型的學習效果和優化空間。
????????首先,觀察到訓練過程中的邊界框損失(box_loss)、分類損失(cls_loss)和分布式焦點損失(dfl_loss)均呈現出隨著訓練輪次增加而逐漸下降的趨勢。這表明模型在識別物體位置、分類準確性以及預測分布上的性能都隨著時間的推移而穩步提升。尤其值得注意的是,驗證集上的損失下降趨勢與訓練集保持一致,這表明模型具有良好的泛化能力,并未出現過擬合現象。在分類損失中,我們可以看到經過100個訓練輪次后,損失值穩定在一個較低的水平,這說明模型在區分不同類別上表現出了較高的準確性。而分布式焦點損失的下降更為顯著,這種損失的降低直接關聯到模型在預測目標類別概率分布時的精確度,其快速下降說明模型在這方面學習得相當有效。
????????再來看評價指標,精確度(precision)和召回率(recall)在訓練過程中波動較大,但總體趨勢是向上提升的。這種波動可能是由于模型在各個訓練階段對不同難度樣本的學習效果不同所致。盡管如此,隨著訓練的深入,模型對于正樣本的識別能力在提升,能夠找到更多真正的目標物體,同時保持較少的誤識別。
????????mAP(mean Average Precision)是綜合考量模型識別精度和召回率的指標,尤其是mAP50和mAP50-95。mAP50指的是IOU(Intersection Over Union)閾值為0.5時的平均精度,而mAP50-95則考慮了從0.5到0.95不同IOU閾值下的平均表現。從mAP50和mAP50-95的趨勢圖中可以看出,模型在不同IOU閾值下的表現都呈現穩定提升的趨勢,其中mAP50的增長較為明顯。這表明模型在捕獲目標的準確性方面做得很好,即使是在更嚴格的IOU閾值下,模型的表現也在穩步提高。
????????F1得分是一個重要的統計指標,用于衡量模型的精確度和召回率的平衡,特別是在數據集類別分布不均時。它是精確度和召回率的調和平均數,最高可能的F1得分為1(完美精確度和召回率),最低可能為0。通常,隨著置信度閾值的增加,精確度會上升而召回率下降,F1得分則反映了這兩個指標之間的平衡。
???????? 從曲線圖中可以看出,模型在不同的置信度閾值下對三個類別(綠色、紅色、受損)的檢測表現。整體而言,當置信度較低時,模型的召回率較高,但隨著置信度閾值的提高,F1得分呈現先升后降的趨勢,這說明模型開始更加謹慎地標記正類,同時也遺漏了一些真實的正類。具體來看,綠色番茄在所有類別中F1得分最高,表明模型在檢測綠色番茄方面擁有較好的精確度和召回率平衡。受損番茄的F1得分略低,這可能是由于受損番茄的特征比綠色和紅色番茄更難以區分,導致精確度和召回率有所下降。紅色番茄的F1得分最低,可能因為數據集中紅色番茄的數量較多,使得模型在高置信度時過于保守,而錯過了一些正確的紅色番茄標記。
???????? 在整體性能上,所有類別的F1得分最高點出現在置信度大約為0.46時,這個點提供了一個平衡點,在這個置信度閾值下,模型達到了精確度和召回率的最佳平衡,這對于實際應用中的閾值設置具有指導意義。值得注意的是,曲線在置信度閾值較高時急劇下降,這表明隨著置信度的提高,模型錯過了越來越多的正類,精確度的提升并不能補償召回率的顯著下降。
???????? 總的來說,這些F1-Confidence曲線為我們提供了模型性能的深入視角,使我們能夠找到最佳的置信度閾值以優化模型的整體性能。在實際應用中,我們可能需要根據實際情況調整置信度閾值,以確保在精確度和召回率之間取得最佳平衡,從而在確保檢測準確性的同時最大限度地減少遺漏真實目標的風險。通過這種方式,我們的番茄成熟度檢測系統將能夠更加精準地輔助農業生產決策,提高整體效率和產出質量。
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.911 | 0.886 | 0.904 | 0.905 |
F1-Score | 0.80 | 0.79 | 0.83 | 0.81 |
(3)實驗結果分析:
??????? 本次實驗在相同的數據集上對比了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四個不同的算法版本。通過使用F1-Score和mAP(mean Average Precision)作為評價指標,我們可以深入了解每個版本在具體任務上的性能差異。
??????? YOLOv5nu以0.911的mAP值領先,其次是YOLOv7-tiny和YOLOv8n,都達到了0.9以上的水平,而YOLOv6n的mAP值略低,為0.886。這說明在相同條件下,YOLOv5nu在整體檢測精度上略勝一籌,而YOLOv7-tiny和YOLOv8n則表現出相近的精確度。然而,單單mAP值并不能全面反映模型的性能。F1-Score作為精確度和召回率的調和平均,能夠提供更全面的性能評估。在這個指標上,YOLOv7-tiny以0.83的得分位居首位,顯示了其在精確度和召回率的平衡上具有最佳表現。YOLOv8n以0.81的F1-Score緊隨其后,而YOLOv5nu和YOLOv6n分別為0.80和0.79。這表明盡管YOLOv5nu在mAP值上略高,但在精確度和召回率的綜合考慮上,YOLOv7-tiny表現更加出色。
??????? 總體來看,每個版本的YOLO算法都有其優勢和不足。YOLOv5nu在mAP值上展現了較高的檢測精度,但在F1-Score上則略遜于YOLOv7-tiny,后者在兩個指標上都表現相當均衡,顯示了其對于精確度和召回率的優秀把握。YOLOv8n雖然在mAP上與YOLOv7-tiny相近,但在F1-Score上略低,這可能是由于它在召回率上的表現不如YOLOv7-tiny。YOLOv6n雖然在兩個指標上都是最低的,但它的表現仍然是可圈可點的。
???????在實際應用中,選擇哪個版本的YOLO算法可能取決于具體的應用場景和需求。如果追求更高的檢測精度,YOLOv5nu可能是更好的選擇;而如果需要更好的精確度和召回率的平衡,YOLOv7-tiny可能是更優的選擇。YOLOv8n作為最新的版本,在未來的優化和迭代中有望在各項指標上取得進一步的提升。因此,在做出決策時,我們需要根據任務的特點和性能需求,綜合考量各個版本的優勢和局限。
4.4 代碼實現
????????在這一節中,我們將詳細介紹如何利用YOLOv8檢測算法的Python實現來識別和分類不同成熟度的番茄。此系統采用的是深度學習的方法,具體是通過調用YOLOv8模型來實現目標檢測的任務。
(1)引入必要的庫
????????首先,需要導入必要的Python庫,如圖像處理庫OpenCV和用于創建圖形用戶界面的PySide6。同時,我們利用自定義的QtFusion模塊來構建窗口和處理圖像顯示。我們使用random生成隨機顏色,用于在圖像上標記不同的類別。sys和time用于處理系統級別的操作和時間記錄。
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模型并進行目標檢測
QF_Config.set_verbose(False)
(2)設置主窗口
????????接著,我們定義了一系列的類和函數來構建應用程序的界面。MainWindow類繼承自QMainWindow,提供了一個基本的窗口框架。在這個類中,我們設置了窗口大小和布局,并定義了按鍵事件的處理,例如按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)初始化檢測模型和設備
????????隨后,我們創建了YOLOv8Detector對象,并加載了預訓練的模型。這是實現番茄成熟度檢測的核心。我們定義了目標類別的名稱,以及為每個類別分配了一個隨機顏色,以便在圖像上標記時能夠區分。
cls_name = ["綠色", "紅色", "損壞"] # 定義類名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 為每個目標類別生成一個隨機顏色model = YOLOv8Detector() # 創建YOLOv8Detector對象
model.load_model(abs_path("weights/tomato-yolov8n.pt", path_type="current")) # 加載預訓練的YOLOv8模型
(4)番茄成熟度檢測
????????最后,我們初始化了應用程序,并加載了待檢測的圖像。通過調用model.predict函數,我們對圖像進行了預測,并使用drawRectBox函數在圖像上繪制了檢測到的目標的邊界框和類別標簽。
if __name__ == '__main__': # 如果當前模塊是主模塊app = QtWidgets.QApplication(sys.argv) # 創建QApplication對象window = MainWindow() # 創建MainWindow對象img_path = abs_path("test_media/TomatoRipeness_SIXU_A00012.jpg") # 定義圖像文件的路徑image = cv_imread(img_path) # 使用cv_imread函數讀取圖像image = cv2.resize(image, (850, 500)) # 將圖像大小調整為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())
????????以上代碼展示了如何創建一個交互式的圖形用戶界面來展示YOLOv8檢測模型的結果。從圖像預處理、模型推理到最終的圖像展示,整個流程旨在提供一個直觀的方式來驗證和展示我們的番茄成熟度檢測系統的性能。
5. 番茄成熟度檢測系統實現
????????在實現一款實時番茄成熟度檢測系統時,我們設計的核心理念旨在打造一個直觀、易操作且功能強大的用戶界面,從而使得用戶能夠無縫地進行番茄成熟度的檢測和分析。為了實現這一點,我們將整個系統構建為一個綜合平臺,其中精心設計的MainWindow類扮演著中心角色,不僅負責界面呈現,還協調后臺的檢測處理流程。
5.1 系統設計思路
????????MainWindow類的設計采納了模塊化的思想,確保了各個組件——無論是圖像處理部分、用戶交互界面,還是深度學習模型——都能獨立運作,同時又能協同工作,共同完成復雜的番茄成熟度檢測任務。這種設計不僅提高了系統的靈活性和可維護性,也使得將來的升級和功能擴展變得更加容易。
架構設計
????????我們的系統設計遵循了經典的MVC(Model-View-Controller)架構模式,將應用程序劃分為三個核心組件:模型(Model)、視圖(View)和控制器(Controller),分別對應我們的處理層、界面層和控制層。
- 處理層(Processing Layer):在處理層,我們部署了YOLOv8Detector類,這是一個強大的目標檢測引擎,內置有預訓練的深度學習模型。該模型經過專門訓練,能夠準確識別和分類不同成熟度階段的番茄。它的處理能力是檢測系統效能的關鍵,確保了在各種條件下都能獲得高準確率的檢測結果。
- 界面層(UI Layer):對于界面層,我們利用Qt框架設計了一個直觀的UI,其中包括圖像展示窗口、狀態指示器和控制按鈕。這個用戶界面不僅美觀,而且反應迅速,能夠實時顯示檢測結果,為用戶提供了一種互動體驗,使得檢測過程變得既簡單又有趣。
- 控制層(Control Layer):在控制層,通過MainWindow類中的方法和槽函數來響應用戶的輸入,管理數據流動以及控制檢測過程。例如,用戶可以通過點擊按鈕來上傳待檢測的番茄圖像,控制層將接收這一命令,調用處理層的檢測功能,并將結果返回給界面層進行展示。這種事件驅動的設計模式,確保了用戶操作的每一步都能得到系統的即時響應和反饋。
????????整體而言,番茄成熟度檢測系統的設計思路是以用戶為中心,力求在操作簡便性和技術先進性之間找到完美平衡。無論是技術專家還是非專業用戶,都能夠輕松上手,利用這一系統來完成對番茄成熟度的準確檢測。
系統流程
????????我們將深入了解系統的工作流程,這是確保用戶能夠高效且準確地檢測不同成熟階段番茄的關鍵。從啟動應用程序到展示最終檢測結果,每一步都經過精心設計,以提供最佳的用戶體驗和檢測性能。以下是番茄成熟度檢測系統的工作流程:
- 當用戶啟動我們的應用程序時,系統會實例化MainWindow類,這是整個應用的中心和用戶的第一接觸點。MainWindow類的實例化過程中,會設置好用戶界面,并加載必要的配置參數。這個階段是整個系統運行的起點,它不僅為用戶提供了一個直觀易懂的操作界面,還確保了系統后續流程的順利執行。
- 用戶在應用程序的界面中會看到多種選項來選擇輸入源,無論是實時攝像頭捕捉的圖像、本地視頻文件還是圖像文件。這為用戶提供了靈活的選擇,可以根據實際需要和場景來決定最合適的輸入源。選擇完輸入源后,系統將根據用戶的選擇調用相應的媒體處理器和方法來處理數據,這可能涉及到攝像頭配置的調整或是文件的加載等操作。
- 一旦輸入源準備就緒,系統將進入一個連續的幀處理循環。首先是預處理階段,系統會對輸入的每一幀圖像進行一系列預處理操作,包括調整尺寸和顏色空間轉換等,以滿足YOLO模型的輸入要求。預處理后的圖像將進入檢測與識別階段,這一階段是核心,YOLOv8模型將對圖像進行分析,準確檢測出圖中的番茄,并判斷其成熟度。
- 隨著檢測結果的不斷產出,界面將實時更新。用戶將看到檢測框標注在圖像上的番茄位置,同時,成熟度類別也會清晰顯示。此外,界面還會提供統計數據的視覺展示,如條形圖或表格,使用戶能夠直觀地了解檢測結果的整體分布和詳細信息。
- 用戶交互是我們系統設計的另一個重要方面。界面中的按鈕和控件允許用戶執行多種操作,如保存結果、獲取系統信息以及過濾特定結果等。這些交互功能不僅提高了用戶的操作便利性,也使得用戶能夠更深入地分析和利用檢測數據。
- 最后,媒體控制也是用戶體驗的一部分。用戶可以根據需要控制輸入源的播放狀態,包括開始或停止實時捕捉、視頻播放或暫停圖像分析。這種控制能力為用戶提供了操作的靈活性,并允許他們根據實際情況調整檢測流程。
????????番茄成熟度檢測系統的設計旨在通過簡潔直觀的界面、高效準確的檢測流程和豐富的用戶交互,為用戶提供一個全面且高效的檢測平臺。無論是農業工作者還是研究人員,都可以依靠這個系統來提高番茄分類和成熟度檢測的準確性與效率。
5.2 登錄與賬戶管理
????????在我們的交互式番茄成熟度檢測系統中,不僅將先進的深度學習技術應用于農業領域的實際問題,還為用戶提供了一個全面的賬戶管理系統,確保了使用體驗的個性化和數據管理的便利性。為了讓每個用戶都能擁有個性化的使用體驗并方便地管理自己的數據,我們整合了一個完整的用戶賬戶系統。
????????系統的登錄和賬戶管理界面采用了PySide6框架構建,后端數據存儲則依賴于SQLite數據庫,這種輕量級的數據庫足以滿足我們的應用場景。用戶首次使用系統時,可以通過用戶友好的界面輕松注冊新賬戶,創建個人的賬戶信息,包括設置密碼和上傳個人頭像。此外,用戶還能在任何時候修改密碼、更新頭像、注銷賬戶或重新登錄,所有這些操作都通過直觀的圖形用戶界面完成。
????????這些賬戶管理功能不僅提升了系統的安全性,還增加了操作的便捷性。用戶可以在自己的賬戶中保存檢測結果,無論是圖像、視頻還是實時攝像頭捕獲的內容,都可以被系統記錄下來,并且僅對本人開放。這樣一來,用戶就能夠在任何時候回顧和分析自己之前的檢測記錄,無需擔心數據丟失或是被他人訪問。
????????主界面設計上,我們注重實用性與信息展示的清晰度。在進行番茄成熟度檢測時,用戶會在主界面中實時看到包括檢測框、類別和置信度在內的詳細信息。此外,系統支持多種輸入方式,用戶可以上傳靜態圖片,也可以輸入視頻文件,甚至是實時的攝像頭數據流。這些靈活的輸入選項,使得系統能夠適應不同用戶的不同需求。
????????整體來看,我們的系統不僅僅是一個單一功能的應用程序,而是一個綜合性的解決方案。通過精心設計的用戶賬戶管理功能,我們的系統滿足了用戶在數據管理、個性化設置以及安全性方面的需求。無論是農業工作者想要分析作物成熟度,還是研究人員希望進行數據收集,番茄成熟度檢測系統都能夠提供一個可靠、高效和個性化的平臺。
下載鏈接
????若您想獲得博文中涉及的實現完整全部資源文件(包括測試圖片、視頻,py, UI文件,訓練數據集、訓練代碼、界面代碼等),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時打包到里面,點擊即可運行,完整文件截圖如下:
完整資源中包含數據集及訓練代碼,環境配置與界面中文字、圖片、logo等的修改方法請見視頻,項目完整文件下載請見演示與介紹視頻的簡介處給出:???
演示與介紹視頻:https://www.bilibili.com/video/BV1ki421Z7G8/
????在文件夾下的資源顯示如下,下面的鏈接中也給出了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模型的實時番茄成熟度檢測系統。系統以模塊化的方式設計,充分采用了合理的架構設計,帶來良好的可維護性和可擴展性。其用戶界面友好,能夠提供實時的番茄成熟度檢測和識別結果展示,同時支持用戶賬戶管理,以便于保存和管理檢測結果和設置。
????????該系統支持攝像頭、視頻、圖像和批量文件等多種輸入源,能夠滿足用戶在不同場景下的需求。在后面可以添加更多預訓練模型,增加檢測和識別的種類;優化用戶界面,增強個性化設置;并積極聆聽用戶反饋,以期不斷改進系統,以更好地滿足用戶的需求。
結束語
????????由于博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。
Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788. ??
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ??
Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ??
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. ??
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ??