本项目面向道路交通场景中的行人与车辆目标检测任务,完成 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
字段说明:
|------------|------------------------|
| 字段 | 说明 |
| class_id | 类别编号,0 表示行人,1 表示车辆 |
| x_center | 目标框中心点横坐标,按图片宽度归一化 |
| y_center | 目标框中心点纵坐标,按图片高度归一化 |
| width | 目标框宽度,按图片宽度归一化 |
| height | 目标框高度,按图片高度归一化 |
数据统计
根据当前项目中的 YOLOv8 训练日志,验证阶段数据统计如下:
|----------|--------------------|
| 统计项 | 数值 |
| 检测类别 | 2 类,person、car |
| 验证集图片数 | 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.yaml
Faster 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.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