
簡介這是一套基于YOLO11深度學習框架構建的蔬菜目標檢測系統面向計算機、人工智能、自動化等專業學生及初學者解決農業場景中常見蔬菜西紅柿、洋蔥、土豆、胡蘿卜、大白菜的實時識別與定位問題適用于課程設計、畢業設計、實訓項目及算法入門實踐。資源包共2000個文件含944張JPG格式標注圖像、1027個對應YOLO格式TXT標簽、5個核心Python腳本含訓練/推理/GUI主程序、PyQt5開發的可視化界面工程、訓練好的PT模型、評估曲線圖PR、F1、Loss、CSV結果統計及演示用PNG/MP4素材整體壓縮包僅47.24MB結構清晰、模塊解耦。已有166人下載學習所有代碼經實測可直接運行配套詳細安裝使用教程與數據集說明開箱即用用戶不僅獲得完整可部署系統還能深入理解YOLO11數據組織規范、PyQt5界面集成邏輯及模型評估全流程。1. 項目概述與核心價值最近在整理一些關于農業智能化、新零售自動結算的案例時發現一個挺有意思的需求如何快速、準確地識別一堆混雜的蔬菜無論是超市的自助稱重臺還是食堂后廚的食材分揀甚至是家庭智能冰箱的食材管理都繞不開這個基礎問題。傳統的圖像處理方法在面對形態、顏色、光照變化極大的蔬菜時往往力不從心。正好YOLO系列模型以其“快、準、狠”的特性在目標檢測領域獨樹一幟而最新的YOLO11在精度和速度上又有了新的提升。于是我決定動手搭建一個“基于YOLO11的蔬菜識別檢測系統”并給它套上一個用戶友好的GUI界面目標是讓非專業開發者也能輕松上手實現“開箱即用”。這個項目不僅僅是一個算法演示它是一個完整的工程解決方案。它包含了從數據準備1026張已標注好的蔬菜圖片、模型訓練提供訓練好的權重、到最終應用帶圖形界面的可執行程序的全鏈路。無論你是計算機視覺的初學者想通過一個實戰項目入門深度學習還是相關行業的開發者需要一個現成的蔬菜識別模塊集成到自己的系統中亦或是高校學生在尋找課程設計或畢業設計的素材這個項目都能提供一個扎實的起點。它的核心價值在于“完整性”和“可用性”你拿到手的不再是零散的代碼片段而是一個五臟俱全、能跑起來的系統。2. 項目整體設計與思路拆解2.1 技術選型為什么是YOLO11 PyQt5在目標檢測模型的選擇上YOLO系列一直是工業界和學術界的寵兒。相比于兩階段檢測器如Faster R-CNNYOLO將目標檢測視為一個回歸問題直接在單個神經網絡中預測邊界框和類別概率這帶來了顯著的效率優勢。YOLO11作為該系列的最新迭代在Backbone網絡、Neck結構和損失函數等方面都進行了優化在保持高速度的同時進一步提升了對小目標和密集目標的檢測精度。對于蔬菜識別這種場景蔬菜大小不一、可能緊密擺放YOLO11的這些改進顯得尤為重要。至于GUI框架我選擇了PyQt5。雖然現在Web前端很火但對于一個本地化、需要快速部署、且可能涉及本地攝像頭調用和文件讀寫的桌面應用來說PyQt5是更成熟穩健的選擇。它基于Qt控件豐富、界面美觀跨平臺支持好Windows, Linux, macOS并且與Python的NumPy、OpenCV等科學計算庫結合緊密。用PyQt5打包后的應用用戶無需配置復雜的Python環境雙擊即可運行極大地降低了使用門檻。這個組合確保了系統在算法性能和用戶體驗上的平衡。2.2 系統架構與工作流程整個系統可以劃分為三個核心模塊模型推理模塊、圖形界面模塊和工具與資源模塊。模型推理模塊這是系統的大腦。核心是一個加載了預訓練YOLO11權重的推理引擎。它接收來自GUI的圖片或視頻流利用OpenCV等庫進行預處理如尺寸縮放、歸一化然后送入YOLO11網絡進行前向傳播得到包含邊界框坐標、置信度和類別信息的預測結果。最后再通過非極大值抑制等后處理步驟去除冗余框并將結果繪制到原圖上。圖形界面模塊這是系統的臉面。基于PyQt5構建主要提供以下功能媒體輸入支持圖片文件選擇、文件夾批量處理、攝像頭實時捕獲和視頻文件讀取。交互控制提供“開始檢測”、“停止”、“保存結果”等按鈕以及模型選擇、置信度閾值、IOU閾值等參數調節滑塊。結果展示用兩個主要區域分別顯示原始媒體和添加了檢測框、類別標簽及置信度的結果畫面。信息輸出一個文本區域或狀態欄用于顯示檢測進度、結果統計如檢測到的蔬菜種類和數量和系統日志。工具與資源模塊這是系統的后勤保障。包括數據集提供的1026張標注好的蔬菜圖片涵蓋了常見蔬菜如番茄、黃瓜、西蘭花、辣椒等在不同角度、光照和背景下的圖像格式通常是YOLO所需的txt標注文件歸一化坐標。訓練腳本與配置用于從零開始或微調訓練模型的Python腳本和.yaml配置文件。評估工具用于計算mAP、繪制PR曲線、混淆矩陣等評估指標曲線的腳本幫助量化模型性能。打包與部署腳本使用PyInstaller等工具將Python項目打包成獨立可執行文件的腳本。工作流程很簡單用戶通過GUI選擇輸入源 - 界面將媒體數據傳遞給推理模塊 - 推理模塊調用YOLO11模型進行計算 - 將檢測結果返回給GUI進行渲染和展示 - 用戶可選擇保存結果或進行下一輪檢測。3. 核心細節解析與實操要點3.1 YOLO11模型的核心改進與適配YOLO11并非官方名稱它通常指社區基于YOLOv8架構進行一系列改進和優化的版本或者是Ultralytics公司YOLO系列的下一個重大更新預期。在本項目中我們以當前最先進的YOLOv8為基線并融入一些公認有效的改進策略來模擬“YOLO11”的增強效果。理解這些改進對于后續調優至關重要。Backbone增強原始的YOLOv8使用CSPDarknet。我們可以探索引入更高效的架構如RepVGG風格的重新參數化模塊在訓練時多分支提升性能推理時合并為單路徑保證速度或者加入注意力機制如SimAM無參數注意力讓網絡更關注蔬菜的特征區域抑制復雜背景干擾。Neck結構優化特征金字塔網絡是目標檢測的關鍵。除了標準的PANet路徑聚合網絡可以嘗試引入BiFPN加權雙向特征金字塔它對不同尺度的特征進行加權融合能更好地處理大小差異明顯的蔬菜。損失函數改進YOLOv8使用了CIoU Loss。我們可以嘗試更先進的損失函數如SIoU Loss或Wise-IoU Loss。SIoU考慮了向量的角度使得邊界框回歸更快更準而Wise-IoU通過動態非單調聚焦機制降低高質量錨框的懲罰減輕低質量數據對模型的負面影響這對于數據質量可能參差不齊的自建數據集非常友好。輕量化設計考慮到部署環境可能需要對模型進行輕量化。例如將部分標準卷積替換為深度可分離卷積或者使用模型剪枝、量化如INT8量化技術在精度損失很小的前提下大幅提升推理速度使其在邊緣設備如Jetson Nano上也能流暢運行。注意所謂的“YOLO11”是一個動態概念。在實際操作中我們應基于一個穩定的基線如YOLOv8官方版本進行開發。所有改進都應有明確的實驗對比使用提供的評估工具證明其在該蔬菜數據集上的有效性避免為了“追新”而引入不必要的復雜性。3.2 數據集構建與標注要點提供的1026張標注數據集是項目的基石。但如果你想擴充或創建自己的蔬菜數據集以下幾點是關鍵數據收集的多樣性種類覆蓋盡可能涵蓋目標應用場景中所有需要識別的蔬菜種類。視角與姿態同一蔬菜應有平視、俯視、側視等多種角度以及完整、切半、切片等不同狀態。光照條件包含室內光、自然光、強光、弱光、陰影等不同光照下的圖片。背景復雜度簡單純色背景、貨架背景、廚房臺面背景、混雜其他物品的背景都需要考慮。遮擋與聚集部分遮擋的蔬菜以及多個蔬菜緊密堆積或重疊的場景。標注質量是生命線工具選擇推薦使用LabelImg、CVAT或Roboflow進行標注。它們都支持導出YOLO格式。框體精確邊界框應緊密貼合蔬菜邊緣既不要留太多空隙也不要切掉蔬菜部分。類別一致確保同一種蔬菜在不同圖片中的類別名稱完全相同。難點樣本對于模糊、遮擋嚴重、形變大的樣本更要精確標注這些是提升模型魯棒性的關鍵。數據組織格式dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/圖片放在images下的對應文件夾同名的txt標注文件放在labels下的對應文件夾。txt文件中每行格式為class_id x_center y_center width height坐標均為歸一化后的值0-1之間。3.3 PyQt5 GUI設計的關鍵技巧設計一個友好且高效的GUI需要注意以下細節多線程應用這是重中之重。模型推理尤其是視頻或攝像頭實時檢測是計算密集型任務。如果放在GUI主線程中會導致界面完全卡死無法響應。必須使用QThread或QThreadPool將推理任務放在獨立的工作線程中。主線程UI線程只負責更新界面和響應用戶交互通過信號Signal與槽Slot機制與工作線程通信。# 偽代碼示例啟動一個檢測線程 class DetectionThread(QThread): finished_signal pyqtSignal(np.ndarray) # 信號檢測完成攜帶結果圖片 def run(self): # 在這里執行耗時的模型推理 results model.predict(sourceimage) annotated_image plot_results(results) self.finished_signal.emit(annotated_image) # 在主窗口中連接信號 self.detection_thread DetectionThread() self.detection_thread.finished_signal.connect(self.update_result_display)圖像顯示優化使用QLabel的setPixmap方法顯示圖片。需要注意圖片尺寸可能遠大于QLabel尺寸需要先進行縮放同時保持寬高比。可以使用QPixmap.scaled并設置Qt.KeepAspectRatio。資源管理在打開攝像頭或處理視頻時要妥善管理資源。開始新任務前務必釋放之前的攝像頭或視頻流。在窗口關閉事件closeEvent中也要確保所有資源被正確釋放。參數實時調節將置信度閾值、IOU閾值等參數與QSlider或QDoubleSpinBox控件綁定并為其設置valueChanged信號。當用戶拖動滑塊時實時更新模型推理參數無需重啟檢測提升交互體驗。4. 實操過程與核心環節實現4.1 環境配置與依賴安裝一個清晰、可復現的環境是項目成功的基石。推薦使用Conda管理Python環境。創建并激活Conda環境conda create -n yolo11_veg python3.9 conda activate yolo11_veg選擇Python 3.8或3.9這是目前大多數深度學習庫兼容性最好的版本。安裝PyTorch 訪問PyTorch官網根據你的CUDA版本如果有NVIDIA GPU或選擇CPU版本獲取安裝命令。例如對于CUDA 11.8pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118使用python -c import torch; print(torch.__version__); print(torch.cuda.is_available())驗證安裝及GPU是否可用。安裝Ultralytics YOLO庫及其他依賴pip install ultralytics opencv-python pillow pip install pyqt5 pyqt5-tools pip install matplotlib pandas seaborn # 用于繪制評估曲線 pip install pyinstaller # 用于打包驗證YOLOfrom ultralytics import YOLO model YOLO(yolov8n.pt) # 嘗試加載一個納米模型 print(model.info()) # 打印模型信息4.2 使用預訓練模型進行推理假設項目提供的訓練好的模型文件為best_vegetable.pt。編寫核心推理函數import cv2 from ultralytics import YOLO class VegetableDetector: def __init__(self, model_pathbest_vegetable.pt, conf_thres0.5, iou_thres0.45): self.model YOLO(model_path) self.conf_thres conf_thres self.iou_thres iou_thres def detect_image(self, image_path): 檢測單張圖片 results self.model.predict( sourceimage_path, confself.conf_thres, iouself.iou_thres, saveFalse, # 我們不直接保存而是返回結果用于GUI顯示 showFalse ) # results[0]包含檢測結果 annotated_img results[0].plot() # 這個函數直接返回畫好框的BGR圖片(numpy數組) detections [] # 可以進一步解析results[0].boxes.data獲取結構化信息 for box in results[0].boxes: xyxy box.xyxy[0].cpu().numpy() # 左上右下坐標 conf box.conf[0].cpu().numpy() # 置信度 cls int(box.cls[0].cpu().numpy()) # 類別ID cls_name results[0].names[cls] # 類別名稱 detections.append({bbox: xyxy, confidence: conf, class: cls_name}) return annotated_img, detections def detect_video(self, video_source0): # 0代表默認攝像頭 生成視頻流檢測幀 cap cv2.VideoCapture(video_source) while cap.isOpened(): ret, frame cap.read() if not ret: break # 對小幀進行推理以提速但注意保持寬高比 results self.model.predict(sourceframe, streamTrue, confself.conf_thres, verboseFalse) for r in results: annotated_frame r.plot() yield annotated_frame # 使用生成器逐幀返回 cap.release()集成到PyQt5界面 將上述detect_image和detect_video函數與GUI按鈕事件連接。對于圖片直接調用并更新QLabel對于視頻在一個獨立的線程中循環調用detect_video的生成器并將每一幀通過信號發送給主線程更新UI。4.3 模型訓練與微調基于自有數據如果你想用自己的數據重新訓練或微調模型。準備數據配置文件 創建一個vegetable_dataset.yaml文件放在項目根目錄。path: /path/to/your/dataset # 數據集的根目錄 train: images/train # 相對于path的訓練集圖片路徑 val: images/val # 相對于path的驗證集圖片路徑 test: # 可選測試集路徑 # 類別數量和名稱 nc: 10 # 你的蔬菜類別數例如10種 names: [tomato, cucumber, broccoli, bell_pepper, carrot, potato, onion, lettuce, eggplant, spinach]啟動訓練from ultralytics import YOLO # 加載一個預訓練模型作為起點如YOLOv8s model YOLO(yolov8s.pt) # 開始訓練 results model.train( datavegetable_dataset.yaml, epochs100, # 訓練輪數 patience20, # 早停耐心值如果精度連續20輪不提升則停止 batch16, # 批大小根據GPU內存調整 imgsz640, # 輸入圖片尺寸 device0, # 使用GPU 0如果是CPU則設為cpu workers4, # 數據加載線程數 projectruns/train, # 訓練結果保存目錄 namevegetable_v1, # 實驗名稱 exist_okTrue # 允許覆蓋已存在的實驗目錄 )訓練過程會在runs/train/vegetable_v1目錄下生成所有結果包括權重文件、訓練日志、評估指標圖表等。4.4 模型性能評估與可視化訓練完成后使用驗證集評估模型性能。自動評估 Ultralytics在訓練結束時會自動在驗證集上評估并生成一系列圖表。你也可以手動運行yolo val modelruns/train/vegetable_v1/weights/best.pt datavegetable_dataset.yaml關鍵指標解讀mAP50 (Mean Average Precision IoU0.5)最常用的指標衡量模型在IoU閾值為0.5時的平均精度。值越高越好通常達到0.85以上說明模型性能優秀。mAP50-95在IoU從0.5到0.95步長0.05多個閾值下的平均mAP更綜合、更嚴格。Precision-Recall Curve精確率-召回率曲線曲線下的面積就是AP。理想情況是曲線靠近右上角。Confusion Matrix混淆矩陣直觀顯示模型在各個類別上的混淆情況幫你發現哪些蔬菜容易被誤判。可視化預測結果model YOLO(runs/train/vegetable_v1/weights/best.pt) # 在驗證集上可視化 results model.val(save_jsonTrue, save_hybridTrue) # 或者對單張圖片進行可視化預測 model.predict(path/to/test_image.jpg, saveTrue, showTrue, conf0.5)4.5 使用PyInstaller打包應用程序為了讓沒有Python環境的用戶也能使用我們需要打包成exeWindows或appmacOS。準備打包腳本 創建一個main.spec文件可以通過pyi-makespec main.py生成后修改或直接使用命令行參數。更推薦創建一個build.py腳本# build.py import PyInstaller.__main__ import os # 獲取當前目錄 current_dir os.path.dirname(os.path.abspath(__file__)) PyInstaller.__main__.run([ main.py, # 你的主程序入口文件 --nameVegetable_Detection_System, --onefile, # 打包成單個exe文件 --windowed, # 隱藏控制臺窗口對于GUI應用 --add-databest_vegetable.pt;., # 添加模型文件Windows用;分隔Linux/mac用: --add-datavegetable_dataset.yaml;., --hidden-importultralytics, --hidden-importultralytics.models, --hidden-importtorchvision, --collect-allultralytics, # 確保打包所有ultralytics相關文件 --clean, f--workpath{os.path.join(current_dir, build)}, f--specpath{current_dir}, f--distpath{os.path.join(current_dir, dist)}, ])處理動態庫和路徑問題 PyTorch和OpenCV有很多動態庫。打包后程序可能找不到這些庫。一個常見技巧是在主程序開頭添加路徑修復代碼# main.py 開頭 import sys import os if getattr(sys, frozen, False): # 如果是打包后的exebase_dir是exe所在目錄 base_dir sys._MEIPASS else: # 如果是腳本運行base_dir是腳本所在目錄 base_dir os.path.dirname(os.path.abspath(__file__)) # 將必要的資源路徑添加到系統路徑或作為變量使用 model_path os.path.join(base_dir, best_vegetable.pt)執行打包python build.py打包完成后在dist文件夾下會生成Vegetable_Detection_System.exe。將這個exe和它依賴的模型文件如果沒打包進去、配置文件等一起分發給用戶。5. 常見問題與排查技巧實錄在實際開發和部署過程中你幾乎一定會遇到下面這些問題。這里記錄了我的排查思路和解決方法。5.1 環境與依賴問題問題ImportError: DLL load failed while importing ...或libtorch_cuda.so... not found原因PyTorch的CUDA版本與系統安裝的CUDA驅動版本不匹配或者CUDA環境變量未正確設置。排查在命令行輸入nvidia-smi查看驅動支持的CUDA最高版本右上角。在Python中運行torch.version.cuda查看PyTorch編譯時使用的CUDA版本。兩者需兼容PyTorch的CUDA版本 ≤ 驅動支持的版本。例如PyTorch CUDA 11.8需要系統CUDA Toolkit版本為11.8且驅動版本450.80.02。解決從PyTorch官網選擇與你的系統CUDA驅動兼容的PyTorch版本重新安裝。或者更新你的NVIDIA顯卡驅動到最新版。對于打包后的程序確保目標機器也安裝了相應版本的CUDA運行時庫或者直接使用CPU版本的PyTorch打包pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu。問題PyQt5界面閃退或無響應原因最常見的原因是GUI主線程被阻塞比如將耗時的模型推理代碼直接寫在按鈕點擊事件里。排查在推理代碼前后打印日志觀察是否在推理開始后界面就卡死。解決必須使用多線程。將模型加載和推理操作放入QThread中。確保所有對GUI控件的更新如QLabel.setPixmap都在主線程中執行通過信號槽從工作線程傳遞數據。5.2 模型訓練與性能問題問題訓練損失不下降mAP始終很低原因學習率不當太大導致震蕩太小導致收斂慢或停滯。數據問題標注錯誤太多、類別不平衡、數據量太少或多樣性不足。模型容量不足對于復雜場景使用了過小的模型如YOLOv8n。排查與解決使用Ultralytics默認的學習率通常效果不錯。可以嘗試使用lr0和lrf參數進行微調或啟用cosine學習率調度器。仔細檢查數據集用標注工具隨機打開一些圖片查看標注框是否準確。分析數據集中各類別的圖片數量如果嚴重不平衡如“番茄”1000張“菠菜”50張需要進行數據增強或使用類別權重。換用更大的模型如YOLOv8m或YOLOv8l。嘗試使用預訓練權重并在你的數據集上進行微調而不是從頭訓練。問題模型在驗證集上表現好但實際應用新圖片時效果差原因數據分布不一致。訓練/驗證數據與實際應用場景的圖片在光照、背景、拍攝角度、蔬菜品種/形態上差異太大。解決收集更多貼近實際場景的數據進行訓練這是最根本的方法。在數據預處理階段增加更多樣化的數據增強如mosaic、mixup、隨機調整色調、飽和度、亮度添加隨機模糊、噪聲等以提升模型的泛化能力。在train參數中可以通過augmentTrue和相關參數控制。在推理時可以嘗試對輸入圖片進行測試時增強但會顯著增加推理時間。5.3 應用部署與打包問題問題打包后的exe文件非常大1GB原因PyInstaller打包了整個Python環境、PyTorch和CUDA庫這些都非常龐大。解決使用--onefile雖然方便但啟動慢且難以排查問題。可以考慮不打包成單文件而是打包成一個文件夾去掉--onefile參數然后對文件夾進行壓縮分發。嘗試使用pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu安裝CPU版本的PyTorch進行打包體積會小很多。前提是你的應用對速度要求不高。使用upx壓縮工具PyInstaller支持--upx-dir參數進一步壓縮可執行文件。問題打包的程序在其他電腦上運行報錯“找不到模型文件”或“缺少DLL”原因資源文件路徑錯誤或目標電腦缺少必要的運行時庫如VC Redistributable。解決確保在.spec文件或命令行中正確使用--add-data包含了所有依賴文件模型、配置文件、圖標等。在代碼中使用前面提到的sys._MEIPASS或基于os.path.dirname(sys.executable)來構建資源文件的絕對路徑。對于Windows告知用戶可能需要安裝Visual C Redistributable。可以在安裝包中附帶或提供下載鏈接。5.4 GUI使用與交互問題問題實時攝像頭檢測幀率很低很卡頓原因模型推理速度慢。圖像在GUI線程和工作線程之間傳遞的數據量太大高分辨率圖片。沒有限制最大幀率GUI刷新過于頻繁。解決換用更小的模型如YOLOv8n或對輸入圖片進行縮放如從1080p縮放到640x480再進行推理。在工作線程中將推理后的圖片壓縮如調整JPEG質量后再通過信號發送給主線程。使用一個定時器QTimer來控制GUI的刷新頻率例如每秒刷新30次33ms間隔而不是每收到一幀就刷新。問題檢測結果框的位置偏移或大小不對原因圖片在送入模型前進行了縮放等預處理但畫框時使用的是原始坐標沒有進行相應的逆變換。排查檢查你的推理代碼。如果你使用了results[0].plot()Ultralytics內部已經處理了坐標變換。但如果你是自己解析results[0].boxes.xyxy等原始坐標進行繪制就必須根據預處理時圖片的縮放比例將歸一化坐標或相對于預處理后圖片的坐標轉換回原始圖片尺寸上的坐標。解決記錄下預處理如letterbox填充的縮放比例和填充偏移量在畫框前進行逆運算。最穩妥的方法是直接使用results[0].plot()它返回的已經是畫在原圖上的BGR圖像數組。本文還有配套的精品資源點擊獲取