據(jù)集6000張YOLO訓(xùn)練全流程與避坑指南)
簡介面向yolo系列算法yolov5至yolo11目標(biāo)檢測訓(xùn)練的數(shù)據(jù)集包聚焦可回收廢物識(shí)別場景包含玻璃瓶、紙瓶、塑料瓶、塑料袋等類別標(biāo)簽齊全可直接訓(xùn)練與驗(yàn)證。數(shù)據(jù)集已劃分好并同時(shí)提供yolo格式txt與voc格式xml兩種標(biāo)注方便在不同框架間切換初學(xué)者與進(jìn)階開發(fā)者均可快速上手。壓縮包共2000個(gè)xml標(biāo)注文件對(duì)應(yīng)VOC格式同時(shí)配套yolo標(biāo)簽整體約229.98MB組織清晰適合垃圾分類檢測模型訓(xùn)練與效果對(duì)比。目前已有47人學(xué)習(xí)/下載適合需要實(shí)際標(biāo)注數(shù)據(jù)完成課程設(shè)計(jì)、項(xiàng)目開發(fā)或算法復(fù)現(xiàn)的讀者。使用時(shí)可依據(jù)yolo格式說明理解坐標(biāo)歸一化規(guī)則也可借助voc格式進(jìn)行數(shù)據(jù)增強(qiáng)或格式轉(zhuǎn)換。這套數(shù)據(jù)能節(jié)省人工標(biāo)注時(shí)間專注模型調(diào)參與迭代是構(gòu)建可回收物檢測系統(tǒng)的實(shí)用基礎(chǔ)資源。1. 可回收廢物數(shù)據(jù)集的 6000 張帶標(biāo)簽圖像YOLO 分揀項(xiàng)目的起點(diǎn)準(zhǔn)備做回收物分揀或者智能回收箱的人大概率會(huì)先去找數(shù)據(jù)集。這份可回收廢物數(shù)據(jù)集 zip 包里裝的是 6000 張帶標(biāo)簽圖像覆蓋玻璃瓶、紙瓶、塑料瓶、塑料袋四類目標(biāo)很明確喂給 YOLO 訓(xùn)練一個(gè)能實(shí)時(shí)識(shí)別這幾類回收物的檢測模型。6000 張對(duì)四類目標(biāo)檢測來說屬于「夠起步但不富余」的量級(jí)——訓(xùn)練能出有效模型但標(biāo)注質(zhì)量和樣本分布稍微出問題指標(biāo)就會(huì)明顯塌。它的適用人群很具體要做垃圾分類演示項(xiàng)目的學(xué)生、給分揀線做視覺方案的小團(tuán)隊(duì)、以及想快速驗(yàn)證 YOLO 落地效果的工程師。這篇文章順著「解包 → 校驗(yàn)標(biāo)簽 → 訓(xùn)練 → 補(bǔ)數(shù)據(jù)」這條線把每一步的做法和坑位寫清楚讓你拿到 zip 之后能直接照做。2. 從 ZIP 到訓(xùn)練集解包、標(biāo)簽格式確認(rèn)與數(shù)據(jù)集劃分2.1 解包之后的第一件事先看目錄別急著看圖拿到 zip 先別急著打開圖片欣賞。常見做法是解壓到一個(gè)不含中文和空格的路徑比如D:\recycle_dataset或~/datasets/recycle。用 unzip 或 Python 的 zipfile 都行命令如下mkdir -p ~/datasets/recycle unzip yolo算法-可回收廢物數(shù)據(jù)集-6000張圖像帶標(biāo)簽-玻璃瓶紙瓶塑料瓶塑料袋.zip -d ~/datasets/recycle解壓完成后不要直接去看圖片內(nèi)容先確認(rèn)頂層目錄結(jié)構(gòu)。按這個(gè)標(biāo)題的命名習(xí)慣包內(nèi)大概率是 images 和 labels 兩個(gè)平級(jí)目錄也可能按類別分子目錄。用 find 列出前兩層結(jié)構(gòu)find ~/datasets/recycle -maxdepth 2 -type d | head -40這一步的目的有兩個(gè)一是確認(rèn)圖像格式是 jpg 還是 png后續(xù)腳本里擴(kuò)展名判斷要對(duì)上二是確認(rèn)標(biāo)簽和圖像是否同名。如果圖像 6000 張、標(biāo)簽文件也是 6000 份說明配對(duì)關(guān)系大概率成立數(shù)量對(duì)不上后面訓(xùn)練時(shí) YOLO 會(huì)靜默跳過沒有標(biāo)簽的圖像導(dǎo)致實(shí)際訓(xùn)練集縮水val 指標(biāo)虛高——這個(gè)坑我放到第 5 章詳細(xì)說。目錄里如果出現(xiàn)classes.txt或labels.txt這是關(guān)鍵文件它是類別順序的唯一權(quán)威來源先復(fù)制出來放好。2.2 YOLO txt 標(biāo)簽和 VOC xml 標(biāo)簽坐標(biāo)系完全不一樣可回收廢物這類數(shù)據(jù)集的標(biāo)簽最常見的就兩種格式。YOLO 格式下每個(gè)目標(biāo)占一行五個(gè)數(shù)字分別是 class_id、歸一化后的中心 x、中心 y、寬 w、高 h全部是浮點(diǎn)數(shù)VOC 格式則是 xml 文件用 xmin、ymin、xmax、ymax 記錄左上右下角像素坐標(biāo)類別寫在name節(jié)點(diǎn)里。兩者坐標(biāo)系不同混用必翻車。我建議隨機(jī)抽三五個(gè)標(biāo)簽文件看內(nèi)容別只看一個(gè)cat ~/datasets/recycle/labels/train/0001.txt如果輸出長這樣0 0.4829 0.5312 0.1842 0.3128 1 0.1124 0.7785 0.0901 0.0874那就是 YOLO txt 格式class id 0 對(duì)應(yīng)第一個(gè)類別。如果打開是 xml先別急著跑轉(zhuǎn)換腳本確認(rèn)一件事數(shù)據(jù) yaml 里的類別順序必須與 xml 里 name 節(jié)點(diǎn)和 id 的映射一致。VOC 轉(zhuǎn) YOLO 時(shí)中心點(diǎn)和寬高都要除以圖像寬高歸一化這步做錯(cuò)所有框的位置會(huì)整體偏移訓(xùn)練出來的模型檢測框全偏屬于玄學(xué)難排查的一類問題。我見過有人轉(zhuǎn)換時(shí)忘了歸一化loss 曲線看起來正常但推理時(shí)框全跑到圖像邊緣浪費(fèi)了一整輪訓(xùn)練時(shí)間。提示隨機(jī)抽 35 個(gè)標(biāo)簽文件看不要只抽一個(gè)。類別編號(hào)順序不一致是最容易踩的坑——有的包玻璃瓶是 0有的包塑料瓶是 0光看目錄名根本看不出來。2.3 劃分 train/val先比對(duì)文件名再隨機(jī)切劃分?jǐn)?shù)據(jù)集之前務(wù)必先確認(rèn)圖像和標(biāo)簽文件一一對(duì)應(yīng)。下面這段腳本用文件主鍵比對(duì)兩個(gè)目錄import os img_dir images label_dir labels imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith((.jpg, .png))} labels {os.path.splitext(f)[0] for f in os.listdir(label_dir) if f.endswith(.txt)} missing imgs - labels print(f圖像數(shù): {len(imgs)}, 標(biāo)簽數(shù): {len(labels)}, 缺標(biāo)簽: {len(missing)}) if missing: print(缺標(biāo)簽示例:, list(missing)[:5])這里用os.path.splitext取主鍵而不是拿整個(gè)文件名匹配是因?yàn)?zip 解壓后常見一種情況圖像是.png標(biāo)簽卻在生成時(shí)寫成了.jpg完整文件名比對(duì)會(huì)誤判成缺標(biāo)簽。比對(duì)完如果缺標(biāo)簽超過 5%要么補(bǔ)標(biāo)要么直接把這部分圖像移出訓(xùn)練目錄留著只會(huì)讓訓(xùn)練集數(shù)量虛高、實(shí)際學(xué)習(xí)不到完整信號(hào)。劃分 train/val 我習(xí)慣按 8:2 隨機(jī)分。6000 張四類任務(wù)隨機(jī)劃分足夠不需要太復(fù)雜的分層抽樣。腳本如下import os, random, shutil random.seed(42) imgs [f for f in os.listdir(images) if f.endswith((.jpg, .png))] random.shuffle(imgs) val_ratio 0.2 val_count int(len(imgs) * val_ratio) os.makedirs(images/train, exist_okTrue) os.makedirs(images/val, exist_okTrue) os.makedirs(labels/train, exist_okTrue) os.makedirs(labels/val, exist_okTrue) for i, img in enumerate(imgs): stem os.path.splitext(img)[0] src_img os.path.join(images, img) src_lbl os.path.join(labels, stem .txt) if i val_count: shutil.move(src_img, images/val/) shutil.move(src_lbl, labels/val/) else: shutil.move(src_img, images/train/) shutil.move(src_lbl, labels/train/)這段腳本的三個(gè)要點(diǎn)random.seed(42)保證每次劃分結(jié)果一致方便復(fù)現(xiàn)實(shí)驗(yàn)先 shuffle 再按數(shù)量切避免原目錄按文件名排序?qū)е碌姆植计顖D像和標(biāo)簽必須同步移動(dòng)只移圖像會(huì)讓 2.3 的比對(duì)腳本白跑。如果你的包內(nèi)圖像文件名不是連續(xù)編號(hào)也沒關(guān)系腳本用的是字符串主鍵不依賴編號(hào)。3. 寫 data.yaml 并跑通第一次 YOLOv8 訓(xùn)練3.1 data.yaml 的寫法names 順序就是訓(xùn)練時(shí)的類別 idYOLOv8 和 YOLOv5 的數(shù)據(jù)配置都用 yaml 文件。假設(shè)這個(gè)包的類別順序是玻璃瓶、紙瓶、塑料瓶、塑料袋以標(biāo)簽文件實(shí)際出現(xiàn)的 id 為準(zhǔn)data.yaml 長這樣path: ~/datasets/recycle train: images/train val: images/val nc: 4 names: 0: glass_bottle 1: paper_bottle 2: plastic_bottle 3: plastic_bag這里最大的坑是names的順序必須和標(biāo)簽文件里的 class id 一致。yaml 里寫錯(cuò)順序loss 照樣收斂但推理結(jié)果會(huì)張冠李戴——玻璃瓶被叫成塑料瓶屬于訓(xùn)練過程一點(diǎn)異常都看不出來的沉默錯(cuò)誤。所以寫完 yaml 之后別急著訓(xùn)練先跑一段腳本從標(biāo)簽文件反推實(shí)際的類別 id 全集import os ids set() for root, _, files in os.walk(labels/train): for f in files: if not f.endswith(.txt): continue with open(os.path.join(root, f)) as fp: for line in fp: ids.add(int(line.split()[0])) print(實(shí)際出現(xiàn)的類別 id:, sorted(ids))遍歷所有標(biāo)簽文件收集出現(xiàn)的 class id。如果打印出來是[0, 1, 2, 3]說明四類齊全且編號(hào)連續(xù)和 yaml 的 names 順序可以一一對(duì)上。如果出現(xiàn) 5、6 這類超出標(biāo)題范圍的編號(hào)說明包里混了沒寫進(jìn)標(biāo)題的類別需要單獨(dú)抽出來看是刪還是保留。這個(gè)腳本建議每次換數(shù)據(jù)集都跑一次是性價(jià)比最高的防呆手段。3.2 最小訓(xùn)練命令Ultralytics 一行起跑環(huán)境這塊我一般用 PyCharm 建一個(gè)虛擬環(huán)境來裝 ultralytics避免污染系統(tǒng) Python也方便換版本后回滾。安裝就一條命令pip install ultralytics裝完先不急著訓(xùn)練跑一個(gè)極小的探測任務(wù)確認(rèn)環(huán)境通yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg能出檢測結(jié)果說明 CUDA 和模型下載鏈路都沒問題。然后開始正式訓(xùn)練yolo detect train datarecycle.yaml modelyolov8s.pt epochs100 imgsz640 batch16這條命令的參數(shù)含義拆開說modelyolov8s.pt會(huì)從官方倉庫自動(dòng)下載 COCO 預(yù)訓(xùn)練權(quán)重用它做遷移學(xué)習(xí)6000 張圖能比隨機(jī)初始化快幾倍收斂如果下載超時(shí)手動(dòng)下載 yolov8s.pt 放到項(xiàng)目目錄參數(shù)改成model./yolov8s.pt即可。epochs100對(duì)四類 6000 張的量是合理的起點(diǎn)跑完看 val 曲線再?zèng)Q定加不加。batch取決于顯存我從 16 開始OOM 就降到 8。imgsz640是通用默認(rèn)值如果你的圖像里瓶子占畫面比例很小可以試 960代價(jià)是訓(xùn)練時(shí)間明顯變長。關(guān)鍵參數(shù)速查參數(shù)建議值什么時(shí)候調(diào)modelyolov8s.pt顯存小用 n精度不夠再上 mepochs100val loss 還在降就加到 150batch16OOM 時(shí)降到 8 或 4imgsz640小目標(biāo)多、顯存夠時(shí)改 960注意訓(xùn)練前關(guān)掉其他占顯存的程序。Windows 上常見問題是中途CUDA out of memory崩掉先降 batch別一上來就換大模型。3.3 訓(xùn)練曲線怎么讀損失、mAP 和數(shù)據(jù)質(zhì)量的對(duì)應(yīng)關(guān)系ultralytics 訓(xùn)練結(jié)束后runs/detect/train 目錄下會(huì)輸出 results.png、confusion_matrix.png 和一批驗(yàn)證圖。results.png 第一行是 box loss 和 cls loss第二行是 mAP50 和 mAP50-95。讀這些曲線時(shí)我關(guān)注的不是絕對(duì)數(shù)值而是三個(gè)信號(hào)。第一個(gè)信號(hào)box loss 在 50 epoch 后還在穩(wěn)定下降、沒有平臺(tái)期說明 100 epoch 不夠加到 150。第二個(gè)信號(hào)mAP50 很高0.95 上下但 mAP50-95 很低0.5 左右說明框的位置大致對(duì)、但和真值重疊不夠常見原因是標(biāo)注框沒貼緊目標(biāo)邊緣——比如瓶子標(biāo)注時(shí)把瓶蓋和陰影都框進(jìn)去了。第三個(gè)信號(hào)val loss 在某輪后開始回升說明過擬合。6000 張四類任務(wù)一般不太會(huì)太早過擬合真出現(xiàn)了通常是 batch 太小或模型選太大誤用了 yolov8x。這里和 yolo 損失函數(shù)直接相關(guān)的一點(diǎn)box loss 反映的是框回歸的質(zhì)量cls loss 反映類別預(yù)測的置信度。如果 cls loss 降得很快但 box loss 拖后腿問題出在標(biāo)注框的 IoU 一致性上而不是模型學(xué)不會(huì)——這時(shí)候去調(diào)學(xué)習(xí)率沒用回頭清洗標(biāo)注才是正解。我習(xí)慣訓(xùn)練時(shí)開著終端每隔一段時(shí)間瞄一眼 runs/detect/train 下有沒有新生成的曲線圖30 epoch 時(shí)就能看出趨勢省得跑完一輪才發(fā)現(xiàn)數(shù)據(jù)有問題。4. 訓(xùn)練前的數(shù)據(jù)清洗與樣本均衡標(biāo)注質(zhì)量決定模型上限4.1 用腳本找出面積過小和越界的標(biāo)注框可回收廢物數(shù)據(jù)集里最典型的標(biāo)注問題有兩類一類是瓶子在畫面里特別小只有幾十個(gè)像素高這類目標(biāo)在 imgsz640 下幾乎學(xué)不到有效特征另一類是標(biāo)注框越界YOLO 格式下表現(xiàn)為歸一化坐標(biāo)大于 1 或小于 0。檢查腳本如下import os from PIL import Image bad_files [] for f in sorted(os.listdir(labels/train)): if not f.endswith(.txt): continue stem os.path.splitext(f)[0] img_path os.path.join(images/train, stem .jpg) if not os.path.exists(img_path): img_path os.path.join(images/train, stem .png) if not os.path.exists(img_path): continue w, h Image.open(img_path).size with open(os.path.join(labels/train, f)) as fp: for line in fp: parts line.split() if len(parts) ! 5: bad_files.append((f, 字段數(shù)異常)) break _, cx, cy, bw, bh map(float, parts) x1 (cx - bw / 2) * w y1 (cy - bh / 2) * h x2 (cx bw / 2) * w y2 (cy bh / 2) * h if x1 0 or y1 0 or x2 w or y2 h: bad_files.append((f, 坐標(biāo)越界)) break if bw * w 10 or bh * h 10: bad_files.append((f, 目標(biāo)過小)) break print(len(bad_files), 個(gè)文件可能需要處理) print(bad_files[:10])邏輯說明先把 YOLO 歸一化坐標(biāo)還原成像素坐標(biāo)檢查是否落在圖像范圍內(nèi)再用框的像素寬高判斷目標(biāo)是否小到?jīng)]法學(xué)。還原坐標(biāo)這步是核心很多人直接比較歸一化坐標(biāo)和 1 的大小忽略了中心點(diǎn)加寬高一半可能越界的情況。10 像素是我自己的閾值可以在 816 之間調(diào)判斷依據(jù)是 imgsz640 時(shí)一個(gè) 10 像素寬的目標(biāo)只占整圖寬度的 1.5%檢測頭很難穩(wěn)定回歸。這些壞樣本我的處理原則是越界的直接刪掉對(duì)應(yīng)標(biāo)簽行數(shù)量少不影響大局目標(biāo)過小的先統(tǒng)計(jì)占比如果超過 5% 說明采集時(shí)拍攝距離太遠(yuǎn)或圖像分辨率不夠這批數(shù)據(jù)對(duì)瓶子的召回率不會(huì)有保障與其硬扛不如直接放棄過小樣本把標(biāo)注精力留給中等尺寸目標(biāo)。4.2 類別不均衡和背景單一的應(yīng)對(duì)思路玻璃瓶、紙瓶、塑料瓶、塑料袋四類如果數(shù)量差距大比如玻璃瓶 3000 張、塑料袋只有 500 張訓(xùn)練時(shí) loss 會(huì)被樣本多的類別主導(dǎo)塑料袋的 recall 會(huì)明顯掉隊(duì)。處理手段按優(yōu)先級(jí)排先改損失權(quán)重再對(duì)少數(shù)類做復(fù)制增強(qiáng)最后才考慮生成合成數(shù)據(jù)。合成瓶子圖像容易把紋理和反光特征做假塑料瓶那一類在驗(yàn)證集上 mAP 高一上現(xiàn)場就翻車的情況我見過不少——數(shù)據(jù)增強(qiáng)的教訓(xùn)有一條算一條寧可少補(bǔ)不要亂補(bǔ)。背景單一是另一個(gè)容易被忽略的問題。拿礦泉水瓶做例子如果訓(xùn)練集里 60% 的背景是白墻和桌面現(xiàn)場放到深色傳送帶上檢測模型的泛化能力立刻見底??苫厥諒U物數(shù)據(jù)集如果全部在室內(nèi)固定背景拍攝建議訓(xùn)練時(shí)打開 Ultralytics 的 mosaic 增強(qiáng)它會(huì)把四張圖拼成一張訓(xùn)練樣本相當(dāng)于變相擴(kuò)充背景多樣性。再配合一點(diǎn) HSV 擾動(dòng)讓瓶子的顏色在合理范圍內(nèi)波動(dòng)能明顯提升透明瓶和深色瓶的區(qū)分度。mosaic 在 ultralytics 里默認(rèn)開啟只要確認(rèn)沒被手動(dòng)關(guān)掉就行HSV 參數(shù)通過命令行傳入hsv_h0.015 hsv_s0.7 hsv_v0.4是實(shí)用起點(diǎn)在這個(gè)基礎(chǔ)上微調(diào)即可。4.3 處理數(shù)據(jù)時(shí)的自我校驗(yàn)清單數(shù)據(jù)清洗和增強(qiáng)做完訓(xùn)練前再過一遍清單各類別樣本數(shù)是否接近均衡驗(yàn)證集里是否覆蓋了不同背景和光照標(biāo)簽坐標(biāo)是否全部落在圖像范圍內(nèi)類別 id 是否與 yaml 的 names 順序一致。這套清單我每次都會(huì)走一遍血淚經(jīng)驗(yàn)是數(shù)據(jù)問題在訓(xùn)練前暴露代價(jià)是一小時(shí)訓(xùn)練后才暴露代價(jià)是一整天。第 5 章里寫的幾個(gè)翻車現(xiàn)場根源幾乎都在這一步漏檢。5. 避坑指南可回收廢物數(shù)據(jù)集訓(xùn)練常見的四個(gè)翻車現(xiàn)場5.1 缺標(biāo)簽的圖像被靜默跳過val 指標(biāo)虛高現(xiàn)象訓(xùn)練日志顯示數(shù)據(jù)集有 6000 張圖但每個(gè) epoch 實(shí)際處理的圖像明顯少于這個(gè)數(shù)val 的 mAP 卻高得反常。原因YOLO 對(duì)沒有對(duì)應(yīng) txt 標(biāo)簽的圖像會(huì)靜默跳過不報(bào)錯(cuò)也不警告。這個(gè) zip 解壓后標(biāo)簽缺失多半是文件名編碼問題導(dǎo)致配對(duì)失敗或者圖像是 png、標(biāo)簽卻在生成時(shí)以 jpg 為后綴命名主鍵匹配斷開。解決訓(xùn)練前跑 2.3 節(jié)的比對(duì)腳本把缺標(biāo)簽的圖像統(tǒng)計(jì)出來。文件擴(kuò)展名不一致是最隱蔽的情況務(wù)必用os.path.splitext取主鍵比對(duì)別拿完整文件名直接相等判斷。5.2 類別順序和標(biāo)簽 id 對(duì)不上模型識(shí)別張冠李戴現(xiàn)象訓(xùn)練日志正常loss 正常收斂驗(yàn)證集上玻璃瓶被成批識(shí)別成塑料瓶且置信度還很高看起來像模型「學(xué)會(huì)了但學(xué)錯(cuò)了」。原因data.yaml 里 names 的順序和標(biāo)簽文件里的 class id 不一致。很多數(shù)據(jù)集打包時(shí) categories 信息寫在子目錄里或者根本沒附全憑猜。解決先跑 3.1 的反推腳本收集標(biāo)簽文件里實(shí)際出現(xiàn)的 id 全集和每個(gè) id 的樣本數(shù)再對(duì)照 yaml 的 names 順序逐一核對(duì)。不要信目錄名目錄名和標(biāo)簽 id 不一致的情況我碰到過不止一次——目錄叫 paper_bottle標(biāo)簽里 id 2 代表的可能是塑料瓶。5.3 mAP50 很高但現(xiàn)場實(shí)時(shí)檢測框亂飄現(xiàn)象驗(yàn)證集 mAP50 0.9 以上跑攝像頭實(shí)時(shí)檢測時(shí)塑料瓶的檢測框在目標(biāo)附近抖動(dòng)置信度忽高忽低甚至同一瓶子相鄰兩幀一類識(shí)別成玻璃瓶、一類識(shí)別成塑料瓶。原因訓(xùn)練圖像全是一個(gè)角度、一個(gè)距離拍的缺少橫拍、斜拍和遠(yuǎn)近變化或者標(biāo)注框沒有貼緊目標(biāo)邊緣模型學(xué)到的框始終比瓶子大一圈。透明玻璃瓶和塑料瓶在邊緣和背景融為一體時(shí)標(biāo)注員很容易把框畫大。解決先看 runs/detect/train 里的驗(yàn)證樣本圖和 confusion matrix確認(rèn)模型學(xué)的是瓶子本身而不是背景。透明瓶類別的邊緣模糊問題可以在標(biāo)注階段要求標(biāo)注員貼著高光邊緣畫框陰影區(qū)域一律不框進(jìn)。這個(gè)修正是提升 mAP50-95 最直接的手段。5.4 換大模型救不了數(shù)據(jù)集只會(huì)更早過擬合現(xiàn)象從 yolov8s 換到 yolov8m、yolov8x訓(xùn)練時(shí)間翻倍甚至翻三倍mAP 只漲零點(diǎn)幾個(gè)點(diǎn)val loss 反而提前回升。原因6000 張四類目標(biāo)檢測任務(wù)的瓶頸通常不在模型容量而在標(biāo)注質(zhì)量和樣本多樣性。模型參數(shù)量變大只會(huì)更快記住訓(xùn)練集的噪聲。解決先用 yolov8s 跑通拿 baseline。如果 mAP50 已經(jīng)在 0.9 以上下一步是補(bǔ)數(shù)據(jù)、清洗標(biāo)注、加數(shù)據(jù)增強(qiáng)而不是升級(jí)模型。這也是為什么我堅(jiān)持把第 4 章的清洗腳本放在調(diào)參前面——數(shù)據(jù)問題暴露得越早后面越省事模型選型這種事放到數(shù)據(jù)干凈之后再做才有效。6. 用混淆矩陣和單類召回率決定下一批數(shù)據(jù)補(bǔ)什么訓(xùn)練完第一版先別急著調(diào)參。ultralytics 會(huì)在 runs/detect/train 下生成 confusion_matrix.png這張圖是決定「下一批數(shù)據(jù)補(bǔ)什么」最直接的工具比盯著 mAP 均值有用得多。對(duì)可回收廢物四類來說最常見的混淆就是對(duì)角線之外的高亮格玻璃瓶和塑料瓶因?yàn)橥该鞑馁|(zhì)的反光特征在圖像上高度重疊紙瓶和塑料袋因?yàn)閮烧叨际强烧郫B、輪廓不規(guī)則的形態(tài)。如果混淆矩陣?yán)锊A勘淮罅颗谐伤芰掀空f明訓(xùn)練集里欠缺能區(qū)分這兩類的樣本——比如帶高光的磨砂玻璃和啞光塑料的對(duì)比圖像。補(bǔ)數(shù)據(jù)時(shí)應(yīng)該精準(zhǔn)補(bǔ)這一類而不是四類均勻加量。另一種做法是加載訓(xùn)練好的模型對(duì) val 集逐類算精度和召回率from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) metrics model.val(datarecycle.yaml) print(metrics.results_dict)metrics.results_dict里同時(shí)包含各類的召回率哪類 recall 低哪類就是下一輪重點(diǎn)補(bǔ)樣本的對(duì)象。別只看四類加權(quán) mAP均值會(huì)掩蓋單類掉隊(duì)的真相。我自己踩過一個(gè)印象很深的坑第一版模型 mAP50 0.93看起來不錯(cuò)但塑料袋 recall 只有 0.62——訓(xùn)練集里塑料袋大多是團(tuán)著的深色袋子現(xiàn)場遇到淺色展開的袋子就認(rèn)不出。后來補(bǔ)了 300 張展開狀態(tài)的塑料袋圖像recall 直接到 0.85。從那以后我養(yǎng)成了一個(gè)習(xí)慣每次訓(xùn)練完先看混淆矩陣和單類 recall再?zèng)Q定要不要繼續(xù)調(diào)參。數(shù)據(jù)問題不解決調(diào)參就是浪費(fèi)時(shí)間。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取