據(jù)集:YOLO格式2700張訓練圖實戰(zhàn)解析)
簡介這份資源面向計算機視覺學習者與工地安全檢測方向的開發(fā)者提供一套可直接用于YOLO目標檢測的反光背心穿戴識別數(shù)據(jù)集幫助解決安全帽、反光衣等場景下目標檢測模型訓練與驗證的數(shù)據(jù)來源問題。數(shù)據(jù)按YOLOv5標準文件夾結(jié)構(gòu)組織包含訓練集約2700張、驗證集約770張、測試集約390張圖片及對應標簽文件類別共2類具體以classes文件為準可直接接入YOLO檢測流程。壓縮包為7z格式共約2000個文件以1999個txt標簽文件和1個py可視化腳本為主整體約398.38MB。其中可視化腳本無需修改即可運行隨機傳入一張圖片便能繪制邊界框并保存到當前目錄便于快速核查標注質(zhì)量。目前已有380人學習瀏覽適合需要快速搭建工地安全檢測基線、驗證數(shù)據(jù)分布與標注格式的讀者參考使用。1. 工地反光背心檢測數(shù)據(jù)集2700 張訓練圖能跑出什么結(jié)果工地安全帽和反光背心檢測是目標檢測落地最典型的場景之一但真正動手時卡住大多數(shù)人的不是模型結(jié)構(gòu)而是數(shù)據(jù)。網(wǎng)上開源的安全類數(shù)據(jù)集要么類別混亂要么標注格式不統(tǒng)一要么圖片數(shù)量太少撐不起訓練。這份 YOLO 格式的工地反光背心數(shù)據(jù)集直接按 YOLOv5 的目錄結(jié)構(gòu)組織好了訓練集、驗證集和測試集類別只有兩個——穿戴反光背心和沒穿反光背心標簽是標準的 txt 格式還附帶一個可視化腳本隨機傳一張圖就能把邊界框畫出來存到當前目錄。適合正在做工地安全監(jiān)控、邊緣端部署檢測模型或者想拿一份干凈的二分類數(shù)據(jù)集快速驗證 YOLO 訓練流程的從業(yè)者。下面從目錄結(jié)構(gòu)、標簽格式、可視化驗證到訓練參數(shù)把這份資源拆開講清楚。2. 數(shù)據(jù)集目錄結(jié)構(gòu)與 YOLO 標簽格式拆解2.1 按 YOLOv5 規(guī)范組織的目錄長什么樣拿到一份數(shù)據(jù)集第一件事不是急著訓練而是先確認目錄結(jié)構(gòu)對不對。YOLOv5 對數(shù)據(jù)目錄有明確的約定常見做法是根目錄下放images和labels兩個文件夾各自再分train、val、test三個子集。這份資源就是按這個規(guī)范來的訓練集約 2700 張圖片加對應標簽驗證集約 770 張測試集約 390 張。圖片是 jpg 格式標簽是同名的 txt 文件文件名一一對應比如img_006_jpg.rf.dc1bdef4e66822aeecbcb764b1a9ba83.txt對應同名的圖片文件。這種命名里帶.rf.和長哈希串的風格是 Roboflow 導出時自動生成的不影響使用但要注意圖片和標簽的文件名必須完全一致只差擴展名。如果你后續(xù)要自己增補數(shù)據(jù)命名規(guī)則也得對齊否則 YOLO 在加載時會找不到標簽直接報No labels found或者把沒有標簽的圖當負樣本處理訓練結(jié)果會莫名其妙地差。目錄結(jié)構(gòu)大致如下dataset/ ├── images/ │ ├── train/ # 約 2700 張 jpg │ ├── val/ # 約 770 張 jpg │ └── test/ # 約 390 張 jpg ├── labels/ │ ├── train/ # 對應 txt 標簽 │ ├── val/ │ └── test/ ├── classes.txt # 類別定義 └── show.py # 可視化腳本提示不同版本的 YOLO 對目錄層級要求略有差異YOLOv5 和 YOLOv8 都支持這種images/labels分離的結(jié)構(gòu)但 data.yaml 里的路徑寫法要對應調(diào)整。2.2 標簽 txt 里每一行到底存了什么YOLO 格式的標簽文件是純文本每一行代表一個目標框格式是class_id x_center y_center width height后四個值都是歸一化到 0 到 1 之間的浮點數(shù)。這份數(shù)據(jù)集的類別只有兩個所以 class_id 只可能是 0 或 1具體哪個對應“穿戴反光背心”、哪個對應“沒穿”要看 classes.txt 里的順序。常見做法是 0 表示沒穿1 表示穿戴但不同來源的數(shù)據(jù)集可能反過來訓練前一定要打開 classes.txt 確認。舉個例子一行標簽可能是這樣1 0.5234 0.6120 0.0890 0.2340意思是這個框?qū)儆陬悇e 1中心點在圖片寬高的 52.34% 和 61.20% 位置框的寬高分別占整圖的 8.9% 和 23.4%。歸一化的好處是圖片無論怎么縮放標簽都不用改這也是 YOLO 系列一直沿用這種格式的原因。用幾行 Python 就能快速統(tǒng)計每個類別的框數(shù)量和分布判斷數(shù)據(jù)是否均衡import os from collections import Counter label_dir dataset/labels/train counter Counter() for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for line in f: parts line.strip().split() if len(parts) 5: counter[parts[0]] 1 print(類別分布, dict(counter))這段代碼遍歷訓練集所有標簽文件統(tǒng)計每個 class_id 出現(xiàn)的次數(shù)。如果兩個類別數(shù)量差距過大比如一個 5000 框、另一個只有 300 框訓練時就要考慮用加權損失或者過采樣來平衡。參數(shù)上label_dir換成 val 或 test 就能看驗證集和測試集的分布建議三個子集都跑一遍確認劃分是否合理。2.3 classes.txt 與 data.yaml 的對應關系classes.txt 里每行一個類別名順序就是 class_id 的順序。這份數(shù)據(jù)集里兩行分別是穿戴反光背心和沒穿反光背心具體順序以文件為準。訓練時還需要一個 data.yaml把圖片路徑、類別數(shù)和類別名告訴 YOLO。常見寫法path: ./dataset train: images/train val: images/val test: images/test nc: 2 names: 0: vest 1: no_vestnc是類別數(shù)這里填 2names的順序必須和 classes.txt 完全一致否則訓練出來的模型會把類別搞反推理時把沒穿背心的框標成穿戴這種錯誤在驗證階段看混淆矩陣才能發(fā)現(xiàn)屬于典型的血淚經(jīng)驗。路徑寫法上path是根目錄train、val、test是相對路徑Y(jié)OLOv5 和 YOLOv8 都認這種寫法。3. 可視化腳本 show.py 的運行與邊界框驗證3.1 show.py 怎么跑起來可視化腳本是這份資源里最實用的部分之一。它的邏輯很簡單隨機傳入一張圖片腳本讀取對應的標簽文件把歸一化的坐標還原成像素坐標用矩形框畫在圖上然后保存到當前目錄。運行方式通常是命令行傳參python show.py --image dataset/images/train/img_006_jpg.rf.dc1bdef4e66822aeecbcb764b1a9ba83.jpg腳本內(nèi)部會做幾件事用 OpenCV 或 PIL 讀圖根據(jù)圖片文件名找到同目錄下 labels 文件夾里的同名 txt逐行解析 class_id 和四個歸一化坐標乘以圖片寬高得到像素坐標再用cv2.rectangle畫框、cv2.putText寫類別名最后cv2.imwrite保存。如果腳本里用的是相對路徑找標簽那運行時的當前目錄就很重要建議在數(shù)據(jù)集根目錄下執(zhí)行或者把腳本里的路徑改成絕對路徑。3.2 畫出來的框能驗證什么可視化不只是為了好看它能幫你快速判斷幾件事。第一標簽和圖片是否對齊如果框整體偏移或者尺寸明顯不對說明標簽在導出時可能出了問題。第二類別是否正確穿戴和沒穿的框顏色或標簽應該區(qū)分開如果發(fā)現(xiàn)大量誤標這份數(shù)據(jù)就需要清洗。第三小目標比例反光背心在遠景圖里可能只占幾十個像素如果框太小訓練時就要考慮用更大的輸入尺寸或者專門的小目標檢測策略。我一般會隨機抽 20 到 30 張圖跑一遍可視化覆蓋訓練集、驗證集和測試集重點看邊緣場景——夜間、逆光、多人重疊、背心被遮擋。這些場景的標注質(zhì)量直接決定模型上線后的誤報率。如果發(fā)現(xiàn)某類場景標注普遍不準寧可把這幾張?zhí)薜粢膊灰屌K數(shù)據(jù)進訓練集。3.3 腳本改造批量可視化與類別過濾原腳本一次只處理一張圖實際用的時候往往需要批量看??梢栽谠_本基礎上加一個循環(huán)遍歷整個目錄import os import cv2 img_dir dataset/images/train label_dir dataset/labels/train out_dir vis_output os.makedirs(out_dir, exist_okTrue) for fname in os.listdir(img_dir): if not fname.lower().endswith((.jpg, .png)): continue img_path os.path.join(img_dir, fname) label_path os.path.join(label_dir, os.path.splitext(fname)[0] .txt) if not os.path.exists(label_path): continue img cv2.imread(img_path) h, w img.shape[:2] with open(label_path) as f: for line in f: cid, x, y, bw, bh line.strip().split() x, y, bw, bh map(float, (x, y, bw, bh)) x1 int((x - bw / 2) * w) y1 int((y - bh / 2) * h) x2 int((x bw / 2) * w) y2 int((y bh / 2) * h) color (0, 255, 0) if cid 1 else (0, 0, 255) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.imwrite(os.path.join(out_dir, fname), img)這段代碼批量處理訓練集所有圖片把畫好框的圖存到vis_output目錄。color那行按 class_id 區(qū)分顏色方便一眼看出類別分布。參數(shù)上img_dir和label_dir換成 val 或 test 就能看其他子集out_dir可以改成你習慣的輸出位置。跑完之后翻一遍輸出圖比看損失曲線更能發(fā)現(xiàn)數(shù)據(jù)問題。4. 用這份數(shù)據(jù)集訓練 YOLO 的關鍵參數(shù)與避坑4.1 訓練命令與核心參數(shù)怎么設數(shù)據(jù)確認沒問題后就可以開訓了。以 YOLOv5 為例常見命令是python train.py --img 640 --batch 16 --epochs 100 --data data.yaml --weights yolov5s.pt --cache--img 640是輸入尺寸反光背心在圖中占比不大時可以提到 800 甚至 1024但顯存占用會明顯上升。--batch 16是批大小顯存不夠就降到 8 或 4同時把學習率按比例調(diào)小。--epochs 100對 2700 張圖來說通常夠用如果驗證集 mAP 在 80 輪后還在漲可以加到 150。--weights yolov5s.pt用預訓練權重比從頭訓收斂快很多這也是為什么建議先用小模型跑通再換大模型。--cache把圖片緩存到內(nèi)存加快讀取但數(shù)據(jù)量大時注意內(nèi)存占用。訓練過程中重點看三個指標mAP0.5、precision和recall。工地場景對漏檢容忍度低recall 比 precision 更重要如果 recall 偏低優(yōu)先檢查標注是否漏框而不是急著調(diào)模型。4.2 避坑這份數(shù)據(jù)集最容易翻車的五個地方現(xiàn)象一訓練一開始就報No labels found。原因通常是 data.yaml 里的路徑寫錯或者圖片和標簽文件名不一致。解決方法是先用os.listdir對比 images 和 labels 目錄下的文件名集合確認一一對應再檢查 yaml 里的相對路徑是否從正確的根目錄出發(fā)?,F(xiàn)象二訓練 loss 正常下降但驗證 mAP 一直是 0。大概率是類別順序搞反了或者 names 里的類別數(shù)和 nc 對不上。打開 classes.txt 和 data.yaml 逐行核對確保順序和數(shù)量完全一致。這種錯誤在混淆矩陣里表現(xiàn)為所有預測都集中到一個類別?,F(xiàn)象三可視化時框的位置整體偏移。原因可能是標簽在導出時用了不同的歸一化基準比如按 padding 后的圖算的而原圖沒有 padding。解決辦法是拿幾張圖手動量一下框的像素坐標和標簽還原出來的坐標對比確認偏差是系統(tǒng)性的還是隨機的?,F(xiàn)象四小目標漏檢嚴重。反光背心在遠景圖里可能只有 20 到 30 像素寬640 輸入下特征幾乎消失。常見做法是把輸入尺寸提到 1024或者在數(shù)據(jù)增強里加 mosaic 和 copy-paste增加小目標樣本。也可以換用帶 P2 檢測層的模型結(jié)構(gòu)專門抓小目標?,F(xiàn)象五驗證集和測試集分布不一致。如果驗證集 mAP 很高但測試集掉得厲害說明劃分時沒有按場景分層。解決方法是重新劃分確保訓練、驗證、測試三個子集里都包含白天、夜間、多人、單人等不同場景而不是隨機切分。4.3 數(shù)據(jù)增強與類別平衡的實操建議這份數(shù)據(jù)集兩個類別天然不均衡工地上穿戴反光背心的樣本通常遠多于沒穿的。訓練時可以在 YOLO 的 hyp 配置文件里調(diào)fl_gamma或者用--balance類的采樣策略。更直接的辦法是在數(shù)據(jù)加載階段對少數(shù)類做過采樣或者用 mosaic 增強時提高少數(shù)類圖片的拼接概率。增強參數(shù)上hsv_h、hsv_s、hsv_v控制色調(diào)、飽和度、亮度擾動工地場景光照變化大可以適當調(diào)大。degrees旋轉(zhuǎn)角度建議控制在 10 度以內(nèi)因為反光背心的朝向在真實場景里不會劇烈旋轉(zhuǎn)。translate和scale可以正常開增加位置和尺度多樣性。如果發(fā)現(xiàn)模型對夜間場景表現(xiàn)差可以專門收集夜間圖做補充而不是靠增強硬造。5. 從訓練到部署驗證模型是否真的可用的幾個技巧訓練完拿到best.pt別急著上線。我一般會走一遍完整的驗證流程確認模型在真實場景下不掉鏈子。第一步是用測試集跑val.py看 mAP、precision、recall 三個指標的絕對值而不是只看訓練曲線。測試集 mAP 比驗證集低 5 個點以內(nèi)算正常低太多說明過擬合或者劃分有問題。第二步是拿一批訓練集里沒出現(xiàn)過的工地實拍圖做推理重點看誤報和漏報。誤報多說明模型把類似背心的顏色或形狀當成了目標漏報多說明小目標或者遮擋場景沒學好。這時候可以調(diào)低置信度閾值看召回能不能上來但閾值太低會引入大量誤報需要根據(jù)業(yè)務容忍度找平衡點。第三步是看推理速度。如果用 YOLOv5s在普通 GPU 上單張圖推理通常在 10 毫秒以內(nèi)邊緣設備上可能到幾十毫秒。工地監(jiān)控往往要求實時如果速度不夠可以換更小的模型或者用 TensorRT 加速。導出 ONNX 或 TensorRT 引擎時注意輸入尺寸和歸一化參數(shù)要和訓練時一致否則精度會掉。最后一步是做一個簡單的混淆矩陣看兩個類別之間有沒有互相誤判。穿戴和沒穿在顏色上差異明顯正常情況混淆應該很少如果混淆嚴重說明標注里可能有一批圖把兩個類別標反了需要回頭清洗。從那以后我每次拿到新數(shù)據(jù)集都強制先跑一遍可視化加類別統(tǒng)計再開始訓練這個習慣幫我省下了大量返工時間。希望這份拆解能幫到你順利跑通自己的檢測流程。本文還有配套的精品資源點擊獲取