
簡介面向目標檢測與工業缺陷識別場景的腰果缺陷YOLO數據集共5類Broken、Defect、SplitDown、SplitUp、Whole已按YOLOv5目錄結構劃分訓練集3186張、驗證集304張、測試集150張每張圖片均含對應txt標簽采用相對坐標格式可直接替換至YOLOv5、YOLOv8等主流框架訓練。資源包共2000個文件主要包括1999個YOLO格式標注txt與1個數據可視化Python腳本腳本可隨機讀取圖片繪制邊界框并保存至當前目錄無需改動即可運行便于快速核驗標注效果。壓縮包大小約101.94MB同時附帶類別class文件省略手動配置步驟。已有63人學習使用適合需要現成腰果缺陷數據集的目標檢測學習者、算法工程師及比賽團隊尤其適合專注模型調優與缺陷識別改進的開發者。1. 腰果缺陷檢測數據集從零標注到可訓練少走三天彎路做過工業質檢的朋友都清楚缺陷檢測項目最耗時的往往不是模型調參而是數據準備。腰果這種農產品外形不規則、裂紋方向隨機、破損形態多樣標注標準稍不統一模型訓練出來就是一團漿糊。這套腰果缺陷檢測數據集直接給出了 5 類標注結果——Broken、Defect、SplitDown、SplitUp、Whole并且嚴格按照 YOLOv5 的目錄結構存放訓練集 3186 張、驗證集 304 張、測試集 150 張每個子集下 images 和 labels 一一對應拿過來改個 data.yaml 就能開始訓練。更實用的是資源里附帶了一個show.py可視化腳本不需要改任何路徑配置直接運行就會隨機抽一張圖片并繪制邊界框幫你快速核對標簽質量。對剛接觸 YOLO 的開發者來說這是理解標注格式和數據結構的最佳樣例對做農產品分選、食品質檢的工程師來說這也是一份可以遷移到其他不規則物體檢測任務的參考模板。接下來我從目錄結構、標注格式、可視化驗證、訓練配置和常見坑位幾個維度拆開講。2. YOLO 數據集目錄與 5 類標簽格式先看懂文件再說訓練2.1 目錄結構YOLOv5 約定下的 images/labels 組織方式拿到資源后第一件事不是急著跑訓練而是把目錄樹看清楚。這套數據嚴格遵循 YOLOv5 的組織約定訓練集和驗證集、測試集分開存放圖片和標簽文件放在各自的子目錄中且文件名一一對應。常見結構如下datasets/ ├── images/ │ ├── train/ # 3186 張圖片 │ ├── val/ # 304 張圖片 │ └── test/ # 150 張圖片 ├── labels/ │ ├── train/ # 3186 個 txt 標簽 │ ├── val/ # 304 個 txt 標簽 │ └── test/ # 150 個 txt 標簽 ├── classes.txt # 類別文件 └── show.py # 可視化腳本注意一個細節資源里測試集目錄的描述寫的是datasets-images-val實際是 test 數據也沿用了 val 的命名規范使用前建議先確認一下 test 文件夾的實際名稱。如果路徑不一致YOLO 訓練時會在data.yaml里通過 test 字段顯式指定不受文件夾名影響。建議收到數據后先跑一條命令驗證圖片和標簽數量是否嚴格一致for split in train val test; do img_count$(ls datasets/images/$split/*.jpg 2/dev/null | wc -l) lbl_count$(ls datasets/labels/$split/*.txt 2/dev/null | wc -l) echo $split: images$img_count labels$lbl_count done這里的邏輯是分別統計三個子集下的圖片和標簽文件數量正常情況下兩邊數字必須完全相同。如果出現 labels 少于 images 的情況說明有圖片沒有對應標注訓練時會被 YOLO 自動跳過但會影響實際參與訓練的樣本數導致類別分布失衡。文件名前綴IMG_0687_png.rf.xxx.txt說明這批數據來自 Roboflow 的導出格式rf是 Roboflow 的標記不影響 YOLO 讀取。2.2 YOLO 標簽格式class 與歸一化坐標的精確含義打開任意一個 txt 文件你會看到類似下面 5 列數字的格式0 0.482421875 0.352604167 0.0859375 0.104166667 3 0.721093750 0.572916667 0.152343750 0.133333333每一行代表一個目標框共 5 個字段用空格分隔。第一個字段是類別 ID從 0 開始計數對應classes.txt里的行號后面四個字段分別是x_centre、y_centre、w、h全部是相對于圖片寬高的歸一化值。比如0.482421875表示目標框中心點在圖片寬度方向的 48.24% 位置0.0859375表示框寬占整張圖片寬度的 8.59%。這種歸一化坐標的好處是與圖片分辨率無關。同一張腰果圖片縮放成 640x640 還是 1280x1280標注值都不需要改YOLO 內部在訓練時會自動映射回實際分辨率。這一點和 COCO 的像素坐標標注x, y, w, h絕對像素值有本質區別混用的話會導致邊界框偏移。類別文件classes.txt每行一個類名順序必須和標注文件里的 ID 對應。這組數據的順序是Broken Defect SplitDown SplitUp Whole也就是說 ID 0 是 BrokenID 4 是 Whole。訓練配置文件data.yaml中names列表的順序必須與此完全一致否則會出現標簽錯位的嚴重問題——模型學到的特征與類別名對不上評估指標一片混亂。2.3 批量檢查標簽坐標合法性拿到數據集后建議先寫一個快速腳本批量掃描所有標簽文件檢查是否有越界坐標、負數寬高或空文件問題。越界坐標通常來自標注工具的精度損失雖然 YOLO 在訓練時會做 clipping但坐標偏差過大會影響邊框回歸的收斂速度。import os label_dir datasets/labels/train bad_files [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: bad_files.append((fname, 字段數不為5)) continue cls, xc, yc, w, h parts xc, yc, w, h map(float, [xc, yc, w, h]) if xc 0 or xc 1 or yc 0 or yc 1 or w 0 or h 0: bad_files.append((fname, f坐標越界: {line.strip()})) elif xc - w/2 0 or xc w/2 1 or yc - h/2 0 or yc h/2 1: bad_files.append((fname, f邊界超出: {line.strip()})) print(f共檢查 {len(os.listdir(label_dir))} 個文件發現 {len(bad_files)} 個異常) for name, reason in bad_files[:20]: print(f{name}: {reason})這段腳本的兩個判斷邏輯第一層是合法性檢查坐標值必須在 0 到 1 之間且寬高為正數第二層是邊界檢查框的左上角(xc - w/2, yc - h/2)和右下角(xc w/2, yc h/2)必須落在圖片范圍內。如果第二條報錯通常說明標注框貼邊訓練時 mosaic 增強會把邊緣框截斷影響檢測精度。3. show.py 可視化腳本一張圖確認標注質量3.1 腳本設計邏輯隨機抽樣繪制邊界框show.py是這套資源里最省心的工具。它的設計意圖很明確隨機從數據集目錄中取一張圖片讀取對應的 txt 標注文件將歸一化坐標映射回像素坐標后用 OpenCV 繪制邊界框和類別標簽最后保存到當前目錄。整個流程不需要任何命令行參數也不要求手動指定圖片路徑做到了開箱即用。腳本核心邏輯可以還原為以下流程import cv2 import random import os img_dir datasets/images/train label_dir datasets/labels/train class_names [Broken, Defect, SplitDown, SplitUp, Whole] img_files [f for f in os.listdir(img_dir) if f.endswith((.jpg, .png))] rand_img random.choice(img_files) img_path os.path.join(img_dir, rand_img) label_path os.path.join(label_dir, rand_img.rsplit(., 1)[0] .txt) img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: lines f.readlines() for line in lines: cls_id, xc, yc, bw, bh map(float, line.strip().split()) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, class_names[int(cls_id)], (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) cv2.imwrite(visual_result.jpg, img) print(f已保存: visual_result.jpg (圖片: {rand_img}))核心邏輯拆解第一步用random.choice隨機選中一張圖片確保每次運行結果不同方便多輪抽檢第二步通過文件名替換后綴找到對應的 txt 標簽文件第三步是關鍵——將歸一化坐標乘以圖片實際寬高得到邊界框的像素坐標。x1和y1是左上角x2和y2是右下角OpenCV 的rectangle函數接收的正是這兩個坐標點。3.2 動手運行與結果解讀運行方式極其簡單在項目根目錄下執行python show.py如果datasets目錄路徑和腳本中的默認值不匹配會報FileNotFoundError。常見做法是把腳本中的img_dir和label_dir改成實際路徑或者把數據集目錄軟鏈接到腳本同級目錄下ln -s /your/actual/path/datasets ./datasets運行完成后當前目錄會生成一張visual_result.jpg。打開圖片重點看三件事第一邊界框是否緊貼腰果輪廓如果框大面積超出或明顯小于目標說明標注精度有問題第二類別標簽是否正確比如 Whole 類別出現 Broken 的標簽就是標注錯誤第三一張圖片里是否有多個框腰果檢測經常出現同一張圖多個目標的情況漏標會導致訓練時背景誤判。可視化驗證的價值在于訓練集的標注質量直接決定模型上限。YOLO 這類單階段檢測器對標簽噪聲的容忍度有限尤其是邊框偏移超過 10% 時mAP 會明顯下降。用show.py抽檢 20 到 30 張圖基本就能對整體標注水平做出判斷。4. 直接訓練 YOLOv5/v8data.yaml 配置與超參選擇4.1 data.yaml 的編寫與路徑修正拿到數據集后訓練前需要手動創建data.yaml文件。YOLOv5 和 YOLOv8 的配置格式完全一致核心是三個路徑加一個類別列表train: datasets/images/train val: datasets/images/val test: datasets/images/test nc: 5 names: [Broken, Defect, SplitDown, SplitUp, Whole]這里train、val、test指向圖片目錄即可YOLO 會自動根據文件名前綴去labels目錄下找對應的 txt。路徑建議使用相對路徑如果訓練時從項目根目錄執行這樣配置最不容易出錯。如果目錄結構是datasets/images/train但實際 labels 在datasets/labels/trainYOLO 內部處理邏輯是把images替換為labels所以目錄名的對應關系必須嚴格。訓練時如果遇到AssertionError: Label class X exceeds nc5 in data/yaml說明類別 ID 超出了取值范圍。常見原因是classes.txt里有空行或者數據集中出現了未定義的類別 ID。檢查方法awk {print $1} datasets/labels/train/*.txt | sort -n | uniq -c這條命令統計訓練集中出現的所有類別 ID 及頻次輸出應該只有 0 到 4 五個數字。如果出現 5 或更大值說明標注文件里有越界類別需要清洗數據否則訓練直接報錯。4.2 訓練參數的選擇邏輯YOLOv5 和 YOLOv8 在訓練命令上差異不大核心參數是img、batch、epochs。以 YOLOv8 為例yolo train modelyolov8s.pt datadata.yaml epochs100 imgsz640 batch16 device0參數說明modelyolov8s.pt是預訓練權重s 版本在精度和速度之間最均衡適合腰果這種類別數少、目標尺度中等的場景imgsz640是輸入分辨率腰果缺陷如 SplitDown 和 SplitUp 屬于細小裂紋如果 GPU 顯存充足可以提到 800 或 960小目標檢測精度會明顯改善batch16在 16GB 顯存下比較穩妥顯存不夠就降到 8。建議先跑 30 個 epoch 做一次快速驗證觀察 loss 曲線是否正常下降再決定是否跑滿 100 輪。如果使用 YOLOv5命令對應為python train.py --data data.yaml --weights yolov5s.pt --img 640 --batch 16 --epochs 100YOLOv5 和 YOLOv8 的損失函數結構不同v5 使用 GIoU Loss 作為回歸損失v8 改為 CIoU 結合 Distribution Focal LossDFL。對腰果這種邊界不規則的目標v8 的邊框回歸通常更穩定但 v5 的生態更成熟、部署方案更豐富。如果項目沒有特別要求優先推薦 v8s 起步。超參數方面有兩個重點mosaic和hsv增強。YOLOv5 默認開啟 mosaic1.0在訓練后期最后 10 個 epoch會自動關閉以穩定收斂YOLOv8 中可以用mosaic0.5控制概率。腰果圖片背景相對單一mosaic 增強能有效提升模型對背景變化的魯棒性建議保留。訓練時觀察類別分布如果 Whole 類別占比過高考慮在 loss 中加大其他類別的權重或者通過class_weight參數調節。4.3 訓練產出物的驗證方式訓練完成后runs/detect/train目錄下會生成weights/best.pt和weights/last.pt。best.pt是驗證集上 mAP 最高的權重last.pt是最后一輪的權重部署時統一用best.pt。快速驗證模型效果yolo predict modelruns/detect/train/weights/best.pt sourcedatasets/images/test/ imgsz640 saveTrue查看runs/detect/predict下的預測結果圖重點看兩個指標一是有沒有把 Broken 誤檢成 Defect這倆類別在視覺上容易混淆二是小裂紋 SplitUp 和 SplitDown 有沒有漏檢。如果漏檢嚴重下一步優化方向是提升輸入分辨率或增加數據增強。5. tips圖片與標簽錯位的快速排查與類別失衡處理5.1 文件名不匹配的隱形坑YOLO 訓練過程中如果出現corrupt image或assert labels are correct的報錯多數情況下是文件名不匹配。資源里的文件名帶_png.rf.這種冗長后綴有些開發者會在處理時用字符串截取改名結果導致圖片和 txt 文件前綴對不上。排查命令cd datasets for split in train val test; do diff (ls images/$split | sed s/\.[^.]*$// | sort) (ls labels/$split | sed s/\.[^.]*$// | sort) /dev/null echo $split OK || echo $split MISMATCH done這里是逐個子集對比 images 和 labels 下的文件名前綴sed s/\.[^.]*$//刪除最后一個點之后的后綴只保留主文件名再排序后 diff。如果有不一致輸出說明存在孤兒文件需要刪除或補齊。5.2 類別不均衡的處理策略這組數據 5 個類別里 Whole 的數量通常遠大于其余缺陷類直接用原始分布訓練會導致模型偏向多數類。常見做法是調整data.yaml中的類別權重YOLOv8 的 loss 支持class_weights參數YOLOv5 可以在訓練命令中加--cls 0.6提高分類損失的權重。另一種更直接的方式是離線過采樣少數類把 SplitDown 和 SplitUp 的圖片復制幾份混入訓練集注意打亂順序避免模型學到數據順序的偏置。5.3 標簽偏移的精細校準技巧如果可視化后發現某些框偏移了 2 到 3 個像素屬于標注誤差對訓練影響不大。但如果偏移超過 5%且集中在某個方向可以寫腳本對標簽做統一修正——統計所有框中心點的平均偏移量然后批量平移。這類系統性偏差通常來自標注工具導出時的坐標轉換 bug修正一次能明顯提升 mAP。建議訓練前先跑一次上面 2.3 節的檢查腳本再配合 show.py 抽檢兩步做完再進入訓練環節效率最高。本文還有配套的精品資源點擊獲取