
简介YOLO行人数据集.zip 面向从事目标检测的算法工程师、研究生与计算机视觉爱好者用于训练和评估 YOLO 系列行人检测模型可服务于智能监控、自动驾驶、人群统计等实时场景。压缩包共 1459 个文件约 154.43MB其中 485 张 jpg 图像覆盖城市街道、商场及 FLIR 红外等多场景485 个 xml 提供 PASCAL VOC 格式边界框标注489 个 txt 则对应 YOLO 训练所需的归一化标签图像、标注与标签一一配套省去自行整理与格式转换的麻烦。数据集涵盖不同天气、光照与人群密度有助于提升模型泛化能力也可用于计算准确率、召回率与 mAP 等指标来横向对比模型表现。目前已有 1611 人学习下载适合需要快速搭建行人检测训练与评测流程的读者直接上手使用。1. 行人检测数据集到底解决什么问题从一堆图到可训练的标签行人检测是视觉落地里最容易被低估的一环。很多人拿到 YOLO 权重跑通一张街景图就以为完事真到自己训练时才发现通用 COCO 里 person 类样本虽多但场景分布和你的业务差得远遮挡、小目标、夜间、密集人群这些情况一测就翻车。这份 YOLO 行人数据集就是冲着这个缺口来的——它把行人这一类单独抽出来整理成 YOLO 训练格式省掉你自己爬图、清洗、标注、转格式的大半工作量。它适合三类人一是刚学 YOLO 训练、想跑通「自己数据集」全流程的新手二是做安防、客流统计、校园或园区监控需要行人专用数据的从业者三是想拿行人检测做模型改进、对比实验的研究者。数据集本身不绑定某个 YOLO 版本YOLOv5、v8、v11 乃至 RT-DETR 都能直接吃。下面从目录结构、标签格式讲到训练参数和踩坑按能复现的路子走一遍。2. 拆开压缩包目录结构、标签格式与选型判断2.1 先看清目录长什么样拿到YOLO行人数据集.zip别急着解压进项目根目录先单独放一个数据盘路径比如D:\datasets\person。解压后典型结构是 images 和 labels 两个平行目录各自再分 train、val也可能带 test。判断一份 YOLO 数据集是否规范就看 images 和 labels 是否同名同层级、图片和 txt 是否一一对应。# 解压后先看结构别直接扔进训练目录 unzip YOLO行人数据集.zip -d /data/person_dataset cd /data/person_dataset find . -maxdepth 2 -type d | sort # 统计图片数量和标签数量两者应基本一致 find . -name *.jpg -o -name *.png | wc -l find . -name *.txt | wc -l这段命令先摸清目录层级再核对图片与标签数量。数量对不上通常意味着有图没标或有标没图训练时 YOLO 会直接跳过无标签图或者报找不到 label。参数上-maxdepth 2只看到两级目录避免输出太乱统计时把 jpg 和 png 都算上因为不同来源的图格式可能混着。2.2 YOLO 标签格式一行一个框五个字段YOLO 的标签是每张图对应一个同名 txt每行代表一个目标框格式是类别 x_center y_center width height后四个都是相对整图宽高的归一化值范围 0 到 1。行人数据集如果只有 person 一类类别 id 就是 0。很多人第一次看这种 txt 会懵因为它没有像素坐标全是比例。# 校验标签是否合法坐标必须在 0~1且宽高大于 0 import os label_dir /data/person_dataset/labels/train bad [] for name in os.listdir(label_dir): if not name.endswith(.txt): continue with open(os.path.join(label_dir, name)) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: bad.append((name, i, 字段数不对)) continue cls, x, y, w, h parts vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals) or vals[2] 0 or vals[3] 0: bad.append((name, i, 坐标越界或宽高非正)) print(异常标签数:, len(bad)) for b in bad[:10]: print(b)这段脚本遍历标签目录逐行检查字段数和坐标范围。字段数不是 5 说明格式被污染坐标越界或宽高非正说明标注工具导出有问题。这类脏标签不清理训练 loss 会异常震荡甚至出现 nan。常见做法是训练前统一跑一遍校验把异常样本挑出来人工复核。2.3 为什么选行人专用数据集而不是 COCO 子集COCO 里 person 类大概六万多张看着不少但它是通用场景很多是远景小人、运动场景和监控视角的行人分布差别很大。行人专用数据集通常聚焦街道、园区、出入口这类视角正样本密度高小目标和遮挡样本也更贴近实际部署。选它的理由很直接同样训练轮数下专用数据的收敛更快误检更少。代价是场景多样性可能不如 COCO如果你的业务场景特别偏还是得自己补数据。提示先确认数据集里 person 的类别 id 是不是 0。有些数据集混了其他类id 不连续直接训练会导致类别错位。3. 用 YOLOv8 跑通训练配置文件、命令与参数含义3.1 写一份数据集描述 yamlYOLO 训练不直接读目录而是读一个 yaml 描述文件里面写清 train、val 路径和类别名。路径建议用绝对路径避免工作目录变化导致找不到数据。nc 是类别数names 是类别名列表顺序必须和标签里的 id 对应。# person_dataset.yaml path: /data/person_dataset # 数据集根目录 train: images/train # 相对 path 的训练图目录 val: images/val # 相对 path 的验证图目录 nc: 1 # 类别数只有行人 names: 0: person # id 0 对应 personyaml 里 path 是根train 和 val 是相对根的子路径这样换机器只要改 path 一行。nc 和 names 必须和标签一致写错会直接报类别索引越界。如果数据集自带 test 目录可以再加一行 test: images/test训练完单独评估。3.2 启动训练与关键参数用 ultralytics 的 YOLOv8 训练一条命令就能跑但参数决定成败。下面这条是行人检测比较稳的起手配置imgsz 用 640batch 按显存调epochs 先跑 100 看收敛曲线。# 行人检测训练起手命令 yolo detect train \ dataperson_dataset.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/person \ nameexp1model 用预训练权重yolov8n.pt做迁移学习比从零训练收敛快得多这是行人检测的常规做法。imgsz640 是精度和速度的平衡点小目标多可以提到 960但显存和耗时翻倍。batch16 是 8G 显存的安全值显存够可以加到 32。lr0 初始学习率 0.01 是默认值数据量小可以降到 0.005 防过拟合。patience20 表示 20 轮没提升就早停省时间。project 和 name 决定结果保存路径方便多次实验对比。3.3 训练过程看什么指标训练日志里重点盯三个box_loss、cls_loss 和 mAP50。box_loss 管框位置cls_loss 管分类两者都应平稳下降。mAP50 是 IoU 0.5 下的平均精度行人检测一般能到 0.8 以上算可用。如果 loss 下降但 mAP 不涨多半是过拟合或验证集分布和训练集差太多。混淆矩阵能看出漏检和误检方向行人被误判成背景就是漏检背景被误判成行人就是误检。# 训练完在验证集上单独评估输出各类指标 yolo detect val \ modelruns/person/exp1/weights/best.pt \ dataperson_dataset.yaml \ imgsz640 \ conf0.25val 命令加载 best.pt 在验证集上跑一遍conf0.25 是置信度阈值低于它的框不算。这个阈值直接影响 precision 和 recall 的平衡部署时再按业务调。评估结果里的混淆矩阵和 PR 曲线是判断模型能不能上线的直接依据。4. 避坑与排查行人数据集训练最常见的五个翻车点4.1 图片和标签不同名训练直接跳过现象训练日志显示 images 数量远大于 labelsloss 一直不降。原因图片是001.jpg标签却是001_person.txtYOLO 按同名匹配对不上就当成无标签图跳过。解决写脚本批量重命名标签去掉多余后缀保证和图片主名一致。4.2 标签坐标没归一化框全跑到图外现象训练初期 loss 巨大可视化预测框全挤在角落。原因标注工具导出的是像素坐标没除以图宽高。解决用前面 2.2 的校验脚本查坐标是否超过 1超了就按图尺寸重新归一化。4.3 验证集和训练集图片重复指标虚高现象mAP 高得离谱一上真实场景就崩。原因train 和 val 里有重复图模型等于在背答案。解决训练前对两个目录做哈希去重确保没有交集。# 用 md5 快速查 train 和 val 是否有重复图 import hashlib, os def md5(p): with open(p, rb) as f: return hashlib.md5(f.read()).hexdigest() train {md5(os.path.join(/data/person_dataset/images/train, n)) for n in os.listdir(/data/person_dataset/images/train)} val {md5(os.path.join(/data/person_dataset/images/val, n)) for n in os.listdir(/data/person_dataset/images/val)} print(重复图片数:, len(train val))这段用文件内容哈希比对比文件名可靠。重复数不为 0 就得从 val 里剔除否则评估结果没有参考价值。4.4 小目标太多默认 anchor 和 imgsz 不够用现象远处行人漏检严重近处正常。原因640 输入下小目标像素太少特征丢失。解决把 imgsz 提到 960 或 1280或者用带 P2 检测头的模型变体专门增强小目标。4.5 训练中 BN 崩溃loss 变 nan现象训练到一半 loss 突然 nan报 BN 相关错误。原因batch 太小导致批归一化统计不稳或者学习率过高。解决把 batch 调大或改用梯度累积学习率降到 0.001 重跑。这是行人检测训练里比较玄学的一类问题换小模型往往也能绕开。注意改完任何数据问题都要重新从预训练权重开始训练别在坏数据上续训否则错误会被继承。5. 从训练到部署导出格式、阈值调优与一个验证习惯训练出 best.pt 只是中间产物真正落地要导出成部署格式。YOLOv8 支持导出 ONNX、TensorRT、OpenVINO 等边缘设备常用 ONNX 或 TensorRT。导出命令很简单但导出后的推理结果要和 PyTorch 对齐否则精度悄悄掉。# 导出 ONNX动态 batch 方便部署 yolo export modelruns/person/exp1/weights/best.pt formatonnx dynamicTrue opset12format 指定导出格式dynamicTrue 让 batch 维度可变opset12 兼容性较好。导出后务必用同一张图分别跑 PyTorch 和 ONNX比对框坐标差异超过一两个像素就要查预处理是否一致。部署时最影响体验的是置信度阈值和 NMS 的 IoU 阈值。行人密集场景NMS IoU 设太高会框重叠设太低会漏掉挨着的人。我一般先在验证集上扫一遍 conf 从 0.1 到 0.5画 precision-recall 曲线选 F1 最高的点作为起点再按业务微调。安防场景宁可误检不可漏检conf 就调低客流统计怕重复计数conf 调高。部署格式适用设备导出要点ONNX通用 CPU/GPUopset 选 11 或 12注意动态轴TensorRTNVIDIA 边缘需匹配 CUDA 和 TensorRT 版本OpenVINOIntel 平台适合 CPU 推理量化后提速明显最后说个我自己的习惯每次拿到新数据集先抽 20 张图用标注工具打开肉眼过一遍框的质量再跑校验脚本。这一步花不了十分钟但能挡掉后面几小时的无效训练。行人检测的坑大多不在模型而在数据本身标签干净比换模型管用得多。从那以后我每次训练前都强制走一遍「看图、校验、去重」三件套希望帮到你。本文还有配套的精品资源点击获取