基于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 标注格式的数据集,检测类别为 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
  1. 加载 yolov8s.pt 预训练权重。
  1. 按 640 x 640 输入尺寸进行训练。
  1. 使用 YOLOv8 默认检测损失,包括边界框损失、分类损失和 DFL 损失。
  1. 训练过程中保存 best.ptlast.pt
  1. 训练结束后在验证集上评估 Precision、Recall、mAP50、mAP50-95。

当前训练配置记录在:

复制代码
runs/detect/person_car_detect/args.yaml

Faster R-CNN 训练流程

  1. 读取 data/images/traindata/labels/train 作为训练集。
  1. 读取 data/images/valdata/labels/val 作为验证集。
  1. 加载 COCO 预训练权重:

    fasterrcnn/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth

  2. 替换检测头,使模型输出背景、行人、车辆 3 类。

  1. 使用 SGD 优化器和 StepLR 学习率衰减策略训练 100 轮。
  1. 每轮训练后计算 Precision、Recall、F1。
  1. 按 F1 分数保存最优模型 best.pth,同时保存最后一轮模型 last.pth
  1. 输出训练日志、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

相关推荐
FriendshipT1 小时前
Ultralytics:简要解读YOLOv8 → YOLO11 → YOLO26网络架构
人工智能·pytorch·python·深度学习·yolo·目标检测
j7~2 小时前
【C语言】《C语言自定义类型(结构体+联合体+枚举类型)》--详解
c语言·开发语言·深度学习·结构体·位段·联合体·枚举类型
橙臣程2 小时前
深度学习11——Tokenization、embedding、位置编码
人工智能·深度学习·embedding
正和视觉教育2 小时前
深圳CCD视觉培训:快速掌握机器视觉检测核心技术
人工智能·python·计算机视觉·视觉检测
电气_空空2 小时前
基于 LabVIEW的数据采集与信号处理系统的设计
嵌入式硬件·毕业设计·信号处理·labview
fai厅的秃头姐!13 小时前
OpenCV——进阶
人工智能·opencv·计算机视觉
大鹏的NLP博客13 小时前
机器学习中的统计波动控制与表征几何优化原则:从函数稳定性到隐空间结构学习
人工智能·深度学习·机器学习
LaughingZhu21 小时前
Product Hunt 每日热榜 | 2026-07-27
人工智能·深度学习·神经网络·搜索引擎·产品运营
学到头秃的suhian21 小时前
Super Mamba feature enhancement framework for small object detection
目标检测