實(shí)戰(zhàn):基于YOLOv12的數(shù)據(jù)集標(biāo)注與訓(xùn)練全流程)
簡(jiǎn)介植物萌芽檢測(cè)數(shù)據(jù)集專注植物萌發(fā)階段的視覺識(shí)別面向精準(zhǔn)農(nóng)業(yè)監(jiān)測(cè)、智能溫室管理、植物表型研究及農(nóng)業(yè)科研教學(xué)等場(chǎng)景可支持構(gòu)建萌芽期識(shí)別模型用于作物生長(zhǎng)階段自動(dòng)化監(jiān)測(cè)與生長(zhǎng)周期預(yù)測(cè)。數(shù)據(jù)集共2000個(gè)文件涵蓋1484個(gè)txt格式邊界框標(biāo)注、514張jpg原始圖像、1個(gè)yaml配置與1個(gè)docx說明文檔壓縮包整體約133.71MBtxt標(biāo)注遵循中心坐標(biāo)加寬高的YOLO規(guī)范yaml可直接套用訓(xùn)練配置docx補(bǔ)充數(shù)據(jù)構(gòu)建與使用建議。數(shù)據(jù)劃分包含1177張訓(xùn)練圖、302張驗(yàn)證圖及5張測(cè)試圖覆蓋多種視角并包含旋轉(zhuǎn)、裁剪、噪聲處理等增強(qiáng)版本有助于提升模型魯棒性。目前已有101人學(xué)習(xí)適合目標(biāo)檢測(cè)研究者與農(nóng)業(yè)AI開發(fā)者快速開展萌芽期檢測(cè)實(shí)驗(yàn)亦可作為農(nóng)林院校算法教學(xué)實(shí)踐數(shù)據(jù)集。1. 植物萌芽檢測(cè)數(shù)據(jù)集從標(biāo)準(zhǔn) YOLO 標(biāo)注圖到能落地的出芽識(shí)別模型溫室育苗車間里一張苗盤幾百個(gè)穴孔旺季時(shí)工人要逐個(gè)弓腰核對(duì)萌芽率一個(gè)班下來脖子和眼睛都僵得難受。植物萌芽檢測(cè)數(shù)據(jù)集解決的正是這種重復(fù)枯燥的視覺勞動(dòng)它把苗期圖像整理成標(biāo)準(zhǔn) YOLO 標(biāo)注格式拿回來就能直接丟給 YOLOv12 這類目標(biāo)檢測(cè)模型訓(xùn)練模型輸出每個(gè)芽的坐標(biāo)框與置信度后面接統(tǒng)計(jì)報(bào)表還是補(bǔ)苗機(jī)械臂都順理成章。適合三類人做農(nóng)業(yè)自動(dòng)化方案的工程團(tuán)隊(duì)、要在嵌入式設(shè)備上跑植物視覺識(shí)別的開發(fā)者以及研究工業(yè)農(nóng)業(yè)醫(yī)學(xué)領(lǐng)域目標(biāo)檢測(cè)數(shù)據(jù)集落地的從業(yè)者。省下的不只是標(biāo)注時(shí)間還有從零梳理訓(xùn)練管線的過程。2. 先看懂?dāng)?shù)據(jù)集的目錄與標(biāo)注格式訓(xùn)練前的一小時(shí)自檢2.1 目錄結(jié)構(gòu)長(zhǎng)什么樣這份資源解壓之后內(nèi)部目錄是按目標(biāo)檢測(cè)訓(xùn)練的標(biāo)準(zhǔn)習(xí)慣組織的。我拿到任何一份數(shù)據(jù)集第一步不是急著訓(xùn)練而是先把目錄樹摸清楚確認(rèn) images 和 labels 是否一一對(duì)應(yīng)。常見結(jié)構(gòu)如下plant_sprout/ ├── images/ │ ├── train/ │ │ ├── sprout_0001.jpg │ │ ├── sprout_0002.jpg │ │ └── ... │ └── val/ │ ├── sprout_0351.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── sprout_0001.txt │ │ ├── sprout_0002.txt │ │ └── ... │ └── val/ │ └── ... └── plant_sprout.yamltrain 與 val 的比例通常接近 8:2 或 9:1這個(gè)數(shù)據(jù)集按經(jīng)驗(yàn)也是這種劃分。圖像多為俯拍或斜俯拍的苗盤/苗床照片分辨率跨度比較大有手機(jī)拍的也有工業(yè)相機(jī)拍的恰好能模擬現(xiàn)場(chǎng)設(shè)備參差不齊的真實(shí)狀況。每個(gè) jpg 對(duì)應(yīng)一個(gè)同名 txttxt 里存的就是這張圖上所有目標(biāo)框的標(biāo)注。yam 文件是給 Ultralytics 系列訓(xùn)練框架用的數(shù)據(jù)集描述文件里面寫明了類別數(shù)量和類別名稱訓(xùn)練時(shí)直接以dataplant_sprout.yaml的方式引用。在動(dòng)手訓(xùn)練之前建議先做一件事用tree或find把文件數(shù)量統(tǒng)計(jì)出來確認(rèn)兩個(gè)目錄的文件數(shù)一致避免后面訓(xùn)練時(shí)出現(xiàn)“部分圖像沒有標(biāo)簽”的隱蔽問題。find images/train -name *.jpg | wc -l find labels/train -name *.txt | wc -l如果兩邊數(shù)量對(duì)不上說明存在漏標(biāo)注的圖像后面訓(xùn)練出的模型在沒標(biāo)簽的那些圖上大概率會(huì)被當(dāng)作負(fù)樣本直接干擾損失函數(shù)。我的習(xí)慣是先把這一步走完再談參數(shù)。2.2 YOLO 標(biāo)注格式里的數(shù)字到底代表什么YOLO 格式的每一行是五個(gè)數(shù)字依次是類別編號(hào)、目標(biāo)中心點(diǎn)的 x 坐標(biāo)、y 坐標(biāo)、目標(biāo)寬度、目標(biāo)高度。坐標(biāo)全部做了歸一化處理取值都在 0 到 1 之間分母是圖像的寬和高不是像素絕對(duì)值。我拿一份典型的標(biāo)注拆開說明1 0.513462 0.288741 0.034615 0.040727這一行表示這張圖里有一個(gè)類別編號(hào)為 1 的目標(biāo)它的中心點(diǎn)位于圖像水平方向 51.35%、垂直方向 28.87% 的位置目標(biāo)本身寬度約占整張圖寬度的 3.46%高度約占整張圖高度的 4.07%。換算成像素值只需要把前兩個(gè)數(shù)乘以圖像寬高、后兩個(gè)數(shù)乘以圖像寬高就能得到真實(shí)的像素框。萌芽期的小苗在整張圖中往往只占很小一塊面積所以 w、h 這類數(shù)字普遍落在 0.02 到 0.08 之間屬于典型的小目標(biāo)標(biāo)注。做這類數(shù)據(jù)集訓(xùn)練最忌諱的就是把 w、h 的順序記反還有把中心點(diǎn)坐標(biāo)誤當(dāng)成左上角坐標(biāo)。我見過不止一個(gè)同事用 LabelImg 導(dǎo)出時(shí)選了 PASCAL VOC 格式然后又手動(dòng)轉(zhuǎn) YOLO轉(zhuǎn)完忘了除寬度訓(xùn)練出來的框全部偏移到圖像角落。這份數(shù)據(jù)集里常見類別有兩種組織方式一類是只標(biāo)“萌芽”一個(gè)類別適合單純的出芽計(jì)數(shù)另一類會(huì)把“未出芽的空穴”和“已出芽”區(qū)分開甚至把子葉展開的苗單獨(dú)列一類。后者在實(shí)際補(bǔ)苗場(chǎng)景中更有用因?yàn)樽詣?dòng)補(bǔ)苗需要同時(shí)知道哪里空著、哪里已經(jīng)長(zhǎng)出來了。拿到數(shù)據(jù)集后先打開 yaml 文件確認(rèn) names 列表的內(nèi)容不要按我的項(xiàng)目場(chǎng)景強(qiáng)行套你的業(yè)務(wù)邏輯。2.3 用一段腳本把數(shù)據(jù)集的健康狀況查一遍訓(xùn)練之前我強(qiáng)烈建議把下面這段校驗(yàn)?zāi)_本跑一遍。它做的事很簡(jiǎn)單遍歷每張訓(xùn)練圖檢查同名標(biāo)簽是否存在、每行是不是 5 個(gè)字段、坐標(biāo)是否都落在 0 到 1 范圍內(nèi)。這段腳本幾乎可以套用在任何 YOLO 格式數(shù)據(jù)集上不止這一份資源。from pathlib import Path root Path(plant_sprout) bad_count 0 for split in [train, val]: img_dir root / images / split lbl_dir root / labels / split for img_p in sorted(img_dir.glob(*.jpg)): lbl_p lbl_dir / (img_p.stem .txt) if not lbl_p.exists(): print(f[標(biāo)簽缺失] {img_p.name}) bad_count 1 continue for line in lbl_p.read_text().splitlines(): parts line.split() if len(parts) ! 5: print(f[格式錯(cuò)誤] {img_p.name}: {line}) bad_count 1 continue cls parts[0] try: cx, cy, w, h map(float, parts[1:]) except ValueError: print(f[數(shù)值錯(cuò)誤] {img_p.name}: {line}) bad_count 1 continue if not all(0 v 1 for v in (cx, cy, w, h)): print(f[坐標(biāo)越界] {img_p.name}: {line}) bad_count 1 print(f檢查完成異常數(shù)量: {bad_count})邏輯并不復(fù)雜先用glob拿到所有 jpg 文件名用stem屬性去掉擴(kuò)展名后拼出對(duì)應(yīng) txt 路徑再逐行解析先查字段數(shù)量再查數(shù)值范圍。坐標(biāo)越界是最常見的問題之一比如手工標(biāo)注時(shí)不小心把框拉出了畫布邊緣歸一化后出現(xiàn)大于 1 的值。如果異常數(shù)量為 0說明這份數(shù)據(jù)集在結(jié)構(gòu)層面是干凈的可以進(jìn)入訓(xùn)練環(huán)節(jié)。如果報(bào)出一堆標(biāo)簽缺失建議直接補(bǔ)一份空 txt 或者刪除對(duì)應(yīng)圖像不要讓模型把無標(biāo)簽區(qū)域當(dāng)負(fù)樣本學(xué)。這條規(guī)則對(duì)所有計(jì)算機(jī)視覺數(shù)據(jù)集都適用尤其是做行業(yè)數(shù)據(jù)集復(fù)用時(shí)前人的標(biāo)注習(xí)慣未必嚴(yán)謹(jǐn)自檢這一步不能省。3. 用 YOLOv12 把萌芽檢測(cè)模型跑通環(huán)境、參數(shù)與驗(yàn)證3.1 訓(xùn)練環(huán)境與數(shù)據(jù)集劃分YOLOv12 的訓(xùn)練流程和整個(gè) YOLO 系列基本一致主流做法還是基于 Ultralytics 框架。先裝好依賴pip install ultralytics albumentations如果你的 Ultralytics 版本還沒有收錄 YOLOv12 的預(yù)訓(xùn)練權(quán)重可以先換成 yolov11n 或 yolov8n 驗(yàn)證整套流程數(shù)據(jù)集本身不綁定特定模型版本標(biāo)注格式是所有 YOLO 家族通用的。常見做法是先跑通小模型確認(rèn)數(shù)據(jù)和標(biāo)簽沒有問題再切換到大模型。數(shù)據(jù)集劃分前要注意一個(gè)容易被忽略的點(diǎn)如果原始圖像里存在同一苗盤的連拍序列直接隨機(jī)打散劃分 train/val 會(huì)造成圖片泄漏驗(yàn)證指標(biāo)虛高。按拍攝批次或時(shí)間先后切分例如前 80% 時(shí)間段的圖像進(jìn) train、后 20% 進(jìn) val才是模擬真實(shí)新場(chǎng)景的做法。這一點(diǎn)在工業(yè)農(nóng)業(yè)醫(yī)學(xué)行業(yè)目標(biāo)檢測(cè)數(shù)據(jù)集里尤其重要因?yàn)楝F(xiàn)場(chǎng)采集往往是一次性拍幾百張連圖。我會(huì)在數(shù)據(jù)目錄外新建一份數(shù)據(jù)集描述文件內(nèi)容如下# plant_sprout.yaml path: ./plant_sprout train: images/train val: images/val nc: 2 names: [empty_hole, sprout]path寫數(shù)據(jù)集根目錄的相對(duì)路徑train、val相對(duì)于path填寫nc是類別總數(shù)names按類別順序列出。如果你的數(shù)據(jù)集是單類別把nc改成 1names只保留一個(gè)即可。3.2 訓(xùn)練參數(shù)模板與說明下面是我平時(shí)訓(xùn)練萌芽檢測(cè)時(shí)用的參數(shù)模板。YOLOv12 訓(xùn)練入口與 YOLOv8/YOLOv11 風(fēng)格一致下面這段按 Ultralytics 通用接口寫成from ultralytics import YOLO model YOLO(yolov12n.pt) model.train( dataplant_sprout.yaml, epochs120, imgsz640, batch16, lr00.01, lrf0.01, optimizerSGD, patience20, augmentFalse, seed42, )逐項(xiàng)解釋我的選擇理由epochs120是考慮到數(shù)據(jù)集規(guī)模不大給足迭代次數(shù)讓小目標(biāo)框的 anchor 充分調(diào)整imgsz640兼顧顯存占用和大多數(shù)手機(jī)/工業(yè)相機(jī)圖片的分辨率比例如果圖像本身就是 1920×1080 的航拍圖建議直接提到 960 再訓(xùn)練否則芽的像素面積會(huì)被壓縮到十幾像素batch16是 24GB 顯存的典型配置顯存小的機(jī)器降到 8lr00.01是 SGD 優(yōu)化器的常用初值配合patience20早停在驗(yàn)證指標(biāo)不再上升時(shí)自動(dòng)保存最好權(quán)重augmentFalse是因?yàn)槲伊?xí)慣先跑一版不帶增強(qiáng)的基線確認(rèn)數(shù)據(jù)和標(biāo)簽正確再開增強(qiáng)。先解釋imgsz對(duì)小目標(biāo)的影響。imgsz640意味著輸入圖像會(huì)被縮放到 640×640原本 4000×3000 的大圖里一個(gè) 40×40 像素的芽縮放后只剩約 6×6 像素幾乎在主干網(wǎng)特征圖上消失。第一版訓(xùn)練如果發(fā)現(xiàn)漏檢嚴(yán)重優(yōu)先把imgsz提到 960 或 1280。再解釋augmentFalse的用意。Ultralytics 默認(rèn)開啟 Mosaic、HSV 擾動(dòng)等增強(qiáng)數(shù)據(jù)集本身存在標(biāo)注偏差時(shí)很難判斷是增強(qiáng)過度還是模型欠擬合。先關(guān)閉增強(qiáng)跑一版干凈的再增開是我處理所有行業(yè)數(shù)據(jù)集的一貫順序。推理驗(yàn)證的代碼也貼出來方便直接復(fù)現(xiàn)from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict( sourcetest_images/, imgsz640, conf0.3, saveTrue, save_txtTrue, )conf0.3是出芽檢測(cè)場(chǎng)景比較合理的下限。芽體小、邊緣模糊置信度普遍比大目標(biāo)低一截卡在 0.5 會(huì)漏掉大量真值save_txtTrue會(huì)把檢測(cè)結(jié)果存成 YOLO 格式文本方便后續(xù)統(tǒng)計(jì)每張圖的芽數(shù)。3.3 驗(yàn)證指標(biāo)怎么讀訓(xùn)練結(jié)束后Ultralytics 會(huì)輸出一張 results.csv里面逐行記錄了每個(gè) epoch 的 mAP50、mAP50-95、precision、recall。萌芽檢測(cè)這類小目標(biāo)任務(wù)我更關(guān)注 recall 而不是 mAP。因?yàn)檠a(bǔ)苗場(chǎng)景里漏掉一個(gè)芽意味著空穴被當(dāng)成有苗后期不會(huì)有人再補(bǔ)種損失更不可逆誤報(bào)多一個(gè)芽頂多補(bǔ)苗時(shí)多放一粒種子成本低得多。如果 recall 低于 0.85建議按第 4 章的方法加大輸入尺寸、調(diào)整增強(qiáng)策略。如果 precision 遠(yuǎn)低于 recall再去排查是不是標(biāo)注框偏大導(dǎo)致模型把背景也包了進(jìn)來。我通常會(huì)從 results.csv 里抽最后 10 行的數(shù)據(jù)做判斷避免只看最佳權(quán)重那一個(gè)點(diǎn)。4. 數(shù)據(jù)增強(qiáng)與小目標(biāo)優(yōu)化讓模型對(duì)現(xiàn)場(chǎng)光照更魯棒4.1 針對(duì)萌芽圖像的增強(qiáng)參數(shù)萌芽檢測(cè)的圖像大多在溫室或苗床拍攝光照條件受天氣、補(bǔ)光燈、遮陽網(wǎng)影響很大同一批苗在不同時(shí)段拍出來的色溫、亮度完全不同。模型需要對(duì)這些變化不敏感才能在現(xiàn)場(chǎng)穩(wěn)定工作。開啟增強(qiáng)時(shí)我比較關(guān)注下面這幾項(xiàng)model.train( dataplant_sprout.yaml, epochs120, imgsz960, batch8, hsv_h0.015, hsv_s0.6, hsv_v0.5, degrees15, translate0.1, scale0.4, fliplr0.5, flipud0.1, mosaic0.8, )hsv_v0.5允許亮度在正負(fù)一半的區(qū)間內(nèi)隨機(jī)擾動(dòng)溫室補(bǔ)光燈開啟和關(guān)閉時(shí)的亮度差異基本能被覆蓋hsv_h0.015只做輕微色相擾動(dòng)避免把芽的綠色和土壤的黃色混到一起degrees15模擬相機(jī)安裝角度偏移苗盤在視野里稍微歪一點(diǎn)也能被識(shí)別。flipud0.1只給 10% 概率因?yàn)楦┡慕嵌认聢D像上下翻轉(zhuǎn)雖然物理上合理但如果現(xiàn)場(chǎng)苗盤有方向性紋理翻轉(zhuǎn)過多反而引入噪聲。Mosaic 增強(qiáng)會(huì)把四張圖拼成一張放大圖像中的上下文信息。對(duì)小目標(biāo)檢測(cè)來說Mosaic 能顯著提升模型對(duì)“芽周圍土壤環(huán)境”的建模能力但也要注意如果標(biāo)注框本身有偏差拼圖后偏差會(huì)被放大。我習(xí)慣把mosaic從默認(rèn)的 1.0 降到 0.8給正常圖像留一些訓(xùn)練比例。4.2 輸入尺寸、類別不平衡與困難樣本挖掘萌芽數(shù)據(jù)集普遍存在一個(gè)反直覺的現(xiàn)象類別不平衡不在“萌芽 vs 背景”而在“容易檢測(cè)的萌芽 vs 難檢測(cè)的萌芽”。剛破土而出的芽只有兩片子葉甚至只有一條縫面積小、對(duì)比度低和土壤顏色接近模型傾向于只學(xué)那些已經(jīng)展開子葉、邊界清晰的大芽。針對(duì)這種困難樣本有兩個(gè)常見做法我經(jīng)常組合使用。第一把輸入尺寸從 640 提到 960。萌芽框?qū)挾日颊麍D的比例通常在 0.03 到 0.05 之間640 輸入下對(duì)應(yīng) 19 到 32 像素屬于小目標(biāo)但還不算極小960 輸入下能到 29 到 48 像素特征圖上的響應(yīng)明顯增強(qiáng)。顯存不夠時(shí)用batch8或者開啟梯度累積也要上大圖尺寸這一步對(duì)小目標(biāo)檢測(cè)的收益往往比調(diào)任何超參數(shù)都明顯。第二對(duì)低置信度樣本做二次標(biāo)注加入訓(xùn)練集。訓(xùn)練完第一版模型后把驗(yàn)證集里 recall 為 0 的圖像抽出來人工檢查是沒標(biāo)還是標(biāo)錯(cuò)。常見情況是原數(shù)據(jù)集漏標(biāo)了那些特別小的芽模型學(xué)到了正確特征但 label 里沒有對(duì)應(yīng)框損失函數(shù)把正確的預(yù)測(cè)也當(dāng)負(fù)樣本懲罰。把這些漏標(biāo)補(bǔ)上再訓(xùn)練一輪recall 通常能提升三到五個(gè)百分點(diǎn)。類別不均衡的處理則要看 yaml 里的 names 定義。如果你的數(shù)據(jù)集區(qū)分了empty_hole和sprout兩個(gè)類別且空穴數(shù)量遠(yuǎn)多于芽數(shù)可以在采樣時(shí)對(duì)sprout類別的圖像做上采樣復(fù)制讓每個(gè) epoch 里兩類目標(biāo)出現(xiàn)的頻率接近。Ultralytics 沒有直接提供 per-class 采樣參數(shù)常見做法是提前在數(shù)據(jù)層面復(fù)制少數(shù)類圖像或者直接用外部腳本做重采樣。5. 避坑五個(gè)翻車現(xiàn)場(chǎng)與排查記錄5.1 損失正常下降驗(yàn)證 mAP 卻一直是 0現(xiàn)象訓(xùn)練日志里 box loss 從 0.08 慢慢降到 0.03看起來很健康但每個(gè) epoch 結(jié)束后的 mAP50 和 recall 都停在 0 附近整張驗(yàn)證集一個(gè)框都預(yù)測(cè)不出來。原因標(biāo)簽文件路徑寫錯(cuò)了。plant_sprout.yaml里train和val寫的是images/train和images/val但 Ultralytics 會(huì)默認(rèn)去labels/train找同名 txt。如果 labels 目錄名大小寫不一致或者 txt 文件壓根沒放進(jìn)去訓(xùn)練時(shí)所有圖像都成了“無標(biāo)簽”狀態(tài)模型學(xué)不到任何監(jiān)督信號(hào)損失下降只是背景知識(shí)的正常收斂。解決回到 2.3 的校驗(yàn)?zāi)_本先統(tǒng)計(jì) labels/train 下的 txt 數(shù)量確認(rèn)和 images 數(shù)量一致。如果 txt 文件存在但訓(xùn)練仍顯示 0 標(biāo)簽打開其中一份看內(nèi)容是否為空文件??瘴募热笔募[蔽因?yàn)槲募麑?duì)得上但沒有任何標(biāo)注行模型依然拿不到監(jiān)督信號(hào)。5.2 預(yù)測(cè)框整體偏到芽旁邊的土壤上現(xiàn)象置信度挺高框也方方正正但框的中心點(diǎn)不在芽體上而是落在芽基部旁邊的土塊或基質(zhì)上尤其是小芽特別明顯。原因標(biāo)注框不夠緊。很多標(biāo)注工具導(dǎo)出的框是矩形外接框如果標(biāo)的時(shí)候圖省事把邊框劃大了幾像素芽體本身又小于 10 像素框中心點(diǎn)就會(huì)偏離目標(biāo)區(qū)域。模型訓(xùn)練過程中會(huì)學(xué)著預(yù)測(cè)這個(gè)“偏了的中心”最后輸出的預(yù)測(cè)自然也是偏的。解決我一般會(huì)抽查 50 張訓(xùn)練圖把標(biāo)注框畫回原圖看貼合度。如果固定偏移方向比如都是偏右下說明標(biāo)注時(shí)統(tǒng)一出現(xiàn)了系統(tǒng)性偏差用腳本把所有標(biāo)注按像素偏移修正再訓(xùn)練。如果是隨機(jī)偏移就把這類邊界模糊的樣本找出來重新標(biāo)注重點(diǎn)修那些面積小于 20×20 像素的框。5.3 剛破土的芽頻繁漏檢已展開子葉的芽都能檢出現(xiàn)象分類別統(tǒng)計(jì)時(shí)sprout類的 recall 明明有 0.92但實(shí)際看可視化推理結(jié)果漏掉的全是最小的那批芽很多只有三五個(gè)像素寬。原因這是典型的小目標(biāo)在多尺度特征圖中響應(yīng)不足。YOLO 系列的主干網(wǎng)絡(luò)下采樣倍數(shù)決定了最小檢測(cè)尺寸輸入 640 時(shí)P3 特征圖的 stride 是 8對(duì)應(yīng)感受野大約 8 像素小于 8 像素的目標(biāo)基本只能靠上下文推測(cè)難以形成穩(wěn)定的特征響應(yīng)。解決兩個(gè)手段組合一是按 4.2 把imgsz提到 960 或 1280讓目標(biāo)在輸入圖像里的像素面積變大二是用切圖推理。我常用的工具是 SAHISlicing Aided Hyper Inference把大圖切成 640×640 的重疊切片分別推理再合并結(jié)果能在不改訓(xùn)練配置的情況下把 recall 拉高五到十個(gè)點(diǎn)。對(duì)萌芽檢測(cè)這種目標(biāo)小、分布密的任務(wù)切圖推理幾乎是現(xiàn)場(chǎng)落地的保底方案。5.4 顯存不夠batch 調(diào)小后損失曲線劇烈震蕩現(xiàn)象24GB 顯卡跑batch16沒問題換到 8GB 顯卡只能batch4訓(xùn)練損失從 0.05 到 0.11 來回跳驗(yàn)證指標(biāo)也不穩(wěn)定早停機(jī)制頻繁誤判。原因batch 太小的情況下BNBatch Normalization層的統(tǒng)計(jì)量計(jì)算不穩(wěn)定每批數(shù)據(jù)的均值和方差波動(dòng)大梯度方向的噪聲也隨之放大。這在目標(biāo)檢測(cè)的早期訓(xùn)練階段尤其明顯因?yàn)榍捌?anchor 分配還在劇烈變化。解決優(yōu)先做梯度累積單卡上模擬出更大的 batch。Ultralytics 支持在訓(xùn)練參數(shù)里通過batch和accumulate配合或者手動(dòng)在優(yōu)化器層面累積梯度。其次把優(yōu)化器從 SGD 換成 AdamW它對(duì)小 batch 的適應(yīng)性更好一些。如果兩者都不方便就強(qiáng)制凍結(jié) backbone 前 10 層訓(xùn)練只更新檢測(cè)頭能顯著降低顯存占用和梯度波動(dòng)。5.5 驗(yàn)證指標(biāo)很好一到現(xiàn)場(chǎng)新場(chǎng)景就翻車現(xiàn)象訓(xùn)練集和驗(yàn)證集都是從同一次拍攝里隨機(jī)劃分的mAP50 到了 0.95結(jié)果到現(xiàn)場(chǎng)換了一批苗盤拍攝檢測(cè)率直接掉到 0.6 以下。原因隨機(jī)劃分造成數(shù)據(jù)泄漏。同一苗盤、同一時(shí)段拍攝的圖像之間高度相似模型記憶了這些圖像的紋理特征而不是“芽”本身的通用特征驗(yàn)證集和訓(xùn)練集太像導(dǎo)致評(píng)估結(jié)果虛高。解決所有行業(yè)數(shù)據(jù)集都應(yīng)該按時(shí)間或場(chǎng)景做分組劃分而不是隨機(jī)打散。具體到這個(gè)數(shù)據(jù)集我會(huì)把所有圖像先按拍攝日期排序取前 80% 的圖像做訓(xùn)練后 20% 做驗(yàn)證。如果資源里沒帶時(shí)間信息就按文件名序號(hào)的大段切分保證同一個(gè)批次的連拍不會(huì)同時(shí)出現(xiàn)在訓(xùn)練和驗(yàn)證里。這個(gè)改動(dòng)看起來小但對(duì)現(xiàn)場(chǎng)泛化能力的影響是決定性的。6. 訓(xùn)練完成后我建議你在交付前強(qiáng)制走一遍的驗(yàn)證流程模型訓(xùn)練完不代表能用每年因?yàn)檫@個(gè)翻車的人不少。我自己的習(xí)慣是留出一個(gè)叫final_check的小目錄里面放 20 到 30 張與訓(xùn)練集完全不同場(chǎng)景的圖片比如不同育苗盤的、不同光照下的甚至手機(jī)拍攝角度與工業(yè)相機(jī)不同的。每次訓(xùn)練完不管驗(yàn)證集指標(biāo)多好看都要把這個(gè)目錄跑一遍推理肉眼檢查輸出結(jié)果。檢查時(shí)重點(diǎn)看兩類錯(cuò)誤一類是漏檢模型對(duì)某個(gè)明顯的芽沒輸出任何框另一類是錯(cuò)檢把土壤里的石子、基質(zhì)顆?;蚩潭染€誤判成芽。前者說明泛化不足后者說明特征學(xué)習(xí)有偏差。漏檢多的回到第 4 章調(diào)輸入尺寸和增強(qiáng)錯(cuò)檢多的往往是標(biāo)注時(shí)把背景物體框了進(jìn)去需要回查訓(xùn)練集里有沒有類似的臟標(biāo)簽。我還習(xí)慣把每張測(cè)試圖的置信度分布打印出來統(tǒng)計(jì)conf 0.3的檢測(cè)框數(shù)量占比。如果一張 640×640 的圖上模型輸出了上百個(gè)低置信度框說明模型對(duì)背景產(chǎn)生了過度敏感需要在后處理里把conf閾值往上提到 0.35 或 0.4同時(shí)檢查是不是訓(xùn)練集里空穴類別樣本太少。最后分享一個(gè)我自己的血淚教訓(xùn)有一次做實(shí)時(shí)的苗盤巡檢設(shè)備訓(xùn)練階段只跑通了 YOLOv8 的默認(rèn)配置沒有做小目標(biāo)優(yōu)化結(jié)果拿到現(xiàn)場(chǎng)后漏檢率高出預(yù)期好幾倍。從那以后我每次訓(xùn)練前都強(qiáng)制走一遍數(shù)據(jù)校驗(yàn)、按場(chǎng)景劃分訓(xùn)練集、開大輸入尺寸這三個(gè)步驟雖然多花一兩個(gè)小時(shí)但再也沒有出現(xiàn)過交付現(xiàn)場(chǎng)翻車的情況。這份植物萌芽檢測(cè)數(shù)據(jù)集本身標(biāo)注得算規(guī)范但任何數(shù)據(jù)集到了自己手里都值得按這個(gè)流程過一次手希望我的經(jīng)驗(yàn)?zāi)軒湍闵僮咭欢螐澛?。本文還有配套的精品資源點(diǎn)擊獲取