基于YOLOv8行人车辆检测系统
本项目面向道路交通场景中的行人与车辆目标检测任务,完成 YOLOv8 与 Faster R-CNN 两类检测模型的训练、评估、可视化对比,并集成 PyQt5 桌面端检测系统。系统支持图片检测、视频检测、摄像头实时检测、检测数量统计、历史记录保存以及 CSV / JSON 数据导出。
项目概述
项目以行人和车辆两类目标为检测对象,围绕模型训练、效果评估、模型对比和桌面端应用四个部分展开:
- 使用 YOLOv8s 完成单阶段目标检测训练,默认作为桌面端系统的推理模型。
- 使用 Faster R-CNN ResNet50 FPN 完成两阶段检测模型训练,用于和 YOLOv8 进行性能对比。
- 保存训练日志、指标 CSV、训练曲线、混淆矩阵、PR 曲线、F1 曲线等结果文件。
- 基于 PyQt5 构建图形界面,提供图片、视频、摄像头三种检测入口。
- 检测结果包含目标框、类别、置信度、行人数、车辆数和总目标数。
默认桌面端入口为detection_ui.py,默认加载权重为:
runs/detect/person_car_detect/weights/best.pt数据集说明
本项目使用 YOLO 标注格式的数据集,检测类别为person和car。当前交付目录主要包含训练产物、模型权重和系统代码,若需要重新训练,需要准备或补齐data数据集目录。
数据集结构
Faster R-CNN 训练脚本默认读取如下目录结构,YOLOv8 训练也可按相同数据划分准备data.yaml:
data/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 └── labels/ ├── train/ # 训练集标注 └── val/ # 验证集标注标注格式
标注文件为 YOLO 格式,每张图片对应一个同名.txt文件,每行表示一个目标:
class_id x_center y_center width height字段说明:
字段 | 说明 |
| 类别编号, |
| 目标框中心点横坐标,按图片宽度归一化 |
| 目标框中心点纵坐标,按图片高度归一化 |
| 目标框宽度,按图片宽度归一化 |
| 目标框高度,按图片高度归一化 |
数据统计
根据当前项目中的 YOLOv8 训练日志,验证阶段数据统计如下:
统计项 | 数值 |
检测类别 | 2 类, |
验证集图片数 | 4,959 张 |
验证集目标实例数 | 60,875 个 |
行人实例数 | 6,999 个 |
车辆实例数 | 53,876 个 |
标注格式 | YOLO 归一化框格式 |
输入尺寸 | 640 x 640 |
说明:当前 README 只记录训练日志和项目文件中能够确认的数据。若后续替换数据集,请以实际data/目录和data.yaml为准同步更新本节。
模型方案
YOLOv8 检测模型
YOLOv8 是本项目桌面端默认使用的检测模型,适合实时检测场景。其整体流程如下:
输入图像 │ ▼ YOLOv8 Backbone 特征提取 │ ▼ Neck 多尺度特征融合 │ ▼ Detect Head 输出目标框、类别和置信度 │ ▼ NMS 后处理 │ ▼ 行人 / 车辆检测结果本项目中 YOLOv8 的主要作用:
- 训练
person、car两类目标检测权重。
- 提供桌面端图片、视频和摄像头实时检测能力。
- 输出检测框、类别标签、置信度和数量统计。
- 生成混淆矩阵、PR 曲线、F1 曲线、训练结果曲线等可视化文件。
Faster R-CNN 检测模型
Faster R-CNN 用于模型对比实验和批量图片检测。项目采用 TorchVision 中的 Faster R-CNN ResNet50 FPN,并将分类头替换为 3 类输出:
输入图像 │ ▼ ResNet50 + FPN 特征提取 │ ▼ RPN 候选框生成 │ ▼ RoI Align 特征对齐 │ ▼ 分类分支 + 边界框回归分支 │ ▼ 置信度过滤与结果输出Faster R-CNN 训练时会将 YOLO 标注转换为x_min, y_min, x_max, y_max格式,并将类别编号转换为 TorchVision 检测模型所需的标签编号,其中0作为背景类,1表示行人,2表示车辆。
训练过程
YOLOv8 训练流程
- 读取数据集配置文件
data.yaml。
- 加载
yolov8s.pt预训练权重。
- 按 640 x 640 输入尺寸进行训练。
- 使用 YOLOv8 默认检测损失,包括边界框损失、分类损失和 DFL 损失。
- 训练过程中保存
best.pt和last.pt。
- 训练结束后在验证集上评估 Precision、Recall、mAP50、mAP50-95。
当前训练配置记录在:
runs/detect/person_car_detect/args.yamlFaster R-CNN 训练流程
- 读取
data/images/train、data/labels/train作为训练集。
- 读取
data/images/val、data/labels/val作为验证集。
- 加载 COCO 预训练权重:
fasterrcnn/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth- 替换检测头,使模型输出背景、行人、车辆 3 类。
- 使用 SGD 优化器和 StepLR 学习率衰减策略训练 100 轮。
- 每轮训练后计算 Precision、Recall、F1。
- 按 F1 分数保存最优模型
best.pth,同时保存最后一轮模型last.pth。
- 输出训练日志、CSV 指标、JSON 历史记录和可视化曲线。
训练参数
YOLOv8 参数
参数 | 值 | 说明 |
模型 |
| YOLOv8s 检测模型 |
训练轮数 | 100 | 总训练 Epoch |
输入尺寸 | 640 | 训练和验证输入尺寸 |
批大小 | 16 | 每批图片数量 |
优化器 |
| Ultralytics 自动选择 |
初始学习率 | 0.01 |
|
最终学习率比例 | 0.01 |
|
动量 | 0.937 | SGD 动量参数 |
权重衰减 | 0.0005 | 正则化参数 |
预热轮数 | 3 |
|
AMP | 开启 | 混合精度训练 |
训练设备 | CUDA:0 | 训练日志记录为 RTX 3060 Laptop GPU |
输出目录 |
| YOLOv8 训练结果目录 |
Faster R-CNN 参数
参数 | 值 | 说明 |
模型 | Faster R-CNN ResNet50 FPN | TorchVision 检测模型 |
类别数 | 3 | 背景、行人、车辆 |
训练轮数 | 100 | 总训练 Epoch |
批大小 | 4 | 每批图片数量 |
优化器 | SGD | 随机梯度下降 |
初始学习率 | 0.005 | 主学习率 |
动量 | 0.9 | SGD 动量 |
权重衰减 | 0.0005 | 正则化参数 |
学习率调度 | StepLR | 每 10 轮衰减 |
衰减系数 | 0.1 |
|
置信度阈值 | 0.5 | 评估和推理过滤阈值 |
IoU 阈值 | 0.5 | 匹配阈值 |
输出目录 |
| Faster R-CNN 训练结果目录 |
训练结果
YOLOv8 验证结果
YOLOv8 最优权重为:
runs/detect/person_car_detect/weights/best.pt整体结果:
指标 | 数值 |
Precision | 0.82942 |
Recall | 0.65837 |
mAP50 | 0.74918 |
mAP50-95 | 0.45874 |
推理速度 | 约 1.9 ms / image |
训练耗时 | 约 5.172 小时 |
分类别结果:
类别 | Images | Instances | Precision | Recall | mAP50 | mAP50-95 |
| 1,712 | 6,999 | 0.792 | 0.553 | 0.651 | 0.346 |
| 4,954 | 53,876 | 0.849 | 0.748 | 0.824 | 0.550 |
Faster R-CNN 训练结果
Faster R-CNN 最优权重为:
runs/fasterrcnn/person_car_detect/weights/best.pth最佳性能出现在第 78 轮:
指标 | 数值 |
Best Epoch | 78 |
F1 Score | 0.7074 |
Precision | 0.7112 |
Recall | 0.7036 |
最终第 100 轮结果:
指标 | 数值 |
F1 Score | 0.7046 |
Precision | 0.7089 |
Recall | 0.7004 |
Total Loss | 0.2504 |
Classifier Loss | 0.0663 |
Box Regression Loss | 0.1427 |
Objectness Loss | 0.0042 |
RPN Box Loss | 0.0371 |
模型对比
对比项 | YOLOv8 | Faster R-CNN | 结论 |
整体指标 | mAP50 = 0.7492 | F1 = 0.7074 | YOLOv8 整体得分更高 |
Precision | 0.8294 | 0.7112 | YOLOv8 误检更少 |
Recall | 0.6584 | 0.7036 | Faster R-CNN 漏检更少 |
应用倾向 | 实时检测、桌面端推理 | 离线评估、召回优先场景 | 按场景选择 |
综合当前训练结果,YOLOv8 更适合作为桌面端实时检测模型;Faster R-CNN 在召回率上更高,适合对漏检更敏感的离线检测或对比实验。
可视化结果说明
YOLOv8 可视化文件
目录:
runs/detect/person_car_detect/文件 | 说明 |
| 训练损失、验证损失、Precision、Recall、mAP 等指标曲线 |
| 每个 Epoch 的完整训练指标 |
| 混淆矩阵 |
| 归一化混淆矩阵 |
| Precision-Recall 曲线 |
| Precision 随置信度变化曲线 |
| Recall 随置信度变化曲线 |
| F1 分数随置信度变化曲线 |
| 标注分布可视化 |
| 标注框相关性可视化 |
| 训练批次与数据增强可视化 |
| 验证集真实标签可视化 |
| 验证集预测结果可视化 |
Faster R-CNN 可视化文件
目录:
runs/fasterrcnn/person_car_detect/文件 | 说明 |
| 总损失、分类损失、回归损失、目标性损失、RPN 损失、Precision、Recall、F1 和学习率曲线 |
| F1 分数变化曲线,并标注最佳轮次 |
| 每轮训练指标 |
| 完整训练历史 |
| 训练日志 |
| 训练结果摘要 |
模型对比文件
目录:
runs/comparison/文件 | 说明 |
| YOLOv8 与 Faster R-CNN 指标对比图 |
| 模型对比文字报告 |
| 模型对比结构化数据 |
桌面端系统功能
桌面端系统入口:
detection_ui.py图片检测
- 支持选择本地单张图片进行目标检测。
- 显示带检测框的结果图。
- 统计行人数量、车辆数量和总目标数量。
- 展示每个检测目标的类别和置信度。
- 图片检测结果会写入
detection_history.json。
视频检测
- 支持选择本地视频文件。
- 对视频帧逐帧执行 YOLOv8 检测。
- 实时刷新检测画面和数量统计。
- 可在界面中停止当前检测任务。
摄像头检测
- 支持选择摄像头编号 0、1、2。
- 调用本机摄像头进行实时行人车辆检测。
- 实时显示检测框、类别、置信度和数量统计。
历史记录
- 历史记录保存在
detection_history.json。
- 支持在界面中查看检测时间、输入来源、行人数、车辆数和总数。
- 支持导出为 CSV。
- 支持导出为 JSON。
技术栈
类别 | 技术 |
编程语言 | Python 3.9 |
深度学习框架 | PyTorch、TorchVision |
YOLO 框架 | Ultralytics YOLOv8 |
桌面端框架 | PyQt5 |
图像处理 | OpenCV、Pillow |
数据处理 | NumPy、Pandas、CSV、JSON |
可视化 | Matplotlib |
模型类型 | YOLOv8s、Faster R-CNN ResNet50 FPN |
项目结构
c88/ ├── detection_ui.py # PyQt5 桌面端主程序,默认加载 YOLOv8 best.pt ├── detection_history.json # 图片检测历史记录 ├── train_fasterrcnn.py # Faster R-CNN 训练脚本 ├── detect_fasterrcnn.py # Faster R-CNN 批量检测脚本 ├── fasterrcnn_config.py # Faster R-CNN 训练配置 ├── visualize_fasterrcnn_results.py # Faster R-CNN 训练曲线和摘要生成脚本 ├── compare_models.py # YOLOv8 与 Faster R-CNN 指标对比脚本 ├── redraw_epoch_plots.py # 根据 CSV 重新绘制训练图表 ├── requirements_fasterrcnn.txt # Faster R-CNN 训练相关依赖 ├── 训练日志.txt # YOLOv8 训练日志 ├── yolov8s.pt # YOLOv8s 预训练权重 ├── yolov8s-cls.pt # YOLOv8 分类权重文件 ├── yolo11n.pt # YOLO 系列权重文件 ├── yolo11m.pt # YOLO 系列权重文件 ├── fasterrcnn/ │ └── fasterrcnn_resnet50_fpn_coco-258fb6c6.pth │ # Faster R-CNN COCO 预训练权重 ├── runs/ │ ├── detect/person_car_detect/ │ │ ├── weights/ │ │ │ ├── best.pt # YOLOv8 最优权重,桌面端默认加载 │ │ │ └── last.pt # YOLOv8 最后一轮权重 │ │ ├── results.csv # YOLOv8 每轮训练指标 │ │ └── *.png / *.jpg # YOLOv8 训练与验证可视化结果 │ ├── fasterrcnn/person_car_detect/ │ │ ├── weights/ │ │ │ └── best.pth # Faster R-CNN 最优权重 │ │ ├── results.csv # Faster R-CNN 每轮训练指标 │ │ ├── training_history.json # Faster R-CNN 训练历史 │ │ ├── training_results.png # Faster R-CNN 训练曲线 │ │ └── summary_report.txt # Faster R-CNN 训练摘要 │ └── comparison/ │ ├── model_comparison.png # 两类模型对比图 │ ├── comparison_report.txt # 两类模型对比报告 │ └── comparison_data.json # 两类模型对比数据 ├── vis_output/ # 检测可视化输出图片 └── data/ # 重新训练时需要准备的数据集目录环境准备与启动
1. 创建 Python 环境
建议使用 Python 3.9,并优先使用独立虚拟环境。
cd <项目根目录>2. 安装依赖
先安装 Faster R-CNN 训练依赖:
python -m pip install -r requirements_fasterrcnn.txt再安装桌面端和 YOLOv8 推理所需依赖:
python -m pip install ultralytics PyQt5 opencv-python如需使用 GPU,请确保本机 PyTorch、CUDA 和显卡驱动版本匹配。
3. 启动桌面端系统
python .\detection_ui.py启动后可在界面中选择:
- 图片检测
- 视频检测
- 摄像头检测
- 历史记录查看与导出
4. 重新训练 YOLOv8
如果需要重新训练 YOLOv8,请先准备数据集和data.yaml,再执行:
yolo detect train model=yolov8s.pt data=<数据集目录>\data.yaml epochs=100 batch=16 imgsz=640 project=runs/detect name=person_car_detect训练完成后,桌面端默认读取:
runs/detect/person_car_detect/weights/best.pt5. 训练 Faster R-CNN
请先按 数据集结构 准备data/目录,然后执行:
python .\train_fasterrcnn.py训练输出目录:
runs/fasterrcnn/person_car_detect/6. Faster R-CNN 批量检测
python .\detect_fasterrcnn.py --weights runs/fasterrcnn/person_car_detect/weights/best.pth --source data/images/val --output runs/fasterrcnn/detect --conf 0.5参数说明:
参数 | 说明 |
| Faster R-CNN 权重路径 |
| 待检测图片文件或图片目录 |
| 检测结果输出目录 |
| 置信度阈值 |
7. 生成可视化和对比结果
生成 Faster R-CNN 训练图表和摘要:
python .\visualize_fasterrcnn_results.py生成 YOLOv8 与 Faster R-CNN 对比图表:
python .\compare_models.py根据现有 CSV 重新绘制训练图:
python .\redraw_epoch_plots.py本项目为个人原创,结构清晰,功能完整,适合计算机视觉方向课程设计、毕业设计和项目演示使用。有定制化需求可以评论或私信作者。
作者原创项目地址:michael-jay.pages.dev/projects.html
