基于 YOLOv8 的行人车辆检测系统

本项目面向道路交通场景中的行人与车辆目标检测任务,完成 YOLOv8 与 Faster R-CNN 两类检测模型的训练、评估、可视化对比,并集成 PyQt5 桌面端检测系统。系统支持图片检测、视频检测、摄像头实时检测、检测数量统计、历史记录保存以及 CSV / JSON 数据导出。

目录

  1. 项目概述
  2. 数据集说明
  3. 模型方案
  4. 训练过程
  5. 训练参数
  6. 训练结果
  7. 可视化结果说明
  8. 桌面端系统功能
  9. 技术栈
  10. 项目结构
  11. 环境准备与启动

项目概述

项目以行人和车辆两类目标为检测对象,围绕模型训练、效果评估、模型对比和桌面端应用四个部分展开:

  • 使用 YOLOv8s 完成单阶段目标检测训练,默认作为桌面端系统的推理模型。
  • 使用 Faster R-CNN ResNet50 FPN 完成两阶段检测模型训练,用于和 YOLOv8 进行性能对比。
  • 保存训练日志、指标 CSV、训练曲线、混淆矩阵、PR 曲线、F1 曲线等结果文件。
  • 基于 PyQt5 构建图形界面,提供图片、视频、摄像头三种检测入口。
  • 检测结果包含目标框、类别、置信度、行人数、车辆数和总目标数。

默认桌面端入口为 detection_ui.py,默认加载权重为:

runs/detect/person_car_detect/weights/best.pt

数据集说明

本项目使用 YOLO 标注格式的数据集,检测类别为 personcar。当前交付目录主要包含训练产物、模型权重和系统代码,若需要重新训练,需要准备或补齐 data 数据集目录。

数据集结构

Faster R-CNN 训练脚本默认读取如下目录结构,YOLOv8 训练也可按相同数据划分准备 data.yaml

data/
├── images/
│   ├── train/          # 训练集图片
│   └── val/            # 验证集图片
└── labels/
    ├── train/          # 训练集标注
    └── val/            # 验证集标注

标注格式

标注文件为 YOLO 格式,每张图片对应一个同名 .txt 文件,每行表示一个目标:

class_id x_center y_center width height

字段说明:

字段 说明
class_id 类别编号,0 表示行人,1 表示车辆
x_center 目标框中心点横坐标,按图片宽度归一化
y_center 目标框中心点纵坐标,按图片高度归一化
width 目标框宽度,按图片宽度归一化
height 目标框高度,按图片高度归一化

数据统计

根据当前项目中的 YOLOv8 训练日志,验证阶段数据统计如下:

统计项 数值
检测类别 2 类,personcar
验证集图片数 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 的主要作用:

  • 训练 personcar 两类目标检测权重。
  • 提供桌面端图片、视频和摄像头实时检测能力。
  • 输出检测框、类别标签、置信度和数量统计。
  • 生成混淆矩阵、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 训练流程

  1. 读取数据集配置文件 data.yaml
  2. 加载 yolov8s.pt 预训练权重。
  3. 按 640 x 640 输入尺寸进行训练。
  4. 使用 YOLOv8 默认检测损失,包括边界框损失、分类损失和 DFL 损失。
  5. 训练过程中保存 best.ptlast.pt
  6. 训练结束后在验证集上评估 Precision、Recall、mAP50、mAP50-95。

当前训练配置记录在:

runs/detect/person_car_detect/args.yaml

Faster R-CNN 训练流程

  1. 读取 data/images/traindata/labels/train 作为训练集。
  2. 读取 data/images/valdata/labels/val 作为验证集。
  3. 加载 COCO 预训练权重:
fasterrcnn/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth
  1. 替换检测头,使模型输出背景、行人、车辆 3 类。
  2. 使用 SGD 优化器和 StepLR 学习率衰减策略训练 100 轮。
  3. 每轮训练后计算 Precision、Recall、F1。
  4. 按 F1 分数保存最优模型 best.pth,同时保存最后一轮模型 last.pth
  5. 输出训练日志、CSV 指标、JSON 历史记录和可视化曲线。

训练参数

YOLOv8 参数

参数 说明
模型 yolov8s.pt YOLOv8s 检测模型
训练轮数 100 总训练 Epoch
输入尺寸 640 训练和验证输入尺寸
批大小 16 每批图片数量
优化器 auto Ultralytics 自动选择
初始学习率 0.01 lr0
最终学习率比例 0.01 lrf
动量 0.937 SGD 动量参数
权重衰减 0.0005 正则化参数
预热轮数 3 warmup_epochs
AMP 开启 混合精度训练
训练设备 CUDA:0 训练日志记录为 RTX 3060 Laptop GPU
输出目录 runs/detect/person_car_detect 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 gamma
置信度阈值 0.5 评估和推理过滤阈值
IoU 阈值 0.5 匹配阈值
输出目录 runs/fasterrcnn/person_car_detect 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
person 1,712 6,999 0.792 0.553 0.651 0.346
car 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/
文件 说明
results.png 训练损失、验证损失、Precision、Recall、mAP 等指标曲线
results.csv 每个 Epoch 的完整训练指标
confusion_matrix.png 混淆矩阵
confusion_matrix_normalized.png 归一化混淆矩阵
PR_curve.png Precision-Recall 曲线
P_curve.png Precision 随置信度变化曲线
R_curve.png Recall 随置信度变化曲线
F1_curve.png F1 分数随置信度变化曲线
labels.jpg 标注分布可视化
labels_correlogram.jpg 标注框相关性可视化
train_batch*.jpg 训练批次与数据增强可视化
val_batch*_labels.jpg 验证集真实标签可视化
val_batch*_pred.jpg 验证集预测结果可视化

Faster R-CNN 可视化文件

目录:

runs/fasterrcnn/person_car_detect/
文件 说明
training_results.png 总损失、分类损失、回归损失、目标性损失、RPN 损失、Precision、Recall、F1 和学习率曲线
f1_curve.png F1 分数变化曲线,并标注最佳轮次
results.csv 每轮训练指标
training_history.json 完整训练历史
training_log.txt 训练日志
summary_report.txt 训练结果摘要

模型对比文件

目录:

runs/comparison/
文件 说明
model_comparison.png YOLOv8 与 Faster R-CNN 指标对比图
comparison_report.txt 模型对比文字报告
comparison_data.json 模型对比结构化数据

桌面端系统功能

桌面端系统入口:

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.pt

5. 训练 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

参数说明:

参数 说明
--weights Faster R-CNN 权重路径
--source 待检测图片文件或图片目录
--output 检测结果输出目录
--conf 置信度阈值

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

posted on 2026-08-03 00:54  Jay8059  阅读(2)  评论(0)    收藏  举报

导航