實戰(zhàn)拆解:從環(huán)境部署到GUI應(yīng)用)
簡介目標(biāo)檢測是計算機視覺中的核心任務(wù)其價值不僅在于識別圖像中存在什么更在于精確定位目標(biāo)的空間位置。YOLOv5作為主流的一階段檢測算法憑借高效的回歸機制和成熟的工程生態(tài)成為眾多應(yīng)用場景的首選方案。在農(nóng)業(yè)植保領(lǐng)域蘋果葉病害檢測通常需要結(jié)合圖像處理技術(shù)構(gòu)建從模型推理到可視化的完整鏈路。OpenCV承擔(dān)圖像讀寫、顏色空間轉(zhuǎn)換和畫框渲染等關(guān)鍵環(huán)節(jié)與YOLOv5形成互補共同支撐起帶GUI界面的桌面應(yīng)用。這種“算法工程”的組合模式廣泛適用于課程設(shè)計、畢業(yè)設(shè)計以及農(nóng)業(yè)信息化的快速原型驗證。文章圍繞一套典型的蘋果葉病害識別項目系統(tǒng)講解環(huán)境搭建、目錄結(jié)構(gòu)、GUI實現(xiàn)、指標(biāo)曲線解讀以及如何訓(xùn)練自定義數(shù)據(jù)集幫助開發(fā)者從零建立可用的檢測系統(tǒng)。 我每次看到這種名字特別齊全的壓縮包比如“基于yolov5opencv蘋果葉病害識別檢測源碼3類病害帶GUI界面訓(xùn)練好的模型評估指標(biāo)曲線操作使用說明.zip”第一反應(yīng)是先高興接著就開始警覺。高興的是該有的東西都有警覺的是很多人拿到這種包后連環(huán)境都搭不起來最后只能對著報錯日志發(fā)呆。這套東西本質(zhì)上是把“目標(biāo)檢測訓(xùn)練 OpenCV圖像處理 GUI交互界面 模型評估”串成了一條完整鏈路對做課程設(shè)計、畢業(yè)設(shè)計或者剛接觸農(nóng)業(yè)視覺方向的人來說是一個非常適合當(dāng)參考的工程模板。這篇文章不討論你從哪里下載這個包而是假設(shè)你已經(jīng)拿到了它或者已經(jīng)照著類似結(jié)構(gòu)準(zhǔn)備好了一套工程。我會從技術(shù)選型、環(huán)境安裝、目錄拆解、GUI使用、指標(biāo)曲線分析到重新訓(xùn)練自己的數(shù)據(jù)把整套系統(tǒng)的關(guān)鍵環(huán)節(jié)完整拆開講一遍。你不需要一開始就懂YOLOv5的所有細(xì)節(jié)但跟著走完你至少能回答清楚這個包里的每個文件是干什么用的模型到底行不行以及如果我想換成自己的蘋果葉數(shù)據(jù)集應(yīng)該改哪里。1. 拆開zip之前先想清楚這套系統(tǒng)到底在解決什么問題1.1 三類病害識別不是“看圖說話”而是“定位分類”蘋果葉片病害檢測和普通的圖像分類任務(wù)有本質(zhì)區(qū)別。圖像分類只回答“這張葉片有沒有病、可能是哪類病”但實際果園場景里一片葉子上可能同時出現(xiàn)好幾個病斑不同病斑之間還可能重疊。你需要的不是一句“有黑星病”的結(jié)論而是“在圖像坐標(biāo)的哪個位置、面積大概多大、屬于哪一類病害”。這就是目標(biāo)檢測要做的事。所以這個項目選YOLOv5而不是單純用ResNet做分類是有道理的。YOLO系列直接回歸出邊界框和類別概率天然適合這種“多目標(biāo)、多類別、需要定位”的任務(wù)。傳統(tǒng)圖像分類雖然也能做但沒法給出病害的空間分布信息在指導(dǎo)精準(zhǔn)施藥、評估嚴(yán)重程度這些場景下就會非常吃力。這個項目里處理的類別通常圍繞三種常見蘋果葉片病害展開比如黑星病、銹病和褐斑病當(dāng)然具體類別名字以后面數(shù)據(jù)集里的實際標(biāo)注為準(zhǔn)但無論類別名稱怎么變檢測流程是完全一樣的。1.2 一個可運行的完整項目價值在于把訓(xùn)練、推理、交互串起來市面上講YOLOv5原理和訓(xùn)練的文章非常多但大部分都止步于終端里輸出一張帶框的圖片。真正做成一個帶GUI界面的系統(tǒng)意味著你要額外處理很多工程問題模型怎么加載攝像頭畫面怎么讀取OpenCV里的BGR通道怎么轉(zhuǎn)換成GUI能顯示的RGB格式檢測結(jié)果怎么一邊畫框一邊不影響界面刷新置信度閾值怎么暴露給用戶去調(diào)。這些細(xì)節(jié)單獨看都不難但沒有人幫你串一遍你自己拼起來可能要折騰好幾天。這個zip包最大的價值就在這里。它不像純算法Demo那樣只丟給你一段推理代碼而是把訓(xùn)練好的best.pt模型、GUI入口腳本、OpenCV圖像處理工具、評估指標(biāo)曲線以及說明文檔一起打包。你拿到的其實是一套最小可用的“算法產(chǎn)品”結(jié)構(gòu)無論是用來交作業(yè)、寫報告還是作為自己項目的腳手架都有直接參考意義。1.3 適合哪些人、預(yù)期獲得什么如果你是以下這幾類人這個項目的拆解對你價值很大正在做畢業(yè)設(shè)計或課程設(shè)計需要一套能演示、能截圖、能寫進(jìn)論文的完整系統(tǒng)剛?cè)腴T目標(biāo)檢測想搞清楚模型訓(xùn)練完之后怎么變成一個可交互的桌面工具有農(nóng)業(yè)信息化項目背景想在真實葉片數(shù)據(jù)上快速驗證YOLOv5的效果已經(jīng)跑通過YOLOv5官方Demo但對GUI集成和評估指標(biāo)解讀還一知半解。先說清楚預(yù)期。這套系統(tǒng)解決的是“蘋果葉病害能不能被檢測出來、哪些位置有病、大概是什么病”的問題它不解決防治方案、不解決產(chǎn)量預(yù)測。你拿到項目后最重要的不是把里面每個函數(shù)都背下來而是理解模型、圖像處理、界面交互三者之間的數(shù)據(jù)流。把這條鏈路理順了以后不管是換成玉米葉、番茄葉還是其他檢測任務(wù)思路完全復(fù)用。2. yolov5opencv的技術(shù)選型為什么是它們而不是別的組合2.1 yolov5負(fù)責(zé)檢測主干opencv負(fù)責(zé)圖像管道在這個項目里YOLOv5和OpenCV的分工非常明確。YOLOv5承擔(dān)的是深度模型部分。訓(xùn)練好的best.pt權(quán)重文件里包含backbone、neck和head的參數(shù)輸入一張圖片后模型會輸出檢測框的位置坐標(biāo)、置信度分?jǐn)?shù)和類別索引。這個重量級任務(wù)必須由深度學(xué)習(xí)框架完成PyTorch是主要運行載體。OpenCV則承擔(dān)圖像管道部分。從磁盤讀取圖片、把攝像頭幀從BGR轉(zhuǎn)到RGB、縮放尺寸、做基礎(chǔ)圖像增強、把模型畫完框的結(jié)果轉(zhuǎn)成GUI能顯示的格式這些都是OpenCV的強項。它不參與病害特征的“理解”但它是整個系統(tǒng)里最忙的圖像搬運工。用一句話概括YOLOv5負(fù)責(zé)“看懂”圖片OpenCV負(fù)責(zé)“傳遞和顯示”圖片。兩條線在模型推理那一瞬間交匯然后各司其職。2.2 選yolov5而非更輕或更重模型的原因YOLOv5的定位很巧妙。比它更輕的模型可能在邊緣設(shè)備上跑得更快但精度和生態(tài)成熟度往往有限比它更重的模型精度可能更高但訓(xùn)練成本、顯存占用和部署門檻也一起上去了。對實驗室環(huán)境、個人電腦、課程演示這種場景來說YOLOv5s和YOLOv5m是性價比最高的選擇。另一個不可忽略的原因是生態(tài)。YOLOv5的文檔、教程、預(yù)訓(xùn)練權(quán)重、標(biāo)注工具適配方案幾乎是最齊全的遇到問題基本都能搜到解決方案。農(nóng)業(yè)病害檢測這種任務(wù)數(shù)據(jù)集的規(guī)模通常不大往往只有幾千張甚至幾百張用YOLOv5s可以靠遷移學(xué)習(xí)很快收斂不需要一上來就上超大模型。如果你用過YOLOv8再回頭看YOLOv5會發(fā)現(xiàn)核心概念大同小異這個項目選擇v5更多是歷史慣性和生態(tài)優(yōu)勢共同作用的結(jié)果。2.3 版本選擇與硬件門檻這個項目涉及的版本坑比想象中多。YOLOv5官方倉庫的版本迭代很快直接導(dǎo)致不同時期下載的代碼和權(quán)重不兼容。你在評估指標(biāo)曲線里看到results.png的布局、confusion_matrix.png的生成方式都可能隨版本變化。如果包里自帶了requirements.txt強烈建議不要手動改版本號以它鎖定的一套依賴為準(zhǔn)。硬件上推理階段其實很親民。CPU也能跑YOLOv5s只是速度慢一張圖片可能要一兩秒。如果GUI界面調(diào)用了攝像頭實時檢測最好還是有支持CUDA的NVIDIA顯卡4G以上顯存就很順暢。訓(xùn)練階段的門檻會高一些批量大小和輸入分辨率需要根據(jù)顯存去調(diào)這個我在后面的訓(xùn)練章節(jié)詳細(xì)講。總之這個項目的運行環(huán)境要求并沒有想象中那么高一臺普通游戲本就能跑起來。3. 環(huán)境安裝與第一個報錯把運行基礎(chǔ)搭穩(wěn)3.1 依賴清單與推薦安裝方式我拿到這種項目的第一步永遠(yuǎn)是先看requirements.txt內(nèi)容而不是直接運行g(shù)ui.py。這套工程的核心依賴包括Python 3.8到3.10之間不要太新也不要太老PyTorch和torchvisionCPU版或CUDA版取決于你有沒有顯卡opencv-python負(fù)責(zé)圖像讀寫和視頻處理PyQt5或PySimpleGUI取決于GUI實現(xiàn)方式numpy、matplotlib、pandas、seaborn這些數(shù)據(jù)科學(xué)基礎(chǔ)庫ultralytics/yolov5倉庫中的其他依賴比如tqdm、pyyaml、requests。安裝順序也建議固定。先裝PyTorch再裝其他庫。因為PyTorch的CUDA版本選擇會影響到torchvision的匹配裝在后面對不上版本就很麻煩。直接通過pip安裝雖然能省事但如果你要用GPU建議到PyTorch官網(wǎng)選一個適合本機CUDA版本的安裝命令不要盲目裝默認(rèn)版本。3.2 yolov5安裝步驟YOLOv5本身不是一個pip install就能解決的普通庫它更多是一個開源倉庫需要你拉下來之后當(dāng)作工作目錄來使用。標(biāo)準(zhǔn)的安裝流程是這樣創(chuàng)建虛擬環(huán)境避免和系統(tǒng)Python環(huán)境互相污染把YOLOv5倉庫克隆到本地在倉庫根目錄里安裝requirements.txt下載預(yù)訓(xùn)練權(quán)重或者把你自己的best.pt放到weights目錄運行一行最簡單的推理命令驗證環(huán)境是否可用。這里我要重點強調(diào)一下虛擬環(huán)境。很多同學(xué)圖方便直接在base環(huán)境里裝結(jié)果后面升級了某個包整個項目就崩了。尤其是一個項目里同時涉及PyTorch、OpenCV、PyQt5版本沖突幾乎是必然的用虛擬環(huán)境可以給你留一條隨時重來的后路。conda create -n apple_yolo python3.9 conda activate apple_yolo git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt pip install PyQt5如果你用的是國內(nèi)網(wǎng)絡(luò)clone倉庫或者安裝依賴時經(jīng)常超時可以給pip配置鏡像源也可以把gitclone換成國內(nèi)加速地址。這個屬于常規(guī)操作做完以后安裝速度會明顯提升。3.3 opencv相關(guān)坑位headless、imshow和GUI混用OpenCV在這個項目里最典型的坑有兩個。第一個是安裝了opencv-python-headless版本。headless版本去掉了所有GUI相關(guān)依賴適合服務(wù)器環(huán)境但它不支持cv2.imshow這樣的窗口顯示功能。你在本地跑GUI項目時如果代碼里混用了cv2.imshow和PyQt5窗口輕則沒反應(yīng)重則直接報錯。解決辦法很直接卸載headless版本改成安裝完整的opencv-python。第二個坑是OpenCV和PyQt5的顏色通道混用。OpenCV讀進(jìn)來的圖默認(rèn)是BGR通道順序而PyQt5顯示QImage時通常按RGB理解。如果直接把OpenCV的numpy數(shù)組丟給QImage你看到的葉子顏色會整體偏藍(lán)或偏紅病斑的顏色特征全部失真。必須在中間做一次cvtColor轉(zhuǎn)換。import cv2 from PyQt5.QtGui import QImage, QPixmap frame cv2.imread(leaf.jpg) rgb_frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) qimg QImage(rgb_frame.data, rgb_frame.shape[1], rgb_frame.shape[0], QImage.Format_RGB888) pixmap QPixmap.fromImage(qimg)這個轉(zhuǎn)換雖然只有一行但它是整個GUI顯示邏輯里最容易出錯的點我建議你從第一步就養(yǎng)成習(xí)慣所有要顯示到界面上的OpenCV圖像統(tǒng)一先轉(zhuǎn)成RGB。4. 項目目錄逐層拆解模型、源碼、指標(biāo)曲線都存放在哪里4.1 模型文件best.pt與last.pt的區(qū)別打開解壓后的目錄你會看到不少文件。其中權(quán)重文件一般有兩個可能的名字best.pt和last.pt。這兩個名字對應(yīng)的是訓(xùn)練過程中產(chǎn)生的不同檢查點。last.pt是訓(xùn)練過程中最后一個epoch保存下來的權(quán)重它不一定是表現(xiàn)最好的。如果訓(xùn)練末期出現(xiàn)過擬合last.pt的驗證集指標(biāo)很可能已經(jīng)下降了。best.pt是根據(jù)驗證集上的mAP或loss自動挑選出來的最優(yōu)權(quán)重通常也是項目帶GUI推理時默認(rèn)加載的那個。實際操作中如果你對檢測效果不滿意想排查是模型問題還是數(shù)據(jù)處理問題可以分別用best.pt和last.pt跑同一張圖片對比結(jié)果。如果兩者差距很大說明訓(xùn)練過程后期波動嚴(yán)重這時候優(yōu)先考慮降低學(xué)習(xí)率、增加正則化或者提前停止而不是反復(fù)調(diào)GUI代碼。這個排查思路很有用很多人忽略了這個診斷方法。4.2 評估指標(biāo)曲線文件和它們的生成邏輯這個zip包中標(biāo)注的“評估指標(biāo)曲線”通常包括以下這些文件results.png訓(xùn)練過程中的loss曲線和指標(biāo)曲線匯總圖confusion_matrix.png三分類的混淆矩陣PR_curve.png每類病害的精確率-召回率曲線F1_curve.pngF1隨置信度閾值變化的曲線labels.jpg訓(xùn)練數(shù)據(jù)的標(biāo)注分布情況train_batch*.jpg訓(xùn)練批次中經(jīng)過增強后的圖像示例。這些文件不是手動畫出來的它們是YOLOv5訓(xùn)練過程中自動生成的。你不用知道每個像素是怎么畫的但你要能看懂這些曲線到底在說什么。隨著訓(xùn)練進(jìn)行train/box_loss、val/val_box_loss這些曲線如果持續(xù)下降說明模型在正常收斂。如果驗證集loss在某個epoch后不降反升那就是過擬合的典型信號。很多同學(xué)看指標(biāo)只看mAP這是一個不好的習(xí)慣。mAP是一個綜合數(shù)字它掩蓋了每個類別之間的差異。比如三類病害里黑星病的病斑更大更容易檢測褐斑病的病斑細(xì)小容易被漏檢整體mAP可能看著還行但你實際去測褐斑病葉片時就會覺得模型很“笨”。這時候你必須去查混淆矩陣和PR曲線看看是哪一類在拖后腿。4.3 GUI源碼與推理腳本的職責(zé)劃分一眼看過去這個工程里可能會有多個Python文件。常見的是gui.py、detect.py、train.py、val.py、utils等目錄。它們的職責(zé)劃分很清晰train.py和val.py是模型訓(xùn)練和驗證入口通常不在GUI流程中使用但它們決定了模型怎么被訓(xùn)練出來detect.py是YOLOv5官方的推理腳本也是GUI界面背后調(diào)用的核心邏輯gui.py是你自己寫的界面層負(fù)責(zé)把detect的輸入輸出翻譯成人類友好的操作剩下的models、utils、data等目錄大部分是YOLOv5倉庫自帶的不需要刻意去改。我強烈建議你在運行GUI之前先手動用detect.py跑通一次純命令行檢測。這樣能最快暴露模型加載、類別映射、圖像讀取這些基礎(chǔ)問題。命令行能跑出結(jié)果再打開GUI你的排查范圍就可以縮小到界面層效率會高很多。5. GUI界面怎么用從選擇圖片到看到檢測結(jié)果的全過程5.1 界面布局和操作區(qū)域這類項目的GUI界面通常不會特別復(fù)雜但結(jié)構(gòu)基本類似。左側(cè)一般是操作區(qū)包括“選擇圖片”“開始檢測”“置信度閾值滑塊”“保存結(jié)果”這些按鈕右側(cè)是顯示區(qū)原始圖片和檢測結(jié)果會并排展示或者用選項卡切換兩種視圖。我拿到界面第一件事是先把置信度閾值滑塊拉到最低再拉高觀察檢測框數(shù)量變化。這個過程能幫你快速判斷模型對當(dāng)前圖片的“自信程度”。如果閾值設(shè)成0.25時畫面上一堆小框設(shè)成0.7時幾乎沒有框說明很多目標(biāo)都屬于低置信度預(yù)測這個模型的識別邊界比較模糊需要進(jìn)一步研究訓(xùn)練數(shù)據(jù)而不是急著找GUI代碼的bug。5.2 detect核心代碼的運行邏輯不管GUI界面寫得再好背后調(diào)用的推理邏輯都差不多。核心步驟是讀取模型、讀取輸入圖片、把圖片縮放或補齊到模型要求的分辨率、前向推理、解析檢測框、過濾低置信度結(jié)果、畫框畫標(biāo)簽。示意代碼大致是這個樣子import torch import cv2 model torch.hub.load(ultralytics/yolov5, custom, pathweights/best.pt) model.conf 0.3 model.iou 0.45 img cv2.imread(test_leaf.jpg) results model(img, size640) boxes results.xyxy[0].cpu().numpy() for box in boxes: x1, y1, x2, y2, conf, cls_id box label f{model.names[int(cls_id)]} {conf:.2f} cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) cv2.putText(img, label, (int(x1), int(y1)-5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)不要把這段代碼直接復(fù)制到GUI里就完事。你要注意model實例應(yīng)該只被創(chuàng)建一次放在類初始化方法里不能每次點擊檢測按鈕都重新加載一遍權(quán)重。很多人做的GUI一點檢測就卡住幾秒鐘就是因為每點一次按鈕就torch.load一次模型這個開銷高得離譜。正確的做法是程序啟動時加載模型之后的每次檢測都只做前向推理。5.3 當(dāng)檢測結(jié)果疊加在畫面上的時候發(fā)生了什么模型返回的results對象里包含很多信息但GUI需要的是兩個東西畫好框的圖像和檢測到的目標(biāo)數(shù)量。YOLOv5的results.render()方法會返回一張帶標(biāo)注的numpy數(shù)組圖像這比手動遍歷框去畫省事很多但你需要確認(rèn)一下當(dāng)前版本是否支持這個API。annotated_frame results.render()[0] # 返回帶框的numpy數(shù)組拿到這張圖之后經(jīng)過BGR轉(zhuǎn)RGB再轉(zhuǎn)成QImage最后setPixmap到QLabel上。整套流程的耗時主要集中在前向推理部分如果推理本身只需要幾十毫秒但界面刷新卻卡得不行那問題通常出在圖像尺寸過大、GUI線程阻塞或QImage轉(zhuǎn)換時沒做必要的縮放。建議在顯示前先統(tǒng)一把圖像縮放到一個適合界面的寬度比如640像素畫面清晰度和流暢度會有不錯的平衡。5.4 視頻與攝像頭場景下的特殊情況這個項目雖然核心是圖片檢測但很多擴展會做成實時攝像頭檢測。這里有一個容易忽略的細(xì)節(jié)攝像頭讀取幀的尺寸通常很大1280x720甚至1920x1080直接整幀輸入模型會拖慢FPS。一般做法是先把幀縮放到640x640推理完再根據(jù)縮放比例把檢測框坐標(biāo)映射回原圖尺寸顯示。另一個需要注意的點是幀讀取和推理不應(yīng)該串在一起做否則視頻會一頓一頓的。比較聰明的做法是開一個子線程專門做推理主線程只負(fù)責(zé)攝像頭畫面的實時顯示。對于課程設(shè)計來說用一個隊列緩存最新一幀就夠用了。不需要把整個線程模型搞得太復(fù)雜但至少不能讓detect過程阻塞了卡頓感。6. 評估指標(biāo)曲線怎么看你的模型是真的好用還是紙面好看6.1 results.png中的四大曲線results.png是訓(xùn)練日志的可視化匯總一個標(biāo)準(zhǔn)圖表里會包含多個子圖。對三分類的蘋果葉病害項目來說你要重點盯住這幾個子圖box_loss和cls_loss邊界框損失和分類損失訓(xùn)練時下降趨勢越平滑越好metrics/precision和metrics/recall在驗證集上的精確率和召回率變化metrics/mAP_0.5和mAP_0.5:0.95IoU閾值0.5下的mAP以及更嚴(yán)格的0.5到0.95范圍內(nèi)的平均mAPval/box_loss等驗證集損失訓(xùn)練集和驗證集損失的gap是關(guān)鍵信號。我見過不少項目在結(jié)尾貼一張非常漂亮但完全過擬合的訓(xùn)練曲線。特征是訓(xùn)練集loss降到幾乎0驗證集loss卻在后半段一路向上。這種模型在訓(xùn)練集圖片上效果極好換一張新葉片就“翻車”。所以看results.png時不要光看最左邊那條向下走的線要看訓(xùn)練集和驗證集兩條線之間的間隔是不是越來越大。6.2 混淆矩陣和PR曲線的解讀要點confusion_matrix.png能直觀展示三類病害之間容易互相混淆的情況。矩陣對角線上的數(shù)字越大越好如果“銹病”這一列里有很多樣本被歸類到“褐斑病”說明這兩種病在特征空間上很接近模型沒學(xué)到足夠有區(qū)分度的特征。PR曲線反映的是精確率和召回率的權(quán)衡關(guān)系。曲線越靠近右上角越好。不同類別的PR曲線可以疊加在同一張圖里如果某個類別的曲線明顯低于其他類別那這個類應(yīng)該被單獨拿出來分析。可能原因包括樣本數(shù)量太少、標(biāo)注框太小、不同病害外觀高度相似。這時候不要急著盲調(diào)模型結(jié)構(gòu)先去看labels.jpg里這個類別的樣本數(shù)量和位置分布再決定下一步。6.3 復(fù)現(xiàn)指標(biāo)曲線的具體命令如果你的包里沒有自帶評估指標(biāo)曲線或者你重新訓(xùn)練了一批數(shù)據(jù)想重新生成一份指標(biāo)文件可以用YOLOv5官方val.py接口。python val.py --data apple_leaf.yaml --weights weights/best.pt --img 640 --conf 0.001 --iou 0.6設(shè)置conf為0.001是為了讓模型盡量多地輸出候選框這樣算出來的PR曲線和mAP值更準(zhǔn)確。如果你用默認(rèn)的conf 0.25去跑驗證PR曲線只覆蓋置信度0.25以上的區(qū)間畫出來的曲線會缺失低置信度部分mAP也可能偏樂觀。這是一個很容易被忽略但對結(jié)果影響很大的參數(shù)細(xì)節(jié)。驗證腳本會在runs/val目錄下生成新的指標(biāo)文件包括confusion_matrix.png、PR_curve.png、F1_curve.png以及其他驗證結(jié)果。對比不同訓(xùn)練版本的指標(biāo)時建議每次都把輸出目錄重命名一下不要讓它默認(rèn)覆蓋否則你很難說清楚哪張圖是哪次實驗的產(chǎn)物。7. 如果我想訓(xùn)練蘋果葉病害自己的數(shù)據(jù)集應(yīng)該怎么動7.1 數(shù)據(jù)采集與YOLO標(biāo)注格式想真正跑一套屬于自己的蘋果葉病害檢測項目數(shù)據(jù)是地基。YOLO格式的數(shù)據(jù)集需要兩部分圖片文件和同名txt標(biāo)注文件。每張圖片的txt里每行代表一個目標(biāo)框格式是“類別索引 中心點x 中心點y 寬度 高度”這四個坐標(biāo)值都?xì)w一化到0到1之間。比如一張圖片尺寸是1000x800某個黑星病病斑的中心點是(300, 400)寬200高150那么對應(yīng)的txt一行就是0 0.3 0.5 0.2 0.1875標(biāo)注工具推薦用LabelImg或者AnyLabeling這是圖像標(biāo)注領(lǐng)域最常見的選擇。框選病斑時有兩個原則要記住一是框要緊貼病斑邊緣但不需要特別精確到像素級YOLO對標(biāo)注框位置的容錯性還可以你不需要為了幾像素的偏差反復(fù)糾結(jié)二是要保證標(biāo)注一致性同樣的病斑在不同圖片里的框法盡量統(tǒng)一尤其是涉及半遮擋和重疊區(qū)域時如果不同標(biāo)注人員風(fēng)格差異過大模型學(xué)到的特征會很混亂。7.2 寫data.yaml并更新類別數(shù)YOLOv5的數(shù)據(jù)集路徑信息全部寫在一個yaml文件里。如果你自己建數(shù)據(jù)格式大致是這樣train: datasets/apple_leaf/images/train val: datasets/apple_leaf/images/val nc: 3 names: [black_rot, cedar_rust, brown_spot]這里最容易出問題的是names順序。訓(xùn)練時類別名一定要和標(biāo)注文件里的類別索引一一對應(yīng)如果第0類本來是黑星病你卻在names里寫成了銹病檢測時標(biāo)簽就會全部錯位。前期標(biāo)注時最好提前規(guī)劃好0、1、2分別代表什么不要讓標(biāo)注人員和訓(xùn)練腳本各猜一套。如果你的數(shù)據(jù)圖片數(shù)量不夠可以先用官方預(yù)訓(xùn)練權(quán)重yolov5s.pt作為初始化權(quán)重這樣模型能利用已經(jīng)在COCO上學(xué)習(xí)過的通用視覺特征比從零訓(xùn)練收斂快得多而且在小數(shù)據(jù)集上不容易跑偏。但你需要注意COCO的80個類別和你的3個病害類別無關(guān)遷移學(xué)習(xí)利用的是底層特征不代表能直接檢測出病斑這是兩回事。7.3 訓(xùn)練命令和關(guān)鍵超參數(shù)說明訓(xùn)練入口是train.py最基本的命令是python train.py --img 640 --batch 16 --epochs 100 --data apple_leaf.yaml --weights yolov5s.pt --cache幾個關(guān)鍵超參需要結(jié)合你的硬件條件來調(diào)整。--img是輸入分辨率默認(rèn)640。如果蘋果葉病斑比較小可以試試1280這會顯著增加顯存占用和訓(xùn)練時間但對小目標(biāo)檢測的提升也很明顯。--batch是批量大小顯存不夠就調(diào)小8或4都可以但批量太小會影響B(tài)atchNorm的穩(wěn)定性所以如果顯存只夠batch 4建議用SGD優(yōu)化器并適當(dāng)降低學(xué)習(xí)率不要硬撐著用大batch。--epochs對小型數(shù)據(jù)集來說100到200就足夠重點看驗證集曲線是否已經(jīng)收斂。如果到80輪時mAP基本不再變化再加epoch意義不大甚至可能過擬合。--cache參數(shù)可以提前把圖像加載進(jìn)內(nèi)存能明顯減少硬盤讀取瓶頸代價是占用內(nèi)存如果你的機器內(nèi)存不足32G建議別用。7.4 訓(xùn)練完之后的驗證流程訓(xùn)練結(jié)束后不要急著關(guān)終端。先進(jìn)入runs/train/exp目錄找到weights里的best.pt和last.pt用val.py分別跑一遍看看驗證集指標(biāo)差異。再用detect.py拿一些訓(xùn)練前沒有見過的真實果園圖片做測試注意一定不要用訓(xùn)練集里的圖片做效果展示那會產(chǎn)生嚴(yán)重的“幸存者偏差”。我自己習(xí)慣的驗證順序是先看results.png確認(rèn)收斂趨勢再看confusion_matrix.png確認(rèn)類別混淆度最后隨便挑幾張背景復(fù)雜、光照不理想的圖片做盲測。這比盯著一堆指標(biāo)數(shù)字有用得多。模型最終是給人用的不是給指標(biāo)用的。8. 實測中的高頻坑和繼續(xù)提升效果的思路8.1 我整理的高頻問題與解決對照表跑這類項目時有幾個問題出現(xiàn)頻率極高。我整理成一張對照表你可以直接當(dāng)排查手冊用現(xiàn)象可能原因處理方法GUI啟動后提示找不到best.pt權(quán)重路徑寫成了相對路徑當(dāng)前工作目錄不對用絕對路徑或確保從項目根目錄啟動檢測結(jié)果類別名稱亂names順序和訓(xùn)練時不一致檢查data.yaml中names列表順序圖片顯示顏色偏藍(lán)BGR/RGB通道未轉(zhuǎn)換用cvtColor轉(zhuǎn)成RGB后再顯示點擊檢測按鈕卡死每幀重新加載模型或推理線程阻塞模型只加載一次必要時用子線程攝像頭畫面非常卡整幀高分辨率推理先縮放至640推理后再映射回原圖置信度滑塊沒反應(yīng)沒有更新model.conf設(shè)置model.conf 當(dāng)前滑塊值訓(xùn)練時報錯類別數(shù)不匹配yaml的nc與模型頭不匹配改yolov5s.yaml中的nc為3出現(xiàn)“Unknown/unsupported”字樣OpenCV GUI庫缺失或依賴沖突重裝完整版opencv-python避免headless這些坑單獨看都不大但每個都可能卡住一兩天。尤其是第一個路徑問題很多人明明文件都在程序卻說找不到原因就是當(dāng)前運行目錄不在項目根目錄下。遇到路徑問題先打印一下當(dāng)前工作目錄能節(jié)省很多排查時間。8.2 小病斑、重疊葉片等場景的優(yōu)化方向蘋果葉病害檢測真正難的不是“大而明顯的病斑”而是那種早期剛出現(xiàn)的小斑點、被葉片遮擋了一半的病斑、以及光照不均勻產(chǎn)生的假陰影。這些場景下模型很容易漏檢或誤檢。面對這類問題我建議按優(yōu)先級嘗試以下優(yōu)化提高輸入分辨率從640改成1280或更高這是對小目標(biāo)最直接的改進(jìn)做切片推理把大圖切成重疊小塊分別檢測再把結(jié)果合并本質(zhì)上是“放大鏡”策略使用更強的數(shù)據(jù)增強比如mosaic、copy-paste讓模型見過更多不同背景和遮擋情況檢查數(shù)據(jù)集中小目標(biāo)的標(biāo)注框大小分布如果小目標(biāo)占比低模型天然不擅長需要補充樣本。對課程設(shè)計來說前面兩個方向最值得嘗試。提高分辨率改動小、效果明顯切片推理稍微復(fù)雜一點但對病斑密集的場景提升很大。如果做到這兩步仍然不滿意再考慮調(diào)模型結(jié)構(gòu)。8.3 再往下走部署形態(tài)的三種選擇訓(xùn)練完、GUI也能跑了這個項目就算完整閉環(huán)了。不過如果你愿意再往前走一步還可以考慮三種部署形態(tài)。第一種是導(dǎo)出成ONNX用ONNXRuntime進(jìn)行CPU推理。優(yōu)點是擺脫了PyTorch環(huán)境依賴部署機器不用安裝龐大的Torch庫速度在CPU上也會更快。第二種是構(gòu)建成簡單Web服務(wù)用Flask或FastAPI把模型包成一個HTTP接口前端頁面負(fù)責(zé)上傳圖片和展示結(jié)果。這樣手機或者平板也能訪問適合果園現(xiàn)場的輕量巡檢。第三種是邊緣設(shè)備部署比如Jetson Nano、RK3588這類板子把模型導(dǎo)出成TensorRT或RKNN格式。這是真正走到工業(yè)級體驗的路線但硬件的成本和配置復(fù)雜度會明顯增加。這三條路不需要都走選一條最適合你當(dāng)前目標(biāo)的就行。如果只是畢業(yè)設(shè)計把ONNX和Web服務(wù)做出來已經(jīng)能拉開和大多數(shù)同學(xué)的差距如果想深入產(chǎn)業(yè)應(yīng)用邊緣端部署才是最終歸宿。最后分享一點我自己的使用習(xí)慣。每次拿到這種帶GUI的檢測工程我一定是先命令行驗證模型再打開GUI最后才去看訓(xùn)練腳本。這個順序幫我把問題隔離得很干凈模型不行就是數(shù)據(jù)或訓(xùn)練的問題界面不行就是代碼或環(huán)境的問題兩邊同時出問題的情況其實很少。你把這條思路記下來以后再遇到類似的“源碼模型GUI”項目都能少走彎路。本文還有配套的精品資源點擊獲取