复杂场景人员检测数据集:5000张图与VOC/COCO/YOLO三格式标签及划分脚本

发布时间:2026/10/30 0:29:18
复杂场景人员检测数据集:5000张图与VOC/COCO/YOLO三格式标签及划分脚本 简介本资源面向从事目标检测的开发者与学习者提供一套复杂场景下的人员目标检测数据集可用于YOLO系列模型的训练与验证。数据均为真实场景采集覆盖多种光照、遮挡与背景条件标注由labelimg完成质量较高并同时提供voc、coco和yolo三种格式标签分别存放于不同文件夹便于直接接入不同框架。压缩包共约2000个文件以1986个xml标注文件为主另含少量html说明文档、txt列表与py脚本整体约552.93MB。资源附赠环境搭建与训练教程覆盖Windows与Linux版本并给出训练集、验证集、测试集划分脚本可按需自行划分。已有284人学习下载适合希望快速搭建人员检测基线、验证模型泛化能力或开展课程实践的用户参考使用。1. 复杂场景人员检测数据集5000 张图、三套标签和一套能跑通的划分脚本监控画面里人挤人、逆光、遮挡、小目标这种场景下拿公开数据集训出来的模型往往一上现场就拉胯。这份资源针对的就是这个痛点5000 张真实复杂场景的人员图片用 labelImg 逐张标注同时给出 VOCxml、COCOjson、YOLOtxt三种格式标签分别放在独立文件夹里YOLO 系列可以直接吃。更实用的是它没只丢一堆图还配了训练集/验证集/测试集划分脚本、Linux 和 Windows 两套环境搭建与训练教程以及train_list.txt这类清单文件。适合谁正在做人员检测落地、需要快速搭一个能复现的 baseline、又不想在数据格式转换上耗半天的从业者。下面按「数据长什么样 → 怎么划分 → 怎么训 → 坑在哪」拆开讲。2. 三种标签格式的对应关系VOC、COCO、YOLO 到底怎么选2.1 先搞清楚三套标签的坐标系差异同一张图三种格式描述的其实是同一个框但表达方式完全不同这是后面所有转换和踩坑的根源。VOC 的 xml 里bndbox存的是xmin, ymin, xmax, ymax绝对像素坐标原点在左上角。COCO 的 json 里bbox是[x, y, width, height]同样是绝对像素但给的是左上角加宽高而且所有图片的标注集中在一个 json 的annotations数组里靠image_id关联。YOLO 的 txt 则是归一化后的class x_center y_center width height五个值全在 0~1 之间每张图一个同名 txt一行一个目标。很多人第一次转格式翻车就是把 COCO 的[x, y, w, h]当成[xmin, ymin, xmax, ymax]直接塞进 VOC 逻辑框整体偏移半个身位。记住一句话VOC 和 COCO 是绝对坐标YOLO 是归一化中心点坐标。格式文件形态坐标类型单文件组织VOC每图一个 xml绝对 xmin/ymin/xmax/ymax分散COCO单个 json绝对 x/y/w/h集中YOLO每图一个 txt归一化 cx/cy/w/h分散2.2 这份资源里三套标签怎么放、怎么取资源把三种格式分别放在不同文件夹下好处是你不用自己转坏处是容易拿错。我一般会先确认目录结构再动手典型布局是这样# 查看数据集根目录结构先摸清楚再写代码 ls -R dataset/ | head -50 # 常见结果 # dataset/images/ 原图 # dataset/labels_voc/ 每图一个 xml # dataset/labels_coco/ annotations.json # dataset/labels_yolo/ 每图一个 txt # dataset/ImageSets/ 划分后的 txt 清单确认清楚后选哪套取决于你的训练框架。Ultralytics 系的 YOLO 直接读 YOLO txt路径规则是「图片目录替换 images 为 labels扩展名换 txt」。如果你用的是 MMDetection 或 Detectron2那 COCO json 更省事。VOC 一般只在老代码或某些评测脚本里用。提示三套标签的类别顺序不一定一致。YOLO 的 class id 从 0 开始VOC 的类别是字符串COCO 的 category_id 有时从 1 开始。混用前先对齐类别映射否则会出现「人」被识别成别的类。2.3 用脚本验证标签和图片是否一一对应在训练之前强烈建议先跑一遍一致性检查这一步能省掉后面几小时的玄学报错。import os img_dir dataset/images lbl_dir dataset/labels_yolo imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir)} lbls {os.path.splitext(f)[0] for f in os.listdir(lbl_dir)} only_img imgs - lbls # 有图没标签 only_lbl lbls - imgs # 有标签没图 print(有图无标签:, len(only_img), list(only_img)[:5]) print(有标签无图:, len(only_lbl), list(only_lbl)[:5])逻辑说明用集合差集找出不匹配的文件。参数上img_dir和lbl_dir换成你实际的路径。如果only_img不为空说明这些图没有标注训练时要么剔除要么补标如果only_lbl不为空通常是图片被误删或扩展名不一致jpg vs png。我见过最坑的情况是图片是.JPG大写脚本按.jpg找结果全部对不上训练直接报空标签。3. 数据集划分脚本实操train/val/test 怎么切才不翻车3.1 三个划分脚本分别干什么资源里带了三个脚本名字很直白但用途有区别训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py把图片和标签按比例复制到新的 train/val/test 文件夹物理隔离。训练集、验证集划分脚本图片标签划分写入新文件夹.py只切 train/val适合数据量不大、不需要独立测试集的场景。split_train_val生成ImageSets下txt文件划分脚本.py不复制文件只在ImageSets下生成train.txt、val.txt等清单记录文件名。选哪个如果你后续要反复调比例、又不想占磁盘用生成 txt 的那个如果要把数据集打包给别人或喂给只认文件夹结构的框架用复制文件的那个。train_list.txt就是清单式划分的产物。3.2 按 8:1:1 划分并写入新文件夹下面是我常用的划分逻辑和资源里复制式脚本思路一致比例可调import os, random, shutil random.seed(42) # 固定随机种子保证可复现 img_dir dataset/images lbl_dir dataset/labels_yolo out_root dataset_split ratio (0.8, 0.1, 0.1) # train, val, test names [os.path.splitext(f)[0] for f in os.listdir(img_dir)] random.shuffle(names) n len(names) n_train int(n * ratio[0]) n_val int(n * ratio[1]) splits { train: names[:n_train], val: names[n_train:n_train n_val], test: names[n_train n_val:], } for split, items in splits.items(): for sub in (images, labels): os.makedirs(os.path.join(out_root, split, sub), exist_okTrue) for name in items: # 图片扩展名按实际情况改这里假设 jpg shutil.copy(os.path.join(img_dir, name .jpg), os.path.join(out_root, split, images, name .jpg)) shutil.copy(os.path.join(lbl_dir, name .txt), os.path.join(out_root, split, labels, name .txt)) print(split, len(items))逻辑说明先固定random.seed这是保证实验可复现的关键否则每次划分结果不同模型指标没法对比。ratio三元组控制比例n_train和n_val用整除截断剩下的全给 test避免因四舍五入丢样本。复制时图片和标签必须同名同批移动漏一个就会在训练时报「找不到标签」。参数怎么改数据量小于 2000 张时建议 7:2:1 甚至 7:1.5:1.5给验证留够样本数据量上万时 9:0.5:0.5 也够。random.seed换成任意整数都行但一旦定了就别改。3.3 生成 ImageSets 清单式划分如果你不想复制文件用清单方式更轻量import os, random random.seed(42) img_dir dataset/images out_dir dataset/ImageSets os.makedirs(out_dir, exist_okTrue) names [os.path.splitext(f)[0] for f in os.listdir(img_dir)] random.shuffle(names) n len(names) n_train int(n * 0.8) n_val int(n * 0.1) with open(os.path.join(out_dir, train.txt), w) as f: f.write(\n.join(names[:n_train])) with open(os.path.join(out_dir, val.txt), w) as f: f.write(\n.join(names[n_train:n_train n_val])) with open(os.path.join(out_dir, test.txt), w) as f: f.write(\n.join(names[n_train n_val:])) print(清单已生成)逻辑说明只写文件名不带扩展名训练时框架按清单去 images 和 labels 目录取对应文件。这种方式磁盘占用几乎为零适合大数据集。注意清单里的名字要和图片、标签严格对应扩展名在读取时由框架拼接。注意划分前一定要先做 2.3 的一致性检查。如果存在有图无标签的样本划分后这些图会进入某个 split训练时直接报错中断。4. 环境搭建与训练Linux 和 Windows 两条路4.1 Linux 下从零到能跑资源里带了 Ubuntu 环境安装、YOLO 环境搭建和训练教程三份 HTML。按我的习惯Linux 上走 conda 隔离环境最稳# 创建独立环境避免污染系统 Python conda create -n yolo python3.10 -y conda activate yolo # 安装 PyTorchCUDA 版本按你的显卡驱动选 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics # 验证环境和 GPU 是否可用 yolo checks逻辑说明python3.10是目前兼容性最好的版本太新或太旧都容易在依赖上翻车。PyTorch 的 CUDA 版本要和nvidia-smi显示的驱动匹配cu118 对应驱动 520 以上。yolo checks会打印环境摘要重点看 CUDA 是否 available如果是 False说明装成了 CPU 版训练会慢到怀疑人生。4.2 Windows 下的差异点Windows 教程思路一样但有几个坑一是路径反斜杠配置文件里写C:\data\images容易转义出错建议统一用正斜杠或双反斜杠二是num_workers在 Windows 上设大了会卡死一般设 0 或 2三是某些 CUDA 版本和 Windows 驱动对不上装之前先确认驱动版本。4.3 用这份数据训一个人员检测模型数据划分好、环境通了就可以写训练配置。以 YOLO 的 yaml 配置为例# data_person.yaml path: /home/user/dataset_split # 数据集根目录 train: train/images val: val/images test: test/images nc: 1 # 类别数人员检测就是 1 names: [person] # 类别名顺序要和标签里的 class id 对应# 开始训练imgsz 和 batch 按显存调 yolo detect train datadata_person.yaml modelyolov8n.pt epochs100 imgsz640 batch16逻辑说明nc和names必须和标签里的类别严格一致人员检测只有一类写错会导致训练时类别越界。modelyolov8n.pt是拿预训练权重做迁移小数据集上比从零训收敛快得多。imgsz640是常见输入尺寸显存不够就降到 416 或 320batch同步调小。epochs100对 5000 张图通常够看验证集 mAP 不再涨就可以早停。参数怎么改显存 8G 以下建议batch8、imgsz416显存 12G 以上可以batch32、imgsz640。学习率一般不用手动设ultralytics 有自适应策略除非你发现 loss 震荡得厉害再调。5. 避坑与排查那些让我重训过三次的问题5.1 训练 loss 正常但 mAP 一直是 0现象训练日志里 box_loss、cls_loss 都在降但验证集 mAP 始终为 0 或极低。原因最常见的是类别映射错位。YOLO txt 里的 class id 是 0但你的 yaml 里names写成了从 1 开始的类别或者标签里混进了其他 class id。其次是标签坐标没归一化直接写了像素值模型学不到有效框。解决先抽查几个 txt确认每行第一个数是 0 且后四个数都在 0~1 之间。再核对 yaml 的nc和names。用 2.3 的脚本统计一下所有出现过的 class id多一个都别放过。5.2 报错「No labels found」或标签路径找不到现象训练启动即报找不到标签或警告大量图片被跳过。原因YOLO 默认按「images 替换为 labels」的规则找标签如果你的目录名不是images/labels这种标准结构或者图片是.JPG而标签是.txt但脚本按.jpg找就会全部失配。解决要么把目录改成标准结构要么在 yaml 里显式指定train和val指向图片目录并保证同级有同名 labels 目录。扩展名大小写在 Linux 上敏感统一成小写最省事。5.3 划分后验证集指标虚高现象验证集 mAP 高得离谱一上测试集就掉一大截。原因划分时没打乱或者同一场景的连续帧被分到了 train 和 val造成数据泄漏。监控视频抽帧的数据集尤其容易这样相邻帧几乎一样分到两边等于变相泄漏。解决划分前先random.shuffle并且如果数据来自视频抽帧最好按视频源或时间段划分而不是按帧随机分。这份资源是真实场景图片相对好一些但如果你自己扩充了视频帧务必注意。5.4 显存溢出CUDA out of memory现象训练跑几步就 OOM 中断。原因batch或imgsz设太大或者num_workers过高导致内存和显存双重压力。解决先把batch减半再降imgsz。Linux 上num_workers可以设 4~8Windows 上设 0~2。还可以开混合精度ampTrueultralytics 默认开能省不少显存。5.5 中文路径导致读取失败现象Windows 下数据集放在中文目录训练报编码错误或找不到文件。原因部分底层库对非 ASCII 路径支持不好。解决数据集路径全用英文和数字别用中文、空格和特殊符号。这是血泪经验改路径比改代码快得多。6. 进阶技巧用 train_list.txt 做可复现实验与快速验证清单文件train_list.txt不只是划分产物用好了能大幅提升实验效率。我一般会把它当成实验的「后悔药」每次调整划分比例或增删数据都生成一份带时间戳的清单训练配置直接引用清单这样任何一次实验都能精确复现当时用了哪些图。具体做法是在 yaml 里不写死目录而是让训练脚本读清单动态生成数据列表。ultralytics 支持在 yaml 里用train: train.txt指向一个文本文件文件里每行是图片路径。这样你换清单就等于换数据集不用动目录结构。# 生成带时间戳的清单便于追溯 cp dataset/ImageSets/train.txt dataset/ImageSets/train_$(date %Y%m%d_%H%M).txt另一个技巧是快速验证。5000 张图全量训一轮要不少时间调参阶段我会先抽 500 张子集跑通流程确认标签、类别、路径都没问题再上全量。子集清单直接从 train.txt 里取前 500 行即可head -500 dataset/ImageSets/train.txt dataset/ImageSets/train_debug.txt这样能把「数据问题」和「模型问题」分开定位避免在全量训练上浪费几小时才发现是标签格式错了。验证模型是否真的学到了东西别只看 mAP。我会额外抽几张逆光、遮挡、小目标的图做推理肉眼看看框的位置和置信度。如果 mAP 不错但实际画面里漏检严重多半是验证集分布和真实场景不一致这时候要回头检查划分策略而不是继续调模型。从那以后我每次拿到新数据集都强制先走一遍「一致性检查 → 小样本跑通 → 全量训练」这三步再急也不跳过。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询