简介:本资源为面向YOLO系列目标检测算法的仓库工人数据集,适用于智慧仓储、掌舵安全等场景下的工人检测与安全监控任务,可帮助算法学习者与工程人员快速开展模型训练与验证。数据集共623张图像,均已标注并划分完毕,包含YOLO格式txt标签与VOC格式xml标签两套标注文件,分别存放于独立文件夹,同时提供1个yaml配置文件,便于直接接入训练流程。压缩包共1870个文件,以jpg图像、txt标签、xml标注及yaml配置为主,整体约30.25MB,体积轻量、结构清晰。YOLO标签采用类别索引与归一化中心点、宽高坐标,兼容yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流版本。目前已有43人学习下载,适合需要快速验证检测方案、补充仓储场景样本或进行课程实验的读者使用。
1. 仓库工人检测数据集:623 张带标签图像,为什么值得先跑一遍再谈调参
上周有个做仓储安全监控的朋友找我,说想上一套工人检测模型,但卡在数据上——公开数据集要么是 COCO 里人挤人的通用场景,要么是工地安全帽那种偏门类别,仓库里叉车旁走动、货架间穿行的工人图像几乎没有现成的。我让他先别急着标数据,把这份warehouse-skj9z数据集跑通再说。它包含 623 张仓库场景图像,全部带标签,已经划分好训练/验证结构,同时提供 YOLO 格式(txt)和 VOC 格式(xml)两套标注,直接兼容 yolov5 到 yolo11 这一整条 YOLO 系列算法线。适合两类人:一是想快速验证仓库人员检测可行性的算法工程师,二是拿它当 YOLO 训练流程练手、熟悉数据配置的从业者。623 张不算大,但胜在场景聚焦、标签齐全、格式双份,省掉最耗时的清洗和转换环节,能让你把精力放在模型和参数上。
2. 数据集结构与两种标签格式:先看清目录再动手
拿到压缩包别急着解压完就train.py,先把目录结构和标签格式摸清楚。这份数据集的核心价值在于「双格式并存」,但两种格式的坐标体系完全不同,混用会直接导致训练时 loss 不收敛或者框全飘到图像外。下面按我实际拆包的顺序讲。
2.1 目录布局与文件命名规律
解压后典型结构是这样(不同版本可能略有差异,以实际为准):
warehouse-skj9z/ ├── images/ │ ├── train/ │ │ ├── img_0509_87.jpg │ │ ├── img_0509_92.jpg │ │ └── ... │ └── val/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── img_0509_87.txt │ │ └── ... │ └── val/ │ └── ... └── annotations/ # VOC 格式 xml ├── img_0509_87.xml └── ...图像命名是img_0509_XX.jpg这种带日期前缀的流水号,标签文件名与图像名严格一一对应,只是扩展名不同。这一点很关键:YOLO 训练时靠文件名匹配图像和标签,如果你手动重命名了图像却没同步改标签,训练会静默跳过那些样本,日志里只看到 images 数量对不上,排查起来很费时间。
常见做法是解压后先跑一条命令核对配对情况:
# 统计 train 下图像和标签数量是否一致 ls images/train/*.jpg | wc -l ls labels/train/*.txt | wc -l两个数字必须相等。如果不等,用comm找出差集:
# 找出有图像但没标签的文件(去掉扩展名后比对) comm -23 <(ls images/train/*.jpg | xargs -n1 basename | sed 's/.jpg//' | sort) \ <(ls labels/train/*.txt | xargs -n1 basename | sed 's/.txt//' | sort)输出的就是「孤儿图像」,要么补标要么删掉,别留着。
2.2 YOLO 格式标签的坐标含义
YOLO 格式的 txt 每行代表一个目标框,格式是:
<class> <x_center> <y_center> <width> <height>五个字段全部用空格分隔。<class>是类别索引,从 0 开始;后面四个是归一化到 0~1 的浮点数,分别表示框中心点的 x、y 坐标和框的宽、高,都是相对于图像宽高的比例值。举个例子,一张 1920×1080 的图,某个工人框中心在像素 (960, 540),框宽 200 像素、高 400 像素,那么标签行是:
0 0.5 0.5 0.104 0.370计算方式:x_center = 960/1920 = 0.5,y_center = 540/1080 = 0.5,width = 200/1920 ≈ 0.104,height = 400/1080 ≈ 0.370。
这里有个新手常翻车的点:YOLO 的 width/height 是归一化后的绝对宽高,不是半宽半高。有些自己写转换脚本的人会习惯性除以 2,结果框缩成一半,训练出来的模型检测框永远偏小。这份数据集是标准 YOLO 格式,直接用就行,但如果你要拿它去转其他格式,记住这个定义。
2.3 VOC 格式 xml 与 YOLO 的对应关系
annotations/下的 xml 是标准 Pascal VOC 结构,关键节点是:
<annotation> <filename>img_0509_87.jpg</filename> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <object> <name>worker</name> <bndbox> <xmin>860</xmin> <ymin>340</ymin> <xmax>1060</xmax> <ymax>740</ymax> </bndbox> </object> </annotation>VOC 用的是绝对像素坐标的左上角 (xmin, ymin) 和右下角 (xmax, ymax),和 YOLO 的归一化中心点格式是两套体系。两者互转的公式:
x_center = (xmin + xmax) / 2 / widthy_center = (ymin + ymax) / 2 / heightw = (xmax - xmin) / widthh = (ymax - ymin) / height
反过来:
xmin = (x_center - w/2) * widthymin = (y_center - h/2) * heightxmax = (x_center + w/2) * widthymax = (y_center + h/2) * height
提示:转换时务必用每张图自己的 width/height,不要用整个数据集的平均值。仓库图像如果分辨率不统一,用错尺寸会让框整体偏移。
2.4 类别索引与 data.yaml 配置
这份数据集是单类别(仓库工人),class 0 对应 worker。训练前要写一个data.yaml:
# data.yaml path: ./warehouse-skj9z # 数据集根目录 train: images/train # 训练图像相对路径 val: images/val # 验证图像相对路径 nc: 1 # 类别数 names: ['worker'] # 类别名,顺序必须和标签里的 class 索引一致nc和names是最容易配错的地方。如果标签里出现了 class 1 但你nc写的 1(只有 class 0),训练时那些 class 1 的框会被忽略或报索引越界。核对方法:
# 统计所有标签里出现过的类别索引 cat labels/train/*.txt | awk '{print $1}' | sort -u输出应该只有0。如果有其他数字,说明类别数不止一个,nc和names要相应调整。
3. 用 YOLOv8 跑通训练:从环境到第一个权重文件
结构看清了,接下来落到实际训练。我一般用 YOLOv8 做首轮验证,因为它的 CLI 和 Python API 都比较顺手,而且这份数据集标注规范,不需要额外清洗。下面按「装环境 → 改配置 → 启动训练 → 看结果」的顺序走,命令都能直接抄。
3.1 环境准备与依赖安装
先建一个干净的虚拟环境,避免和系统里的包打架:
# 创建并激活虚拟环境 python -m venv venv_yolo source venv_yolo/bin/activate # Windows 用 venv_yolo\Scripts\activate # 安装 ultralytics(YOLOv8/v11 官方库) pip install ultralytics # 验证安装,会打印版本和可用设备 yolo checksyolo checks会输出 PyTorch 版本、CUDA 是否可用、GPU 型号。如果显示CUDA: not available,说明你装的是 CPU 版 torch,训练会非常慢。623 张图在 CPU 上跑 100 epoch 可能要几个小时,有 GPU 的话务必确认 CUDA 可用。装 GPU 版 torch 的常见做法是先到 PyTorch 官网选对应 CUDA 版本的安装命令,再装 ultralytics。
3.2 启动训练与关键参数
把data.yaml放到数据集根目录,然后从命令行启动:
# 用 yolov8n 预训练权重在仓库工人数据集上微调 yolo detect train \ data=./warehouse-skj9z/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ project=runs/warehouse \ name=exp1逐个说参数:
model=yolov8n.pt:n 是最小模型,623 张图用 n 或 s 就够,用 l/x 容易过拟合。首次运行会自动下载预训练权重。epochs=100:小数据集可以多跑几轮,但配合patience早停。imgsz=640:输入分辨率。仓库图像如果工人目标较小,可以提到 960 或 1280,但显存占用会涨。batch=16:显存不够就降到 8 或 4,报CUDA out of memory时优先调这个。lr0=0.01:初始学习率,微调场景常用 0.01,从头训练可以到 0.02。patience=20:20 轮验证指标不提升就停,省时间。
训练过程中终端会打印每轮的 box_loss、cls_loss、mAP50、mAP50-95。重点看 mAP50 是否稳定上升,如果一开始就卡在很低的值不动,八成是 data.yaml 路径或类别配置错了。
3.3 训练结果解读与验证
训练结束后,runs/warehouse/exp1/下会有:
| 文件/目录 | 含义 |
|---|---|
weights/best.pt | 验证集上表现最好的权重 |
weights/last.pt | 最后一轮的权重 |
results.csv | 每轮指标记录 |
confusion_matrix.png | 混淆矩阵 |
val_batch0_pred.jpg | 验证集预测可视化 |
先看results.csv里 mAP50 的走势,再用 best.pt 跑一次验证:
# 用训练好的权重在验证集上评估 yolo detect val \ model=runs/warehouse/exp1/weights/best.pt \ data=./warehouse-skj9z/data.yaml \ imgsz=640如果 mAP50 在 0.8 以上,说明这份数据质量不错,模型基本能用了。低于 0.5 就要回头查标签——常见原因是类别索引错位或者框坐标越界(出现负数或大于 1 的值)。
3.4 推理测试:拿单张图看效果
验证指标是一回事,实际看图是另一回事。挑几张验证集图像跑推理:
# 对单张图像推理并保存结果 yolo detect predict \ model=runs/warehouse/exp1/weights/best.pt \ source=./warehouse-skj9z/images/val/img_0509_92.jpg \ conf=0.25 \ save=Trueconf=0.25是置信度阈值,低于它的框不显示。仓库场景如果工人被货架遮挡,可以降到 0.15 看看有没有漏检;如果误检多,提到 0.4。结果图默认存在runs/detect/predict/下,打开对比原图,重点看三种情况:工人密集处有没有漏框、货架边缘有没有误检、远处小目标框得准不准。这三种情况基本能反映数据集和模型的真实水平。
4. 换 YOLOv5/v7/v9/v10/v11 训练:格式兼容与版本差异
这份数据集标称兼容 yolov5 到 yolo11,但不同版本的目录约定和配置写法有差异,直接套用 v8 的 yaml 到 v5 上会报错。下面说清楚哪些能通用、哪些要改。
4.1 各版本对 YOLO 格式的兼容性
好消息是 YOLO 格式的 txt 标签从 v5 到 v11 都是同一套定义(class + 归一化中心点宽高),所以标签文件本身不用动。差异主要在:
| 版本 | 配置文件 | 目录约定 | 备注 |
|---|---|---|---|
| YOLOv5 | .yaml | images/labels 同级 | 需要 clone 仓库 |
| YOLOv7 | .yaml | 同 v5 | 配置项略有不同 |
| YOLOv8 | .yaml | 同 v5 | ultralytics 统一管理 |
| YOLOv9 | .yaml | 同 v5 | 依赖 ultralytics 或官方仓库 |
| YOLOv10 | .yaml | 同 v5 | 同上 |
| YOLO11 | .yaml | 同 v5 | ultralytics 直接支持 |
所以data.yaml基本可以复用,只是 v5 的 yaml 里字段名是train:、val:、nc:、names:,和 v8 一致。真正要改的是启动命令和权重文件名。
4.2 YOLOv5 训练配置示例
YOLOv5 需要单独 clone 仓库:
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt # 启动训练 python train.py \ --data ../warehouse-skj9z/data.yaml \ --weights yolov5s.pt \ --epochs 100 \ --img 640 \ --batch 16 \ --project runs/warehouse \ --name exp_v5注意 v5 用的是--img而不是--imgsz,--weights而不是--model。这些参数名差异是换版本时最容易踩的坑,报unrecognized arguments就是参数名写错了。
4.3 YOLOv10/v11 的差异点
YOLOv10 和 YOLO11 都可以通过 ultralytics 库直接调用,命令和 v8 几乎一样,只是模型权重名不同:
# YOLOv10 yolo detect train data=./warehouse-skj9z/data.yaml model=yolov10n.pt epochs=100 imgsz=640 # YOLO11 yolo detect train data=./warehouse-skj9z/data.yaml model=yolo11n.pt epochs=100 imgsz=640v10 主打无 NMS 的端到端推理,v11 在精度和速度上做了平衡。对这份 623 张的小数据集来说,几个版本的最终 mAP 差距不会太大,选哪个更多看你的部署环境——如果推理框架对 NMS 支持不好,v10 的端到端特性会省事。
4.4 用 VOC 格式标签训练的情况
如果你要用 VOC 格式(比如某些框架只吃 xml),需要先转成对应框架要求的格式。以转 YOLO 为例:
import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, out_path, classes): tree = ET.parse(xml_path) root = tree.getroot() size = root.find('size') w = int(size.find('width').text) h = int(size.find('height').text) lines = [] for obj in root.iter('object'): cls = obj.find('name').text if cls not in classes: continue cls_id = classes.index(cls) bbox = obj.find('bndbox') xmin = float(bbox.find('xmin').text) ymin = float(bbox.find('ymin').text) xmax = float(bbox.find('xmax').text) ymax = float(bbox.find('ymax').text) # 转成归一化中心点格式 x_center = (xmin + xmax) / 2.0 / w y_center = (ymin + ymax) / 2.0 / h bw = (xmax - xmin) / w bh = (ymax - ymin) / h lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}") with open(out_path, 'w') as f: f.write('\n'.join(lines)) # 批量转换 classes = ['worker'] for xml_file in os.listdir('annotations'): if xml_file.endswith('.xml'): voc_to_yolo( os.path.join('annotations', xml_file), os.path.join('labels_conv', xml_file.replace('.xml', '.txt')), classes )这段脚本的关键点是classes列表的顺序必须和你的data.yaml里names一致,否则类别索引会错位。另外转换后建议抽查几张,用可视化脚本把框画回原图确认没偏。
5. 避坑与排查:标签、路径、显存这三类问题最常翻车
训练跑不起来或者结果离谱,九成出在标签、路径、显存这三块。下面是我和身边人实际踩过的五条,按「现象 → 原因 → 解决」写。
5.1 训练 loss 为 nan 或框全飘到图像外
现象:训练几轮后 box_loss 变成 nan,或者验证时预测框全部堆在图像边缘。
原因:标签坐标越界。YOLO 要求所有坐标在 0~1 之间,如果转换脚本算错或者原始标注有负值/大于 1 的值,模型会学到无效分布。
解决:写个校验脚本扫一遍所有标签:
import os def check_labels(label_dir): bad = [] for f in os.listdir(label_dir): if not f.endswith('.txt'): continue with open(os.path.join(label_dir, f)) as fp: for i, line in enumerate(fp): parts = line.strip().split() if len(parts) != 5: bad.append((f, i, '字段数不对')) continue vals = list(map(float, parts[1:])) if any(v < 0 or v > 1 for v in vals): bad.append((f, i, f'坐标越界: {vals}')) return bad print(check_labels('labels/train'))输出为空说明标签干净,有输出就逐条修。
5.2 训练日志显示 images 数量为 0
现象:启动训练后提示No images found或者0 images, 0 backgrounds。
原因:data.yaml里的train/val路径写错。YOLO 的路径解析是相对于path字段的,如果path写的是绝对路径而train又写了绝对路径,会拼成错误路径。
解决:统一用相对路径。path指向数据集根目录,train和val写相对path的子路径。改完用yolo detect train ... --verbose看它实际解析出的路径。
5.3 CUDA out of memory
现象:训练刚开始就报显存不足。
原因:batch或imgsz太大,或者同时开了其他占显存的进程。
解决:按batch→imgsz的顺序降。先把 batch 从 16 降到 8,还不行降到 4;再不行把 imgsz 从 640 降到 416。另外用nvidia-smi看有没有僵尸进程占着显存,有就 kill 掉。
5.4 验证集 mAP 远低于训练集
现象:训练集 loss 降得很好,但验证集 mAP 只有 0.2 左右。
原因:训练/验证划分不合理,或者两个集合的图像分布差异大(比如训练集都是白天,验证集都是夜间)。
解决:先确认划分是否随机。如果数据集本身按时间或场景划分,检查两个集合的类别分布是否一致。623 张图如果验证集只有几十张,指标波动会很大,可以适当增大验证集比例到 20%。
5.5 换版本后报参数不识别
现象:从 v8 换到 v5,报unrecognized arguments: --imgsz。
原因:不同版本的 CLI 参数名不同,v5 用--img,v8 用--imgsz。
解决:查对应版本的train.py --help或官方文档,别凭记忆套。常见对应关系:--img/--imgsz、--weights/--model、--project/--project(这个倒是一样)。
6. 进阶技巧:用这份数据集做迁移学习和数据增强验证
623 张图直接从头训练容易过拟合,更稳的做法是拿 COCO 预训练权重做迁移学习,再配合针对性增强。这一章说两个我常用的技巧,以及怎么验证增强是否真的有用。
6.1 冻结 backbone 微调
小数据集上,先冻结 backbone 只训练检测头,再解冻全量微调,通常比一上来就全量训练效果好:
# 第一阶段:冻结 backbone,只训练检测头 yolo detect train \ data=./warehouse-skj9z/data.yaml \ model=yolov8n.pt \ epochs=30 \ imgsz=640 \ freeze=10 \ lr0=0.001 \ project=runs/warehouse \ name=stage1_freeze # 第二阶段:解冻全量微调,用更小的学习率 yolo detect train \ data=./warehouse-skj9z/data.yaml \ model=runs/warehouse/stage1_freeze/weights/best.pt \ epochs=70 \ imgsz=640 \ lr0=0.0001 \ project=runs/warehouse \ name=stage2_fullfreeze=10表示冻结前 10 层(backbone 部分)。第一阶段学习率可以稍大,因为只更新检测头;第二阶段解冻后学习率要降下来,避免破坏预训练特征。
6.2 针对仓库场景的数据增强配置
仓库图像的特点是光照不均、货架遮挡多、工人姿态多样。默认增强里 mosaic 和 mixup 对遮挡场景有帮助,但要注意别过度:
# 在 data.yaml 同级建 hyp.yaml,或直接命令行传参 hsv_h: 0.015 # 色调抖动,模拟不同灯光 hsv_s: 0.7 # 饱和度抖动 hsv_v: 0.4 # 亮度抖动,仓库光照差异大,可以调高 degrees: 10.0 # 旋转角度,工人姿态多样 translate: 0.1 # 平移 scale: 0.5 # 缩放,模拟远近 mosaic: 1.0 # mosaic 增强,对遮挡有效 mixup: 0.1 # mixup 比例,别太高启动时用yolo detect train ... hsv_v=0.4 mosaic=1.0 mixup=0.1覆盖默认值。hsv_v调到 0.4 是因为仓库里明暗差异大,增强亮度抖动能让模型更鲁棒。
6.3 验证增强是否有效
增强不是越多越好,得用验证集指标说话。做法是跑两组对照:一组默认增强,一组自定义增强,比较验证集 mAP50。如果自定义增强后 mAP 反而降了,说明增强过头,把mixup或degrees调小。我一般会记录每次实验的配置和结果:
| 实验 | hsv_v | mosaic | mixup | mAP50 |
|---|---|---|---|---|
| baseline | 0.4 | 1.0 | 0.0 | 0.82 |
| +mixup | 0.4 | 1.0 | 0.1 | 0.84 |
| +rotate | 0.4 | 1.0 | 0.1 | 0.83 |
从这张表能看出 mixup 有提升,但加旋转后反而略降,说明这份数据里工人姿态已经够多样,再旋转引入了不真实样本。这种对照实验做两三组,就能摸清这份数据集的增强边界。
6.4 导出与部署前的最后检查
训练满意后导出 ONNX 或 TensorRT 用于部署:
# 导出 ONNX yolo export model=runs/warehouse/stage2_full/weights/best.pt format=onnx imgsz=640 # 导出 TensorRT(需要 GPU 和 tensorrt 环境) yolo export model=runs/warehouse/stage2_full/weights/best.pt format=engine imgsz=640 half=True导出后务必用同一张测试图对比 PyTorch 和导出模型的输出,确认框位置一致。我吃过一次亏:导出时忘了设imgsz,默认用了 640 但训练时是 960,结果部署后框全偏。从那以后我每次导出都强制走一遍「导出 → 单图推理 → 对比原模型输出」这三步,确认无误再上线。希望这份数据集的拆解和这些踩坑记录能帮到你,少走点弯路。
本文还有配套的精品资源,点击获取