基于深度学习YOLOv10的车辆行人检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)
本项目基于YOLOv10深度学习框架,开发了一套高效精准的车辆行人联合检测系统,能够实时检测并区分场景中的行人(person)和车辆(car)两类目标。系统采用优化的YOLOv10网络结构,结合针对复杂交通场景的数据增强策略,在保持高检测速度的同时显著提升了检测精度,特别是对小尺度行人和车辆的识别能力。数据集包含5,607张高质量标注图像(训练集4,485张,验证集1,122张),涵盖城市街道、十
一、项目介绍
摘要
本项目基于YOLOv10深度学习框架,开发了一套高效精准的车辆行人联合检测系统,能够实时检测并区分场景中的行人(person)和车辆(car)两类目标。系统采用优化的YOLOv10网络结构,结合针对复杂交通场景的数据增强策略,在保持高检测速度的同时显著提升了检测精度,特别是对小尺度行人和车辆的识别能力。
数据集包含5,607张高质量标注图像(训练集4,485张,验证集1,122张),涵盖城市街道、十字路口、停车场、校园等多种场景,包含不同光照条件(白天/夜间)、天气状况(晴天/雨天/雾天)以及不同视角(地面监控/车载视角/无人机航拍)。该系统可广泛应用于智能交通监控、自动驾驶环境感知、智慧安防、机器人导航等多个领域,为智慧城市建设和智能交通管理提供关键技术支撑。
项目意义
-
智能交通管理应用
-
实时统计道路人车流量,优化交通信号灯控制策略
-
检测违章停车、行人违规横穿马路等交通违法行为
-
为城市交通规划提供数据支持
-
-
自动驾驶安全保障
-
为自动驾驶车辆提供精准的环境感知能力
-
提前预警潜在的人车碰撞风险
-
支持V2X(车路协同)系统建设
-
-
公共安全监控
-
用于校园、园区、商业区等场所的安全监控
-
检测异常人群聚集或车辆违停情况
-
支持智慧城市安防体系建设
-
-
算法技术创新
-
优化YOLOv10在多目标检测任务中的性能
-
解决人车目标尺度差异大的检测难题
-
为轻量化目标检测提供实践案例
-
-
边缘计算部署
-
模型经过优化可在Jetson、树莓派等边缘设备运行
-
支持实时视频流分析
-
目录
七、项目源码(视频下方简介内)
基于深度学习YOLOv10的车辆行人检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)_哔哩哔哩_bilibili
基于深度学习YOLOv10的车辆行人检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)
二、项目功能展示
系统功能
✅ 图片检测:可对图片进行检测,返回检测框及类别信息。
✅ 视频检测:支持视频文件输入,检测视频中每一帧的情况。
✅ 摄像头实时检测:连接USB 摄像头,实现实时监测。
✅参数实时调节(置信度和IoU阈值)
-
图片检测
该功能允许用户通过单张图片进行目标检测。输入一张图片后,YOLO模型会实时分析图像,识别出其中的目标,并在图像中框出检测到的目标,输出带有目标框的图像。
-
视频检测
视频检测功能允许用户将视频文件作为输入。YOLO模型将逐帧分析视频,并在每一帧中标记出检测到的目标。最终结果可以是带有目标框的视频文件或实时展示,适用于视频监控和分析等场景。
-
摄像头实时检测
该功能支持通过连接摄像头进行实时目标检测。YOLO模型能够在摄像头拍摄的实时视频流中进行目标检测,实时识别并显示检测结果。此功能非常适用于安防监控、无人驾驶、智能交通等应用,提供即时反馈。
核心特点:
- 高精度:基于YOLO模型,提供精确的目标检测能力,适用于不同类型的图像和视频。
- 实时性:特别优化的算法使得实时目标检测成为可能,无论是在视频还是摄像头实时检测中,响应速度都非常快。
- 批量处理:支持高效的批量图像和视频处理,适合大规模数据分析。
三、数据集介绍
数据集概述
本数据集专门针对车辆行人联合检测任务构建,包含5,607张精心标注的图像数据,划分为训练集(4,485张)和验证集(1,122张)。数据集具有以下特点:
-
目标类别:2类(person行人,car车辆)
-
标注格式:YOLO格式标准标注
-
数据来源:公开数据集(如COCO、Cityscapes)补充自采数据
-
场景覆盖:10+种典型交通场景
数据集特点
-
目标尺度多样性
-
包含近景大目标和远景小目标
-
车辆尺寸跨度大(从摩托车到大型货车)
-
-
复杂场景覆盖
-
不同时段(白天/黄昏/夜间)
-
多种天气(晴天/雨天/雾天/雪天)
-
各类场景(城市道路/高速公路/人行道/停车场)
-
-
挑战性样本丰富
-
部分遮挡目标(被其他车辆或物体遮挡的行人)
-
密集人群中的个体检测
-
反光/阴影等困难样本
-
-
多视角数据
-
固定监控摄像头视角
-
车载移动视角
-
无人机高空视角
-
-
高质量标注
-
采用三级质检流程确保标注质量
-
边界框紧密贴合目标轮廓
-
困难样本进行特殊标记
-
数据集配置文件
采用标准YOLO格式配置文件,关键内容如下:
# YOLOv10车辆行人检测数据集配置
path: ../datasets/person_car_detection
train: images/train # 训练集路径
val: images/val # 验证集路径
test: images/test # 测试集路径
# 类别信息
nc: 2 # 类别数量
names: ['person', 'car'] # 类别名称
# 数据增强参数
augmentation:
hsv_h: 0.015 # 色调增强幅度
hsv_s: 0.7 # 饱和度增强幅度
hsv_v: 0.4 # 明度增强幅度
degrees: 10.0 # 旋转角度范围
translate: 0.1 # 平移幅度
scale: 0.5 # 缩放幅度
shear: 0.0 # 剪切幅度
perspective: 0.0005 # 透视变换
flipud: 0.0 # 上下翻转概率
fliplr: 0.5 # 左右翻转概率
数据集制作流程
-
数据采集阶段
-
整合公开数据集(COCO、Cityscapes等)
-
自建采集团队使用多种设备(监控摄像头、行车记录仪、无人机)采集数据
-
确保场景多样性(不同时间、天气、地点)
-
-
数据清洗阶段
-
剔除模糊、过曝、低质量图像
-
去除无有效目标的空场景
-
平衡不同场景的数据分布
-
-
数据标注阶段
-
使用专业标注工具(Label Studio)进行标注
-
标注规范:
-
行人:包括全身可见的行人,部分遮挡需标注可见部分
-
车辆:包含完整车辆轮廓,区分不同类型车辆
-
-
实施三级质检流程(标注员自检、组长复核、专家抽查)
-
-
数据增强阶段
-
基础增强:
-
随机旋转
-
色彩抖动(亮度、对比度、饱和度调整)
-
随机裁剪和缩放
-
-
高级增强:
-
Mosaic增强(四图拼接)
-
MixUp增强(两图混合)
-
模拟雨天/雾天特效
-
-
-
数据集划分
-
严格按场景划分训练集和验证集
-
确保同一地点的不同时段图像不会同时出现在训练和验证集
-
验证集包含所有典型场景的代表性样本
-
-
四、项目环境配置
创建虚拟环境
首先新建一个Anaconda环境,每个项目用不同的环境,这样项目中所用的依赖包互不干扰。
终端输入
conda create -n yolov10 python==3.9
激活虚拟环境
conda activate yolov10
安装cpu版本pytorch
pip install torch torchvision torchaudio
pycharm中配置anaconda
安装所需要库
pip install -r requirements.txt
五、模型训练
训练代码
from ultralytics import YOLOv10
model_path = 'yolov10s.pt'
data_path = 'datasets/data.yaml'
if __name__ == '__main__':
model = YOLOv10(model_path)
results = model.train(data=data_path,
epochs=500,
batch=64,
device='0',
workers=0,
project='runs/detect',
name='exp',
)
根据实际情况更换模型 yolov10n.yaml (nano):轻量化模型,适合嵌入式设备,速度快但精度略低。 yolov10s.yaml (small):小模型,适合实时任务。 yolov10m.yaml (medium):中等大小模型,兼顾速度和精度。 yolov10b.yaml (base):基本版模型,适合大部分应用场景。 yolov10l.yaml (large):大型模型,适合对精度要求高的任务。
--batch 64
:每批次64张图像。--epochs 500
:训练500轮。--datasets/data.yaml
:数据集配置文件。--weights yolov10s.pt
:初始化模型权重,yolov10s.pt
是预训练的轻量级YOLO模型。
训练结果
六、核心代码
import sys
import cv2
import numpy as np
from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog
from PyQt5.QtCore import QThread, pyqtSignal
from ultralytics import YOLOv10
from UiMain import UiMainWindow
import time
import os
class DetectionThread(QThread):
frame_received = pyqtSignal(np.ndarray, np.ndarray, list) # 原始帧, 检测帧, 检测结果
finished_signal = pyqtSignal() # 线程完成信号
def __init__(self, model, source, conf, iou, parent=None):
super().__init__(parent)
self.model = model
self.source = source
self.conf = conf
self.iou = iou
self.running = True
def run(self):
try:
if isinstance(self.source, int) or self.source.endswith(('.mp4', '.avi', '.mov')): # 视频或摄像头
cap = cv2.VideoCapture(self.source)
while self.running and cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 保存原始帧
original_frame = frame.copy()
# 检测
results = self.model(frame, conf=self.conf, iou=self.iou)
annotated_frame = results[0].plot()
# 提取检测结果
detections = []
for result in results:
for box in result.boxes:
class_id = int(box.cls)
class_name = self.model.names[class_id]
confidence = float(box.conf)
x, y, w, h = box.xywh[0].tolist()
detections.append((class_name, confidence, x, y))
# 发送信号
self.frame_received.emit(
cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB),
cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB),
detections
)
# 控制帧率
time.sleep(0.03) # 约30fps
cap.release()
else: # 图片
frame = cv2.imread(self.source)
if frame is not None:
original_frame = frame.copy()
results = self.model(frame, conf=self.conf, iou=self.iou)
annotated_frame = results[0].plot()
# 提取检测结果
detections = []
for result in results:
for box in result.boxes:
class_id = int(box.cls)
class_name = self.model.names[class_id]
confidence = float(box.conf)
x, y, w, h = box.xywh[0].tolist()
detections.append((class_name, confidence, x, y))
self.frame_received.emit(
cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB),
cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB),
detections
)
except Exception as e:
print(f"Detection error: {e}")
finally:
self.finished_signal.emit()
def stop(self):
self.running = False
class MainWindow(UiMainWindow):
def __init__(self):
super().__init__()
# 初始化模型
self.model = None
self.detection_thread = None
self.current_image = None
self.current_result = None
self.video_writer = None
self.is_camera_running = False
self.is_video_running = False
self.last_detection_result = None # 新增:保存最后一次检测结果
# 连接按钮信号
self.image_btn.clicked.connect(self.detect_image)
self.video_btn.clicked.connect(self.detect_video)
self.camera_btn.clicked.connect(self.detect_camera)
self.stop_btn.clicked.connect(self.stop_detection)
self.save_btn.clicked.connect(self.save_result)
# 初始化模型
self.load_model()
def load_model(self):
try:
model_name = self.model_combo.currentText()
self.model = YOLOv10(f"{model_name}.pt") # 自动下载或加载本地模型
self.update_status(f"模型 {model_name} 加载成功")
except Exception as e:
QMessageBox.critical(self, "错误", f"模型加载失败: {str(e)}")
self.update_status("模型加载失败")
def detect_image(self):
if self.detection_thread and self.detection_thread.isRunning():
QMessageBox.warning(self, "警告", "请先停止当前检测任务")
return
file_path, _ = QFileDialog.getOpenFileName(
self, "选择图片", "", "图片文件 (*.jpg *.jpeg *.png *.bmp)")
if file_path:
self.clear_results()
self.current_image = cv2.imread(file_path)
self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_BGR2RGB)
self.display_image(self.original_image_label, self.current_image)
# 创建检测线程
conf = self.confidence_spinbox.value()
iou = self.iou_spinbox.value()
self.detection_thread = DetectionThread(self.model, file_path, conf, iou)
self.detection_thread.frame_received.connect(self.on_frame_received)
self.detection_thread.finished_signal.connect(self.on_detection_finished)
self.detection_thread.start()
self.update_status(f"正在检测图片: {os.path.basename(file_path)}")
def detect_video(self):
if self.detection_thread and self.detection_thread.isRunning():
QMessageBox.warning(self, "警告", "请先停止当前检测任务")
return
file_path, _ = QFileDialog.getOpenFileName(
self, "选择视频", "", "视频文件 (*.mp4 *.avi *.mov)")
if file_path:
self.clear_results()
self.is_video_running = True
# 初始化视频写入器
cap = cv2.VideoCapture(file_path)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
cap.release()
# 创建保存路径
save_dir = "results"
os.makedirs(save_dir, exist_ok=True)
timestamp = time.strftime("%Y%m%d_%H%M%S")
save_path = os.path.join(save_dir, f"result_{timestamp}.mp4")
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
self.video_writer = cv2.VideoWriter(save_path, fourcc, fps, (frame_width, frame_height))
# 创建检测线程
conf = self.confidence_spinbox.value()
iou = self.iou_spinbox.value()
self.detection_thread = DetectionThread(self.model, file_path, conf, iou)
self.detection_thread.frame_received.connect(self.on_frame_received)
self.detection_thread.finished_signal.connect(self.on_detection_finished)
self.detection_thread.start()
self.update_status(f"正在检测视频: {os.path.basename(file_path)}")
def detect_camera(self):
if self.detection_thread and self.detection_thread.isRunning():
QMessageBox.warning(self, "警告", "请先停止当前检测任务")
return
self.clear_results()
self.is_camera_running = True
# 创建检测线程 (默认使用摄像头0)
conf = self.confidence_spinbox.value()
iou = self.iou_spinbox.value()
self.detection_thread = DetectionThread(self.model, 0, conf, iou)
self.detection_thread.frame_received.connect(self.on_frame_received)
self.detection_thread.finished_signal.connect(self.on_detection_finished)
self.detection_thread.start()
self.update_status("正在从摄像头检测...")
def stop_detection(self):
if self.detection_thread and self.detection_thread.isRunning():
self.detection_thread.stop()
self.detection_thread.quit()
self.detection_thread.wait()
if self.video_writer:
self.video_writer.release()
self.video_writer = None
self.is_camera_running = False
self.is_video_running = False
self.update_status("检测已停止")
def on_frame_received(self, original_frame, result_frame, detections):
# 更新原始图像和结果图像
self.display_image(self.original_image_label, original_frame)
self.display_image(self.result_image_label, result_frame)
# 保存当前结果帧用于后续保存
self.last_detection_result = result_frame # 新增:保存检测结果
# 更新表格
self.clear_results()
for class_name, confidence, x, y in detections:
self.add_detection_result(class_name, confidence, x, y)
# 保存视频帧
if self.video_writer:
self.video_writer.write(cv2.cvtColor(result_frame, cv2.COLOR_RGB2BGR))
def on_detection_finished(self):
if self.video_writer:
self.video_writer.release()
self.video_writer = None
self.update_status("视频检测完成,结果已保存")
elif self.is_camera_running:
self.update_status("摄像头检测已停止")
else:
self.update_status("图片检测完成")
def save_result(self):
if not hasattr(self, 'last_detection_result') or self.last_detection_result is None:
QMessageBox.warning(self, "警告", "没有可保存的检测结果")
return
save_dir = "results"
os.makedirs(save_dir, exist_ok=True)
timestamp = time.strftime("%Y%m%d_%H%M%S")
if self.is_camera_running or self.is_video_running:
# 保存当前帧为图片
save_path = os.path.join(save_dir, f"snapshot_{timestamp}.jpg")
cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR))
self.update_status(f"截图已保存: {save_path}")
else:
# 保存图片检测结果
save_path = os.path.join(save_dir, f"result_{timestamp}.jpg")
cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR))
self.update_status(f"检测结果已保存: {save_path}")
def closeEvent(self, event):
self.stop_detection()
event.accept()
if __name__ == "__main__":
app = QApplication(sys.argv)
# 设置应用程序样式
app.setStyle("Fusion")
# 创建并显示主窗口
window = MainWindow()
window.show()
sys.exit(app.exec_())
七、项目源码(视频下方简介内)
完整全部资源文件(包括测试图片、视频,py文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
基于深度学习YOLOv10的车辆行人检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)_哔哩哔哩_bilibili
基于深度学习YOLOv10的车辆行人检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)