
簡介本資源是面向計算機視覺初學者與YOLO目標檢測實踐者的高質量垃圾識別數據集及配套訓練支持包解決真實場景下小樣本、多類別垃圾目標檢測模型訓練的數據與環境搭建難題。壓縮包共2000個文件含1000張真實場景高清圖片、990個YOLO格式標簽.txt、1000個VOC格式標注.xml以及6個HTML教程文檔、3個Python劃分腳本支持train/val/test三集自動拆分并生成ImageSets、1個YOLO訓練配置yaml文件整體73.26MB結構清晰、開箱即用。已有1482人學習下載覆蓋課程實驗、課程設計及畢業設計等教學場景。用戶可直接調用三種主流標注格式開展YOLOv5/v8等模型訓練同步獲得Windows/Linux雙平臺環境搭建指南、分步式訓練教程及多個實用劃分腳本顯著降低數據預處理與工程復現門檻。1. 這不是“拿來即用”的數據包而是YOLO目標檢測落地的最小閉環驗證集你下載了一個名為“YOLO垃圾目標檢測數據集含1000張圖片對應VOC、COCO和YOLO三種格式標簽劃分腳本訓練教程.rar”的壓縮包——它表面看是資源合集實則是把YOLO目標檢測從數據準備到模型訓練的關鍵斷點全部顯性化的一套可驗證載體。1000張真實場景下的垃圾圖像如塑料瓶、紙盒、果皮、煙頭等不是合成圖或模糊截圖而是具備合理光照、遮擋與尺度變化的現場采集樣本三種標注格式并存不是簡單轉換而是暴露了不同框架對坐標系、類別索引、邊界框歸一化邏輯的根本差異劃分腳本不只分train/val/test還強制校驗每張圖是否真有標注、是否所有類別在各子集中均有覆蓋訓練教程跳過環境安裝泛泛而談直接從yolov8n.yaml修改類別數開始用ultralytics最新穩定版v8.2.64命令跑通單卡微調。適合兩類人剛學完YOLO理論但卡在“數據怎么喂給模型”的新手以及需要快速驗證某類小眾目標如環衛、市政、環保AI應用是否可用YOLO baseline解決的工程師。它不承諾高精度但能讓你30分鐘內看到loss下降、50分鐘內拿到mAP0.5——這才是工業級目標檢測項目啟動的真實起點。2. 為什么必須同時提供VOC、COCO、YOLO三種格式坐標系統與類別管理的底層差異決定一切2.1 VOC格式XML結構里的絕對像素坐標與類別字符串綁定VOC格式以filename.xml文件存儲核心是bndbox標簽內的xmin,ymin,xmax,ymax四個整數值單位為像素原點在左上角。關鍵約束在于類別名必須與name標簽完全一致且區分大小寫如plastic_bottle不能寫成Plastic_Bottle所有類別必須在ImageSets/Main/目錄下對應的train.txt、val.txt中列出文件名不含擴展名Annotations/目錄下XML文件名必須與JPEGImages/中圖片名嚴格匹配。提示YOLO訓練不直接讀VOC但它是人工標注工具如LabelImg的默認輸出也是COCO格式轉換的中間態。若你的標注團隊用LabelImgVOC就是不可繞過的源頭格式。2.2 COCO格式JSON中的歸一化坐標與category_id映射機制COCO采用單個instances_train.json文件結構分三層images含id,file_name,width,height、annotations含image_id,category_id,bbox、categories含id,name。其中bbox為[x, y, width, height]單位為像素但x,y是左上角坐標非中心點——這點常被誤認為YOLO格式。更重要的是category_id必須從1開始連續編號0被保留為背景且categories數組索引需與category_id一一對應同一類別在不同圖片中category_id必須相同否則訓練時會報IndexError: index out of rangeimages中width/height必須與實際圖片尺寸完全一致否則bbox坐標將錯位。{ categories: [ {id: 1, name: plastic_bottle}, {id: 2, name: cardboard_box} ], annotations: [ { image_id: 1, category_id: 1, bbox: [120, 85, 92, 138] // x120, y85, w92, h138 } ] }2.2.1 COCO轉YOLO時最易踩的坑bbox歸一化分母取錯YOLO要求bbox為[x_center, y_center, width, height]且全部歸一化到[0,1]區間。常見錯誤是用max(width, height)作分母正確做法是x_center (x width/2) / image_widthy_center (y height/2) / image_heightwidth_norm width / image_widthheight_norm height / image_height若圖片尺寸為640x480bbox[120,85,92,138]應轉為[0.2656, 0.2792, 0.1438, 0.2875]保留4位小數。任何偏差都會導致anchor匹配失敗loss長期不降。2.3 YOLO格式TXT文件中的相對坐標與類別索引零基化每個圖片對應一個同名.txt文件每行代表一個目標class_id center_x center_y width height。關鍵規則class_id從0開始plastic_bottle0,cardboard_box1與COCO的category_id偏移1center_x,center_y,width,height均為[0,1]區間浮點數分母必須是該圖片原始寬高非resize后尺寸若一張圖無目標對應.txt文件為空非刪除文件。注意Ultralytics官方要求YOLO格式的train/目錄下必須有images/和labels/兩個子目錄且images/中圖片路徑與labels/中txt路徑一一對應如images/train/001.jpg→labels/train/001.txt。路徑錯位會導致KeyError: image_id。3. 劃分腳本不止分數據更要保障類別分布均衡與標注完整性校驗3.1 標準劃分腳本的核心邏輯按圖片而非標注行切分很多腳本按標注框數量隨機打亂導致某類目標全集中在train集。正確做法是掃描所有圖片提取每張圖的唯一類別集合如001.jpg含[0,2]002.jpg含[1]按圖片ID隨機排序但使用stratify參數確保各類別在train/val/test中占比接近sklearn的train_test_split支持強制檢查若某類在val集中出現0次腳本自動從train集抽樣補充避免No labels found in val set錯誤。# split_dataset.py 關鍵片段Python 3.9 from sklearn.model_selection import train_test_split import os, random def get_image_classes(img_path, labels_dir): 返回圖片中出現的所有類別ID label_file os.path.join(labels_dir, os.path.splitext(os.path.basename(img_path))[0] .txt) if not os.path.exists(label_file): return [] with open(label_file) as f: classes set() for line in f: if line.strip(): cls_id int(line.split()[0]) classes.add(cls_id) return list(classes) # 獲取所有圖片路徑 img_paths [os.path.join(images, f) for f in os.listdir(images) if f.lower().endswith((.jpg,.jpeg,.png))] # 構建類別向量用于分層抽樣 y [max(get_image_classes(p, labels)) if get_image_classes(p, labels) else -1 for p in img_paths] # 分層劃分test_size0.2, val_size0.2 → train:60%, val:20%, test:20% train_idx, temp_idx train_test_split(range(len(img_paths)), test_size0.4, stratifyy, random_state42) val_idx, test_idx train_test_split(temp_idx, test_size0.5, stratify[y[i] for i in temp_idx], random_state42)3.1.1 劃分后必須執行的三重校驗校驗項命令失敗表現修復動作圖片與標簽文件名一致性diff (ls images/train | sort) (ls labels/train | sed s/\.txt$/.jpg/ | sort)輸出非空行刪除缺失配對的文件標簽文件中class_id越界grep -n ^[3-9]|^[1-9][0-9] labels/train/*.txt顯示行號及內容用sed -i s/^3$/2/g修正假設只有3類val集類別覆蓋檢查python -c import json; djson.load(open(coco/val.json)); print(set(a[category_id] for a in d[annotations]))輸出{1,2}但應有{1,2,3}從train集手動復制含缺失類別的圖片3.2 訓練教程的最小可行命令繞過配置文件修改的快捷路徑Ultralytics v8.2支持命令行直接覆蓋配置無需編輯yolov8n.yaml# 在數據集根目錄執行假設結構datasets/garbage/images/, datasets/garbage/labels/ yolo detect train \ datadatasets/garbage/data.yaml \ modelyolov8n.pt \ epochs100 \ batch16 \ imgsz640 \ namegarbage_yolov8n \ projectruns/detect \ device0 \ --cfg {nc: 3, names: [plastic_bottle, cardboard_box, food_waste]}data.yaml只需定義train,val,nc,names四字段nc為類別數names為列表--cfg參數直接注入模型結構nc必須與數據集中最大class_id1相等YOLO格式class_id從0開始batch16在單卡RTX 3060上穩定若OOM則降至8不要盲目調大——YOLO的batch size對收斂影響遠小于學習率。4. YOLO訓練參數調優從loss曲線診斷到學習率、anchor、mosaic的協同調整4.1 loss曲線的三段式解讀定位問題根源的黃金法則訓練過程中results.png中的三條曲線box_loss, cls_loss, dfl_loss必須同步觀察box_loss長期高于cls_loss如box_loss2.5, cls_loss0.3說明定位不準優先檢查bbox歸一化是否錯誤、anchor尺寸是否匹配垃圾目標小目標多則需縮小anchorcls_loss不下降但box_loss下降類別混淆檢查names順序是否與label文件class_id一致或是否存在相似類別如paper_bag與cardboard_box所有loss在epoch 20后停滯學習率過高導致震蕩或數據增強過度如mosaic1.0對小目標有害。提示用tensorboard --logdirruns/detect/garbage_yolov8n實時查看重點關注train/box_loss的平滑度——鋸齒過大說明batch size過小或數據加載瓶頸。4.2 學習率策略cosine退火比step decay更適合小數據集YOLO默認lr00.01對1000張圖過大易過擬合。實測有效組合參數推薦值作用說明lr00.001初始學習率1000圖用0.01會在epoch5就發散lrf0.01最終學習率 lr0 * lrf即0.00001避免后期震蕩warmup_epochs3前3 epoch線性增到lr0緩解初始梯度爆炸optimizerautoUltralytics自動選AdamW比SGD更穩yolo detect train ... \ lr00.001 \ lrf0.01 \ warmup_epochs3 \ optimizerauto4.3 anchor優化用k-means聚類生成適配垃圾目標的先驗框默認YOLOv8的anchor[10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326]針對COCO通用目標對垃圾小目標平均尺寸50px不匹配。運行聚類# 生成聚類輸入文件YOLO格式的width,height列表 python -c import glob, os with open(anchors_input.txt,w) as f: for txt in glob.glob(labels/train/*.txt): with open(txt) as t: for line in t: if line.strip(): _, _, _, w, h map(float, line.split()) # 還原為像素尺寸假設imgsz640 w_px, h_px int(w*640), int(h*640) f.write(f{w_px},{h_px}\n) # 運行k-meansk6因YOLOv8用6組anchor kmeans.py -f anchors_input.txt -num_clusters 6 -output anchors_6.txt輸出anchors_6.txt類似[12,15, 21,28, 32,42, 45,60, 68,85, 92,110]替換yolov8n.yaml中anchors字段即可。5. 驗證與部署前的關鍵技巧用confusion matrix定位漏檢與誤檢根源5.1 生成混淆矩陣不只是看mAP更要定位具體錯誤類型訓練完成后用驗證集生成詳細分類報告yolo detect val \ datadatasets/garbage/data.yaml \ modelruns/detect/garbage_yolov8n/weights/best.pt \ conf0.25 \ iou0.6 \ save_txtTrue \ save_confTrue關鍵參數conf0.25降低置信度閾值捕獲更多預測框用于統計iou0.6匹配GT與Pred的IoU閾值COCO標準為0.5此處設0.6更嚴格save_txtTrue保存每張圖的預測結果preds/xxx.txt格式同YOLO標簽。然后運行分析腳本# analyze_confusion.py from sklearn.metrics import confusion_matrix import numpy as np # 讀取所有gt和pred gt_labels, pred_labels [], [] for txt in glob.glob(val_labels/*.txt): # 讀gt with open(txt) as f: for line in f: gt_labels.append(int(line.split()[0])) # 讀pred同名preds/xxx.txt pred_file preds/ os.path.basename(txt) if os.path.exists(pred_file): with open(pred_file) as f: for line in f: if float(line.split()[5]) 0.25: # conf 0.25 pred_labels.append(int(line.split()[0])) else: pred_labels.append(-1) # 未檢出 cm confusion_matrix(gt_labels, pred_labels, labels[0,1,2]) print(Confusion Matrix:) print(cm)輸出示例[[85 12 3] # plastic_bottle: 85正確, 12誤判為cardboard, 3誤判為food [ 8 92 0] # cardboard_box: 8誤判為plastic, 92正確 [ 5 2 73]] # food_waste: 5誤判為plastic, 2誤判為cardboard, 73正確若plastic_bottle行第二列12顯著高于其他說明模型將塑料瓶與紙箱特征混淆——需檢查訓練圖中兩類目標的紋理相似度或增加HSV顏色擾動增強。5.2 導出ONNX并驗證推理一致性確保部署端無精度損失yolo export \ modelruns/detect/garbage_yolov8n/weights/best.pt \ formatonnx \ dynamicTrue \ simplifyTrue \ opset12導出后用PyTorch和ONNX Runtime分別推理同一張圖對比輸出import torch, onnxruntime as ort import cv2 import numpy as np # PyTorch推理 model torch.load(best.pt)[model].float().eval() img cv2.imread(test.jpg) img_tensor torch.from_numpy(img.transpose(2,0,1)[None]/255.0).float() pred_pt model(img_tensor)[0] # [1, 84, 8400] # ONNX推理 ort_session ort.InferenceSession(best.onnx) pred_onnx ort_session.run(None, {images: img_tensor.numpy()})[0] # 比較top5置信度 print(PyTorch top5:, pred_pt[0, :5].detach().numpy()) print(ONNX top5: , pred_onnx[0, :5])若差值1e-4說明simplifyTrue破壞了算子——此時去掉simplify參數重導出犧牲體積換取精度。本文還有配套的精品資源點擊獲取