
简介本资源面向计算机视觉入门与进阶开发者提供一套可直接运行的YOLOv5车辆行人检测完整方案解决交通场景下person与car两类目标检测的落地需求。包内包含yolov5s与yolov5m两种已训练权重mAP达90%以上并附PR曲线、loss曲线等训练过程记录便于评估模型表现。资源共约2000个文件以jpg图像、xml与txt双格式标注、py源码及yaml配置为主另有pt权重、ui界面文件与mp4演示视频压缩包约640MB目录按数据集、代码与结果分模块组织。配套PyQt界面支持图片、视频与摄像头三种检测模式可自由切换输入源。数据集含5000余张交通场景行人车辆图像标注同时提供txt与xml两种格式方便直接用于训练或迁移学习。目前已有5802人学习下载适合希望快速复现检测流程、对照曲线调参或二次开发界面的读者参考。1. 从一份能直接跑起来的 YOLOv5 车辆行人检测项目说起如果你正在找一套能直接跑通、带界面、带数据、带训练好权重的车辆行人检测方案这套资源大概率能省掉你至少一周的折腾时间。它包含四个核心部分YOLOv5 检测模型、已经训练好的车辆行人权重文件、PyQt 图形界面、以及 5000 张规模的车辆行人检测数据集。换句话说从数据到模型到界面整条链路都给你铺好了你拿到手就能验证效果而不是从零开始配环境、标数据、调参、写界面。这套东西适合谁第一类是想快速验证车辆行人检测效果的开发者比如你要做一个园区出入口的统计 demo或者给某个安防项目做原型验证直接加载权重就能看到检测框。第二类是想学习 YOLOv5 完整落地流程的学生或转行者数据集、训练脚本、推理代码、界面代码都在你可以逐层拆开看每一步怎么衔接。第三类是做课程设计或毕业设计的人PyQt 界面加上训练好的模型稍作修改就能形成一套完整的演示系统。但我要先把话说在前面这套资源不是“万能钥匙”。YOLOv5 本身是一个通用目标检测框架车辆行人检测只是它的一个应用方向。你拿到的权重是在特定数据集上训练出来的换一个场景——比如夜间红外、密集人群、极端遮挡——效果会打折扣。所以这篇文章不会只告诉你“它能用”而是把怎么用、参数怎么调、哪里容易翻车一条条拆开讲清楚。2. 拆开资源包模型、权重、界面、数据集各自扮演什么角色2.1 YOLOv5 检测模型的结构与选型逻辑YOLOv5 并不是一个单一模型而是一个系列常见的有 YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x字母越大网络越深、参数量越多、精度通常越高但推理速度也越慢。这套资源里用的是哪个版本你需要拿到手后确认但不管哪个版本核心结构是一致的Backbone 负责提取特征Neck 做多尺度特征融合Head 输出检测结果。对于车辆行人检测这个任务我一般会优先考虑 YOLOv5s 或 YOLOv5m。原因很直接车辆和行人的尺度变化虽然大但整体属于中等难度目标YOLOv5s 在 640 输入尺寸下已经能跑到不错的 mAP而且推理速度快方便你在 PyQt 界面里做实时演示。如果你追求更高精度可以换 YOLOv5m但要注意界面刷新率会下降。这里有一个容易被忽略的点YOLOv5 的输入尺寸不一定是 640。你可以在推理时改成 416 或 320 来提速也可以改成 1280 来提升小目标检测能力。但改输入尺寸后最好用同样的尺寸重新评估一下权重因为训练时的尺寸和推理时的尺寸不一致精度会有波动。2.2 训练好的权重文件怎么用、怎么验证权重文件通常是.pt格式这是 PyTorch 的模型保存格式。拿到权重后第一件事不是直接塞进界面而是先用命令行验证一下它能不能正常推理。常见做法是python detect.py --weights best.pt --source test_images/ --img-size 640 --conf-thres 0.25 --iou-thres 0.45这段命令的意思是加载best.pt权重对test_images/目录下的图片做推理输入尺寸 640置信度阈值 0.25NMS 的 IoU 阈值 0.45。跑完之后去runs/detect/exp/目录看结果图重点观察三件事检测框有没有漏、有没有误检、框的位置准不准。如果漏检多先把--conf-thres降到 0.1 试试看是不是阈值太高把低置信度的目标滤掉了。如果误检多把--conf-thres提到 0.4 以上。如果框的位置明显偏移那可能是权重和当前 YOLOv5 代码版本不匹配需要确认训练时用的代码分支。提示不要一上来就改权重文件的名字或路径结构YOLOv5 的加载逻辑对路径比较敏感保持原始目录结构能减少很多玄学问题。2.3 PyQt 界面在整套系统里的定位PyQt 界面不是模型的一部分它是模型的外壳。它的作用是把“加载权重 → 读取图片/视频 → 推理 → 画框 → 显示”这一串操作包装成按钮和窗口让不懂命令行的人也能用。这套资源里的 PyQt 界面常见实现方式是主线程负责 UI 刷新子线程负责推理避免界面卡死。你拿到界面代码后重点看三个地方第一权重加载的路径是不是写死的如果是改成相对路径或配置文件第二推理线程和 UI 线程之间是怎么通信的通常用信号槽机制第三视频帧的读取和显示有没有做缓冲没做缓冲的话高分辨率视频会掉帧。2.4 5000 张车辆行人数据集的构成与使用边界5000 张图片在目标检测里不算大但也不小。关键不是数量而是标注质量和场景覆盖。你需要确认几件事标注格式是 YOLO 格式每行class x_center y_center width height归一化到 0-1还是 VOC/COCO 格式类别是只有“车辆”和“行人”两类还是包含更多细分图片里有没有大量重复或近似重复的帧。如果数据集里车辆和行人的比例严重失衡比如车辆 4500 张、行人 500 张那训练出来的模型对行人的检测能力会偏弱。常见做法是统计一下每个类别的实例数量然后决定要不要做数据增强或重采样。另外5000 张里如果有大量同一场景的连续帧验证集和训练集之间容易泄漏导致验证指标虚高。我一般会按场景或视频来源划分训练集和验证集而不是随机按图片划分。3. 从零跑通训练与推理环境、命令、参数一次讲透3.1 环境配置conda 建环境与依赖安装YOLOv5 的环境不算复杂但版本对不上就会出各种报错。我一般用 conda 建一个独立环境Python 版本选 3.8 或 3.9这两个版本和 PyTorch 的兼容性最稳。conda create -n yolov5_vehicle python3.8 -y conda activate yolov5_vehicle pip install torch1.12.1cu113 torchvision0.13.1cu113 --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt第一行建环境第二行激活第三行装 PyTorch 和 torchvision注意cu113表示 CUDA 11.3 版本你要根据自己的显卡驱动改。第四行装 YOLOv5 的其他依赖比如 numpy、opencv-python、pyqt5 等。如果requirements.txt里某个包版本冲突优先保证 torch、torchvision、opencv-python 这三个的版本匹配。注意不要用pip install -r requirements.txt一把梭之后就不管了装完一定要跑一句python -c import torch; print(torch.cuda.is_available())确认 GPU 能用。如果返回 False后面训练会慢到让你怀疑人生。3.2 数据集准备YOLO 格式转换与 data.yaml 配置假设你拿到的数据集是图片加标注文件标注可能是 XML 或 JSON。你需要先转成 YOLO 格式。常见做法是写一个转换脚本import os import xml.etree.ElementTree as ET def convert_annotation(xml_path, img_w, img_h, class_map): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in class_map: continue cls_id class_map[cls_name] bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) return lines这段代码的核心逻辑是读 XML 里的边界框坐标先算中心点坐标和宽高再分别除以图片的宽和高做归一化。class_map是类别名到类别 ID 的映射比如{car: 0, person: 1}。转换完之后每张图片对应一个同名.txt文件放在和图片同级的labels目录下。然后配置data.yamltrain: ../datasets/vehicle_person/images/train val: ../datasets/vehicle_person/images/val nc: 2 names: [car, person]train和val是训练集和验证集的图片目录nc是类别数names是类别名列表。注意路径不要写绝对路径用相对路径方便迁移。3.3 训练命令与超参数设置训练命令本身不复杂关键是参数怎么设python train.py --img 640 --batch 16 --epochs 100 --data data.yaml --weights yolov5s.pt --project runs/train --name vehicle_person--img 640是输入尺寸--batch 16是批次大小--epochs 100是训练轮数--data指向配置文件--weights是预训练权重--project和--name决定输出目录。如果你显存不够把--batch降到 8 或 4如果训练 loss 下降很慢把--epochs加到 200 或 300。YOLOv5 的超参数默认值在data/hyp.scratch.yaml里常见需要改的有lr0初始学习率、lrf最终学习率因子、momentum、weight_decay。我一般不会一上来就大改超参数先用默认值跑一轮看 loss 曲线和 mAP 曲线再决定要不要调。如果训练集 loss 下降但验证集 mAP 不升可能是过拟合加数据增强或减模型复杂度。3.4 推理与 PyQt 界面联调训练完之后用best.pt做推理确认效果没问题再接入 PyQt 界面。界面联调时最容易出问题的地方是线程阻塞。如果你在 UI 主线程里直接调model()做推理界面会卡住不动。正确做法是把推理放在QThread里通过信号把结果传回主线程画框。from PyQt5.QtCore import QThread, pyqtSignal import torch class DetectThread(QThread): result_ready pyqtSignal(object, object) def __init__(self, model, img): super().__init__() self.model model self.img img def run(self): results self.model(self.img) self.result_ready.emit(self.img, results)这段代码定义了一个检测线程run方法里执行推理完成后通过result_ready信号把原图和结果发出去。主线程收到信号后再更新界面。注意self.model要在主线程加载好再传进来不要在子线程里加载权重否则容易出问题。4. 避坑与排查车辆行人检测落地时最容易翻车的五个地方4.1 现象推理结果全是乱框置信度极低原因通常是权重文件和代码版本不匹配。YOLOv5 不同分支的模型结构有差异用 v6.0 的代码加载 v5.0 训练的权重可能会出现层名对不上、输出维度错位。解决方法是确认训练时的代码 commit 或版本号切到对应分支再加载。如果找不到版本信息用torch.load看一下权重里的键名和当前模型的state_dict对比。4.2 现象PyQt 界面点“开始检测”后直接卡死原因是推理跑在了 UI 主线程里。PyQt 的事件循环被推理阻塞界面无法刷新。解决方法是把推理逻辑放到QThread子类里用信号槽回传结果。另外视频检测时不要每一帧都发信号可以每 2-3 帧发一次减少 UI 刷新压力。4.3 现象训练时 loss 变成 NaN常见原因是学习率太大或数据里有异常标注。先检查标注文件里有没有宽高为 0 或坐标超出 0-1 范围的框。如果标注没问题把lr0从 0.01 降到 0.001 再试。还有一种可能是 batch 太小导致 BatchNorm 不稳定把--batch调大一点。4.4 现象验证集 mAP 很高但实际场景漏检严重这是典型的数据集分布问题。5000 张图片如果大部分是白天、晴天、近距离模型学到的是这些场景的特征。换到夜间、雨天、远距离效果自然差。解决方法是在数据集里补充目标场景的图片或者用数据增强模拟不同光照和天气。如果没法补数据至少把--conf-thres降低减少漏检。4.5 现象界面显示的视频比原视频慢很多原因是推理速度跟不上视频帧率。先确认是不是用了 GPU如果torch.cuda.is_available()返回 False那推理是在 CPU 上跑的慢是正常的。如果 GPU 正常检查输入尺寸是不是设得太大把--img-size从 1280 降到 640 或 416。还不行的话换 YOLOv5s 权重或者跳帧检测。5. 进阶技巧用 TTA 和置信度融合把漏检压下去如果你已经跑通了基础流程想让车辆行人检测在复杂场景下更稳可以试试测试时增强TTA和置信度融合。TTA 的思路是对同一张图做多种变换比如水平翻转、多尺度缩放分别推理再把结果融合。YOLOv5 自带 TTA 选项在推理时加--augment就行python detect.py --weights best.pt --source test_video.mp4 --img-size 640 --augment --conf-thres 0.2--augment会启用 TTA代价是推理速度大约慢 2-3 倍。如果你的场景对漏检非常敏感比如安防监控这个代价是值得的。另一个技巧是置信度融合用两个不同版本的权重比如 YOLOv5s 和 YOLOv5m分别推理把两组检测框做 NMS 融合。这样能结合不同模型的优势减少单一模型的漏检。我自己的习惯是每次拿到新场景的视频先跑一遍默认参数记录漏检和误检的典型帧然后开--augment再跑一遍对比 mAP 和速度最后决定线上用哪套参数。这个流程走下来基本能避免“训练指标好看、实际用起来翻车”的情况。还有一个容易被忽略的点PyQt 界面里的置信度阈值最好做成可调的滑块而不是写死在代码里。不同场景对漏检和误检的容忍度不一样现场调参比重新训练快得多。我一般会在界面上放两个滑块一个调conf-thres一个调iou-thres方便快速适配。从那以后我每次部署检测模型都强制走一遍“默认参数 → TTA → 阈值扫描”的流程不跳过任何一步。希望这套资源和你自己的调参流程结合起来能帮你少走一些弯路。本文还有配套的精品资源点击获取