ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

1200张监控视角行人检测数据集:YOLO格式直训指南

1200张监控视角行人检测数据集:YOLO格式直训指南 简介面向计算机视觉研究者、在校学生与开发者的街道监控视角行人检测数据集包含1200张实拍图片及对应YOLO格式txt标签已细致划分为训练集、验证集和测试集监控视角贴近实际应用场景涵盖不同距离、光照和遮挡条件下的行人样本无需自行标注与划分可直接用于YOLOv3到YOLOv10全系列算法训练。压缩包共2000个文件其中txt标签1211个、jpg图片788个、yaml配置文件1个整体大小138.6MB目录结构清晰标签与图片一一对应便于训练时快速定位与调用。数据集仅含person一个类别标注精准可靠据验证在YOLOv9上训练准确率可达96.4%可作为行人检测算法效果对比与调参实验的稳定基准。无论是科研实验、课程设计、毕业设计还是实际落地项目都能帮助快速完成行人检测模型的训练与评估减少前期数据准备工作量目前已有722人学习下载。适合作为行人检测相关课题的研究基础也便于复现对比不同YOLO版本在复杂场景下的性能表现。1. 1200张监控视角行人检测数据集为什么说它是YOLO系列入局最快的起点做行人检测的人都知道模型能不能在真实场景里站稳看的不是COCO上刷了多少点而是训练数据和实际部署视角吻不吻合。公开数据集里COCO、VOC的行人样本大多是日常平视视角真放到街道监控、出入口闸机、园区安防这些自上而下的鱼眼或俯视画面里姿态、遮挡、尺度和光照全变了模型经常昨天还好好的今天一上线就开始漏检。这个标题给到的数据集恰恰就是从监控视角出发1200张带YOLO格式txt标签的街道场景图片并且已经按训练集、验证集、测试集划分完毕自带标签格式就是YOLO系列算法原生需要的格式解压之后不用自己写转换脚本直接把路径接进data.yaml就能开训。对那些想快速验证YOLOv5、YOLOv8甚至YOLO11在自己业务场景中表现又不想从爬图、清洗、打标开始的团队来说它是省掉最脏最累环节的一条捷径。适合的人群很明确刚接触目标检测、需要一个干净可复现数据集的初学者以及做安防、交通、零售巡检方向、需要一个小规模高纯度数据做预研或算法验证的工程师。这个标题里最值得玩味的不是“1200张”这个数字本身而是它背后透露出来的三个决策视角选型、格式预转换、划分固化。这三个点恰恰是实际项目里最容易反复返工的地方。下面我把这个数据集从解压到训练、再到验证和排错全流程拆开讲透。2. 数据集解剖yolo格式txt标签到底意味着什么2.1 一张监控图背后的标注信息长什么样YOLO格式的txt标签是目标检测领域里最“轻”的一种标注表达。每一行对应一个目标框五个数值依次是类别id、框中心点的x坐标归一化、框中心点的y坐标归一化、框的宽度w归一化、框的高度h归一化。归一化指的是除以图片的宽和高所以这些值全部落在0到1之间和图片的绝对分辨率无关。这一点非常重要无论原图是1080P的监控画面还是720P的抓拍图标签数值都是0到1的小数训练时YOLO系算法在加载图片时会做统一的letterbox缩放标签也跟着等比映射不会因为分辨率差异产生坐标偏移。这种格式和COCO的JSON格式相比最大的优势是直观、易读、单个文件独立。一张图片对应一个txt删掉某个样本只需要删掉一对文件合入新数据也只需要把新图片和新txt按同名规则丢进目录即可不需要像COCO那样去维护一个巨大的JSON索引文件。对做工程的人来说这种“一个图一个标”的组织方式在数据检查、错误定位、增量扩充上的操作成本都低得多。一份正常的标签文件头几行大概是这样的0 0.463281 0.365278 0.146094 0.526389 0 0.723958 0.432639 0.103125 0.386111第一列是类别编号这里只有行人一个类别所以全是0后面四列是中心点x、中心点y、框宽、框高全部是归一化后的相对坐标。拿第一行举例意思是这个行人的框中心位于图片宽度方向的46.3%、高度方向的36.5%处宽度约占整张图的14.6%高度约占整张图的52.6%。这四个数一出来马上就能在脑海里还原出一个人形直立框的样子宽高比接近1:3.6符合监控视角下站立行人的典型形态。2.2 训练集、验证集、测试集的划分逻辑和目录结构这个数据集解压后目录结构应该是朝着“零改造直训”的方向设计的。常见的做法是Pedestrian_Street_1200/ ├── images/ │ ├── train/ # 训练集图片约800-900张 │ ├── val/ # 验证集图片约150-200张 │ └── test/ # 测试集图片约150-200张 ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml训练集、验证集、测试集三份目录在images和labels下严格同名对应这对YOLO系算法来说是硬性要求。YOLOv5、YOLOv8、YOLO11的训练入口都是通过一个data.yaml文件来定位数据的它会读取里面的train、val、test字段把这些路径指向你的目录然后逐对去查找同名图片和同名txt标签。为什么一定要划分成三个集合验证集的作用是训练过程中每轮epoch结束后评估模型当前状态帮你判断模型是在正常收敛还是已经开始过拟合。测试集则是在整个训练流程全部结束后做最终评估的它不能参与任何训练阶段的决策包括模型选择、学习率调整、早停判断。很多人在小规模数据集上习惯只分train和val调参调到飞起最后一评估感觉效果不错一上线被打回原形。本质原因就是验证集的评估结果多多少少被你的主观选择“污染”了。这个数据集直接预划分好三份就是在逼你养成“测试集最后碰”的好习惯。2.3 从打标到txt聊聊labelimg之外的选择有人会问我自己手里有几百张监控截图能不能自己打标然后输出成这个格式如果你想完全复刻这个数据集的格式下面这条手动打标的路径是通用做法pip install labelimg labelimg打开labelimg后在View菜单里勾选Auto Save modePascalVOC和YOLO格式之间用CtrlR切换在YOLO模式下保存就会生成同名txt。步骤是打开图片目录 → 框选行人 → 输入类别名 → 点Save。保存出来的txt文件就是直接用空格分隔的归一化坐标和这个数据集里的一份文件完全同构。这里有个细节值得注意labelimg输出的YOLO格式txt类别的id按你定义的classes.txt排序决定。假如你的classes.txt里第一行是person那person的类别id就是0和这个数据集里的标签完全一致。如果你先用了别的工具或者从别处迁了一批标签建议统一检查一遍类别顺序否则id错位一个数字模型会学到完全错误的内容。高版本的labelimg对YOLO格式的支持已经比较友好框选、微调、自动保存、切换下一张的快捷键效率很高。如果嫌桌面版麻烦也可以用开源的CVAT做在线标注导出时选YOLO 1.1格式出来的结果同样可用。3. 把数据集跑通YOLOv5和YOLOv8目录结构、data.yaml与训练命令3.1 准备YOLO环境venv虚拟环境与依赖安装拿到这个数据集之后第一件事不是解压丢进某个路径就开始训练而是先准备一个干净的训练环境。YOLO系列对Python版本和依赖库有一定要求常见做法是用venv或conda建一个独立环境避免和本机其他项目的依赖打架。python3 -m venv yolo_env source yolo_env/bin/activate pip install ultralytics用ultralytics这个包YOLOv8和YOLO11都能直接调用训练入口统一不需要自己写复杂的训练脚本。如果你的显卡是NVIDIA且驱动到位ultralytics会自动检测CUDA可用性并默认用GPU训练没有GPU也不至于跑不了只是速度会慢一些1200张图在小模型上CPU也不是完全不能忍。这里给一个检验环境可用的快速命令python -c import torch; print(torch.cuda.is_available())输出True代表GPU可用输出False就要么检查驱动要么心态放平用CPU慢慢跑。3.2 目录规整与data.yaml的写法解压数据集后如果目录结构和你当前的工作目录不一致不用复制粘贴整个文件夹直接用绝对路径指向即可。这里最关键的一步是写data.yaml。你也许已经注意到有些版本的数据集压缩包里自带data.yaml但路径写的是打包者机器上的绝对路径直接拿来用大概率报错。所以最好自己重新写一份。假设你把压缩包解压到了 /home/user/pedestrian1200/ 下那么data.yaml的写法如下train: /home/user/pedestrian1200/images/train val: /home/user/pedestrian1200/images/val test: /home/user/pedestrian1200/images/test nc: 1 names: [person]注意train和val字段指向的是images下的子目录而不是整个images目录更不是labels目录。YOLO系算法在看到路径后会去同级的labels目录里找同名txt文件这是一种硬编码的配套查找逻辑。也就是说images/train/a.jpg会对应labels/train/a.txt这个对应关系是训练流程自动完成的不需要额外指定。所以你的目录结构里只要保证images和labels在同一个父目录下且子目录同名就不会出问题。nc是类别数量这个数据集只有一个类别填1names列表里是这个唯一类别的名称写成person。这里有个细节names的顺序决定了类别id的含义第0位对应id 0与标签文件里的类别编号一一对应。3.3 跑通最小训练命令从YOLOv5到YOLOv8用YOLOv8训练的命令非常简洁几行就能跑起来yolo detect train \ data/home/user/pedestrian1200/data.yaml \ modelyolov8s.pt \ epochs50 \ imgsz640 \ batch16 \ projectruns/pedestrian \ nameexp_street逻辑说明data指向你的data.yaml路径model指定预训练权重这里选了yolov8ssmall版本在精度和速度之间比较均衡。epochs50是训练轮数对这个1200张的小数据集来说50轮已经足够观察收敛趋势imgsz640是输入分辨率YOLOv8默认就是640监控画面如果原始分辨率偏高模型会做缩放来适配batch16是在你显存允许范围内的一个折中值。参数说明如果你用的是YOLOv5而不是YOLOv8训练命令长这样python train.py \ --data /home/user/pedestrian1200/data.yaml \ --weights yolov5s.pt \ --epochs 50 \ --batch-size 16 \ --img 640 \ --project runs/pedestrian \ --name exp_street_v5YOLOv5和YOLOv8在训练入口上有差异但底层的data.yaml格式和目录逻辑是完全相通的。也就是说这个数据集的目录结构、标签格式在YOLOv5和YOLOv8之间是零修改直接复用。训练过程中你会在终端里看到每个epoch的输出包括box损失、cls损失、dfl损失、precision、recall、mAP50和mAP50-95几个指标。重点盯mAP50和mAP50-95这两列mAP50衡量的是IoU阈值0.5下的平均精度直观理解是框得差不离就算对mAP50-95是多个IoU阈值下的平均值更严格对框的定位精度更敏感。行人检测场景下mAP50重要mAP50-95同样重要因为监控画面里行人彼此靠近框偏了半个身位可能就把两个行人并成一个了。3.4 推理、验证与结果查看训练结束后用验证集做一次正式评估运行下面这条命令yolo detect val \ data/home/user/pedestrian1200/data.yaml \ modelruns/pedestrian/exp_street/weights/best.ptbest.pt是训练过程中验证集表现最好的一轮权重val命令会在测试集上重新跑一遍前向推理并输出最终的mAP指标。然后可以用训练好的权重去测单张图片yolo predict \ modelruns/pedestrian/exp_street/weights/best.pt \ source/path/to/a/test_image.jpg \ conf0.4conf0.4是置信度门限低于这个值的目标框会被过滤掉。这个参数在实际部署时非常关键设置在0.3到0.5之间是常见区间需要根据漏检和误检的代价来权衡后面的避坑章节里我会专门展开。4. 1200张数据的边界与逼近训练策略、增强参数和收敛判断4.1 小数据集训练的典型风险过拟合和泛化1200张图在目标检测领域属于小规模数据集。这个量级下最典型的翻车现象就是过拟合训练集损失一路下降验证集损失先降后升模型把训练样本的细节背了下来换一批新图就明显退化。怎么判断过拟合正在发生盯住训练日志里val损失和mAP的变化趋势。正常收敛时val损失下降mAP上升过拟合开始时val损失掉头向上mAP上升变缓或开始回落但train损失还在继续下降。这个剪刀差一出现就要做两件事一是降低模型复杂度从yolov8s换到yolov5s或yolov5n二是增强数据增强强度让模型在训练中看到的“变化版本”更多减少死记硬背的机会。YOLOv8里可以用如下参数放大增强强度augment: true hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 0.0 translate: 0.1 scale: 0.5 fliplr: 0.5 mosaic: 1.0参数说明hsv_h/hsv_s/hsv_v是在HSV颜色空间的随机扰动模拟监控画面在不同白平衡、饱和度下的颜色偏移translate是随机平移scale是随机缩放模拟行人在画面中出现的位置和尺度变化fliplr是水平翻转概率0.5表示一半概率翻转。这些增强项叠加起来等于把1200张图“搓”成了上万种形态能显著缓解过拟合。4.2 数据增强策略的边界监控视角不适用什么增强监控场景和自然图像采集有个显著差异摄像头的安装位置和朝向是固定的行人在画面中的尺度、角度其实有一定的分布规律。因此有些增强手段要慎用。degrees0.0是我写上面参数时有意识留下的意思是完全不做随机旋转。为什么因为街道监控画面存在明显的“地面-天空”约束行人大部分时间保持直立你如果把它旋转30度画面里会出现一个横躺着的人这在真实监控画面里几乎不存在反而会让模型学到错误的姿态分布。同样大幅度的透视变换也会破坏监控画面的视角一致性我不建议使用。合理的增强应该集中在颜色扰动、亮度抖动、轻微尺度变化、水平翻转这几项。监控画面最大的变量不是视角而是光照和天气所以hsv和亮度扰动优先级最高。4.3 训练超参数epochs、batch、学习率怎么定1200张图在常规设置下训练50到80轮是比较稳妥的区间。batch大小取决于显卡显存拿常见的8GB到12GB显存卡为例yolov8s配合640分辨率batch设16基本是安全线显存不够就降到8不要硬撑。学习率一般不用动YOLOv8默认的lr00.01配合AdamW优化器在小数据集上表现比较稳定。偶尔会遇到开局loss就很低、后面完全不想下降的情况大概率是预训练权重在COCO上有过对行人的充分学习模型一开始就知道行人长什么样只需要微调监控视角的特征分布。这时候把前3个epoch设成warmup让学习率从很小的值爬升到0.01后续就能正常收敛。判断收敛的标准不是loss降到多少而是验证集mAP50连续多个epoch不再明显上升。如果到60轮左右mAP50还在往上走就加10轮继续训如果连续15轮不涨继续训下去也只是在过拟合边缘反复试探及时止损比硬刚更明智。4.4 类别不平衡与单类模型的经验教训这个数据集是单类别类别不平衡问题天然不存在但“单类”也有单类的问题模型只见过行人一个类别遇到背景里类似人形的物体路灯杆、树桩、交通锥筒、店面模特容易给出较高的误检置信度。这在单类检测里很常见本质上是因为模型没有见过“非行人”的负样本应该长什么样。缓解手段有两个一是在训练数据里混入一些完全没有行人的背景图标签文件为空txt帮助模型学习什么是“没有目标”二是推理时把置信度门限提高例如从0.25提到0.45虽然会牺牲一部分低置信度的真阳性框但能显著压制误检。按这个数据集的设计如果你想快速度过预研阶段单类训练没有毛病但如果要上生产强烈建议补充负样本。5. 避坑指南YOLO训练中最容易踩的四个坑5.1 图片路径带中文或空格导致训练崩溃现象训练启动阶段报错提示找不到图片文件但目录检查下来文件明明都在。原因YOLO的数据加载模块对含中文或特殊空格的路径支持不稳Windows上尤其常见中文路径在底层编码转换中会失效。解决把数据集放到全英文路径下比如 D:/datasets/pedestrian1200目录层级不要太多另外路径里也不要带括号和空格。做工程养成好习惯所有数据集、代码路径一律英文数字下划线能少踩很多无谓的坑。5.2 标签文件存在但训练时提示Label not in [0, class_count)现象训练日志刷出警告某个batch的标签全部被跳过或直接报错训练无法启动。原因标签txt里出现了大于等于nc值的类别id。最常见的情况是数据集原本有多个类别比如行人、车辆、骑行者被压缩包作者处理过后把非行人类别全部删掉了但标注文件里漏删了一行留下某个id2或id3的标签或者你自己合并数据时classes.txt顺序没对齐。解决用下面这个小脚本对整个labels目录做一次全量校验找出越界id和坐标异常的标签文件import os label_root /home/user/pedestrian1200/labels/train all_lines [] for f in os.listdir(label_root): if not f.endswith(.txt): continue path os.path.join(label_root, f) with open(path, r) as fp: for line in fp: parts line.strip().split() if not parts: continue cls_id int(parts[0]) if cls_id ! 0: print(f文件 {f} 包含类别id {cls_id}) coords [float(v) for v in parts[1:]] if len(coords) ! 4 or max(coords) 1.0 or min(coords) 0.0: print(f文件 {f} 坐标异常: {line.strip()})逻辑说明遍历labels目录下每一个txt文件读取每一行的第一个数字作为类别id检查是否越界再检查后面四个坐标是否全部落在0到1区间内。一旦打印出任何异常就找到对应文件手工修正。参数说明如果你的数据不是归一化格式而是像素坐标那么坐标值会远大于1运行这个脚本就会全部报警。这种情况下先确认数据集到底是不是YOLO格式标题约定YOLO格式就应该是归一化的如果从其他来源混入了绝对坐标的标注需要单独写转换脚本不能混在一起训练。5.3 验证集mAP很高但实测图片漏检严重现象验证集指标跑出来mAP50有0.9以上拿到实拍监控画面去推理结果漏掉一半行人。原因验证集和训练集出自同一批原始素材录制场景、时间段、天气条件高度相似模型在验证集上评估的“好成绩”带有明显的场景记忆成分。这是小数据集最常见的“假象”。解决至少把测试集从训练阶段彻底隔离开训练中只看验证集loss和mAP测试集指标只作为最终结论。有条件的话再从实际部署点位重新截取一部分历史录像画面和数据集里的测试集混在一起做盲测。我在实际项目里的经验是如果盲测的mAP掉得离谱先别急着加数据或调参回头看测试集图片是不是和训练集太像把评估方式改正过来比改模型更优先。5.4 批次大小和显存不足时的应对现象batch设了16训练一启动就报CUDA out of memory程序中断。原因显存不够用。YOLOv8在640分辨率下yolov8s模型单张图的显存开销大约在1GB到2GB之间batch 16意味着同时前向/反向计算16张图显存需求成倍上升。解决先把batch降到8如果还不够就降到4。再不行把imgsz从640降到480输入分辨率降低后显存占用明显下降同时对行人这种中大尺寸目标的精度损失有限。还有一个被很多人忽略的地方训练WSL或远程服务器时其他进程可能占用了显存用nvidia-smi看一下把闲置的僵尸进程清掉有时候比你调参数管用得多。6. 部署时置信度门限怎么调一个最值得花时间的细节训练完成、权重固化、评估达标之后真正决定你是否敢上线的往往是部署阶段没有训练日志可供参考的实测调参。这个环节最核心的一个旋钮就是置信度门限。YOLO系推理的默认门限一般在0.25但部署场景里很少有人直接用它。门限设低了误检框变多安防场景里会把路灯杆、倒影、树丛误当成行人导致告警轰炸值班人员一周就会对系统失去信任门限设高了漏检变多真有人进入监控区域反而没报这种漏报造成的后果比误报严重得多。所以门限的选择本质上是业务风险的取舍。我的习惯是这样做的先准备一段连续时间的监控历史片段用模型跑全量推理然后按置信度分桶统计true positive和false positive的分布。通常你会看到真正行人的置信度集中在0.6到0.95之间误检框则散落在0.2到0.5之间。两者之间往往存在一个低谷区那个区间就是当前场景下的最佳门限位置。用这种方式定出的门限比坐在工位上拍脑袋定个0.4靠谱得多。如果发现行人和误检的置信度区间大量重叠门限怎么调都找不到合适位置就要回到数据层面解决。最有效的做法是找一些误检样例图片直接加入训练集标签写空txt也就是作为负样本让模型学习“这些不是行人”。YOLO系列对难负样本的修正能力很强加上三五十张典型误检图重训一轮误检量下降是非常明显的。还有一个小技巧是部署时启用多尺度推理或TTA也就是测试时增强。YOLO的predict模块支持对不同尺度、翻转后的同一张图分别预测再融合结果能小幅提升最终的mAP但代价是推理时间成倍增加。监控实时场景一般不推荐用TTA但如果你做的是离线视频分析批量跑历史录像TTA带来的那两三个点的提升是白捡的便宜。最后说一句题外话。我接触过很多拿到数据集就马上开训的团队总觉得数据到手训练跑起来结果自然就会好。真实情况往往是数据检查花半天训练花两小时调门限花了一周。模型能不能用从来不是只靠训练出来的而是靠你在部署现场蹲测试点、盯误报截图、一帧一帧推理视频熬出来的。这个数据集帮你省掉了最费时的标注环节但从数据到可用的产品中间还有很多功课要补。希望这篇笔记能把一些我用过的、踩过的坑总结出来帮你在“拿到数据”和“上线能跑”之间少走几步弯路。本文还有配套的精品资源点击获取
返回列表