
简介YOLO复杂场景人员目标检测数据集面向目标检测学习者和算法工程师聚焦真实环境中多尺度、遮挡、光照变化等复杂情况包含5000张高质量标注图片经LabelImg精标配套VOC(xml)、COCO(json)、YOLO(txt)三种格式标签分目录存放可直接用于训练与评估。压缩包内共2000个文件主要为xml标签文件另含Python划分脚本和HTML格式的教程文档整体大小552.93MB。附赠YOLO环境搭建与训练教程覆盖Windows/Linux、数据集划分脚本可灵活生成训练集、验证集和测试集便于快速完成数据准备与模型迭代。已有283人学习下载适合想要省去繁琐标注、直接开展YOLO系列模型实战的入门及进阶用户。1. 复杂场景人员检测为什么需要一份带三格式标签的现成数据集做行人检测或人员计数的人都知道模型效果的上限不在网络结构而在训练数据的质量。公开的 COCO、VOC 数据集里人员类别虽然多但大多是标准视角、光照均匀的样本一旦遇到遮挡、密集人群、低光照、相机俯拍这类“复杂场景”直接迁移训练出来的模型漏检率会明显上升。这次整理的数据集正是冲着这个缺口来的5000 张真实场景图片全部用 LabelImg 人工标注同时导出 VOC(xml)、COCO(json)、YOLO(txt) 三种格式标签省去了自己写格式转换脚本的环节。此外压缩包内附带了训练集/验证集/测试集划分脚本和基于案例修改的 YOLO 训练教程可以说下载后只剩两条路要么直接当基准数据跑通流程要么动手替换成自己的数据照猫画虎。接下来我会把这份资源的内部结构、格式差异、划分逻辑、训练接入方法以及复杂场景下的调优经验逐一拆开讲。2. 三种标签格式的差异与目录组织方式2.1 LabelImg 标注结果如何映射到 VOC、COCO、YOLOLabelImg 默认保存的是 PASCAL VOC 格式的 XML 文件每个目标对应一个object节点里面记录类别名、bounding box 的左上角坐标和右下角坐标。COCO 格式则是把所有标注信息汇总到一个 JSON 文件里图像信息、类别信息、标注信息分成三个数组。YOLO 格式最精简每张图片对应一个同名 txt 文件每行内容为class x_center y_center width height其中四个坐标值均归一化到 0~1。这份数据集在压缩包里已经按格式分好目录实际项目里我一般会直接用xml文件夹做训练因为 YOLO 训练需要 txt 时用脚本转换并把图片和 txt 放在同一个目录下方便组织。而 COCO 格式的 json 则适合用来跑 Detectron2 或者 mmdetection 这类要求输入 COCO 标注的框架。2.2 VOC 标签的字段含义与文件解析示例XML 中核心节点包括folder、filename、size以及多个object。object里name是类别名bndbox包含xmin、ymin、xmax、ymax这四个值都是绝对像素坐标。下面是一个真实标注片段的结构化展示字段含义示例值folder图片所在文件夹名JPEGImagesfilename图片文件名img_0001.jpgsize.width/height/depth图片宽、高、通道数1280 720 3object.name目标类别personobject.bndbox.xmin左上角 x 坐标342object.bndbox.ymin左上角 y 坐标118object.bndbox.xmax右下角 x 坐标741object.bndbox.ymax右下角 y 坐标689拿到这份数据后如果感觉某个 XML 的坐标异常通常可以直接用 Python 解析并画框排查常见验证方法见第 5 章。2.3 COCO JSON 的结构与 category_id 对应关系COCO JSON 顶层包含images、annotations、categories三个关键数组。images里的每一条记录有id、file_name、width、heightannotations里的每条记录有id、image_id、category_id、bbox、area、iscrowd。需要注意bbox是[x, y, width, height]与 VOC 的[xmin, ymin, xmax, ymax]完全不同转换时要小心。category_id是从 1 开始编号的categories数组里id:1对应name: person。如果这份数据以后要扩展多类别建议直接按照categories中的 id 顺序管理避免 ID 错乱。2.4 YOLO txt 的归一化坐标与类别 idYOLO 格式每行是class x_center y_center width height其中x_center (xmin xmax) / 2 / widthwidth (xmax - xmin) / image_width。因为所有值都归一化了训练时引擎不需要读取原图尺寸就能直接加载坐标。这个格式简洁、读取快但有两个坑一是坐标全是小数肉眼难检查错误只能靠工具可视化二是不同 YOLO 版本的类别文件data.yaml中的类别顺序必须和 txt 里的 class id 对齐否则训练出来的模型会张冠李戴。使用这份数据集前建议先查看压缩包内是否提供了classes.txt如果没有就从任意一个 XML 中提取name去重后自己生成。3. 数据集划分脚本的原理、参数与正确使用方式3.1 为什么要手动划分训练集、验证集、测试集很多公开数据集直接把图片和标注放在一起训练时如果全部灌进去模型没有独立的验证集参考无法判断过拟合程度。这份资源附带了三个划分脚本一个是生成 ImageSets 下 txt 的脚本另外两个是把图片和标签写入新文件夹的脚本区别在于后者会把训练和验证的数据物理复制一份到独立目录适合直接喂给 YOLOv5/v8 的 datasets 目录结构。我的建议是如果只是快速跑通流程用生成 ImageSets txt 的脚本就够了如果要反复调参并需要稳定对比模型效果使用把图片标签写入新文件夹的脚本更方便因为每次实验的输入目录是干净的不会因为原目录文件的增减影响训练。3.2split_train_val生成 ImageSets 文件的脚本逻辑这类脚本常见做法是遍历所有图片文件名按比例随机划分并写入到类似train.txt、val.txt、test.txt的文件中内容为图片的绝对路径或相对路径。考虑到 YOLO 训练时通常需要的是图片路径列表而不是单独的 ImageSets 目录压缩包里的train_list.txt应该就是生成的训练图片路径清单。以下是一个简化版的划分脚本核心逻辑与资源内脚本一致import os import random jpg_dir images train_ratio 0.8 val_ratio 0.1 test_ratio 0.1 files [f for f in os.listdir(jpg_dir) if f.endswith(.jpg)] random.shuffle(files) train_cnt int(len(files) * train_ratio) val_cnt int(len(files) * val_ratio) train_files files[:train_cnt] val_files files[train_cnt:train_cnt val_cnt] test_files files[train_cnt val_cnt:] with open(train.txt, w) as f: for name in train_files: f.write(os.path.join(jpg_dir, name) \n) # 同理写 val.txt 和 test.txt这段代码的思路是先把图片文件列表打乱然后按比例切片。实际使用中需要注意以下几点第一random.shuffle必须在切分之前做否则顺序会影响划分结果第二如果数据集中图片数量不均匀比如某个场景的图片密集出现随机划分可能导致某个集合里全是同一类场景这时最好先对场景进行分组再按组划分第三如果你的标注文件不是.txt而是.xml划分后要同步把对应的标注文件也拷贝过去否则训练时找不对应关系。3.3 图片标签写入新文件夹的脚本使用说明资源中名为“训练集、验证集划分脚本图片标签划分写入新文件夹.py”的脚本做的事情更直观先按比例划分好文件列表然后用shutil.copy把图片和对应标注文件复制到新的train_imgs、val_imgs等目录下。这里我重新实现一个兼顾三种格式的版本方便你在只有 VOC 标注的情况下也能用import os import shutil import random src_img_dir JPEGImages src_label_dir Annotations dst_train_img dataset/train/images dst_train_label dataset/train/labels dst_val_img dataset/val/images dst_val_label dataset/val/labels imgs [f for f in os.listdir(src_img_dir) if f.endswith(.jpg)] random.seed(42) random.shuffle(imgs) val_count int(len(imgs) * 0.1) val_imgs imgs[:val_count] train_imgs imgs[val_count:] os.makedirs(dst_train_img, exist_okTrue) os.makedirs(dst_train_label, exist_okTrue) # 同样创建 val 目录 for img in train_imgs: shutil.copy(os.path.join(src_img_dir, img), dst_train_img) xml_name img.replace(.jpg, .xml) shutil.copy(os.path.join(src_label_dir, xml_name), dst_train_label) # 同理处理 val_imgs这里random.seed(42)是关键加上这一行可以让每次运行划分结果一致便于实验对比。如果你使用的是 YOLO txt 标注需要把xml_name替换成对应的.txt文件名并且把src_label_dir指向存放 txt 的目录。此外还要注意YOLO 训练加载时会通过图片路径自动寻找同名的标签文件因此图片目录和标签目录必须分开放置且文件名保持一致。3.4 划分脚本常见错误排查我自己处理数据集时遇到过几种典型问题NotADirectoryError或FileNotFoundError多半是脚本里路径没有写全或者工作目录不对运行脚本前先os.chdir到数据集根目录。划分后标签数量少于图片数量说明源标注目录中缺少某些图片对应的 xml/txt可以写个循环检查一一对应。复制后 YOLO 训练报错找不到标签原因往往是把标签文件和图片放在同一个目录而 YOLO 默认的标签路径是在图片路径的上级labels目录下或者按images和labels同级专门存放标注。这些逻辑需要在data.yaml中通过train、val和nc、names两项配置清楚。错误现象可能原因解决方向划分后图片与标签数量不一致原目录缺少对应文件检查文件后缀命名训练时标签全为空标签路径配置错误查看 data.yaml 的 train/val 路径训练 loss 不下降归一化坐标有误可视化标签检查图片显示有框但标注偏移VOC 转 YOLO 时未除原图宽高确认转换公式4. 基于该数据集的 YOLO 训练全流程与配置修改路径4.1 环境搭建的两个版本差异与选择建议压缩包内的教程分别覆盖 Windows 和 Linux 两个版本。Windows 版本一般更适合养老 GPU 单卡训练用 pip 安装torch、torchvision即可但需要注意 CUDA 版本与 PyTorch 的匹配。Linux 版本推荐 Ubuntu 20.04 或 22.04使用 Conda 创建虚拟环境这样可以避免包冲突。如果你的显存只有 6GB不建议直接上 YOLOv8x 或 YOLOv5x从 yolov8s 或 yolov5s 开始训练更稳妥。教程里的“YOLO环境搭建”文档主要解决两个问题先装显卡驱动和 CUDA再建虚拟环境装依赖。安装 PyTorch 时用官方命令例如conda create -n yolo python3.9 -y conda activate yolo pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118以上命令中--index-url指定 CUDA 11.8 对应的 PyTorch 轮子源。装完后可用python -c import torch; print(torch.cuda.is_available())验证 CUDA 是否可用输出True才说明 GPU 被正确识别。教程中应该还包含了ultralytics包的安装一般用pip install ultralytics即可。4.2 数据目录结构如何组织以适配 YOLOv5/v8拿到数据集后建议按照下面的目录结构重新组织数据dataset/ train/ images/ labels/ val/ images/ labels/ data.yaml因为资源里提供的标签有 txt 格式直接选用 YOLO 格式最省事。如果只有 xml需要写一个转换脚本公式如 2.4 节所述。准备好目录后把划分脚本生成的训练图片和标签分别放入对应文件夹。注意 labels 里的 txt 文件名要与 images 里的 jpg 文件同名否则训练时会跳过该图片。4.3 修改 data.yaml 的核心参数YOLOv5 和 YOLOv8 训练时都需要读取一个data.yaml文件里面最关键的有四项train: dataset/train/images val: dataset/val/images nc: 1 names: [person]train和val为训练和验证图片目录路径注意不要写成末尾带斜杠防止路径拼接出错。nc为类别数量这份数据集只有 person 一类填 1。names是类别名称列表顺序要与 txt 中的 class id 对应。如果 txt 里类别 id 是 0那么 names 的第一个元素就应该是 person。如果还包含 test 图片可以增加test: dataset/test/images。在训练指令中通过--data data.yaml引用该配置文件。教程里“根据案例修改训练自己的数据集”指的就是把其他案例的data.yaml和模型 yaml 替换成自己数据的配置。4.4 训练指令选择与关键超参数的影响以 YOLOv8 为例训练命令一般为yolo train datadata.yaml modelyolov8s.pt epochs100 imgsz640 batch16其中modelyolov8s.pt表示加载 COCO 预训练权重这对于只有 5000 张图片的数据集非常关键迁移学习能显著加速收敛。imgsz是输入分辨率若原图较大且目标较小建议imgsz1280虽然显存占用变高但对小目标检测提升明显。batch应根据显存调整显存 12GB 时可设为 16若显存不足降低 batch 或使用--cache减少磁盘 I/O。YOLOv5 的训练命令格式略有不同python train.py --data data.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --img 640两者的损失函数与数据增强策略有差异但本数据集不复杂两个版本都能在 100 epoch 内达到较好效果。训练过程中关注两个指标一是train/cls_loss和val/cls_loss是否同步下降二是mAP50和mAP50-95是否还在提升如果超过 50 个 epoch 后 mAP 保持不变可以提前终止。4.5 训练结果文件说明与模型选择训练完成后YOLOv8 会在runs/detect/train下输出weights/best.pt和weights/last.ptbest.pt是验证集表现最好的权重last.pt是最后一个 epoch 的权重。推荐使用best.pt做后续推理。YOLOv5 的输出目录结构类似。此时可以用下面的命令对测试集中的图片做推理yolo predict modelruns/detect/train/weights/best.pt sourcetest_images/ imgsz640 conf0.25看到输出图片上检测框正确覆盖人员且类别为 person就说明整个流程已经打通。5. 复杂场景下的验证技巧与针对性优化手段复杂场景人员检测最容易出现的问题是密集人群中两个重叠目标被合并成一个框远距离小目标被漏检夜间或低对比度下框定位不稳。针对这些问题分享三个可直接套用的处理技巧。第一个技巧用预测结果和标注做可视化对比。把训练好的模型跑在验证集上同时把 XML 中的真实框画在同一张图中人为去观察哪些区域出现漏检和误检。常见做法是写一个简单脚本用 OpenCV 或 PIL 读取图片先画预测框再画真实框。如果发现大量定位偏移重新检查数据标注是否不够紧贴目标如果发现遮挡严重的两个目标被识别成一个考虑采用更高分辨率的输入并把 NMS 的 iou 阈值从默认的 0.45 降为 0.35减少重叠框被抑制的可能。第二个技巧关注 mAP50 与 mAP50-95 的差值。差值过大说明模型对目标框的定位精度不足。此时不应盲目增加模型参数量而应该检查标签中是否包含了面积过小的目标。YOLO 训练时默认会忽略面积小于一定阈值的标签这不一定适合密集人群。可以在训练时修改img_size到 960 或 1280小目标占的像素就会变大模型更容易学到特征。如果显存不够则考虑将原图切块训练比如把 1920x1080 的图像切成 4 个 960x960 的 patch再对每个 patch 进行标注和训练推理时将检测结果映射回原坐标。第三个技巧针对场景分布做分层验证。这个数据集的一个特点是场景丰富可能包含室内、街道、工地等不同子集。如果只统计整体 mAP无法知道模型在哪类场景下失效。我一般会按场景关键词从图片文件名中提取分组或者用相似图片聚类的方法把验证集分成若干小组分别测试。这样做的好处是能明确下一次迭代该补充哪种场景的数据。模型部署阶段还可以通过conf阈值控制 precision 和 recall 的平衡。如果业务需求更看重召回比如安防场景中不希望漏人就把conf调低到 0.15如果看重准确率就调高到 0.5。实际调参时先在 20 张典型图片上人工统计结果再根据反馈调整阈值。最后针对这份数据集中可能存在的夜间、遮挡和小目标样本训练时可以开启 YOLOv8 的augmentTrue默认增强它包含随机翻转、缩放和马赛克增强。如果 Mosaic 增强导致小目标被裁切掉可以设置mosaic0.5降低合成图像中目标被截断的比例。若发现模型推理速度不满足上线要求优先从yolov8s换成yolov8n而不是直接削减图像输入分辨率因为后者对精度影响更明显。调试到此你手里的模型已经可以跑通常规复杂场景的人员检测任务了。本文还有配套的精品资源点击获取