
简介面向街道监控场景的行人检测数据集包含1200张真实抓拍图片及对应的YOLO格式txt标签专为目标检测算法研究者、毕业设计学生和项目开发人员准备兼容YOLOv3至YOLOv10全系列框架。压缩包内共2000个文件其中788张jpg图片、1211个txt标注文件及1个yaml配置文件整体约138.6MB目录已按训练集、验证集、测试集划分下载后无需任何格式转换即可直接调用训练。目前已有723人学习下载标注类别为单类person标注精准使用YOLOv9训练时准确率可达96.4%。资源源自街道监控真实视角样本覆盖不同抓拍场景适合行人检测、智能安防等方向同时可用于科研、课设和实际落地项目帮助省去数据采集、清洗与划分时间快速开启模型训练。1. 1200张街道监控视角行人检测数据集yolo训练前先搞懂它在解决什么场景做行人检测的人手里最不缺的就是数据集但打开一个标注好的压缩包标签格式不对、类别id错位、train和val光照分布完全两套这才是常态。标题里这个1200张街道监控视角行人检测数据集主打的是“yolo系列算法直接用”——txt标签、已划分训练集验证集测试集意味着你从压缩包里拷出文件改一下data.yaml路径就能开始yolov8或yolov5的训练不用再写转换脚本也不用担心数据集划分时类别分布不均。它的场景固定在街道监控视角也就是俯视或者斜俯视的路口、人行道、商铺门口跟车路协同和智慧安防里“远距离、多尺度、密集遮挡”的真实需求是对齐的。这篇文章适合两类人一类是刚接触yolo训练、手里还没有自己数据集的新手想先拿一套标注规范的现成数据集把pipeline跑通另一类是做智慧城市或交通场景检测的工程师需要一个与监控机位视角匹配的数据集来评估yolo的基线表现再决定是否补充自采数据。我会从数据集内部结构讲到训练参数、评估维度再落到5个高频踩坑点最后给出把这套数据用于真实项目的进阶做法。2. 拆解yolo格式txt标签与数据集划分目录结构、坐标换算和校验脚本拿到手先别急着开训先花十分钟把数据集的结构摸清楚。yolo系列算法能“直接用”的前提是标注文件格式和目录组织方式都符合约定这个约定一旦有偏差训练出来的模型会以很隐蔽的方式变差——比如loss正常下降但mAP始终上不去。2.1 数据集目录与txt标签的标准组织方式yolo训练数据集的目录结构在yolov5、yolov8、yolov11里基本统一一个能直接用的数据集应该是这样的dataset/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片 ├── labels/ │ ├── train/ # 训练集txt标注 │ ├── val/ # 验证集txt标注 │ └── test/ # 测试集txt标注 └── data.yaml # 数据集配置文件images和labels下的子目录名必须一一对应每张images/train/xxx.jpg都必须有一份labels/train/xxx.txt。txt文件与图片同名但扩展名不同。因为这会直接影响yolo在训练时通过img2label_paths函数做文件匹配的逻辑如果名字对不上yolo会直接跳过这张图并在日志里打一行WARNING很多新手没注意以为数据集正常加载了实际训练图片数少了一半。data.yaml是yolo读取数据集的入口关键内容就三块路径、类别数和类别名。比如这个行人检测数据集只有一类yaml里就是nc: 1和names: [person]一旦类别数写错训练时类别id会越界或者全部归到背景类这种错误在loss曲线上通常要到十几个epoch之后才看得出来。2.2 归一化坐标每一行txt在描述什么yolo格式的txt标注每一行代表一个目标框格式是固定的五个字段class_id x_center y_center width height这里的x_center、y_center、width、height全部是归一化坐标范围在0到1之间计算方式是相对于图片宽高的比例x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height为什么要归一化因为yolo的预测头输出就是归一化值模型学习的本质是“目标中心在图片中的相对位置”和“目标占图片的相对尺寸”而不是绝对像素值。这样同一个目标在不同分辨率输入下标注值保持一致。街道监控视角的特点是相机固定、焦距固定但行人远近差异极大——近处的人可能占图片1/3高度远处的人在50x50像素以内归一化坐标能保证模型在不同尺度上学到一致的目标分布。建议随手写一个脚本校验txt内容是否都在合法区间这一步非常值得import os label_dir dataset/labels/train bad_files [] for name in os.listdir(label_dir): if not name.endswith(.txt): continue with open(os.path.join(label_dir, name)) as f: for line in f: parts line.strip().split() if len(parts) ! 5: bad_files.append((name, 字段数不为5)) continue cid, xc, yc, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): bad_files.append((name, f坐标越界: {line.strip()})) if bad_files: for fname, reason in bad_files[:10]: print(f{fname}: {reason}) else: print(全部标签合法)这个脚本的价值在于把肉眼检查变成自动化检查。坐标越界的根源通常是标注工具导出时没有归一化或者脚本里除的是图片高度却写成了宽度。对于监控视角数据集还有一种特殊情况行人在图像边缘被截断标注框只框了可见部分这是合法但不理想的情况后面第5章我会单独说它怎么影响训练。2.3 训练集、验证集、测试集的最佳比例与划分逻辑“已划分”意味着你不需要自己写随机分配脚本但要检查划分方式是否合理。常见的划分比例是70/15/15或80/10/101200张的体量下我倾向于70/15/15——训练集840张验证集180张测试集180张。如果验证集太少mAP的置信区间会很大涨两个点还是跌两个点根本说不清。比比例更重要的是划分的随机性是否按“场景”而非按“单张图片”进行。2200张的图如果都来自同一条马路的连续视频帧随机划分会导致同一时间段、同一机位的强相关画面同时出现在train和val里模型其实是在“背场景”不是学特征。更严谨的做法是按摄像头机位或时间段分桶一个机位的画面要么全进训练集要么全进验证集。验证划分是否合理的一个简单维度是光照分布。街道监控的行人检测白天和夜晚的画面差异极大如果训练集几乎全是白天验证集却混入大量夜景loss曲线会出现典型的“训练下降、验证震荡”现象。检查方式很简单把训练集和验证集的图片平均亮度分别算出来画个直方图看一眼分布是否重叠。3. 用yolov8/yolov5直接跑通训练data.yaml、预训练权重与关键参数数据集结构没问题之后下一步就是让训练真正跑起来。yolo系列算法直接用这个标题的关键词体现在你不需要写数据加载器不需要改模型输入尺寸只需要把配置文件的路径填对就能在yolov5或yolov8下启动训练。3.1 编写data.yaml并验证配置正确先看这个文件长什么样# data.yaml path: /path/to/dataset # 数据集根目录绝对路径或相对于运行目录的路径 train: images/train # 训练集图片目录 val: images/val # 验证集图片目录 test: images/test # 测试集图片目录 nc: 1 # 类别数只有person一个类 names: [person] # 类别名称列表这里有一个容易踩的细节path字段写的是数据集根目录train/val/test写的是相对路径。yolov8和yolov5在解析时都会用path / train拼接完整路径。如果path写成了dataset/然后train又写了images/train最终变成dataset/images/train没问题但如果trtrain里误写了绝对路径/home/user/dataset/images/train则path设置会被直接覆盖验证集会变成空或者报错。配置写好后跑一条快速命令验证数据能否正常加载这一步能省下后面大量排错时间yolo detect train \ modelyolov8s.pt \ datadata.yaml \ epochs1 \ imgsz640 \ batch8 \ cacheTrue只看三个输出第一启动日志里出现数据集路径和类别信息第二出现“train: 840 images, val: 180 images”这样的统计第三第一个epoch能正常跑完。任何一步异常都先在命令行把data.yaml的路径用绝对路径重写一遍再试。3.2 预训练模型选择yolov5s还是yolov8s还是从零训练对于1200张的数据量我的建议非常明确必须用预训练模型做微调不要从零训练weights。COCO预训练权重里包含的通用视觉特征——边缘、纹理、形状、人体部件结构——对于行人检测来说是极强的先验。从零训练在1200张图上很难收敛到可用状态因为行人检测的难点在遮挡、小目标、姿态变化这些特征需要大量数据才能学到通用性。yolov5和yolov8的选择上如果是有部署经验的老团队yolov5的生态工具链更成熟转onnx、tensorrt的教程也多如果是新项目直接上yolov8。yolov8的anchor-free设计让检测头对小目标的响应更好而街道监控视角的一个主要难点恰恰是远处行人目标小。访问hugging face或者ultralytics官方仓库能下载到预训练权重比如yolov8s.pt、yolov8m.pt。注意“yolo预训练模型下载”这个搜索词对应的坑必须用与训练代码版本匹配的权重文件yolov5的pt不能直接给yolov8用架构不兼容会报missing keys错误更不要从非官方渠道下载别人改过的权重。3.3 训练关键参数设置跑yolov8训练最重要的几个参数组成了这组命令yolo detect train \ modelyolov8s.pt \ datadata.yaml \ epochs100 \ imgsz640 \ batch-1 \ lr00.01 \ optimizerSGD \ augmentTrue \ cacheTrue \ patience20 \ projectruns/detect \ nameperson_street_view参数设定逻辑如下imgsz640是yolo系列默认的输入尺寸但针对这个监控数据集如果发现行人在图中的占比普遍偏小建议把imgsz调到960甚至1280代价是显存占用翻倍、训练速度变慢。batch-1表示让yolo自动检测GPU显存能容纳的最大batch这个功能非常实用因为不同显卡的显存差异太大手动设置batch16可能爆显存batch4又浪费算力。lr00.01配合SGD与预训练权重是经过大量场景验证的组合。学习率过大比如0.1会让预训练权重被冲毁表现为前几个epoch loss不降反升后续很难修复。学习率过小比如0.001则收敛极慢100个epoch可能只达到应有精度的70%。patience20是早停参数连续20个epoch在验证集上没有mAP提升就停止训练。这个参数很重要因为不要盲目跑满100个epoch——过拟合在这个数据集体量下是大概率事件通常在第40-60个epoch时模型就达到了最佳验证mAP继续训练loss还在降但mAP不再上涨这时候就该停了。4. 训练完怎么验收mAP、混淆矩阵与pr曲线别只看loss训练结束后很多人只看train loss曲线下降了就觉得模型训练好了这是个很危险的误判。loss是模型在训练集上的拟合程度不代表在未见过的监控画面上的检测能力。真正要看的是验证集上的一组指标。4.1 mAP50、mAP50-95与pr曲线训练结束会在runs/detect/person_street_view/下生成一堆文件其中最重要的是三个results.png、confusion_matrix.png、PR_curve.png。results.png第一行画的是Box Loss和Cls Loss第二行是mAP50和mAP50-95。mAP50指的是IoU阈值设为0.5时的平均精度均值mAP50-95则是在0.5到0.95的范围内每隔0.05算一个mAP再取平均。对于行人检测项目我建议两个指标分开解读mAP50是“框有没有框到人”的核心指标0.85以上对这个数据集算正常水平mAP50-95是“框的准确度有多高”因为行人目标尺寸跨度极大小目标的IoU很难达到0.75以上mAP50-95通常比mAP50低15-25个百分点pr曲线Precision-Recall Curve精确率-召回率曲线比mAP更有诊断价值。如果曲线在召回率0.6之前就急剧下滑说明模型为了保精确率牺牲了大量召回对应场景是“漏检率偏高”——监控画面里远处的小人也必须被检测到时这种模型不合格。如果曲线在精确率0.5时就崩盘说明大量误检——把路牌、垃圾桶、树影当成了人。4.2 混淆矩阵要不要看confusion_matrix.png在单类别检测任务里只有两行两列person和background好像没什么好看的但它的价值在于查看background列的数字——代表的是误检数量。模型把多少个背景区域预测成了person这一列的数字远大于正确检测数时说明模型的判别边界太宽需要提高置信度阈值或者检查标注里是否混进了大量只含半个人的框。很多人搜“yolo混淆矩阵总合不唯一”这是一个正常现象归一化方式在横向还是纵向不同总和就有差异不需要纠结。要关注的是背景类那一列的绝对大小。4.3 用测试集做最终评估而不是验证集验证集在训练过程中已经被用来做早停和超参调优了模型在验证集上的分数会有一点虚高。真正能说明这个数据集训练最终效果的是测试集。做法是yolo detect val \ modelruns/detect/person_street_view/weights/best.pt \ datadata.yaml \ splittest \ imgsz640注意splittest这个参数yolov8默认验证的是val集指定splittest才会在测试集上跑评估。测试集上的mAP50如果比验证集低超过5个百分点需要怀疑是不是训练集和测试集之间存在场景或光照分布偏移——这在监控视角数据集里很常见训练集多是白天测试集夜景占比高。5. 踩坑排查txt标签、划分分布、小目标漏检和bn崩溃的5个典型案例这一章是血泪经验的集合。用这个数据集训练yolo系列模型时新手会反复遇到下面这些问题每条都是“现象、原因、解决”三步讲清。5.1 训练集加载数量比实际少一半现象训练日志里显示train: 420 images但你数过图片目录是840张。原因yolo在读取时要求每张图片必须有对应的txt标注文件有部分jpg文件在labels/train下找不到同名txt被自动跳过。解决写脚本对比images和labels两个目录下的文件名找出缺失列表。常见的丢失原因是标注工具导出时自动跳过了“没有行人”的背景帧但这在监控数据里是可以接受的——yolo本身就支持背景帧的存在如果没有txt标注直接把图片放进train目录即可yolo会把它当作负样本参与训练不跳过的行为反而是合理的。5.2 类别id越界报错现象训练到某个epoch时pytorch报错AssertionError: Class index is out of range或者loss值突然变成nan。原因txt标签里的第一列出现了不在0到nc-1范围内的数字。在这个单类别数据集上常见原因是有人误把类别名person写成了1而不是0。yolo的类别计数从0开始这是所有标注工具导出时最容易出错的点。解决用第2章的校验脚本加一个类别范围检查打印出所有大于等于1的class_id找到文件后手动修正或重新导出。5.3 夜间和逆光场景漏检严重现象整体mAP50不低0.85左右但单独抽夜景测试图看远处行人几乎全部漏检。原因街道监控视角下白天和夜晚的图像外观差异极大而训练集中夜景占比不足或者在划分时没按光照条件分层。解决第一个做法是看数据集images/train下夜景图片的比例如果低于20%训练时用hsv_h0.015, hsv_s0.7, hsv_v0.4做颜色增强第二个做法更好——训练时给yolo加augmentTrue的同时把验证集里夜景样本补充到训练集。注意不要通过简单把验证集图片复制进训练集来解决这会造成数据泄漏测试集评估失去意义。5.4 BN层崩溃导致训练震荡现象训练没几个epochloss从1.2突然跳到5以上然后一直下不来。你搜“yolo训练中bn崩溃”出来的结果几乎都指向同一个原因——学习率设置过大或batch太小。BNBatch Normalization层的统计量在小batch下不稳定特别是batch2、batch4这类极小值模型参数的更新幅度大于BN层统计量的适应速度整个网络内部的数据分布就乱了。解决使用batch-1让显存决定batch如果显卡只有6G显存batch大概率是4或8那就要把lr0从默认的0.01降到0.002或0.001同时把warmup_epochs从默认的3改到5让学习率缓慢爬升BN层才有时间适应。5.5 遗忘测试集中的“部分可见行人”现象测试集mAP50高但在实际应用里行人在画面边缘被截断、只露出半身时模型检不到。原因标注数据里边缘截断的行人框大多标注了可见部分模型训练时看到的大部分是完整行人框对“残缺目标”的先验不足。解决训练时不要动这类样本但在数据增强阶段开启随机裁剪yolov8的augment默认包含random crop它会让模型学会利用更少的信息推断目标位置如果项目对边缘截断要求高就把数据集中所有边缘截断行人的标注找出来复制一份随水平翻转后追加到训练集让这个分布从少数变成常态。6. 进阶技巧用数据增强和badcase迭代把街道监控行人检测精度再拉一档基础训练跑通、评估指标正常之后这个数据集的价值才真正开始体现。1200张只是起点yolo系列算法的迭代上限由你的数据策略决定而不是模型结构。我的习惯是先跑基线把badcase打印出来挂在墙上逐类改进。第一招是数据增强参数精细化。yolov8提供的augment参数默认值偏向通用场景但街道监控有自己的特点——机位固定、物体始终是直立行人、不会出现倒置目标。可以关掉degrees随机旋转因为监控画面里不会有倾斜的行人旋转只会制造无意义的样本但要把translate0.1和scale0.5加大模拟行人在画面中不同位置和远近尺度的变化这符合监控场景下行人从远处走入近处的真实规律。对于夜景占比不足的数据集hsv_v从默认的0.4加到0.6等于手动模拟了夜间低亮度环境。第二招是harvest hard examples。把验证集里mAP50低于0.3的样本挑出来看它们的共同特征——是远距离小目标居多还是密集人群遮挡严重还是逆光剪影。针对小目标把imgsz从640提到960相当于变相放大目标尺寸代价是显存翻倍、训练时间变长针对密集遮挡用mosaic增强yolov8默认开启mosaic1.0让模型在训练时看到更多“多个行人互相遮挡”的组合。这两招是最常见且有效的两个方向和搜索里高频出现的“yolo实例分割”“多模态数据集”无关行人检测单类模型的迭代重点就是尺寸和遮挡。第三招也是最容易被忽略的从训练好的模型反推数据标注质量。用best.pt跑一遍训练集回测yolo detect val时把data.yaml中val指回images/train找出loss最高的若干张大概率能看到一批标注框没贴合行人轮廓框过大或过小的样本。这些标注错误会持续拖累模型精度手动修正它们比增加新数据更值。这套流程走完之后这个数据集在上文提及的yolov8s预训练权重下的实际表现通常在mAP50上有0.85以上的水平用在项目里作为baseline足够了。但数据永远有天花板。真正把行人检测落进街道监控项目时单靠这1200张是不够的还要采样同一场景下不同时段的视频帧按“白天、夜晚、黄昏、雨天”分层补充逐步把训练集扩到3000张以上精度才会继续上升——这套从划分、训练、评估到badcase反馈的闭环能力才是数据集真正教给你的东西。我自己每次拿到新数据、新场景都宁愿多花一天做校验和分层也不愿意把不靠谱的数据扔给yolo训练省那一小时这个习惯帮我省过不少返工的麻烦希望帮到你。本文还有配套的精品资源点击获取