简介面向目标检测与计算机视觉开发者的YOLOv5行人检测训练资源包聚焦街道、公路等交通场景下的行人识别任务类别仅针对person便于快速验证和落地。内含基于上万样本训练得到的检测权重平均准确率可达90%以上并附带训练曲线图可直观评估收敛过程与检测效果同时收录约3000张多行人图片标签格式覆盖VOC与YOLO两种兼顾模型训练与数据扩充需求。压缩包共2000个文件主体包括jpg图像、txt标签文件、Python工程脚本、pt权重文件及yaml配置等整体约378.52MB结构清晰适合直接调用、再训练或二次开发。已有6309人学习下载适合需要快速获取行人检测基线模型、对比不同训练策略或补充数据集的深度学习者与工程开发者。1. 这份 YOLOv5 行人检测权重为什么值得直接下做街道和公路场景的行人检测最耗时间的从来不是跑通模型而是攒数据、标数据、调超参数这三件事能把一个完整的周末全吃进去。这份资源把「一万多张真实场景训练出来的 YOLOv5 行人检测权重、90% 以上准确率、3000 张多行人数据、VOC 和 YOLO 双标签」打包在一起拿到手就能直接跑 detect.py 推理也可以当成预训练权重去微调你自己的监控画面。适合刚入门 YOLOv5、急需一份靠谱 baseline 做 demo 的人也适合智慧交通、安防项目里想快速验证算法效果的从业者。省下的标数据时间已经值回下载成本了。2. 先拆资源权重、训练曲线、单类模型的三重边界2.1 压缩包结构哪些文件直接决定你能跑通拿到压缩包先别急着解压跑 detect.py花五分钟看目录结构能省下后面一晚上的排查时间。这份资源保留了 YOLOv5 v6.0 官方仓库的骨架README、CONTRIBUTING、GitHub issue 模板这些文档都在同时把训练入口 train.py 和 utils 下的 datasets.py、general.py 这类辅助脚本也一并带上了。这意味着你不需要再去单独拉一个 YOLOv5 仓库解压后直接在这个目录下执行命令就能跑通大部分流程。按实际使用场景压缩包里的内容可以分成四类内容大类对应形式用途行人检测权重.pt 格式权重文件detect.py 推理、train.py 微调的基础训练曲线图png 或 runs 目录下图表判断训练过程和权重质量三千张多行人数据images labelsVOC 与 YOLO 双格式微调训练、验证、格式转换练习脚本与文档train.py、datasets.py、general.py、README 等复现训练、辅助数据处理其中最关键的是权重文件和数据集。权重文件是这份资源的核心资产README 里写明是「一万多数据训练得到、准确率达 90% 以上」数据集则给了你 3000 张图片和两套标签你不需要再满网络找公开数据集也不用自己写标注工具。datasets.py 和 general.py 这两个脚本看着不起眼实际作用很大datasets.py 负责训练时的数据加载和增强逻辑general.py 收集了检查环境、格式转换、指标计算这些通用函数很多你在推理或训练时报的错最后定位到源码时都会落到这两个文件里。2.2 classes: person 的单类模型为什么适合街道与公路场景资源里明确写了classes: person这是最重要的一个设计信息。很多人拿到权重的第一反应是「怎么只有一类」但在真实项目里把行人和车辆分开建模才是常见做法。街道、公路场景的行人检测本身就是一个独立任务安防、交通、车路协同这些下游应用要的就是行人这一个类别多类别模型反而会带来多余的处理和误报空间。单类模型相比 COCO 80 类模型在实际部署中有三个明显优势。第一是后处理更简单NMS 阶段只需要对 person 这一类做去重没有跨类别框重叠的争议第二是误检率更容易压下去模型无需在几十个类别之间做区分把注意力集中在行人形态上第三是数据效率更高同样一万多张图单类模型学到的是行人的全部特征分布而多类别模型要把数据摊到 80 个类上。从训练曲线和验证结果看90% 以上准确率放在单类任务里是一个相对可靠的水平因为类别少AP 指标的波动也小。有人会担心单类模型在复杂场景下泛化不够这种担心有一定道理但要看场景边界。这套权重针对的是街道、公路场景行人在这类画面里的形态相对固定直立行走或骑行遮挡相对可控。如果你要做的场景是商场密集人群、体育场观众席这种高遮挡高密度的极端画面单类模型的上限确实会受限这时候应该用这份权重做预训练再补充目标场景数据微调而不是直接裸用。2.3 训练曲线图怎么读判断这份权重「能不能打」压缩包里附带的训练曲线图是用来评估权重质量的直接证据不要只盯着 README 里的准确率数字。YOLOv5 训练结束后会在 runs/train/exp 目录下生成 results.png里面一般包含 box_loss、obj_loss、cls_loss、precision、recall、mAP0.5、mAP0.5:0.95 这几条曲线。判断这批曲线是否健康我一般看三处检查点健康的表现异常的表现loss 曲线box_loss 和 obj_loss 单调下降后趋平val 曲线不反弹val loss 尾部明显上扬说明过拟合P/R 曲线precision 和 recall 同步稳定在高位两者差距过大说明阈值敏感mAP 曲线mAP0.5 平滑爬到高位并稳定曲线剧烈震荡说明训练不稳定对照这套标准去看压缩包里的曲线如果 mAP0.5 在高位趋平、val 的 box_loss 没有明显回升那这份权重的「准确率 90% 以上」就有据可依。这里要提醒一句YOLOv5 在验证时直接调用 val.py输出的 mAP 和你自己在测试集上跑出来的数字会有出入因为置信度阈值、IoU 阈值、图片分辨率的设置不同。我拿到任何权重都会先自己跑一遍 val.py把指标复现出来再决定要不要用它做 baseline。3. 一小时跑通推理环境配置与 detect.py 参数详解3.1 环境准备torch 版本、依赖与 CUDA 组合这套资源沿用的是 YOLOv5 v6.0 的训练和推理代码环境要求并不苛刻。先说 Python 版本3.8 到 3.10 之间都行太高的 3.12 某些依赖编译会有兼容问题不建议折腾。解压后先看有没有 requirements.txt有的话直接装上基础依赖没有的话手动补全核心的 torch、torchvision、opencv-python、numpy、matplotlib。关于 torch 与 torchvision 的组合我一般会这么装# CPU 版本先跑通流程不追求速度 pip install torch1.10.0 torchvision0.11.0 --index-url https://download.pytorch.org/whl/cpu # GPU 版本有 NVIDIA 显卡时使用cu113 对应 CUDA 11.3 pip install torch1.10.0cu113 torchvision0.11.0cu113 -f https://download.pytorch.org/whl/torch_stable.html逻辑说明YOLOv5 v6.0 时期官方推荐的组合就是 torch 1.10 这一档后面更高的 torch 版本也能跑但部分脚本涉及 checkpoint 的键名解析跨大版本加载权重偶尔会报兼容警告没必要徒增风险。参数说明里要注意--index-url指定的是 CPU 版的下载源-f指定的是带 CUDA 后缀的稳定版本列表如果你机器上已经装了更高版本的 torch也可以先直接跑报错再回退版本。装完依赖后跑一句python -c import torch; print(torch.__version__)确认安装成功。这一步是整条链路里最容易翻车的环节很多人在推理时报AttributeError或ImportError最后定位下来都是 torch 和 torchvision 版本不匹配两个包的版本号必须严格对应。3.2 detect.py 首次推理从图片到视频的输出链路环境就绪后直接用自带的 detect.py 跑一次推理这是验证权重能不能用的最快路径。完整命令如下python detect.py \ --weights person_detect.pt \ --source test.jpg \ --img 640 \ --conf-thres 0.4 \ --iou-thres 0.45 \ --save-txt \ --save-conf \ --project runs/detect \ --name person_test逻辑说明--weights指定权重文件路径--source可以换成单张图片、视频文件、目录或者摄像头编号--img 640表示推理时缩放到的输入尺寸这个值要和权重训练时的分辨率一致否则精度会受影响。--conf-thres是置信度过滤阈值低于这个分数的框会被丢掉--iou-thres是 NMS 用的 IoU 阈值用于消除重叠框。--save-txt会把检测结果保存成 YOLO 格式的 txt 标签文件--save-conf会在标签文件里额外追加一个置信度列方便后续做批量数据分析。执行完后结果会输出到runs/detect/person_test/exp目录里。每张输入图片会生成一张标注后的图像如果是视频则生成标注后的视频文件同时--save-txt开启后会生成对应的labels子目录里面是每张图的目标坐标。第一次跑建议先用单张图片验证确认环境没问题了再切视频视频推理的速度取决于 GPU 性能和输入分辨率。这里有一个容易忽略的点--source如果传的是目录detect.py 会扫描目录下所有图片按顺序推理这个特性在批量验证时很好用。我一般会把验证集图片单独放一个文件夹一次性跑完再统计结果比一张张跑省事得多。3.3 置信度与 NMS 阈值后处理阶段怎么调才不翻车--conf-thres和--iou-thres这两个参数本质上控制的是 YOLOv5 后处理阶段的行为很多人在推理时只改 confidence 不改 NMS或者反过来效果都不理想。confidence 阈值的作用是过滤低质量预测框而 iou 阈值的作用是在重叠框中保留最优、去除冗余两者是串行工作的。一份权重在后处理阶段怎么调直接决定了你实际体验到的精度是高于还是低于 README 里的数字。不同项目场景对这两个参数的取向完全不同我通常按下面这组经验值起步应用场景conf-thresiou-thres取舍倾向街道监控、安防告警0.250.5漏检代价高宁可多报几个框再做业务过滤抓拍筛选、质量检查0.50.45误报代价高优先保准确率车路协同、边缘盒子0.350.5平衡漏检与误报配合后续跟踪算法使用调整方法并不是拍脑袋而是拿一段真实场景视频跑多组参数对比不同组合下的检测结果。如果你发现行人漏报多说明 conf 阈值定太高往 0.25 方向调如果你发现柱子、树木、车窗反光都被框出来了说明 conf 太低往 0.5 方向提。iou 阈值一般保持在 0.45 到 0.5 之间调得过高或者过低都会出现同一目标被重复框选或框位置不稳的问题。后处理参数和训练参数是两个层面的事不要混为一谈。权重优秀只能说明模型学得好后处理没调对模型的潜力发挥不出来这也是很多人说「同一个权重别人跑出 90% 我跑出 70%」的原因所在。4. 3000 张数据与双标签从 VOC 转 YOLO 到训练复现4.1 数据目录组织train/val 划分与多行人目标特性3000 张多行人数据和双标签格式是这份资源里仅次于权重的部分。多行人数据意味着单张图片里往往有多个目标这对训练的实际影响是一个 batch 里的锚框数量多模型在正负样本上更容易过拟合对数据增强的依赖更强。标签格式方面VOC 是 XML 结构YOLO 是 txt 文本结构两者描述的是同一批目标但坐标格式完全不同VOC 存的是左上角和右下角坐标YOLO 存的是中心点、宽高且全部归一化。拿到数据后第一件事不是训练而是把目录整理成 YOLOv5 期望的结构。VOC 格式数据通常长这样dataset_person/ ├── VOC/ │ ├── JPEGImages/ # 原始图片 │ ├── Annotations/ # VOC 格式 xml 标签 │ └── ImageSets/Main/ # 训练/验证划分文件 └── YOLO/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 └── labels/ ├── train/ # YOLO 格式训练标签 └── val/ # YOLO 格式验证标签我一般会先跑一遍划分脚本把 3000 张数据按 8:1:1 分成训练、验证、测试三部分而不是用 VOC 原生的 ImageSets 划分。原因很简单yolov5 训练时只认 train 和 val 两个路径测试集需要你自己留出来做最终评估。划分时有一个经验值多行人场景的单张图片目标数量集中在 3 到 10 个之间训练时 batch-size 可以设小一点因为单图的目标数量多等效的梯度更新质量已经足够。4.2 VOC 转 YOLO 标签归一化脚本与 class 映射资源里同时提供了 VOC 和 YOLO 两种标签但很多时候你自己补充的数据只有 VOC 格式学一遍转换脚本是有必要的因为标签格式转换是训练自定义数据集时最高频的实操。转换的核心逻辑是解析 XML 里的 bndbox 坐标除以图片宽高得到归一化坐标再换算成中心点和宽高的形式。import os import glob import xml.etree.ElementTree as ET VOC_IMG VOC/JPEGImages VOC_XML VOC/Annotations OUT_IMG YOLO/images/val OUT_LABEL YOLO/labels/val CLASSES [person] # class id 从 0 开始 ids sorted([os.path.splitext(os.path.basename(p))[0] for p in glob.glob(f{VOC_XML}/*.xml)]) for img_id in ids: tree ET.parse(f{VOC_XML}/{img_id}.xml) root tree.getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in CLASSES: continue # 跳过 difficult 目标这类样本训练时价值低且标注不可靠 diff obj.find(difficult) if diff is not None and diff.text 1: continue bnd obj.find(bndbox) x1 int(float(bnd.find(xmin).text)) y1 int(float(bnd.find(ymin).text)) x2 int(float(bnd.find(xmax).text)) y2 int(float(bnd.find(ymax).text)) # YOLO 格式中心点 宽高全部除以图片宽高归一化到 [0,1] x_center (x1 x2) / 2 / w y_center (y1 y2) / 2 / h bw (x2 - x1) / w bh (y2 - y1) / h lines.append(f0 {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}) with open(f{OUT_LABEL}/{img_id}.txt, w, encodingutf-8) as f: f.write(\n.join(lines))逻辑说明脚本按 xml 文件遍历每一张图读取 size 节点得到图像宽高然后遍历所有 object 节点提取目标框坐标。关键步骤是最后一行的归一化换算(x1 x2) / 2 / w先求中心点像素坐标再除以宽度得到的是 0 到 1 之间的浮点数YOLO 训练时会把输入图缩放所以标签必须是归一化的否则框的位置会错位。参数说明里要注意CLASSES的顺序这个列表的索引就是训练时的 class id列表第一项对应类别编号 0第二项对应编号 1以此类推。如果你在 XML 中用的类别名是Pedestrian而不是person把列表改成[Pedestrian]即可但训练 yaml 里的 names 必须同时改。转换完成后一定要抽几张图做可视化检查别偷懒看 txt 文件。用一个 10 行的 OpenCV 脚本把框画回原图如果发现框整体偏移、被拉长、或者落在目标旁边基本都是归一化时除错了图像尺寸或者把 x 和 y 坐标搞混了。这个检查步骤会重复出现在每一个自己处理数据集的晚上值得固化下来。4.3 train.py 训练命令、超参数与微调策略有了干净的 YOLO 格式数据后就可以复现训练或者微调了。YOLOv5 的训练入口是 train.py但训练前必须先准备一个数据配置文件告诉训练脚本数据集路径和类别信息。这里给出一份 person.yaml 的配置train: ./YOLO/images/train val: ./YOLO/images/val nc: 1 names: [person]逻辑说明train 和 val 路径指向上一节整理出的图片目录YOLOv5 会自动在同级目录下找对应的 labels 目录所以 labels 必须放在图片兄弟目录下目录名严格叫labels文件名必须和图片同名。nc: 1声明了类别数量是 1 类names是类别名列表里面索引 0 对应标签文件里每行开头的数字 0。这几个字段缺一不可路径写错会在训练前就直接报错。数据配置准备好后训练命令如下python train.py \ --data person.yaml \ --weights person_detect.pt \ --epochs 100 \ --batch-size 16 \ --img 640 \ --patience 25 \ --hyp data/hyps/hyp.scratch-low.yaml \ --device 0逻辑说明--weights传这份资源自带的权重属于用预训练权重做微调而不是从 COCO 随机初始化开始训练收敛速度会快很多这也是把这份权重当作「预训练模型」时的标准用法。--epochs 100是训练轮数--batch-size 16取决于显存大小8G 显存建议降到 8--img 640和推理时保持一致。--patience 25是早停耐心值连续 25 轮 val loss 不下降就停止训练防止浪费算力。--hyp指定超参数文件这是 YOLOv5 调参的核心入口。超参数文件里最有价值的几个配置是lr0初始学习率、mosaic马赛克增强概率、copy_paste复制粘贴增强概率。微调时我会手动把lr0从默认的 0.01 改成 0.001因为预训练权重已经接近最优解学习率太大容易把已经学好的特征破坏掉这属于微调场景下最常见的坑。数据增强方面多行人场景建议保留 mosaic 和 mixup这两项能显著提升模型对小目标遮挡目标的鲁棒性。如果只是复现这份资源的指标不需要做任何修改直接跑完 100 轮就行如果你是拿它做自己场景的迁移学习记住一个原则先冻结 backbone 跑 20 轮再解冻全部层微调学习率逐步减小。具体操作用--freeze 10参数冻结前 10 层之后再看曲线决定是否解冻。160 层的网络结构也可以在models/yolov5s.yaml里看depth_multiple和width_multiple这两个缩放因子来验证自己的理解这就是常说看 YOLOv5 网络结构图的门道所在。5. 核查与避坑数据、标签、权重最容易翻车的五个点5.1 高频踩坑记录现象、原因、解决坑一推理结果全是 person但标签编号对不上现象用训练好的权重跑验证集时模型输出的类别没问题但用--save-txt保存的标签文件里 class id 偶尔出现 1、2 等非 0 值导致后续分析或训练时数据混乱。原因这份资源是单类模型class id 只有 0 对应 person。如果 label 文件里出现了其他数字通常是混入了 COCO 或其他多类别数据集的标签文件那些数据集的 class id 不是从 person 开始编号的直接套用就错位了。解决批量扫描所有 txt 标签把不是 0 的行做映射或剔除。可以用awk快速检查awk $1 ! 0 {print $1} labels/*.txt | sort | uniq -c查出来后再决定是重新标注还是删除脏样本。坑二检测框整体偏移或者宽高明显被压缩现象跑推理时检测框能框住行人但框不在目标正中心偏左或者偏上或者框的宽高比例明显不对行人被框成一条竖线。原因VOC 转 YOLO 时归一化出错。常见的有三种只除宽没除高、x_center用(x1 x2)忘记除以 2、以及用图片的缩放尺寸而不是原图尺寸做归一化。解决回头跑一遍 4.2 节的转换脚本并把输出可视化。我自己的排查流程是生成一张画框图肉眼对一遍前 50 张图确认没问题再批量继续。这种错误在训练时不会报错因为 YOLOv5 读取标签时会做边界裁剪和过滤你看到的只是训练出来的模型精度低而不会看到具体的报错信息。坑三CPU 推理慢到没法用600 张图跑了一个小时现象没有 GPU 的机器上跑 detect.py一张 640 分辨率的图片推理耗时超过 1 秒视频基本是一帧一帧卡着出图。原因YOLOv5 默认输入是 640 分辨率卷积计算量在 CPU 上非常大。这不是权重的问题是推理硬件的边界。解决CPU 上想提速把--img降到 416 或 320速度能提升一倍以上但精度会小幅下降或者用--device cpu时同时开启--half但 CPU 不支持 FP16 加速意义不大。真正要落地还是要走最后一步的模型导出路线。坑四远距离小目标行人大量漏检现象画面里 50 米外的行人只有十几个像素高模型不报框但近处行人检测正常。原因640 分辨率下小目标的特征在深层特征图里已经被压缩得只剩几个像素模型没有足够信息判断这是不是人。这是所有目标检测模型的共性短板不完全是这份权重的问题。解决训练和推理时把--img提到 960小目标检测能力会明显改善代价是显存占用和推理时间增加。如果场景固定是远距离监控可以把图片做切片推理把原图切成四块分别检测再合并结果这也是工程上常见的 tiling 方案。坑五自己补充数据训练后mAP 反而比原来更低现象往数据集里加了 500 张自己场景的图片重新微调训练结束后验证 mAP 没有上升反而掉了两三个点。原因最常见的有两个微调学习率设太大破坏了预训练权重已经学好的特征或者划分数据时把同一批来源的图片同时分进训练集和验证集验证指标失真。解决微调用 0.001 的学习率训练轮数控制在 50 轮以内先看 val 曲线是否还在下降不要盲目跑满 100 轮。数据划分时按场景分组比如同一摄像头拍的图全部进训练集或验证集避免数据泄漏。5.2 权重文件加载失败与版本不匹配排查还有一个权重文件本身的问题很多人第一次拿 .pt 文件 torch.load 就报错这里给一个排查脚本import torch # 无论权重是在 GPU 上训练的加载时强制映射到 CPU避免跨设备加载报错 ckpt torch.load(person_detect.pt, map_locationcpu) print(key 列表:, list(ckpt.keys())) if model in ckpt: # YOLOv5 checkpoint 里 model 是特征提取网络结构 print(模型信息:, ckpt[model].yaml) if ema in ckpt and ckpt[ema] is not None: print(包含 EMA 权重)逻辑说明这段脚本把 checkpoint 里的键名打印出来正常情况下 YOLOv5 权重里会有model、ema、optimizer、epoch等字段。model字段里存的是模型结构和参数验证权重是否和代码版本匹配时可以用ckpt[model].yaml查看模型的配置文件信息。ema是滑动平均权重YOLOv5 推理时如果存在ema会优先使用它因为 EMA 权重的泛化性通常更好。参数说明里map_locationcpu是排查时的关键只有在没有 GPU 的机器上加载 GPU 训练权重时才需要显式指定有 GPU 时不需要。如果这个脚本都跑不过说明权重文件本身可能损坏重新下载一份即可。另一种情况是权重文件正常但 detect.py 报num_classes相关的错误这通常是你用了其他版本的 YOLOv5 代码加载 v6.0 权重不同大版本的 checkpoint 结构不兼容解决办法是把代码切到对应的 v6.0 版本。这种版本错位问题不会在报错里直接提示而是以各种奇怪的键名错误呈现遇到时先确认代码版本。6. 部署前的最后一个动作全量验证与导出6.1 批量验证与部署前的导出检查单张图片跑通不等于能交付我会在部署前强制做一次全量验证。用这份资源自带的 3000 张数据里的验证集跑一遍批量推理统计整体的目标检出数量、置信度分布和漏检情况比看单张效果图靠谱得多。批量验证脚本如下import glob import torch # 加载自定义权重force_reload 强制重新读取避免使用旧缓存 model torch.hub.load(ultralytics/yolov5, custom, pathperson_detect.pt, force_reloadTrue) model.conf 0.4 model.iou 0.45 imgs sorted(glob.glob(YOLO/images/val/*.jpg)) results model(imgs, size640) df results.pandas().xyxy # 每张图一个 DataFrame total_person sum(len(d) for d in df) print(验证集图片数:, len(imgs)) print(总检出人数:, total_person) print(平均每张图检出:, round(total_person / len(imgs), 2))逻辑说明torch.hub.load 会把 YOLOv5 当作一个 Hub 模型加载custom指定的是本地训练权重文件。model.conf和model.iou相当于前面命令行的--conf-thres和--iou-thres在脚本里直接赋值。results.pandas().xyxy把检测结果转成 DataFrame 结构每个元素对应该图所有目标的坐标和置信度。这段脚本会输出三个核心数字验证集图片数、总检出人数、平均每张图检出目标数这三个数字和 README 里的描述对比能快速判断这份权重在你的环境里是否达标。如果目标是把模型部署到树莓派 4B 或者 RK3568 这类边缘设备我建议在验证后顺手完成一步把权重导出为 ONNX 格式再在目标设备上做 INT8 量化。量化后置信度阈值要重新标定不能直接沿用 FP32 时调好的数值量化模型在低置信度区间的表现会和原模型有偏离。这样的流程走一遍之后我心里才有底而不是拿着压缩包看一眼 README 里的准确率就当项目完成了。从那以后我每次拿到一份新权重都会先跑一遍这种全量验证再谈部署希望帮到你。本文还有配套的精品资源点击获取