本项目面向道路交通场景中的行人与车辆目标检测任务,完成 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.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 检测模型 |
训练轮数 |
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.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
参数说明:
参数 |
说明 |
|
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
本项目为个人原创,结构清晰,功能完整,适合计算机视觉方向课程设计、毕业设计和项目演示使用。有定制化需求可以评论或私信作者。