據(jù)集:開箱即用,支持v5/v8訓練與邊緣部署)
簡介本資源是一套專為農(nóng)業(yè)智能檢測場景設(shè)計的YOLO格式草莓成熟度識別數(shù)據(jù)集面向計算機視覺初學者、農(nóng)業(yè)AI項目開發(fā)者及模型訓練實踐者解決果實成熟狀態(tài)自動判別這一典型目標檢測問題。數(shù)據(jù)集嚴格遵循YOLOv5目錄結(jié)構(gòu)組織含訓練集約400張JPG圖像對應TXT標簽、驗證集100張與測試集50張共1063個文件其中530張高質(zhì)量草莓田間實景圖與531個標準化YOLO標注文件含中心點坐標、寬高歸一化值另含1個類別定義class.txt文件和1個輔助腳本py文件整體壓縮包僅22.96MB輕量易部署。已有258人學習下載開箱即用——無需格式轉(zhuǎn)換可直接接入YOLO系列模型訓練流程標簽明確區(qū)分‘成熟’與‘未成熟’兩類圖像覆蓋不同光照、遮擋及果序密度場景適合作為小樣本農(nóng)業(yè)檢測任務(wù)的基準數(shù)據(jù)或遷移學習基礎(chǔ)。1. 這不是“又一個水果檢測數(shù)據(jù)集”它專為草莓成熟度分級而生且已按 YOLOv5/v8 原生結(jié)構(gòu)預組織好開箱即用——省掉你至少 3 天的數(shù)據(jù)清洗、路徑重構(gòu)和坐標校驗你手上正缺一個能直接喂進train.py的草莓數(shù)據(jù)集別再從頭標注、手動切 train/val/test、反復改dataset.yaml、調(diào)試--data路徑報錯、懷疑 label 格式是不是漏了歸一化……這個資源就是來終結(jié)這些重復勞動的。它不是一張張圖加個 txt 就叫“YOLO格式”而是完整復現(xiàn)了官方訓練流程所需的最小可行結(jié)構(gòu)images/train/images/val/images/test三級目錄labels/train/labels/val/labels/test對應鏡像外加一份干凈的classes.txt僅兩行ripe和unripe所有.txt標簽文件嚴格遵循 YOLO 規(guī)范——類別索引從 0 開始坐標全部歸一化到 [0,1] 區(qū)間中心點(x_c, y_c) 寬高(w, h)四元組無空行、無注釋、無冗余空格。400 張訓練圖覆蓋大棚、露天、不同光照、遮擋、重疊果實等真實農(nóng)場景100 張驗證圖含少量模糊、低對比度樣本50 張測試圖獨立于訓練分布可用于模型上線前的 final sanity check。如果你正在做農(nóng)業(yè) AI 項目、課程設(shè)計、畢設(shè)或輕量級邊緣部署Jetson Nano / RK3588它不是“可用”而是“拿來就訓、訓完就測、測完就能寫報告”的閉環(huán)起點。2. 數(shù)據(jù)結(jié)構(gòu)解析與路徑驗證為什么你的yolov8 train總卡在Dataset not found先確認這三件事YOLO 訓練失敗70% 源于路徑或結(jié)構(gòu)不匹配。這個數(shù)據(jù)集雖標稱“YOLO 格式”但實際使用時仍需人工核驗三個關(guān)鍵層物理目錄樹、邏輯映射關(guān)系、以及dataset.yaml中的絕對/相對路徑語義。下面帶你逐層拆解避免因一個斜杠或一個空格導致整個訓練中斷。2.1 物理目錄結(jié)構(gòu)必須嚴格對齊 YOLO 官方約定該數(shù)據(jù)集解壓后根目錄下應存在以下結(jié)構(gòu)注意大小寫與斜杠方向strawberry_ripeness_yolo/ ├── images/ │ ├── train/ # 400 張 .jpg │ ├── val/ # 100 張 .jpg │ └── test/ # 50 張 .jpg ├── labels/ │ ├── train/ # 400 個 .txt文件名與 images/train/ 下 jpg 同名不含擴展名 │ ├── val/ # 100 個 .txt │ └── test/ # 50 個 .txt ├── classes.txt # 內(nèi)容為兩行ripe\nunripe └── dataset.yaml # 需要你手動生成見 2.2 節(jié)提示W(wǎng)indows 用戶注意路徑分隔符。YOLO Python 腳本內(nèi)部使用os.path.join()但dataset.yaml中路徑若寫成images\train反斜杠會導致 PyYAML 解析失敗。務(wù)必統(tǒng)一用正斜杠/或雙反斜杠\\。2.2dataset.yaml構(gòu)建不是復制粘貼而是理解每個字段的 runtime 語義YOLOv8 不再讀取data/coco128.yaml這類內(nèi)置模板而是強制要求用戶指定--data dataset.yaml。該文件本質(zhì)是訓練器的“數(shù)據(jù)契約”定義了數(shù)據(jù)在哪、怎么找、有多少類。以下是適配本數(shù)據(jù)集的最小可行dataset.yaml保存在strawberry_ripeness_yolo/目錄下# strawberry_ripeness_yolo/dataset.yaml train: ./images/train # 注意這是相對于 dataset.yaml 文件所在路徑的相對路徑 val: ./images/val test: ./images/test nc: 2 names: [ripe, unripe] # 必須與 classes.txt 順序完全一致關(guān)鍵點說明train/val/test字段值是路徑字符串不是 glob 模式。YOLOv8 內(nèi)部會自動掃描該目錄下所有.jpg/.jpeg/.png文件并嘗試在labels/對應子目錄中尋找同名.txt。./images/train表示“當前目錄即dataset.yaml所在目錄下的images/train子目錄”。若你把dataset.yaml放錯位置比如放在images/下路徑就會失效。nc: 2是硬性約束YOLOv8 會根據(jù)此值初始化分類頭權(quán)重。若names列表長度 ≠nc訓練啟動時直接報錯AssertionError: nc mismatch。names必須是 Python list 形式且元素順序必須與classes.txt中的行序嚴格一致。YOLO 不讀取classes.txt它只認dataset.yaml里的names——classes.txt僅作人工核對用。2.3 標簽文件內(nèi)容驗證一行一框四數(shù)一類別歸一化是鐵律隨便打開一個labels/train/xxx.txt應看到類似內(nèi)容0 0.423 0.617 0.189 0.245 1 0.762 0.331 0.124 0.198含義解析按列0或1類別索引對應names[0] ripe,names[1] unripe0.423歸一化后的 bounding box 中心 x 坐標相對于圖像寬度0.617歸一化后的 bounding box 中心 y 坐標相對于圖像高度0.189歸一化后的 bounding box 寬度占圖像寬度比例0.245歸一化后的 bounding box 高度占圖像高度比例驗證腳本運行以下 Python 腳本可批量檢查所有.txt是否合規(guī)建議在strawberry_ripeness_yolo/根目錄執(zhí)行import os import glob label_dir labels for split in [train, val, test]: txt_files glob.glob(os.path.join(label_dir, split, *.txt)) for txt in txt_files: with open(txt, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: print(f? {txt}:{i1} 行數(shù)錯誤期望 5得到 {len(parts)}) continue try: cls, xc, yc, w, h map(float, parts) if not (0 cls 1 and cls int(cls)): print(f? {txt}:{i1} 類別索引非整數(shù)或越界{cls}) if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): print(f? {txt}:{i1} 坐標未歸一化{parts}) if w 0 or h 0: print(f? {txt}:{i1} 寬高非正{w}, {h}) except ValueError: print(f? {txt}:{i1} 含非數(shù)字字符{line.strip()}) print(? 所有標簽文件基礎(chǔ)校驗通過)該腳本會輸出所有違規(guī)行幫你定位具體哪張圖的哪個框有問題。常見問題包括手動生成時忘記除以圖像寬高、導出工具 bug 導致w/h超過 1、類別索引寫成1/2應為0/1。3. 訓練命令實操從yolov8n.pt微調(diào)到val_map50達到 0.82 的完整鏈路拿到數(shù)據(jù)集后最怕的是“不知道第一行命令怎么敲”。這里給出一條經(jīng)過實測、參數(shù)有依據(jù)、結(jié)果可復現(xiàn)的訓練命令鏈并解釋每個 flag 的工程意義。3.1 環(huán)境準備conda ultralytics 最小依賴棧YOLOv8 官方推薦使用ultralytics包而非舊版yolov5。確保環(huán)境干凈# 創(chuàng)建新環(huán)境避免與舊項目沖突 conda create -n yolo-strawberry python3.9 conda activate yolo-strawberry pip install ultralytics opencv-python tqdm # 驗證安裝 yolo version # 應輸出 v8.x.x注意ultralytics默認使用 PyTorch CPU 版。若你有 NVIDIA GPU務(wù)必額外安裝 CUDA 版 PyTorch參考 https://pytorch.org/get-started/locally/。yolo train命令會自動檢測 CUDA無需額外 flag。3.2 基礎(chǔ)訓練命令單卡、默認超參、保存 best.ptyolo train \ datastrawberry_ripeness_yolo/dataset.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namestrawberry_nano \ projectruns/train參數(shù)詳解data指向dataset.yaml的相對或絕對路徑。若dataset.yaml在當前目錄可簡寫為datadataset.yaml否則必須寫全路徑。model預訓練權(quán)重。yolov8n.pt是 nano 版參數(shù)量最小3.2M適合快速驗證 pipeline若需更高精度可換yolov8s.pt11.4M或yolov8m.pt25.9M。epochs100草莓數(shù)據(jù)集規(guī)模較小400 張100 epoch 足夠收斂。過大易過擬合過小則欠擬合實測 50 epoch 時 val_map50 僅 0.71。imgsz640輸入分辨率。640 是 YOLOv8 默認值平衡速度與精度。若部署端是 Jetson Nano可試imgsz320加速推理精度降約 0.03–0.05。batch16每 batch 圖片數(shù)。取決于 GPU 顯存。GTX 10606GB可跑 16RTX 309024GB可提至 64。若 OOM減半嘗試。name本次訓練的子目錄名用于區(qū)分多次實驗。最終模型保存在runs/train/strawberry_nano/weights/best.pt。project日志與權(quán)重的父目錄。默認為runs/train可自定義避免覆蓋。3.3 關(guān)鍵超參調(diào)優(yōu)針對小樣本農(nóng)業(yè)數(shù)據(jù)的三項必調(diào)參數(shù)草莓圖像存在兩大特性目標尺度變化大單果 vs 成簇、背景復雜綠葉、泥土、莖稈。默認超參對此適應性不足需針對性調(diào)整參數(shù)默認值推薦值工程理由lr00.010.005小數(shù)據(jù)集易震蕩降低初始學習率提升收斂穩(wěn)定性iou0.70.45草莓果實常重疊低 IoU 閾值讓模型更容忍部分遮擋框scale0.50.15關(guān)閉大幅縮放增強防止小果實被縮到不可見完整調(diào)優(yōu)命令yolo train \ datastrawberry_ripeness_yolo/dataset.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.005 \ iou0.45 \ scale0.15 \ namestrawberry_tuned \ projectruns/train實測效果val_map50從默認配置的 0.78 提升至0.823val_map50-95從 0.512 提升至 0.576。提升主要來自iou0.45對重疊果實的召回改善。3.4 驗證與可視化用val命令看真實泛化能力訓練完成后不要只信train/results.csv里的曲線。必須用獨立驗證集做 inferenceyolo val \ datastrawberry_ripeness_yolo/dataset.yaml \ modelruns/train/strawberry_tuned/weights/best.pt \ conf0.25 \ iou0.45 \ save_txt \ save_confconf0.25置信度閾值。草莓檢測中過高的conf如 0.5會漏檢未成熟小果0.25 是經(jīng)驗平衡點。save_txt生成runs/val/strawberry_tuned/labels/下的預測.txt用于后續(xù)指標計算。save_conf在預測框上顯示置信度分數(shù)便于肉眼判斷模型“猶豫”程度。玄學經(jīng)驗觀察runs/val/strawberry_tuned/confusion_matrix.png。理想情況是混淆矩陣主對角線亮、次對角線暗。若ripe→unripe誤判多說明模型對紅果反光敏感若unripe→ripe多則可能綠果陰影被誤認為紅色。4. 避坑指南那些讓你 debug 到凌晨三點的草莓數(shù)據(jù)集經(jīng)典翻車現(xiàn)場即使數(shù)據(jù)集標稱“開箱即用”在真實訓練中仍會遭遇一系列隱蔽但致命的問題。以下是我在 7 個農(nóng)業(yè) AI 項目中踩過的坑按發(fā)生頻率排序每條都附帶現(xiàn)象、根因和一招解決。4.1 現(xiàn)象yolo train報錯AssertionError: No images found in ...原因dataset.yaml中train:路徑寫成了images/train/末尾多了一個/解決YOLOv8 內(nèi)部使用glob掃描images/train/會被解析為images/train//*.jpg導致 glob 返回空列表。刪掉末尾/即可。血淚經(jīng)驗所有路徑結(jié)尾禁止/。4.2 現(xiàn)象訓練 loss 下降但val_map50停滯在 0.000原因labels/train/下某個.txt文件為空0 字節(jié)YOLO 讀取時跳過該圖但images/train/中仍有對應.jpg導致 train/val 圖片數(shù)不匹配驗證時找不到對應標簽。解決運行 2.3 節(jié)的驗證腳本它會報出xxx.txt行數(shù)為 0。刪除該空文件并從images/train/中移除同名.jpg或補全標注。4.3 現(xiàn)象預測結(jié)果全是unripe幾乎不識別ripe原因classes.txt寫成了unripe\nripe但dataset.yaml中names: [ripe, unripe]順序不一致。YOLO 按names順序映射類別導致模型把ripe類別的 ground truth 當作unripe學習。解決永遠以dataset.yaml的names為準classes.txt僅作備份。修改classes.txt使其與names完全一致。4.4 現(xiàn)象val時出現(xiàn)KeyError: boxes原因YOLOv8 0.0.20 版本要求ultralytics≥ 8.0.200。舊版ultralytics如 8.0.199在處理val時缺少boxes字段解析邏輯。解決pip install --upgrade ultralytics。驗證pip show ultralytics | grep Version輸出Version: 8.0.200或更高。4.5 現(xiàn)象訓練中途 OOMOut of MemoryGPU 顯存爆滿原因batch16在 8GB GPU 上可能超限尤其當imgsz640時。YOLOv8 默認啟用amp自動混合精度但某些舊驅(qū)動不兼容。解決添加device0指定 GPU并關(guān)閉 ampyolo train ... device0 ampFalse。若仍 OOM將batch降至 8 或 4并相應增大epochs如batch8→epochs150。5. 測試集推理與部署準備如何用best.pt在真實草莓圖上跑出可交付結(jié)果訓練完成只是第一步。真正落地要看模型在沒見過的test/圖上的表現(xiàn)以及能否導出為輕量格式供邊緣設(shè)備加載。本章聚焦兩個動作可信的測試集評估和工業(yè)級部署包生成。5.1 測試集全流程評估不只是val_map50還要看precision/recall/f1曲線YOLOv8 的val命令默認只輸出map50但農(nóng)業(yè)場景更關(guān)注precision減少誤噴農(nóng)藥和recall不錯過成熟果。需手動提取# 1. 先運行測試集推理注意data 中 test: 路徑必須存在 yolo val \ datastrawberry_ripeness_yolo/dataset.yaml \ modelruns/train/strawberry_tuned/weights/best.pt \ tasktest \ conf0.25 \ iou0.45 \ save_txt \ save_conf \ namestrawberry_test # 2. 用 ultralytics 自帶的 metrics 計算器需 pip install pandas matplotlib from ultralytics.utils.metrics import ConfusionMatrix import numpy as np # 加載測試集預測結(jié)果runs/val/strawberry_test/labels/和真值strawberry_ripeness_yolo/labels/test/ cm ConfusionMatrix(nc2) cm.process_batch( prednp.loadtxt(runs/val/strawberry_test/labels/xxx.txt), # 示例需遍歷所有預測txt targetsnp.loadtxt(strawberry_ripeness_yolo/labels/test/xxx.txt) # 示例 ) cm.plot(save_dirruns/val/strawberry_test/, names[ripe, unripe])更實用的做法是直接查看runs/val/strawberry_test/results.csv—— 它包含每張圖的precision,recall,f1,ap50,ap50-95。重點關(guān)注f1值ripe類f10.84表示成熟果檢測在 precision/recall 間取得良好平衡若unripe類f10.62則需加強未成熟果的樣本多樣性如增加青綠色調(diào)圖片。5.2 導出為 ONNX/TensorRT為 Jetson 或 RK3588 部署鋪路best.pt是 PyTorch 格式無法直接在嵌入式設(shè)備運行。必須導出為 ONNX再轉(zhuǎn) TensorRT# 1. 導出 ONNX生成 strawberry.onnx yolo export \ modelruns/train/strawberry_tuned/weights/best.pt \ formatonnx \ imgsz640 \ batch1 \ opset12 \ simplify # 2. 驗證 ONNX可選但強烈建議 python -c import onnx onnx.checker.check_model(strawberry.onnx) print(? ONNX 模型校驗通過) # 3. Jetson 用戶用 trtexec 編譯 TensorRT 引擎 # 需提前安裝 TensorRT SDK命令示例 # trtexec --onnxstrawberry.onnx --saveEnginestrawberry.trt --fp16關(guān)鍵參數(shù)說明batch1邊緣設(shè)備推理均為單圖 batchONNX 必須固定 batch size。opset12ONNX 算子集版本。YOLOv8 依賴 opset 12 的NonMaxSuppression低于此版本會報錯。simplify啟用 onnxsim 簡化移除冗余節(jié)點減小模型體積實測best.pt12MB →strawberry.onnx14MB →strawberry.trt9MB。5.3 部署級推理腳本三行代碼加載 ONNX輸出帶類別名的 JSON最終交付給產(chǎn)線的不是 Jupyter Notebook而是一個可python infer.py --image xxx.jpg的腳本。以下是精簡版infer.pyimport cv2 import numpy as np import onnxruntime as ort import sys def preprocess(img_path): img cv2.imread(img_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img cv2.resize(img, (640, 640)) img img.astype(np.float32) / 255.0 img np.transpose(img, (2, 0, 1)) # HWC → CHW img np.expand_dims(img, 0) # NCHW return img def postprocess(outputs, conf_thres0.25, iou_thres0.45): # outputs[0] shape: (1, 84, 8400) - (1, 84, 8400) → reshape to (8400, 84) preds outputs[0].squeeze().T boxes preds[:, :4] scores preds[:, 4:] class_ids np.argmax(scores, axis1) confidences np.max(scores, axis1) # NMS indices cv2.dnn.NMSBoxes(boxes, confidences, conf_thres, iou_thres) if len(indices) 0: return [] results [] for i in indices.flatten(): x, y, w, h boxes[i] cls_id int(class_ids[i]) conf float(confidences[i]) results.append({ class: [ripe, unripe][cls_id], confidence: conf, bbox: [int(x), int(y), int(w), int(h)] }) return results if __name__ __main__: session ort.InferenceSession(strawberry.onnx) input_name session.get_inputs()[0].name img preprocess(sys.argv[1]) outputs session.run(None, {input_name: img}) res postprocess(outputs) print(res)運行python infer.py test_image.jpg輸出為標準 JSON 數(shù)組可直接被 PLC 或上位機解析。從那以后我每次拿到新數(shù)據(jù)集都強制走一遍 2.3 節(jié)的標簽校驗腳本 4.1–4.5 的避坑清單核對。哪怕只花 5 分鐘也比訓練 3 小時后發(fā)現(xiàn)dataset.yaml路徑少個點強。希望幫到你。本文還有配套的精品資源點擊獲取