☰
YOLOv5车辆行人检测实战:PyQt界面+5000张数据集+训练权重全解析
2026/10/1 23:47:59 网站建设 项目流程

简介:本资源面向计算机视觉入门与进阶开发者,提供一套可直接运行的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.25,NMS 的 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 python=3.8 -y conda activate yolov5_vehicle pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --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.yaml:

train: ../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 → 阈值扫描”的流程,不跳过任何一步。希望这套资源和你自己的调参流程结合起来,能帮你少走一些弯路。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询