基于深度学习YOLOv8的安全锥识别检测体系(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

[复制链接]
发表于 2025-6-8 02:24:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、项目介绍

择要

本项目基于前沿的YOLOv8目标检测算法,研发了一套高效精准的安全锥识别检测体系,专门用于识别道路施工、事故现场等场景中的安全锥设施。体系采用深度学习技术,在包罗5,960张训练图像、341张验证图像和170张测试图像的专业数据集上进行模型训练和优化,确保在各种复杂道路环境下都能实现高精度的安全锥检测。
该检测体系具备实时识别、精确定位和智能分析功能,可广泛应用于智能交通管理、道路施工监控监控、自动驾驶环境感知等领域。体系支持多种部署方式,包括固定监控监控摄像头、车载移动设备和无人机航拍等,能够适应差异应用场景的需求。相较于传统人工巡查方式,本体系可明显提升安全锥检测的效率和精确性,为道路交通安全提供智能化保障。
项目意义

1. 提升道路施工安全管理程度

在道路施工和维护作业中,安全锥的精确摆放对保障施工人员和过往车辆安全至关紧张。本体系的应用可以:


  • 实时监测施工区域安全锥摆放环境
  • 及时发现缺失或倾倒的安全锥
  • 自动预警非常环境
  • 记载施工区域安全状态
  • 生成合规性报告
这种智能化监测手段将大幅提升道路施工安全管理程度,有效防备因安全设施不到位导致的事故。
2. 增强交通事故现场管理能力

在交通事故处理现场,安全锥的快速精确布置直接影响现场安全。本体系能够:


  • 自动识别事故现场安全锥布置环境
  • 评估安全区域设置是否公道
  • 提示执法人员补充缺失的安全锥
  • 记载现场安全步伐执行环境
这将明显提高事故现场处置效率和安全性,降低二次事故风险。
3. 为自动驾驶体系提供环境感知支持

自动驾驶车辆需要精确识别道路上的暂时安全设施。本体系可以:


  • 为自动驾驶体系提供安全锥检测能力
  • 辅助车辆提前预判施工区域
  • 优化自动驾驶路径规划
  • 提升特殊路况下的行驶安全性
这一功能将有效弥补现有自动驾驶体系在暂时道路设施识别方面的不敷。
4. 优化城市聪明交通管理

本体系可与城市聪明交通平台集成,实现:


  • 施工区域电子围栏动态管理
  • 道路安全设施数字化监控监控
  • 交通管制区域智能识别
  • 道路非常环境自动上报
这种智能化管理方式将大幅提升城市交通管理效率和精细化程度。
5. 提高道路巡检效率和精确性

传统人工巡检方式存在效率低、本钱高、易遗漏等题目。本体系能够:


  • 实现道路安全设施自动化巡检
  • 大幅提升巡检效率和覆盖率
  • 降低人力本钱和管理本钱
  • 提供客观精确的检测数据
  • 支持汗青数据比对分析
这将彻底改变传统道路巡检模式,推动行业数字化转型。
6. 计算机视觉技术在交通领域的创新应用

本项目针对交通场景的特殊需求进行了多项技术创新:


  • 优化了差异光照条件下的检测性能
  • 提升了小尺寸安全锥的识别精确率
  • 办理了密集摆放场景下的检测难题
  • 开发了适应多种视角的鲁棒算法
  • 实现了移动平台上的实时检测
这些技术创新为计算机视觉在智能交通领域的应用提供了紧张参考。
应用远景

本体系具有广阔的应用远景,可扩展至:


  • 高速公路智能监控体系
  • 城市道路施工数字化管理
  • 应急救济现场安全管理
  • 特种车辆安全预警体系
  • 聪明城市基础设施管理
随着智能交通建设的加快推进,安全锥识别检测体系将成为道路安全管理的紧张技术支持,具有明显的社会效益和商业代价。
总结

YOLOv8安全锥识别检测体系的研发和应用,代表了人工智能技术在交通安全领域的紧张突破。该体系不仅能够提升道路施工和事故现场的安全管理程度,还能为自动驾驶和聪明交通发展提供技术支持。将来,随着技术的不停优化和应用场景的拓展,该体系将在道路交通安全领域发挥更加紧张的作用,为构建更安全、更智能的交通环境做出贡献。


目次
一、项目介绍
择要
项目意义
二、项目功能展示
体系功能
图片检测
视频检测
摄像头实时检测
三、数据集介绍
数据集概述
数据集特点
数据集设置文件
数据集制作流程
四、项目环境设置
创建假造环境
pycharm中设置anaconda
安装所需要库
五、模型训练
训练代码
训练结果
六、核心代码​
七、项目源码(视频简介内)



基于深度学习YOLOv8的安全锥识别检测体系(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)_哔哩哔哩_bilibili
     基于深度学习YOLOv8的安全锥识别检测体系(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  
二、项目功能展示

体系功能

✅ 图片检测:可对图片进行检测,返回检测框及类别信息。
✅ 视频检测:支持视频文件输入,检测视频中每一帧的环境。
✅ 摄像头实时检测:连接USB 摄像头,实现实时监测。
✅参数实时调治(置信度和IoU阈值)





  • 图片检测
        该功能答应用户通过单张图片进行目标检测。输入一张图片后,YOLO模型会实时分析图像,识别出其中的目标,并在图像中框出检测到的目标,输出带有目标框的图像。批量图片检测
        用户可以一次性上传多个图片进行批量处理。该功能支持对多个图像文件进行并行处理,并返回每张图像的目标检测结果,适用于需要大规模处理图像数据的应用场景。



  • 视频检测
        视频检测功能答应用户将视频文件作为输入。YOLO模型将逐帧分析视频,并在每一帧中标记出检测到的目标。最闭幕果可以是带有目标框的视频文件或实时展示,适用于视频监控和分析等场景。


  • 摄像头实时检测
        该功能支持通过连接摄像头进行实时目标检测。YOLO模型能够在摄像头拍摄的实时视频流中进行目标检测,实时识别并显示检测结果。此功能非常适用于安防监控、无人驾驶、智能交通等应用,提供即时反馈。

核心特点:


  • 高精度:基于YOLO模型,提供精确的目标检测能力,适用于差异类型的图像和视频。
  • 实时性:特别优化的算法使得实时目标检测成为可能,无论是在视频照旧摄像头实时检测中,响应速度都非常快。
  • 批量处理:支持高效的批量图像和视频处理,适合大规模数据分析。

三、数据集介绍

数据集概述

本项目标核心数据集是专门为安全锥识别使命构建的自界说数据集,共包罗6,471张高质量标注图像,按照8:1:1的比例划分为训练集(5,960张)、验证集(341张)和测试集(170张)。全部图像均颠末专业标注人员进行精确标注,确保边界框的精确性和同等性。
数据集特点


  • 多样性:

    • 覆盖多种环境条件(白天、夜晚、阴天、雨天等)
    • 包罗差异角度和间隔的拍摄视角
    • 安全锥出现多种状态(直立、倾倒、部门遮挡等)
    • 来自差异品牌和型号的安全锥样本

  • 挑战性场景:

    • 复杂背景干扰(如施工现场、车流密集道路)
    • 小目标检测(远间隔拍摄的小尺寸安全锥)
    • 遮挡环境(部门被车辆、行人或其他物体遮挡的安全锥)
    • 光照变化(强光反射、低光照条件等)

  • 标注质量:

    • 全部图像均采用矩形边界框精确标注
    • 标注颠末多重质量校验流程
    • 包罗困难样本的特殊标记

  • 数据平衡性:

    • 正负样本比例公道
    • 各类场景分布平衡
    • 差异尺寸安全锥样本分布均匀

数据集设置文件

项目采用YOLO格式:
  1. train: F:\安全锥识别检测数据集\train\images
  2. val: F:\安全锥识别检测数据集\valid\images
  3. test: F:\安全锥识别检测数据集\test\images
  4. nc: 1
  5. names: ['Safety Cone']
复制代码
数据集制作流程


  • 数据收罗:

    • 使用多种设备(专业相机、行车记载仪、监控摄像头等)收罗原始图像和视频
    • 覆盖差异时段、天气条件和场景类型
    • 通过屏幕截图补充部门网络公开数据(确保符合使用规范)

  • 数据预处理:

    • 图像去重和清洗
    • 分辨率标准化
    • 色彩空间统一
    • 视频帧提取和关键帧选择

  • 标注过程:

    • 使用LabelImg或CVAT等标注工具进行人工标注
    • 标注规范制定(包括边界框紧密度要求、遮挡处理规则等)
    • 质量抽检

  • 数据增强:

    • 离线增强:镜像翻转、色彩抖动、随机裁剪等
    • 在线增强:Mosaic、MixUp等YOLO专用增强技术

  • 数据集划分:

    • 按场景类型分层抽样,确保各子集分布同等
    • 保持同一视频的帧不会同时出现在训练集和测试集
    • 特殊保存极端案例作为测试集挑战样本

  • 版本控制:

    • 使用DVC(Data Version Control)管理数据集版本
    • 记载每个版本的变化和性能影响
    • 维护数据变动日志日志



四、项目环境设置

创建假造环境

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

终端输入
conda create -n yolov8 python==3.9


激活假造环境
conda activate yolov8
 


安装cpu版本pytorch
  1. pip install torch torchvision torchaudio
复制代码


pycharm中设置anaconda





安装所需要库

pip install -r requirements.txt


五、模型训练

训练代码

  1. from ultralytics import YOLO
  2. model_path = 'yolov8s.pt'
  3. data_path = 'datasets/data.yaml'
  4. if __name__ == '__main__':
  5.     model = YOLO(model_path)
  6.     results = model.train(data=data_path,
  7.                           epochs=500,
  8.                           batch=64,
  9.                           device='0',
  10.                           workers=0,
  11.                           project='runs/detect',
  12.                           name='exp',
  13.                           )
复制代码
  1. 根据实际情况更换模型
  2. yolov8n.yaml (nano):轻量化模型,适合嵌入式设备,速度快但精度略低。
  3. yolov8s.yaml (small):小模型,适合实时任务。
  4. yolov8m.yaml (medium):中等大小模型,兼顾速度和精度。
  5. yolov8b.yaml (base):基本版模型,适合大部分应用场景。
  6. yolov8l.yaml (large):大型模型,适合对精度要求高的任务。
复制代码


  • --batch 64:每批次64张图像。
  • --epochs 500:训练500轮。
  • --datasets/data.yaml:数据集设置文件。
  • --weights yolov8s.pt:初始化模型权重,yolov8s.pt 是预训练的轻量级YOLO模型。

训练结果



六、核心代码


  1. from PyQt5 import QtCore, QtGui, QtWidgets
  2. from PyQt5.QtCore import Qt, QTimer
  3. from PyQt5.QtGui import QImage, QPixmap, QIcon
  4. from PyQt5.QtWidgets import (QFileDialog, QMessageBox, QTableWidgetItem,
  5.                              QStyledItemDelegate, QHeaderView)
  6. import cv2
  7. import numpy as np
  8. from ultralytics import YOLO
  9. import os
  10. import datetime
  11. import sys
  12. class CenteredDelegate(QStyledItemDelegate):
  13.     def initStyleOption(self, option, index):
  14.         super().initStyleOption(option, index)
  15.         option.displayAlignment = Qt.AlignCenter
  16. class Ui_MainWindow(object):
  17.     def setupUi(self, MainWindow):
  18.         MainWindow.setObjectName("MainWindow")
  19.         MainWindow.resize(1400, 900)
  20.         MainWindow.setWindowTitle("YOLOv8 目标检测系统")
  21.         # 设置窗口图标
  22.         if hasattr(sys, '_MEIPASS'):
  23.             icon_path = os.path.join(sys._MEIPASS, 'icon.ico')
  24.         else:
  25.             icon_path = 'icon.ico'
  26.         if os.path.exists(icon_path):
  27.             MainWindow.setWindowIcon(QIcon(icon_path))
  28.         self.centralwidget = QtWidgets.QWidget(MainWindow)
  29.         self.centralwidget.setObjectName("centralwidget")
  30.         # 主布局
  31.         self.main_layout = QtWidgets.QHBoxLayout(self.centralwidget)
  32.         self.main_layout.setContentsMargins(10, 10, 10, 10)
  33.         self.main_layout.setSpacing(15)
  34.         # 左侧布局 (图像显示)
  35.         self.left_layout = QtWidgets.QVBoxLayout()
  36.         self.left_layout.setSpacing(15)
  37.         # 原始图像组
  38.         self.original_group = QtWidgets.QGroupBox("原始图像")
  39.         self.original_group.setMinimumHeight(400)
  40.         self.original_img_label = QtWidgets.QLabel()
  41.         self.original_img_label.setAlignment(QtCore.Qt.AlignCenter)
  42.         self.original_img_label.setText("等待加载图像...")
  43.         self.original_img_label.setStyleSheet("background-color: #F0F0F0; border: 1px solid #CCCCCC;")
  44.         original_layout = QtWidgets.QVBoxLayout()
  45.         original_layout.addWidget(self.original_img_label)
  46.         self.original_group.setLayout(original_layout)
  47.         self.left_layout.addWidget(self.original_group)
  48.         # 检测结果图像组
  49.         self.result_group = QtWidgets.QGroupBox("检测结果")
  50.         self.result_group.setMinimumHeight(400)
  51.         self.result_img_label = QtWidgets.QLabel()
  52.         self.result_img_label.setAlignment(QtCore.Qt.AlignCenter)
  53.         self.result_img_label.setText("检测结果将显示在这里")
  54.         self.result_img_label.setStyleSheet("background-color: #F0F0F0; border: 1px solid #CCCCCC;")
  55.         result_layout = QtWidgets.QVBoxLayout()
  56.         result_layout.addWidget(self.result_img_label)
  57.         self.result_group.setLayout(result_layout)
  58.         self.left_layout.addWidget(self.result_group)
  59.         self.main_layout.addLayout(self.left_layout, stretch=3)
  60.         # 右侧布局 (控制面板)
  61.         self.right_layout = QtWidgets.QVBoxLayout()
  62.         self.right_layout.setSpacing(15)
  63.         # 模型选择组
  64.         self.model_group = QtWidgets.QGroupBox("模型设置")
  65.         self.model_group.setStyleSheet("QGroupBox { font-weight: bold; }")
  66.         self.model_layout = QtWidgets.QVBoxLayout()
  67.         # 模型选择
  68.         self.model_combo = QtWidgets.QComboBox()
  69.         self.model_combo.addItems(["best.pt"])
  70.         self.model_combo.setCurrentIndex(0)
  71.         # 加载模型按钮
  72.         self.load_model_btn = QtWidgets.QPushButton(" 加载模型")
  73.         self.load_model_btn.setIcon(QIcon.fromTheme("document-open"))
  74.         self.load_model_btn.setStyleSheet(
  75.             "QPushButton { padding: 8px; background-color: #4CAF50; color: white; border-radius: 4px; }"
  76.             "QPushButton:hover { background-color: #45a049; }"
  77.         )
  78.         self.model_layout.addWidget(self.model_combo)
  79.         self.model_layout.addWidget(self.load_model_btn)
  80.         self.model_group.setLayout(self.model_layout)
  81.         self.right_layout.addWidget(self.model_group)
  82.         # 参数设置组
  83.         self.param_group = QtWidgets.QGroupBox("检测参数")
  84.         self.param_group.setStyleSheet("QGroupBox { font-weight: bold; }")
  85.         self.param_layout = QtWidgets.QFormLayout()
  86.         self.param_layout.setLabelAlignment(Qt.AlignLeft)
  87.         self.param_layout.setFormAlignment(Qt.AlignLeft)
  88.         self.param_layout.setVerticalSpacing(15)
  89.         # 置信度滑块
  90.         self.conf_slider = QtWidgets.QSlider(Qt.Horizontal)
  91.         self.conf_slider.setRange(1, 99)
  92.         self.conf_slider.setValue(25)
  93.         self.conf_value = QtWidgets.QLabel("0.25")
  94.         self.conf_value.setAlignment(Qt.AlignCenter)
  95.         self.conf_value.setStyleSheet("font-weight: bold; color: #2196F3;")
  96.         # IoU滑块
  97.         self.iou_slider = QtWidgets.QSlider(Qt.Horizontal)
  98.         self.iou_slider.setRange(1, 99)
  99.         self.iou_slider.setValue(45)
  100.         self.iou_value = QtWidgets.QLabel("0.45")
  101.         self.iou_value.setAlignment(Qt.AlignCenter)
  102.         self.iou_value.setStyleSheet("font-weight: bold; color: #2196F3;")
  103.         self.param_layout.addRow("置信度阈值:", self.conf_slider)
  104.         self.param_layout.addRow("当前值:", self.conf_value)
  105.         self.param_layout.addRow(QtWidgets.QLabel(""))  # 空行
  106.         self.param_layout.addRow("IoU阈值:", self.iou_slider)
  107.         self.param_layout.addRow("当前值:", self.iou_value)
  108.         self.param_group.setLayout(self.param_layout)
  109.         self.right_layout.addWidget(self.param_group)
  110.         # 功能按钮组
  111.         self.func_group = QtWidgets.QGroupBox("检测功能")
  112.         self.func_group.setStyleSheet("QGroupBox { font-weight: bold; }")
  113.         self.func_layout = QtWidgets.QVBoxLayout()
  114.         self.func_layout.setSpacing(10)
  115.         # 图片检测按钮
  116.         self.image_btn = QtWidgets.QPushButton(" 图片检测")
  117.         self.image_btn.setIcon(QIcon.fromTheme("image-x-generic"))
  118.         # 视频检测按钮
  119.         self.video_btn = QtWidgets.QPushButton(" 视频检测")
  120.         self.video_btn.setIcon(QIcon.fromTheme("video-x-generic"))
  121.         # 摄像头检测按钮
  122.         self.camera_btn = QtWidgets.QPushButton(" 摄像头检测")
  123.         self.camera_btn.setIcon(QIcon.fromTheme("camera-web"))
  124.         # 停止检测按钮
  125.         self.stop_btn = QtWidgets.QPushButton(" 停止检测")
  126.         self.stop_btn.setIcon(QIcon.fromTheme("process-stop"))
  127.         self.stop_btn.setEnabled(False)
  128.         # 保存结果按钮
  129.         self.save_btn = QtWidgets.QPushButton(" 保存结果")
  130.         self.save_btn.setIcon(QIcon.fromTheme("document-save"))
  131.         self.save_btn.setEnabled(False)
  132.         # 设置按钮样式
  133.         button_style = """
  134.         QPushButton {
  135.             padding: 10px;
  136.             background-color: #2196F3;
  137.             color: white;
  138.             border: none;
  139.             border-radius: 4px;
  140.             text-align: left;
  141.         }
  142.         QPushButton:hover {
  143.             background-color: #0b7dda;
  144.         }
  145.         QPushButton:disabled {
  146.             background-color: #cccccc;
  147.         }
  148.         """
  149.         for btn in [self.image_btn, self.video_btn, self.camera_btn,
  150.                     self.stop_btn, self.save_btn]:
  151.             btn.setStyleSheet(button_style)
  152.             self.func_layout.addWidget(btn)
  153.         self.func_group.setLayout(self.func_layout)
  154.         self.right_layout.addWidget(self.func_group)
  155.         # 检测结果表格组
  156.         self.table_group = QtWidgets.QGroupBox("检测结果详情")
  157.         self.table_group.setStyleSheet("QGroupBox { font-weight: bold; }")
  158.         self.table_layout = QtWidgets.QVBoxLayout()
  159.         self.result_table = QtWidgets.QTableWidget()
  160.         self.result_table.setColumnCount(4)
  161.         self.result_table.setHorizontalHeaderLabels(["类别", "置信度", "左上坐标", "右下坐标"])
  162.         self.result_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
  163.         self.result_table.verticalHeader().setVisible(False)
  164.         self.result_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
  165.         self.result_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
  166.         # 设置表格样式
  167.         self.result_table.setStyleSheet("""
  168.             QTableWidget {
  169.                 border: 1px solid #e0e0e0;
  170.                 alternate-background-color: #f5f5f5;
  171.             }
  172.             QHeaderView::section {
  173.                 background-color: #2196F3;
  174.                 color: white;
  175.                 padding: 5px;
  176.                 border: none;
  177.             }
  178.             QTableWidget::item {
  179.                 padding: 5px;
  180.             }
  181.         """)
  182.         # 设置居中代理
  183.         delegate = CenteredDelegate(self.result_table)
  184.         self.result_table.setItemDelegate(delegate)
  185.         self.table_layout.addWidget(self.result_table)
  186.         self.table_group.setLayout(self.table_layout)
  187.         self.right_layout.addWidget(self.table_group, stretch=1)
  188.         self.main_layout.addLayout(self.right_layout, stretch=1)
  189.         MainWindow.setCentralWidget(self.centralwidget)
  190.         # 状态栏
  191.         self.statusbar = QtWidgets.QStatusBar(MainWindow)
  192.         self.statusbar.setStyleSheet("QStatusBar { border-top: 1px solid #c0c0c0; }")
  193.         MainWindow.setStatusBar(self.statusbar)
  194.         # 初始化变量
  195.         self.model = None
  196.         self.cap = None
  197.         self.timer = QTimer()
  198.         self.is_camera_running = False
  199.         self.current_image = None
  200.         self.current_result = None
  201.         self.video_writer = None
  202.         self.output_path = "output"
  203.         # 创建输出目录
  204.         if not os.path.exists(self.output_path):
  205.             os.makedirs(self.output_path)
  206.         # 连接信号槽
  207.         self.load_model_btn.clicked.connect(self.load_model)
  208.         self.image_btn.clicked.connect(self.detect_image)
  209.         self.video_btn.clicked.connect(self.detect_video)
  210.         self.camera_btn.clicked.connect(self.detect_camera)
  211.         self.stop_btn.clicked.connect(self.stop_detection)
  212.         self.save_btn.clicked.connect(self.save_result)
  213.         self.conf_slider.valueChanged.connect(self.update_conf_value)
  214.         self.iou_slider.valueChanged.connect(self.update_iou_value)
  215.         self.timer.timeout.connect(self.update_camera_frame)
  216.         # 设置全局样式
  217.         self.set_style()
  218.     def set_style(self):
  219.         style = """
  220.         QMainWindow {
  221.             background-color: #f5f5f5;
  222.         }
  223.         QGroupBox {
  224.             border: 1px solid #e0e0e0;
  225.             border-radius: 5px;
  226.             margin-top: 10px;
  227.             padding-top: 15px;
  228.         }
  229.         QGroupBox::title {
  230.             subcontrol-origin: margin;
  231.             left: 10px;
  232.             padding: 0 3px;
  233.         }
  234.         QLabel {
  235.             color: #333333;
  236.         }
  237.         QComboBox {
  238.             padding: 5px;
  239.             border: 1px solid #cccccc;
  240.             border-radius: 3px;
  241.         }
  242.         QSlider::groove:horizontal {
  243.             height: 6px;
  244.             background: #e0e0e0;
  245.             border-radius: 3px;
  246.         }
  247.         QSlider::handle:horizontal {
  248.             width: 16px;
  249.             height: 16px;
  250.             margin: -5px 0;
  251.             background: #2196F3;
  252.             border-radius: 8px;
  253.         }
  254.         QSlider::sub-page:horizontal {
  255.             background: #2196F3;
  256.             border-radius: 3px;
  257.         }
  258.         """
  259.         self.centralwidget.setStyleSheet(style)
  260.     def load_model(self):
  261.         model_name = self.model_combo.currentText().split(" ")[0]
  262.         try:
  263.             self.model = YOLO(model_name)
  264.             self.statusbar.showMessage(f"模型 {model_name} 加载成功", 3000)
  265.             self.image_btn.setEnabled(True)
  266.             self.video_btn.setEnabled(True)
  267.             self.camera_btn.setEnabled(True)
  268.         except Exception as e:
  269.             QMessageBox.critical(None, "错误", f"模型加载失败: {str(e)}")
  270.     def update_conf_value(self):
  271.         conf = self.conf_slider.value() / 100
  272.         self.conf_value.setText(f"{conf:.2f}")
  273.     def update_iou_value(self):
  274.         iou = self.iou_slider.value() / 100
  275.         self.iou_value.setText(f"{iou:.2f}")
  276.     def detect_image(self):
  277.         if self.model is None:
  278.             QMessageBox.warning(None, "警告", "请先加载模型")
  279.             return
  280.         file_path, _ = QFileDialog.getOpenFileName(
  281.             None, "选择图片", "",
  282.             "图片文件 (*.jpg *.jpeg *.png *.bmp);;所有文件 (*)"
  283.         )
  284.         if file_path:
  285.             try:
  286.                 # 读取图片
  287.                 img = cv2.imread(file_path)
  288.                 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  289.                 # 显示原始图片
  290.                 self.display_image(img, self.original_img_label)
  291.                 self.current_image = img.copy()
  292.                 # 检测图片
  293.                 conf = self.conf_slider.value() / 100
  294.                 iou = self.iou_slider.value() / 100
  295.                 self.statusbar.showMessage("正在检测图片...")
  296.                 QtWidgets.QApplication.processEvents()  # 更新UI
  297.                 results = self.model.predict(img, conf=conf, iou=iou)
  298.                 result_img = results[0].plot()
  299.                 # 显示检测结果
  300.                 self.display_image(result_img, self.result_img_label)
  301.                 self.current_result = result_img.copy()
  302.                 # 更新结果表格
  303.                 self.update_result_table(results[0])
  304.                 self.save_btn.setEnabled(True)
  305.                 self.statusbar.showMessage(f"图片检测完成: {os.path.basename(file_path)}", 3000)
  306.             except Exception as e:
  307.                 QMessageBox.critical(None, "错误", f"图片检测失败: {str(e)}")
  308.                 self.statusbar.showMessage("图片检测失败", 3000)
  309.     def detect_video(self):
  310.         if self.model is None:
  311.             QMessageBox.warning(None, "警告", "请先加载模型")
  312.             return
  313.         file_path, _ = QFileDialog.getOpenFileName(
  314.             None, "选择视频", "",
  315.             "视频文件 (*.mp4 *.avi *.mov *.mkv);;所有文件 (*)"
  316.         )
  317.         if file_path:
  318.             try:
  319.                 self.cap = cv2.VideoCapture(file_path)
  320.                 if not self.cap.isOpened():
  321.                     raise Exception("无法打开视频文件")
  322.                 # 获取视频信息
  323.                 fps = self.cap.get(cv2.CAP_PROP_FPS)
  324.                 width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
  325.                 height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
  326.                 # 创建视频写入器
  327.                 timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
  328.                 output_file = os.path.join(self.output_path, f"output_{timestamp}.mp4")
  329.                 fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  330.                 self.video_writer = cv2.VideoWriter(output_file, fourcc, fps, (width, height))
  331.                 # 启用停止按钮,禁用其他按钮
  332.                 self.stop_btn.setEnabled(True)
  333.                 self.save_btn.setEnabled(True)
  334.                 self.image_btn.setEnabled(False)
  335.                 self.video_btn.setEnabled(False)
  336.                 self.camera_btn.setEnabled(False)
  337.                 # 开始处理视频
  338.                 self.timer.start(30)  # 30ms间隔
  339.                 self.statusbar.showMessage(f"正在处理视频: {os.path.basename(file_path)}...")
  340.             except Exception as e:
  341.                 QMessageBox.critical(None, "错误", f"视频检测失败: {str(e)}")
  342.                 self.statusbar.showMessage("视频检测失败", 3000)
复制代码
七、项目源码(视频简介内)

        完备全部资源文件(包括测试图片,py文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将全部涉及的文件同时打包到内里,点击即可运行,完备文件截图如下:


演示与介绍视频:
基于深度学习YOLOv8的安全锥识别检测体系(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)_哔哩哔哩_bilibili
     基于深度学习YOLOv8的安全锥识别检测体系(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表