资讯详情

YOLO行人检测数据集与训练全流程:监控场景实战指南

📅 2026/9/23 21:30:36 | 华诺云谱 👁 阅读
YOLO行人检测数据集与训练全流程:监控场景实战指南
简介面向街道监控视野的行人检测数据集共1200张实拍图像标注为唯一类别person适合需要训练YOLO系列检测模型的开发者、科研人员与毕设学生使用。资源包已按yolo格式完成标签转换并预先划分为训练集、验证集与测试集从YOLOv3到YOLOv10均可直接加载训练无需额外处理据作者测试YOLOv9在该数据集上准确率达到96.4%。包内共2000个文件其中788张jpg图片对应1211个txt标签文件另附1个yaml配置文件图片与标签一一对应目录结构清晰便于开展模型训练与评估。整体压缩包大小约138.6MB既有数据规模又保持轻量适合快速验证算法效果。目前已有722人学习下载可作为科研实验、课程设计、毕业设计及实际落地项目的基准数据集帮助省去数据采集与标注环节专注模型调优。1. 街道监控行人检测这份 1200 张 YOLO 数据集为什么能直接开训接触过行人检测的人都知道找数据集最怕的不是数据少而是标注格式乱七八糟。这份 1200 张街道监控视角的行人检测数据集图片和 YOLO 格式 txt 标签一一对应且已经划分好训练集、验证集、测试集从 YOLOv3 到 YOLOv10 都能直接消费。它解决的核心痛点是省掉标注、转格式、手动切分这三个最耗时的环节让算法对比和课设毕设从第一天就开始跑模型。对刚接触 YOLO 训练流程的人这份数据能让你把注意力放在训练参数和损失函数上而不是在打标和文件整理里耗掉两个晚上。2. 监控视角的行人检测为什么这个场景值得单独做数据集2.1 监控视角和普通街景的差异决定了训练策略街道监控视角的行人检测和随手拍的街景照片完全是两回事。监控摄像头通常架在高处以俯视或者大角度倾斜视角拍摄行人占比偏小且经常出现相互遮挡、人流密集、光照剧变的情况。这些因素直接影响模型训练时的输入尺寸和数据增强策略。常见的行人检测数据集如 COCO 的 person 类虽然通用性强但监控视角样本占比不高模型迁移到实际安防场景时经常出现漏检率上升的问题。这份数据集专门采集街道监控视角的抓拍画面意味着训练集和真实部署场景的分布是一致的。对做课设或者安防 demo 的人来说这比盲目在大数据集上预训练再微调更省事因为 domain gap 本身就小。我一般拿到新场景的数据第一件事就是确认视角分布是否跟我的业务一致如果都是低机位的平视行人那监控这种俯视场景训练出来的权重可能就不太合用。2.2 解压之后先看目录train/val/test 的划分逻辑拿到压缩包解压后第一眼通常看到的是 images 和 labels 两个大目录或者直接是 train、val、test 三个并行的目录。这份数据已经完成了划分训练时不需要再自己写随机切分脚本。划分的意义不只是省事更重要的是防止数据泄漏。如果训练集和验证集来自同一段连续视频帧相邻帧几乎一样验证指标会虚高跑出来的 mAP 不能反映真实泛化能力所以离线划分好三个集合是负责任的做法。我建议解压后先用一条命令统计一下文件数量确认图片和标签是否一一对应。find . -name *.jpg | wc -l find . -name *.txt | wc -l这个命令分别统计 jpg 图片和 txt 标签的数量。如果两个数字不一致说明存在缺失标签的图片训练时可能会报空标签或者漏检。正常情况下应该是各 1200 份。统计完数量再看一下目录结构。常见划分比例是训练集七成、验证集两成、测试集一成这份数据具体比例以压缩包内实际目录为准。不管比例如何只要验证集和测试集独立于训练集评估结果就有参考价值。目录结构通常是下面这个样子。dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/这种结构是 YOLO 系列训练时最省心的形态data.yaml 里直接把路径指到 train 和 val 的 images 目录即可。注意的是有些压缩包会把 test 也放在结构里但训练时只用到 train 和 valtest 是训练完全结束后做最终评估用的别把 test 的数据提前塞进训练流程。2.3 标签文件拆开看YOLO 格式的归一化坐标每个 txt 文件名与对应 jpg 文件名完全一致比如screenshot_46_png.rf.c630c5fa00185e1dd4d1cd893a1ae99a.jpg对应的标签就是screenshot_46_png.rf.c630c5fa00185e1dd4d1cd893a1ae99a.txt。文件名里的.rf.是 Roboflow 平台导出的标记不影响训练只是说明了这份数据曾经经过 Roboflow 生态的清洗和导出。我用 Python 读一个文件出来看格式。with open(screenshot_46_png.rf.c630c5fa00185e1dd4d1cd893a1ae99a.txt, r) as f: for line in f: print(line.strip())输出的一行数据长这样0 0.53671875 0.44166666666666665 0.0609375 0.2287037037037037这行五个数字的含义分别是类别 ID、归一化中心点 x 坐标、归一化中心点 y 坐标、归一化宽度、归一化高度。类别只有 person 一个所以类别 ID 固定为 0。在 YOLO 格式中坐标全部相对图片宽高做了归一化取值范围在 0 到 1 之间。这种做法的好处是无论原始图片分辨率多大模型输入尺寸怎么变标签都不需要跟随适配。提示类别 ID 从 0 开始编号单类别数据集就是 0。如果自己用 LabelImg 打标后导出 YOLO 格式要确保类别顺序和 data.yaml 中 names 列表一致否则模型会把 person 识别成另一个类别。3. 用 YOLOv8 跑通训练从环境到推理的全流程复现3.1 环境搭建与 ultralytics 安装YOLOv8 到 YOLOv10 的训练都可以走 ultralytics 这个统一框架省去自己处理网络定义、损失函数、数据加载器的麻烦。先创建 Python 环境并安装依赖。conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics这里 Python 版本选 3.10 是为了兼容 PyTorch 的预编译包。ultralytics 安装完成后会自动带上 PyTorch但如果你有 CUDA 版本要求建议先单独装对应版本的 PyTorch再加装 ultralytics。GPU 环境下训练速度比 CPU 快两个数量级1200 张图片的数据量虽然不大但没有 GPU 的话一个 epoch 也要等很久。安装完做一次快速验证确认框架能正常调用设备。import torch from ultralytics import YOLO print(torch.cuda.is_available())如果输出 True说明 GPU 可用。输出 False 的话后续训练全程走 CPU训练时间会明显拉长。1200 张的数据量如果只是做课设验证CPU 也能接受但 batch size 要调小。3.2 data.yaml 配置路径与类别定义是第一个坑点训练前先写 data.yaml这是整个流程里最容易因为粗心出错的文件。路径必须指向你解压后的实际位置且建议使用绝对路径避免相对路径在不同工作目录下失效。path: /home/user/datasets/pedestrian_monitor train: train/images val: val/images test: test/images nc: 1 names: [person]path 字段是数据集根目录train 和 val 是相对根目录的图片路径。nc 为类别数量names 是类别名称列表。有些人在这个文件里反复报错原因就是 path 写成了相对路径或者 train 指向了 labels 目录而不是 images 目录。YOLO 在读取标签时默认去同名目录下的 labels 文件夹里找只要 images 路径正确标签路径会自动匹配。写好后可以先跑一段空训练验证配置正确性。yolo detect train data/home/user/datasets/pedestrian_monitor/data.yaml \ modelyolov8n.pt epochs1 imgsz640epochs 设为 1 只是用来验证配置和跑通流程。如果这一步没有报错并且在输出日志里能看到每个 epoch 的损失值和指标说明数据路径和标签格式都没问题。这一步跑出来即使 mAP 为 0 也没关系目的只是确认链路通了。3.3 训练参数怎么选epochs、batch、imgsz 的工程取舍正式训练的参数选择需要结合数据集规模和场景特点。这份数据集是 1200 张单类别标注质量高属于小而干净的数据集训练策略和小数据集训练保持一致。yolo detect train \ data/home/user/datasets/pedestrian_monitor/data.yaml \ modelyolov8s.pt \ epochs100 \ batch16 \ imgsz640 \ patience20 \ device0epochs 设为 100 是基于 1200 张图片规模的常见选择10 万张量级的数据集通常 300 epoch 起步但小数据集训练太久容易过拟合。patience20 表示连续 20 个 epoch 验证指标没有提升就提前停止这个机制防止训练白跑浪费时间。batch 的默认值在单卡上通常可以到 16但如果显存不足降低到 8 或 4。imgsz 是输入网络的图片尺寸监控视角的行人目标偏小640 是一个兼顾精度与速度的选择。如果硬件允许提到 960 对小目标召回会有正向帮助。训练过程中关注 YOLO 损失函数的三个输出box_loss 衡量预测框与真实框的回归误差cls_loss 衡量分类是否正确dfl_loss 是分布焦点损失控制边界框的精细度。三条损失曲线都在下降说明模型在学习如果 val 指标上升但训练损失还在下降就要留意过拟合适当调低 epoch 或者增强数据正则化。3.4 推理与结果可视化确认模型真的学到了行人特征训练结束后ultralytics 会在runs/detect/train/目录下保存 best.pt 和 last.pt。best.pt 是验证集上指标最好的权重用它来做推理测试。yolo detect predict \ modelruns/detect/train/weights/best.pt \ source/home/user/datasets/pedestrian_monitor/test/images \ conf0.25 \ saveTrueconf 是置信度阈值低于这个值的检测结果会被过滤掉。saveTrue 会把推理结果图保存到runs/detect/predict/。打开几张测试图看看行人密集的地方有没有漏检目标重叠时有没有框位置偏移远处的小行人有没有被识别出来。这一步比任何指标都直观指标是从测试集整体统计上衡量模型好坏而你是否认可这个模型最后取决于肉眼看这些图的质量。4. 避坑与排查训练这套数据集的四个高频故障现场4.1 训练秒退日志只留一行 FileNotFoundError现象启动训练命令后不到五秒程序退出报错信息提示找不到图片或标签文件。原因大多数情况是 data.yaml 中的 path 或 train 路径与解压后的实际目录结构不匹配。比如路径里多写了一层或者把 labels 目录当成了 images 目录。另一种情况是解压工具把文件夹嵌套了一层实际图片在pedestrian_monitor/pedestrian_monitor/train/images而你只写到了第一层。解决用ls查看真实目录层级然后更新 data.yaml 的 path。我一般先用yolo detect train跑 1 个 epoch 验证路径确认日志里出现图片加载统计后再开正式训练。4.2 验证集 mAP 很高但换了场景漏检明显现象训练时验证集 mAP 接近 0.95模型看起来很强。拿到另一批手机拍的街道照片测试漏检率飙升。原因这是典型的同分布验证带来的指标虚高。训练集、验证集来自同一批监控视角截图视角、画质、目标尺度高度一致模型只需要记忆这些特征就能拿高分泛化能力并没有指标显示的那么强。解决不要把验证集指标当作模型实际能力的上限。训练完成后一定要用一批完全独立、不同来源的行人图片做盲测。这个数据集中 test 集合在一定程度上缓解这个问题但 test 同样来自同一监控体系如果做算法对比可以接受但落地部署前必须采集目标场景的数据重新评估。4.3 训练中断提示 empty labels 或 zero size label现象某个 epoch 训练报错提示某个 batch 里包含空的标签文件或者 txt 中存在值为 0 的坐标。原因部分监控截图边缘只露出半个行人人工标注时可能漏标导致少数 txt 文件为空文件。另外如果某个标注框的中心点恰好落在图片边缘之外归一化坐标会出现负值或超过 1 的异常值。解决训练前写一个小脚本扫描所有标签文件过滤空文件和越界坐标。虽然这份数据整体标注质量高但这种检查耗时不到一分钟值得做一次后面我会给出完整脚本示例。4.4 显存爆掉CUDA out of memory现象训练刚开始就报 CUDA out of memory进程被杀。原因监控截图原始分辨率较高而训练时 imgsz640 只是输入尺寸ultralytics 在加载图片时会先按原始分辨率解码再做缩放高分辨率图片解码本身就会占用大量临时显存。同时 batch16 对于 n 系列模型可能没问题但换到 s 或 m 系列模型时参数量增大显存占用翻倍。解决把 batch 降到 8 或 4优先保证训练不中断。如果仍然爆显存换用小模型或者降低 imgsz 到 512。显存有限的场景下用小模型 高分辨率 和 大模型 低分辨率之间前者对行人检测更友好。5. 用 YOLOv9 复现 96.4% 准确率训练流程与超参对齐5.1 YOLOv9 的网络结构特点与迁移基础摘要中提到 YOLOv9 在这个数据集上可以达到 96.4% 的准确率。这个结果的达成与 YOLOv9 的两项核心设计有关。第一是 GELAN 结构它通过梯度路径规划增强特征复用效率相比传统 CSP 结构在相同算力下精度更高。第二是 PGI 可编程梯度信息机制专门解决深层网络中信息瓶颈导致的梯度消失问题对行人这种中等尺寸目标和小目标混合的场景改善明显。用 ultralytics 跑 YOLOv9 训练并不需要下载单独的代码库框架从 YOLOv8 开始已经统一支持。命令几乎一样只要把模型权重换成 YOLOv9 系列的权重文件即可。yolo detect train \ data/home/user/datasets/pedestrian_monitor/data.yaml \ modelyolov9c.pt \ epochs100 \ batch16 \ imgsz640 \ patience20 \ device0yolov9c 是 YOLOv9 的中间体量版本在速度和精度之间相对均衡。如果显存充足可以尝试 yolov9e 大模型精度会更高但训练时间明显拉长。1200 张图片在单卡 GPU 上yolov9c 跑 100 个 epoch 大约需要一到两小时属于可以接受的等待范围。5.2 复现 96.4% 的三个关键旋钮做好下面三点验证集指标的复现率很高。首先是数据增强参数的调整。ultralytics 默认开启了马赛克增强也就是把四张图拼成一张训练。小数据集上加马赛克能显著提升模型对遮挡和密集场景的泛化但马赛克在训练后期会导致目标尺度失真所以默认会在最后 10 个 epoch 自动关闭。第二是学习率的设定。默认的 lr00.01 在批大小为 16 时是合理起点。如果把 batch 调小到 8学习率也应等比例调低到 0.005 左右否则收敛不稳定val 指标会有明显抖动。第三是预训练权重的选择。yolov9c.pt 是在 COCO 上预训练过的权重COCO 中包含 person 类这意味着模型已经具备基本的行人特征提取能力在这个数据集上只需要微调适应监控视角即可。如果从零开始训练1200 张图很难达到同样精度。5.3 从验证指标判断模型水平训练日志中会输出多个指标precision 表示预测为正样本的框中真实目标的比例recall 表示真实目标中被检出的比例mAP50 是 IoU 阈值 0.5 下的平均精度。摘要提到的 96.4% 准确率对应的通常是验证集上的 mAP50 或 precision 达到 0.964。行人检测场景下mAP50 达到 0.95 以上已经具备工程落地的基础条件但实际部署时更应关注召回率因为漏检的代价往往高于误检。注意不同指标之间不能混用。如果你看到别人公布的是 recall而你用 precision 去对照数值差异可能很大。对比模型效果时先确认统计口径一致。6. 最后一步训前跑一遍标签体检脚本堵住三类隐性错误拿到的数据集质量再好也值得花两分钟做一次全面检查。我写了一个轻量的标签体检脚本检查内容有三项坐标是否越界、是否存在空标签、类别 ID 是否在合法范围内。这个脚本通用性很强换任何 YOLO 格式的数据集都能直接复用。import os from pathlib import Path label_root Path(/home/user/datasets/pedestrian_monitor) empty_files [] invalid_files [] for split in [train, val, test]: label_dir label_root / split / labels if not label_dir.exists(): continue for txt in label_dir.glob(*.txt): with open(txt, r) as f: lines [line.strip() for line in f if line.strip()] if not lines: empty_files.append(str(txt)) continue for line in lines: parts line.split() if len(parts) ! 5: invalid_files.append(f{txt}: bad format: {line}) continue cls_id int(parts[0]) coords [float(v) for v in parts[1:]] if cls_id 0 or cls_id 0: invalid_files.append(f{txt}: cls id {cls_id} out of range) if any(c 0 or c 1 for c in coords): invalid_files.append(f{txt}: coord out of range: {line}) print(fempty label files: {len(empty_files)}) print(finvalid label files: {len(invalid_files)}) for f in empty_files[:5]: print(f empty: {f}) for f in invalid_files[:5]: print(f invalid: {f})脚本遍历每个划分目录下的所有 txt 文件逐行解析五个字段。空标签文件单独归类因为在训练时会导致该图片被忽略若空标签文件过多则实际参与训练的图片数量会少于预期。坐标越界检查覆盖了负数坐标和大于 1 的异常值这些都会在 loss 计算时产生不合理的梯度贡献。类别 ID 超出范围的检测则能提前暴露类别映射配置错误避免辛辛苦苦训练完张张图都框错位置。运行这个脚本后输出中应该显示 empty label files 和 invalid label files 均为 0。如果发现少量异常文件直接删除或修复即可。不要怕删1200 张数据里删掉三五个有问题的文件对模型精度没有任何负面影响反而能避免训练中偶然出现的 loss 爆炸。从那以后我拿到任何第三方 YOLO 数据集第一件事都是跑一遍这个体检脚本再决定要不要训练。数据链路一脏后面再花时间调参都是浪费希望这个习惯和这套流程能帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。