news 2026/10/24 10:52:15

YOLOv5行人检测实战:街道场景90%+ mAP开箱即用方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5行人检测实战:街道场景90%+ mAP开箱即用方案

简介:本资源是一套开箱即用的YOLOv5行人检测实战方案,面向计算机视觉初学者、智能安防项目开发者及目标检测算法实践者,聚焦街道与公路等真实场景下的单类别(person)高效检测需求。压缩包共2000个文件,主体为3293张行人图像(jpg)、3184份对应标签(txt/YOLO格式+xml/VOC格式)、42个配置文件(yaml/yml)、31个核心训练与工具脚本(py),以及3个已训练完成的.pt权重文件和完整训练曲线图,整体容量378.52MB,结构清晰、即下即跑。目前已有6310人学习下载,覆盖数据准备、模型训练、结果可视化全流程。用户可直接加载权重进行推理,复现90%以上准确率的检测效果;同时获得3000张多行人实拍数据集(含双格式标注)、训练日志与评估报告,并通过README.md、datasets.py、train.py等关键文件快速掌握数据加载逻辑、训练配置要点与工程化适配方法。

1. YOLOv5行人检测训练权重 +3000行人数据集:街道场景下90%+ mAP的开箱即用方案

你有没有遇到过这样的情况:刚跑通YOLOv5官方COCO权重,一换到自己拍的街景视频,检测框就飘得满屏飞——漏检穿黑衣的人、把广告牌当人框、密集人群里只框出两三个?这不是模型不行,是训练数据和任务不匹配。这个资源包直击痛点:它不是通用COCO权重的微调版,而是专为街道/公路场景打磨的YOLOv5-6.0行人检测完整训练成果。包含已收敛的.pt权重(含loss曲线、PR曲线、F1-score图)、3000张实采多行人图像(非合成、非单人剪裁),且同时提供VOC(XML)与YOLO(txt)双格式标签——这意味着你不用再花半天写转换脚本,也不用纠结labelImg标注后怎么喂进训练流程。适合两类人:一是想快速部署行人计数或安防预警的嵌入式开发者,二是刚学目标检测、需要“有图有真相”验证学习效果的学生。它不解决所有问题(比如夜间低照度或极端遮挡),但在常规白天城市道路场景下,mAP@0.5确实稳定在90%以上,这是我在某高校实验室复现时用val200子集实测的结果。


2. 权重与数据集结构解析:看清文件本质,避免盲目解压就跑

这个压缩包表面看是“拿来即用”,但内部结构藏着关键线索。我拆开yolov5-6.0-person_detect.zip后,发现它并非简单堆砌文件,而是按YOLOv5-6.0标准工程规范组织的轻量级项目骨架。理解每一层的作用,能帮你快速定位修改点,而不是靠试错硬撞。

2.1 训练权重文件:不只是.pt,还有你的调试依据

包内核心权重文件名为yolov5s_person_best.pt(注意不是last.pt),这是训练过程中mAP最高的快照。但真正有价值的是同目录下的results.csv和results.png:

  • results.csv是每轮训练的完整日志,含train/box/obj/cls loss、val/box/obj/cls loss、precision、recall、mAP@0.5、mAP@0.5:0.95、F1-score等12列数据;
  • results.png是自动生成的六宫格图,左上角是总loss下降曲线,右上角是PR曲线,中间两行分别是各类指标随epoch变化的折线图。

提示:不要只盯着最终mAP值。打开results.csv,用Excel筛选mAP@0.5列的最大值,记下对应epoch(比如第287轮),再回看该轮的val/box_loss是否已平稳(<0.05)。如果loss还在跳变,说明权重可能过拟合——这时你应该用yolov5s_person_last.pt而非best.pt做推理测试。

2.2 数据集组织:VOC与YOLO双格式如何共存而不冲突

3000张图像放在datasets/person/images/下,按train/val/test划分(比例7:2:1)。关键在标签管理:

  • datasets/person/labels/yolo/存放YOLO格式txt(class_id center_x center_y width height,归一化);
  • datasets/person/labels/voc/存放Pascal VOC格式XML(含<object><name>person</name>及坐标);
  • datasets/person/labels/根目录下还有classes.txt,仅一行内容:person。

这种设计不是冗余,而是为不同需求留接口:YOLO训练直接读labels/yolo/,VOC转YOLO脚本(如datasets.py里的convert_voc_to_yolo())则从labels/voc/读取并写入labels/yolo/。如果你要用其他框架(如TensorFlow Object Detection API),VOC XML可直接复用;若需增补数据,只需往voc/里丢XML,再运行一次转换脚本即可同步更新YOLO标签。

2.3 代码文件功能映射:哪些该改,哪些绝不能动

包内Python脚本不是全都要运行,它们分工明确:

  • train.py:主训练入口,已预设--data datasets/person/person.yaml --weights yolov5s_person_best.pt --cfg models/yolov5s.yaml;
  • datasets.py:核心工具集,含create_dataloader()(构建DataLoader)、load_image()(带Mosaic增强的图像加载)、convert_voc_to_yolo()(VOC→YOLO转换);
  • general.py:通用函数库,如non_max_suppression()(NMS后处理)、scale_coords()(坐标反归一化)、plot_one_box()(画检测框);
  • README.md等文档:重点看CONTRIBUTING.md里写的“数据增强策略”——它明确列出本次训练启用了Mosaic(4图拼接)、HSV色域扰动(H±0.015, S±0.7, V±0.4)、随机仿射变换(scale 0.5-1.5, degree ±10°),这些参数直接影响你后续微调时的设置。

注意:train.py里--weights默认指向yolov5s_person_best.pt,但这是推理权重,不是预训练起点。若你要在新数据上继续训练,必须改成--weights yolov5s.pt(官方yolov5s-6.0预训练权重),否则会因类别数不匹配(COCO是80类,这里是1类)报错RuntimeError: size mismatch。


3. 快速验证与推理:三步跑通检测,确认权重可用性

拿到权重和数据,别急着改代码。先用最简路径验证:权重能否正确加载?图像能否正常推理?结果是否符合预期?这三步卡住,后面所有优化都是空谈。

3.1 环境准备:严格对齐YOLOv5-6.0依赖

此包基于PyTorch 1.10.2 + CUDA 11.3构建,不兼容YOLOv5最新版(如v8.x)或旧版(如v5.0)。执行前请确认:

# 检查CUDA与PyTorch版本匹配性 nvidia-smi # 应显示CUDA Version: 11.3 python -c "import torch; print(torch.__version__, torch.cuda.is_available())" # 输出 1.10.2 True

若版本不符,建议新建conda环境:

conda create -n yolov5p python=3.8 conda activate yolov5p pip install torch==1.10.2+cu113 torchvision==0.11.3+cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install -r requirements.txt # 使用包内requirements.txt,勿用yolov5官方repo的

提示:requirements.txt中opencv-python==4.5.5.64是关键。新版OpenCV(4.8+)的cv2.dnn.readNetFromONNX()在加载YOLOv5 ONNX模型时会报Unrecognized type name 'float16',降级至此版本可规避。

3.2 单图推理:用detect.py验证基础功能

进入yolov5根目录(确保models/、utils/等文件夹存在),执行:

python detect.py \ --weights ../yolov5s_person_best.pt \ --source ../datasets/person/images/val/000123.jpg \ --conf 0.4 \ --iou 0.5 \ --save-txt \ --save-conf

成功时会在runs/detect/exp/生成:

  • 000123.jpg:原图叠加检测框(绿色,带置信度);
  • 000123.txt:YOLO格式预测结果(0 0.452 0.631 0.210 0.385 0.872→ class_id x_center y_center width height conf);
  • labels/000123.txt:同上,但仅保存置信度>0.4的框。

检查000123.txt行数是否与图中框数一致。若出现0 0.0 0.0 0.0 0.0 0.0(全零坐标),说明权重加载失败,大概率是PyTorch版本不匹配。

3.3 批量验证:用val子集计算真实mAP

为验证90%+ mAP是否可信,需在val集上跑完整评估:

python val.py \ --data datasets/person/person.yaml \ --weights yolov5s_person_best.pt \ --batch-size 16 \ --task test \ --save-json \ --verbose

关键输出在终端末尾:

Class Images Labels P R mAP@.5 mAP@.5:.95: 100%|██████████| 20/20 [00:42<00:00, 2.12s/it] all 200 1842 0.921 0.918 0.902 0.687

这里mAP@.5为0.902(90.2%),mAP@.5:.95为0.687——后者偏低是合理的,因为行人检测对IoU阈值敏感(0.5时框重叠50%即算对,0.95需几乎完全重合)。若mAP@.5低于0.85,检查person.yaml中nc: 1是否被误改为nc: 80(常见手误)。


4. 常见问题排查:五个血泪经验总结,避开90%新手翻车点

这个包看似开箱即用,但我在帮A同学部署时,连续踩了五次坑。以下是现象、原因、解决方案的硬核记录,按发生频率排序:

4.1 现象:RuntimeError: Expected all tensors to be on the same device

原因:GPU显存不足导致部分tensor被分配到CPU,而模型在GPU上。此包权重为FP32,但某些显卡(如GTX 1050 Ti 4GB)在--batch-size 16时会OOM。
解决:降低batch-size并强制指定设备:

python detect.py --weights ... --source ... --batch-size 4 --device 0 # 显卡ID为0

若仍报错,在detect.py开头添加:

import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 限定使用第0块卡

4.2 现象:检测框全部偏移(如框在人头顶上方20像素)

原因:图像预处理尺寸与训练时不一致。训练时imgsz=640,但detect.py默认imgsz=640,若你手动改过--img 416,会导致坐标反归一化错位。
解决:统一预处理尺寸。在detect.py中找到parser.add_argument('--img', type=int, default=640),确保其值与训练yaml中train: imgsz: 640一致。或者直接命令行指定:

python detect.py --weights ... --source ... --img 640

4.3 现象:KeyError: 'names'报错于val.py

原因:person.yaml文件中缺少names字段。正确格式应为:

train: ../datasets/person/images/train val: ../datasets/person/images/val nc: 1 names: ['person'] # 必须有这一行!

解决:用文本编辑器打开datasets/person/person.yaml,在nc: 1下方添加names: ['person']。注意缩进为2个空格,不可用Tab。

4.4 现象:FileNotFoundError: No labels found in ...

原因:val.py默认读取labels/下的txt,但此包将标签分开放在labels/yolo/。路径未对齐。
解决:修改person.yaml中的val路径,指向标签目录:

val: ../datasets/person/images/val # 添加以下两行 val_labels: ../datasets/person/labels/yolo/ # 新增字段,指向YOLO标签

并在val.py中,找到dataset = LoadImages(...)前,插入:

if opt.data.endswith('person.yaml'): data_dict['val_labels'] = data_dict.get('val_labels', data_dict['val'].replace('images', 'labels/yolo'))

4.5 现象:检测速度极慢(单帧>2s),GPU利用率<10%

原因:OpenCV后端未启用CUDA加速。默认cv2.dnn使用CPU推理。
解决:编译支持CUDA的OpenCV,或改用PyTorch原生推理。推荐后者——注释掉detect.py中cv2.dnn相关代码,确保走model(img)路径。关键检查点:

  • detect.py第120行附近:pred = model(img, augment=opt.augment)[0]应被调用;
  • 若看到net = cv2.dnn.readNetFromONNX(...),说明走错了路径,删除或注释该段。

5. 微调与部署实战:从街道检测到边缘设备落地的四步进阶

验证完权重可用,下一步是让它真正干活。我以某跨平台系统项目为例,把这套行人检测从实验室搬到嵌入式设备,总结出四步不可跳过的实操链路。每一步都带着具体参数和避坑点,不是泛泛而谈。

5.1 步骤一:数据增补——用3000张基底,安全扩充至5000+

原始3000张数据虽覆盖街道/公路,但缺乏雨天、黄昏、背光场景。直接爬图增补风险高(版权、分辨率不一、标签不准)。我的做法是:

  • 用datasets.py的copy_paste_augmentation()函数:从现有图像中抠出person实例(mask提取),粘贴到新背景(如下载的免费街景图)上,自动生成新图+新标签;
  • 参数控制:paste_ratio=0.3(粘贴30%的实例)、min_scale=0.5(最小缩放0.5倍)、max_scale=1.2(最大缩放1.2倍),避免失真;
  • 关键检查:粘贴后运行validate_labels.py(包内未提供,需自写),校验每个txt文件的坐标是否在[0,1]范围内,且width*height>0.001(过滤过小框)。

血泪经验:曾因paste_ratio=0.8导致新图中人挤成团,mAP反降5%。现在我固定用0.3,并人工抽检10张生成图——从那以后,每次增补都先跑validate_labels.py再训练。

5.2 步骤二:模型轻量化——从yolov5s到yolov5n,精度损失<1%

yolov5s_person_best.pt在Jetson Nano上推理仅8FPS,需压缩。不推荐剪枝(破坏已收敛结构),而是换更小骨干:

  • 下载官方yolov5n.yaml,修改nc: 1和anchors(保持与训练时一致);
  • 用yolov5s_person_best.pt作为预训练权重,但只加载backbone和neck权重,head层随机初始化:
# 在train.py中,加载权重后添加: model_state_dict = torch.load('yolov5s_person_best.pt')['model'].state_dict() for k in list(model_state_dict.keys()): if 'detect' in k: # 跳过head层 model_state_dict.pop(k) model.load_state_dict(model_state_dict, strict=False) # strict=False允许缺失key
  • 训练参数:--epochs 50 --lr 0.01 --batch-size 32(小模型收敛快)。实测yolov5n在val集上mAP@0.5为89.3%,仅降0.9%,但FPS升至22。

5.3 步骤三:ONNX导出与TensorRT优化——让检测在边缘端提速3倍

PyTorch模型直接部署到Jetson效率低,必须转ONNX再用TensorRT:

# 导出ONNX(注意--dynamic指定动态batch) python export.py --weights yolov5n_person_best.pt --include onnx --dynamic --img 640 # 生成yolov5n_person_best.onnx

然后用TensorRT 8.4转换:

trtexec --onnx=yolov5n_person_best.onnx \ --saveEngine=yolov5n_person.trt \ --fp16 \ --workspace=2048 \ --minShapes=input:1x3x640x640 \ --optShapes=input:4x3x640x640 \ --maxShapes=input:8x3x640x640

关键参数说明:--fp16启用半精度(Jetson必备),--workspace=2048设显存工作区为2048MB(Nano需调至1024),--min/opt/maxShapes定义动态batch范围,避免固定batch导致内存浪费。

5.4 步骤四:部署验证——用真实视频流测试漏检率

最后一步,也是最容易被忽略的:不拿单张图测试,而用10分钟真实道路监控视频(MP4,1920x1080,30fps)跑端到端。我写了一个video_inference.py:

  • 用cv2.VideoCapture读帧,每帧送入TensorRT引擎;
  • 对输出做NMS(cv2.dnn.NMSBoxes),置信度过滤conf=0.35(比训练时0.4更低,适应视频抖动);
  • 统计每分钟漏检数(Ground Truth用人工标注的JSON,对比IoU>0.5即为检出)。

结果:在3000帧测试集中,漏检率为3.2%(97人漏检),主要集中在两类场景:

  • 雨天反光路面(行人倒影被误判为第二人);
  • 远距离(>50米)穿浅色衣服者(模型对low-contrast目标敏感度不足)。

这直接指导了下一步:收集1000张雨天/远距图像,用copy-paste增补,再微调5个epoch。从那以后我每次部署新场景,都强制走一遍10分钟视频流压力测试——希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 18:43:35

RetinaNet核心:Focal Loss与FPN破解检测样本不平衡

1. 目标检测的两条路&#xff1a;一阶段与两阶段之争如果你是这两年才入行做目标检测&#xff0c;那可能不太理解当年 RetinaNet 出现时&#xff0c;圈子里那种“终于等到你”的气氛。在讲 RetinaNet 之前&#xff0c;得先聊聊目标检测的两个流派。两阶段检测器&#xff0c;代表…

作者头像 李华
网站建设 2026/10/23 10:46:50

数字孪生智慧城市怎么建?实时渲染平台选型要点

数字孪生智慧城市&#xff0c;正在改变城市规划、运维与应急管理的落地方式。不少城市建设方在项目选型阶段&#xff0c;常常遇到三维场景加载缓慢、画面同步延迟、模型轻量化难度大等现实难题。如何搭建一套可落地的数字孪生底座&#xff0c;兼顾场景还原度与实时交互性能&…

作者头像 李华
网站建设 2026/10/23 22:24:34

Codex 免解压一键包,本地桌面 AI,定时任务与文档处理实战

&#x1f4a1;前言 许多朋友在 Windows 系统上体验桌面 AI 智能体时&#xff0c;常常会遇到任务执行过程不透明、修改记录难以追溯、缺乏定时调度功能以及插件扩展能力有限等问题。如果您已经尝试过同类工具&#xff0c;正在寻找一套稳定性更强、操作全程可审查、功能覆盖面更…

作者头像 李华
网站建设 2026/10/23 4:38:08

SuiteCRM 7.11.18 中文语言包安装与避坑指南:汉化、缓存与升级保护

简介&#xff1a;该语言包专为 SuiteCRM 7.11.18 版本定制&#xff0c;适合已部署该开源 CRM 却受英文界面困扰的企业管理员、二次开发者和集成运维人员使用。通过替换核心语言文件&#xff0c;可将菜单、模块字段、系统提示和常用工作流界面切换为简体中文&#xff0c;有效降低…

作者头像 李华
网站建设 2026/10/19 8:44:57

Java核心关键字解析:从HelloWorld入门到实践

1. 从HelloWorld开始的Java关键字之旅每个Java程序员都写过那个经典的HelloWorld程序&#xff0c;但很少有人真正理解其中每个关键字背后的含义。今天我们就从这个最简单的程序入手&#xff0c;彻底拆解Java中的核心关键字。package com.example;public class HelloWorld {publ…

作者头像 李华
网站建设 2026/10/22 5:01:44

Java+Flink构建电商实时数据分析平台实践

1. 项目背景与核心价值去年接手的一个电商大促监控项目让我深刻体会到实时数据分析的价值。当时运营团队需要实时掌握每秒订单量、地域分布和爆款商品趋势&#xff0c;传统T1的报表系统完全无法满足需求。我们用JavaFlink构建的实时分析平台&#xff0c;最终实现了从用户下单到…

作者头像 李华