news 2026/4/16 3:49:03

基于深度学习YOLOv12的交通标志识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习YOLOv12的交通标志识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍

本项目开发了一套基于深度学习YOLOv12模型的交通标志智能检测与识别系统,能够准确识别83类常见交通标志,包括禁令标志(如"No Entry"、"No Parking")、警告标志(如"Falling Rocks"、"Pedestrian Crossing")、指示标志(如"Ahead Only"、"Roundabout")以及多种限速标志(如"Speed Limit 30"、"Speed Limit 120")。系统采用PyTorch框架实现,使用包含12,356张训练图像、1,266张验证图像和654张测试图像的高质量数据集进行模型训练和评估,数据经过严格标注和增强处理以确保模型在复杂场景下的鲁棒性。项目创新性地集成了用户友好的图形化界面(UI),支持用户登录注册、图片/视频上传及实时检测功能,检测结果可视化展示,便于实际应用。系统具有高精度、高效率的特点,可广泛应用于智能交通管理、自动驾驶辅助、道路安全监控等领域,为智慧城市建设提供可靠的技术支持。代码结构清晰,模块化设计便于功能扩展和性能优化,具有重要的实用价值和科研意义。

目录

一、项目介绍

二、项目功能展示

2.1 用户登录系统

2.2 检测功能

2.3 检测结果显示

2.4 参数配置

2.5 其他功能

3. 技术特点

4. 系统流程

三、数据集介绍

2. 数据集划分

3. 数据特点

数据集配置文件

四、项目环境配置

创建虚拟环境

安装所需要库

五、模型训练

训练代码

训练结果

六、核心代码

🔐登录注册验证

🎯 多重检测模式

🖼️ 沉浸式可视化

⚙️ 参数配置系统

✨ UI美学设计

🔄 智能工作流

七、项目源码(视频简介)


基于深度学习YOLOv12的交通标志识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习YOLOv12的交通标志识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

二、项目功能展示

✅ 用户登录注册:支持密码检测和安全性验证。

✅ 三种检测模式:基于YOLOv12模型,支持图片、视频和实时摄像头三种检测,精准识别目标。

✅ 双画面对比:同屏显示原始画面与检测结果。

✅ 数据可视化:实时表格展示检测目标的类别、置信度及坐标。

✅智能参数调节:提供置信度滑块,动态优化检测精度,适应不同场景需求。

✅科幻风交互界面:深色主题搭配动态光效,减少视觉疲劳,提升操作体验。

✅多线程高性能架构:独立检测线程保障流畅运行,实时状态提示,响应迅速无卡顿。

2.1 用户登录系统

  • 提供用户登录和注册功能

  • 用户名和密码验证

  • 账户信息本地存储(accounts.json)

  • 密码长度至少6位的安全要求

2.2 检测功能

  • 图片检测:支持JPG/JPEG/PNG/BMP格式图片的火焰烟雾检测

  • 视频检测:支持MP4/AVI/MOV格式视频的逐帧检测

  • 摄像头检测:实时摄像头流检测(默认摄像头0)

  • 检测结果保存到"results"目录

2.3 检测结果显示

  • 显示原始图像和检测结果图像

  • 检测结果表格展示,包含:

    • 检测到的类别

    • 置信度分数

    • 物体位置坐标(x,y)、

2.4 参数配置

  • 模型选择

  • 置信度阈值调节(0-1.0)

  • IoU(交并比)阈值调节(0-1.0)

  • 实时同步滑块和数值输入框

2.5 其他功能

  • 检测结果保存功能

  • 视频检测时自动保存结果视频

  • 状态栏显示系统状态和最后更新时间

  • 无边框窗口设计,可拖动和调整大小

3. 技术特点

  • 采用多线程处理检测任务,避免界面卡顿

  • 精美的UI设计,具有科技感的视觉效果:

    • 发光边框和按钮

    • 悬停和按下状态效果

    • 自定义滑块、表格和下拉框样式

  • 检测结果保存机制

  • 响应式布局,适应不同窗口大小

4. 系统流程

  1. 用户登录/注册

  2. 选择检测模式(图片/视频/摄像头)

  3. 调整检测参数(可选)

  4. 开始检测并查看结果

  5. 可选择保存检测结果

  6. 停止检测或切换其他模式

三、数据集介绍

本系统使用的交通标志数据集包含83 类常见标志,涵盖限速标志、禁令标志、警告标志、指示标志等,如:

  • 禁令类No EntryNo ParkingNo Overtaking

  • 警告类Falling RocksSlippery RoadPedestrian Crossing

  • 指示类Ahead OnlyTurn RightRoundabout

  • 限速类Speed Limit 30Speed Limit 80Speed Limit 120

2. 数据集划分
  • 训练集:12,356 张(用于模型训练)

  • 验证集:1,266 张(用于调参和模型选择)

  • 测试集:654 张(用于最终性能评估)

数据集经过标注(bounding box)和增强处理(如旋转、亮度调整),以提高模型的泛化能力。

3. 数据特点
  • 多样性:覆盖不同天气(雾天、雪天)、光照条件(白天、夜晚)和复杂道路场景。

  • 平衡性:各类别样本分布相对均衡,避免模型过拟合少数类别。

  • 高质量标注:采用YOLO 格式标注class_id, x_center, y_center, width, height),确保检测精度。

数据集配置文件

数据集采用标准化YOLO格式组织:

train: F:\YOLO交通标志检测数据集\images\train val: F:\YOLO交通标志检测数据集\images\val test: # test images (optional) nc: 83 names: ['Children', 'Entering city', 'Exiting city', 'Falling rocks', 'Fog', 'Give way', 'Ice or snow', 'Intersection with priority', 'Intersection without priority', 'Level crossing -multiple tracks-', 'Level crossing 160m', 'Level crossing 240m', 'Level crossing 80m', 'Level crossing with barriers ahead', 'Level crossing without barriers ahead', 'Level crossing', 'Loose surface material', 'Low-flying aircraft', 'No heavy goods vehicles', 'No left turn', 'No overtaking by heavy goods vehicles', 'No right turn', 'No vehicles carrying dangerous goods', 'No vehicles', 'One-way street', 'Opening bridge', 'Parking zone', 'Pedestrian crossing', 'Pedestrians', 'Priority over oncoming traffic', 'Right curve', 'Road narrows', 'Roadworks', 'Series of curves', 'Slippery surface', 'Soft verges', 'Steep ascent', 'Steep descent', 'Traffic queues', 'Traffic signals', 'Trams', 'Tunnel', 'Two-way traffic', 'Unprotected quayside or riverbank', 'Wild animals', 'ahead only', 'ahead or right', 'bumpy road', 'crosswalk', 'do_not_enter', 'end ofSpeed limit 70', 'general caution', 'keep right', 'left curve', 'no admittance', 'no overtakes', 'no stopping', 'no_parking', 'priority road', 'road work', 'roundabout', 'slippery road', 'speed limit -100-', 'speed limit -110-', 'speed limit -120-', 'speed limit -130-', 'speed limit -20-', 'speed limit -30-', 'speed limit -40-', 'speed limit -5-', 'speed limit -50-', 'speed limit -60-', 'speed limit -70-', 'speed limit -80-', 'speed limit -90-', 'stop', 'traffic light- green', 'traffic light- red', 'trafic light- red', 'turn left orright only', 'turn right only', 'yellow', 'yield']

四、项目环境配置

创建虚拟环境

首先新建一个Anaconda环境,每个项目用不同的环境,这样项目中所用的依赖包互不干扰。

终端输入

conda create -n yolov12 python==3.9

激活虚拟环境

conda activate yolov12

安装cpu版本pytorch

pip install torch torchvision torchaudio

安装所需要库

pip install -r requirements.txt

pycharm中配置anaconda

五、模型训练

训练代码

from ultralytics import YOLO model_path = 'yolo12s.pt' data_path = 'data.yaml' if __name__ == '__main__': model = YOLO(model_path) results = model.train(data=data_path, epochs=100, batch=8, device='0', workers=0, project='runs', name='exp', )
根据实际情况更换模型 # yolov12n.yaml (nano):轻量化模型,适合嵌入式设备,速度快但精度略低。 # yolov12s.yaml (small):小模型,适合实时任务。 # yolov12m.yaml (medium):中等大小模型,兼顾速度和精度。 # yolov12b.yaml (base):基本版模型,适合大部分应用场景。 # yolov12l.yaml (large):大型模型,适合对精度要求高的任务。
  • --batch 8:每批次8张图像。
  • --epochs 100:训练100轮。
  • --datasets/data.yaml:数据集配置文件。
  • --weights yolov12s.pt:初始化模型权重,yolov12s.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 YOLO from UiMain import UiMainWindow import time import os from PyQt5.QtWidgets import QDialog from LoginWindow import LoginWindow 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 = YOLO(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("正在从摄像头检测...")

🔐登录注册验证

对应文件:LoginWindow.py

# 账户验证核心逻辑 def handle_login(self): username = self.username_input.text().strip() password = self.password_input.text().strip() if not username or not password: QMessageBox.warning(self, "警告", "用户名和密码不能为空!") return if username in self.accounts and self.accounts[username] == password: self.accept() # 验证通过 else: QMessageBox.warning(self, "错误", "用户名或密码错误!") # 密码强度检查(注册时) def handle_register(self): if len(password) < 6: # 密码长度≥6位 QMessageBox.warning(self, "警告", "密码长度至少为6位!")

🎯多重检测模式

对应文件:main.py

图片检测

def detect_image(self): file_path, _ = QFileDialog.getOpenFileName( self, "选择图片", "", "图片文件 (*.jpg *.jpeg *.png *.bmp)") if file_path: self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.start() # 启动检测线程

视频检测

def detect_video(self): file_path, _ = QFileDialog.getOpenFileName( self, "选择视频", "", "视频文件 (*.mp4 *.avi *.mov)") if file_path: self.video_writer = cv2.VideoWriter() # 初始化视频写入器 self.detection_thread = DetectionThread(self.model, file_path, conf, iou)

实时摄像头

def detect_camera(self): self.detection_thread = DetectionThread(self.model, 0, conf, iou) # 摄像头设备号0 self.detection_thread.start()

🖼️沉浸式可视化

对应文件:UiMain.py

双画面显示

def display_image(self, label, image): q_img = QImage(image.data, w, h, bytes_per_line, QImage.Format_RGB888) pixmap = QPixmap.fromImage(q_img) label.setPixmap(pixmap.scaled(label.size(), Qt.KeepAspectRatio)) # 自适应缩放

结果表格

def add_detection_result(self, class_name, confidence, x, y): self.results_table.insertRow(row) items = [ QTableWidgetItem(class_name), # 类别列 QTableWidgetItem(f"{confidence:.2f}"), # 置信度 QTableWidgetItem(f"{x:.1f}"), # X坐标 QTableWidgetItem(f"{y:.1f}") # Y坐标 ]

⚙️参数配置系统

对应文件:UiMain.py

双阈值联动控制

# 置信度阈值同步 def update_confidence(self, value): confidence = value / 100.0 self.confidence_spinbox.setValue(confidence) # 滑块→数值框 self.confidence_label.setText(f"置信度阈值: {confidence:.2f}") # IoU阈值同步 def update_iou(self, value): iou = value / 100.0 self.iou_spinbox.setValue(iou)

UI美学设计

对应文件:UiMain.py

科幻风格按钮

def create_button(self, text, color): return f""" QPushButton {{ border: 1px solid {color}; color: {color}; border-radius: 6px; }} QPushButton:hover {{ background-color: {self.lighten_color(color, 10)}; box-shadow: 0 0 10px {color}; # 悬停发光效果 }} """

动态状态栏

def update_status(self, message): self.status_bar.showMessage( f"状态: {message} | 最后更新: {time.strftime('%H:%M:%S')}" # 实时时间戳 )

🔄智能工作流

对应文件:main.py

线程管理

class DetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray, list) # 信号量通信 def run(self): while self.running: # 多线程检测循环 results = self.model(frame, conf=self.conf, iou=self.iou) self.frame_received.emit(original_frame, result_frame, detections)

七、项目源码(视频简介)

演示与介绍视频:

基于深度学习YOLOv12的交通标志识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习YOLOv12的交通标志识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 7:37:18

中文英文翻译

export default {project: {title: "KOI-ADMIN"},menu: {login: {auth: "登录",title: "KOI-ADMIN 管理平台",welcome: "欢迎登录",platform: "管理平台",description: "或许我们只是差点运气",account: "账…

作者头像 李华
网站建设 2026/4/16 7:35:42

Spark SQL与数据立方体:构建高效大数据分析平台

Spark SQL与数据立方体:构建高效大数据分析平台 关键词:Spark SQL、数据立方体、大数据分析、高效平台、数据处理 摘要:本文围绕Spark SQL与数据立方体展开,深入探讨如何利用它们构建高效的大数据分析平台。首先介绍了相关背景知识,包括Spark SQL和数据立方体的基本概念。…

作者头像 李华
网站建设 2026/4/16 7:37:10

使用vue时的一些注意事项

1.vue2开发中一些注意事项 1.1数据响应式问题 // ❌ Bug&#xff1a;直接通过索引修改数组元素不会触发更新 this.items[0] new value// ❌ 修改数组长度不会触发更新 this.items.length 0解决方案&#xff1a; // ✅ 使用Vue.set或$set this.$set(this.items, 0, new value)…

作者头像 李华
网站建设 2026/4/16 7:35:40

拣货慢、错发多?1个策略,让东南亚海外仓一件代发效率翻倍!

做东南亚海外仓的同行都懂&#xff0c;最头疼的不是整箱入库&#xff0c;而是零散订单——Shopee、Lazada、TikTok Shop本土零售单、退货单&#xff0c;稍不注意就错发漏发、库存对账难&#xff0c;既耗人力又丢客户。行业数据显示&#xff0c;像一件代发这种拆零拣货占会整个仓…

作者头像 李华
网站建设 2026/4/16 7:37:09

大模型落地实践:97个精选案例助你掌握AI前沿应用技术

《大模型典型示范应用案例集》由阿里云携手99家合作伙伴共同发布&#xff0c;从数百个案例中精选97个优秀案例&#xff0c;分为行业赋能、智能应用和生态服务三类&#xff0c;覆盖医疗、金融、能源等多领域。报告显示上海成为大模型应用热土&#xff0c;大中型企业是主要试验场…

作者头像 李华
网站建设 2026/4/15 22:16:10

2026云+AI应用研究报告:行业大模型落地实战指南

行业大模型是产业智能化升级的关键引擎&#xff0c;云计算已跃升为AI创新核心支撑。AI行业云平台凭借数据基础、安全合规、应用生态等五大优势&#xff0c;成为行业AI应用最佳载体&#xff0c;提供高质量数据、安全机制并降低开发门槛。"AI大模型领地"知识星球提供1万…

作者头像 李华