ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

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

简介:本资源面向从事目标检测的开发者与学习者,提供一套复杂场景下的人员目标检测数据集,可用于YOLO系列模型的训练与验证。数据均为真实场景采集,覆盖多种光照、遮挡与背景条件,标注由labelimg完成,质量较高,并同时提供voc、coco和yolo三种格式标签,分别存放于不同文件夹,便于直接接入不同框架。压缩包共约2000个文件,以1986个xml标注文件为主,另含少量html说明文档、txt列表与py脚本,整体约552.93MB。资源附赠环境搭建与训练教程,覆盖Windows与Linux版本,并给出训练集、验证集、测试集划分脚本,可按需自行划分。已有284人学习下载,适合希望快速搭建人员检测基线、验证模型泛化能力或开展课程实践的用户参考使用。

1. 复杂场景人员检测数据集:5000 张图、三套标签和一套能跑通的划分脚本

监控画面里人挤人、逆光、遮挡、小目标,这种场景下拿公开数据集训出来的模型往往一上现场就拉胯。这份资源针对的就是这个痛点:5000 张真实复杂场景的人员图片,用 labelImg 逐张标注,同时给出 VOC(xml)、COCO(json)、YOLO(txt)三种格式标签,分别放在独立文件夹里,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_ok=True) 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_ok=True) 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 python=3.10 -y conda activate yolo # 安装 PyTorch,CUDA 版本按你的显卡驱动选 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics # 验证环境和 GPU 是否可用 yolo checks

逻辑说明:python=3.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 data=data_person.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16

逻辑说明:nc和names必须和标签里的类别严格一致,人员检测只有一类,写错会导致训练时类别越界。model=yolov8n.pt是拿预训练权重做迁移,小数据集上比从零训收敛快得多。imgsz=640是常见输入尺寸,显存不够就降到 416 或 320,batch同步调小。epochs=100对 5000 张图通常够,看验证集 mAP 不再涨就可以早停。

参数怎么改:显存 8G 以下建议batch=8、imgsz=416;显存 12G 以上可以batch=32、imgsz=640。学习率一般不用手动设,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~8,Windows 上设 0~2。还可以开混合精度amp=True(ultralytics 默认开),能省不少显存。

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 不错但实际画面里漏检严重,多半是验证集分布和真实场景不一致,这时候要回头检查划分策略,而不是继续调模型。

从那以后我每次拿到新数据集,都强制先走一遍「一致性检查 → 小样本跑通 → 全量训练」这三步,再急也不跳过。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表