YOLO可视化界面,目标检测前端页面。

使用PySide6/QT实现YOLOv5/v8可视化GUI页面

在人工智能和计算机视觉领域,YOLO(You Only Look Once)是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果,我们可以使用Python中的PySide6库来创建一个简单的GUI应用程序,将检测结果实时可视化。本文将指导你如何使用PySide6实现这一功能。

  1. 原视频/图片区:上半部分左边区域为原视频/图片展示区;
  2. 检测区:上半部分右边区域为检测结果输出展示区;
  3. 日志文本框:打印输出操作日志;
  4. 加载模型:从本地选择模型pt文件进行加载;
  5. 置信度阈值:自定义检测区的置信度阈值;
  6. 文件上传:选择目标文件;
  7. 开始检测:执行检测程序;
  8. 停止:终止检测程序;

一、工具介绍

1、PySide6

PySide6是一款功能强大的GUI(图形用户界面)开发框架,它允许Python开发者使用Qt库的功能来构建跨平台的桌面应用程序。PySide6作为Qt的Python绑定版本,继承了Qt的跨平台特性,支持在Windows、macOS、Linux等多种操作系统上开发和部署应用程序。其具有以下特点:

  1. 丰富的组件库:PySide6提供了大量的GUI控件和布局管理器,如按钮、文本框、下拉框、复选框等,以及QGridLayout、QFormLayout、QStackedLayout等多种布局方式,方便开发者快速构建用户界面。
  2. 高性能:基于Qt 6的底层实现,PySide6保证了应用程序的性能和响应速度,能够处理大型复杂的GUI。
  3. 灵活的事件处理机制:PySide6能够处理各种用户输入事件,如鼠标点击、键盘输入等,实现丰富的交互功能。
  4. 官方维护与支持:PySide6是Qt公司官方维护的Python绑定版本,享有官方的技术支持和更新服务,确保了框架的稳定性和可靠性。

2、OpenCV 

OpenCV(Open Source Computer Vision Library)是一个广泛使用的开源计算机视觉库,它提供了丰富的图像和视频处理功能,以及一些机器学习算法。

OpenCV具有广泛的应用领域,包括但不限于:

  • 人脸识别和物体识别:使用OpenCV可以实现人脸检测和识别,以及目标检测等,可应用于人脸门禁系统、人脸支付、安全监控等场景。
  • 图像和视频分析:可用于视频压缩、视频稳定、行人跟踪、行为分析等。
  • 图像合成和3D重建:通过多个视角的图像来重建场景的三维结构。
  • 机器学习:OpenCV也提供了针对神经网络和深度学习的高级功能,支持常见的深度学习框架,如TensorFlow、PyTorch和Caffe,使开发者能够利用神经网络进行人脸检测、物体识别和语义分割等任务。

二、环境准备 

利用pip工具进行依赖项安装(也可以利用Annaconda进行依赖包安装),要求python≥3.8。

1、安装ultralytics包

打开CMDWin键 + R打开<运行>,输入"cmd",回车,输入以下代码,即可快速安装YOLO。

也可以在PyCharm编辑器里打开终端进行安装。

# 安装ultralytics工具包
pip install ultralytics# 如果安装速度比较慢可以换成清华源的镜像
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

 在ultralytics包里,会自动安装适配当前ultralytics版本的torch

也可以根据自己的需要安装对应的torch版本:

pip install torch=2.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

 2、安装PySide6工具包

使用 pip 或者 conda 安装 PySide6打开你的终端或命令提示符,然后运行以下命令来安装 PySide6:

# 安装PySide6工具包
pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple

3、安装OpenCV工具包

使用 pip 或者 conda 安装 OpenCV,打开你的终端或命令提示符,然后运行以下命令来安装 OpenCV:

# 安装opencv工具包
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

这个命令会安装 OpenCV 的核心功能,包括图像处理、视频捕获等。如果你还需要额外的功能,比如对 OpenCV 的贡献模块(如 xfeatures2d、stitching 等),你可以安装 opencv-contrib-python:

# 安装opencv工具包
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple

三、导入必要的库

在你的Python脚本中,导入所需的库:

import os
from datetime import datetime
import json
import cv2
import torch
from PyQt5.QtCore import pyqtSlot
from PySide6.QtGui import QIcon
from PySide6 import QtWidgets, QtCore, QtGui
from PySide6.QtCore import Qt, QDir
from ultralytics import YOLO

四、创建主窗口,初始化相关参数

class MyWindow(QtWidgets.QMainWindow):def __init__(self):super().__init__()self.init_gui()self.model = Noneself.timer = QtCore.QTimer()self.timer1 = QtCore.QTimer()self.cap = Noneself.video = Noneself.file_path = Noneself.base_name = Noneself.timer1.timeout.connect(self.video_show)def init_gui(self):self.folder_path = "./model_file"  # 自定义修改:设置模型文件夹路径self.setFixedSize(1300, 650)self.setWindowTitle('目标检测')  # 自定义修改:设置窗口名称self.setWindowIcon(QIcon("logo.jpg"))  # 自定义修改:设置窗口图标central_widget = QtWidgets.QWidget(self)self.setCentralWidget(central_widget)main_layout = QtWidgets.QVBoxLayout(central_widget)

更换窗口背景图片: 

# 自定义修改:设置窗口背景图
self.set_background_image('bg.jpg')  

五、编写页面布局

1、创建图片/视频展示区域

如上图所示,左侧是文件上传之后原图、原视频的展示区域;右侧是经模型加载并执行开始检测之后,用来展示预测结果的检测区。

页面布局代码如下:

# 界面上半部分: 视频框
topLayout = QtWidgets.QHBoxLayout()
self.oriVideoLabel = QtWidgets.QLabel(self)
self.detectlabel = QtWidgets.QLabel(self)
self.oriVideoLabel.setFixedSize(530, 400)
self.detectlabel.setFixedSize(530, 400)
self.oriVideoLabel.setStyleSheet('border: 2px solid #ccc; border-radius: 10px; margin-top:75px;')
self.detectlabel.setStyleSheet('border: 2px solid #ccc; border-radius: 10px; margin-top: 75px;')
topLayout.addWidget(self.oriVideoLabel)
topLayout.addWidget(self.detectlabel)
main_layout.addLayout(topLayout)

在这段代码中,包含一个水平布局(QHBoxLayout),用于放置两个视频显示的标签(QLabel)。这两个标签分别用于显示原始视频(oriVideoLabel)和处理后的视频或检测结果(detectLabel)。

2、创建日志打印区域

在基于YOLO的目标检测当中,我们需要记录一些操作日志,从而方便后续维护。此外,在实际生产环境中,如果置信度大于我们所设定的阈值,需要产生告警信息,而这些信息需要记录标签预测框的坐标信息、产生告警的时间以及告警的标签内容。日志打印区的效果图如下:

 如上图所示,在启动程序之后会提示加载模型文件,之后进行文件上传,最后点击开始检测。在这个过程中会生成操作日志。

在日志打印区当中会生成JSON字符串格式的日志信息,信息内容为当前预测框中的告警信息,包括:

  • 标签名称:"name": "道路积水", 
  • 置信度:"confidence": 0.9243840575218201,
  • 横坐标:"x": 452.06036376953125,
  • 纵坐标:"y": 409.8131103515625,
  • 预测框宽度:"width": 1142.6134033203125,
  • 预测框高度:"height": 571.2572021484375

可以将上述告警信息封装之后以接口的形式传入相关数据平台进行分析和处理。 

日志区域的页面布局代码如下:

# 创建日志打印文本框
self.outputField = QtWidgets.QTextBrowser()
self.outputField.setFixedSize(530, 180)

3、加载YOLO模型

下载YOLO预训练模型,选择自己的预测模型进行加载.....

代码如下:

# 遍历文件夹并添加文件名到下拉框
for filename in os.listdir(self.folder_path):file_path = os.path.join(self.folder_path, filename)if os.path.isfile(file_path) and filename.endswith('.pt'):  # 确保是文件且后缀为.ptbase_name = os.path.splitext(filename)[0]self.selectModel.addItem(base_name)# 添加加载模型按钮
self.loadModel = QtWidgets.QPushButton('🔄️加载模型')  # 新建加载模型按钮
self.loadModel.setFixedSize(100, 50)
self.loadModel.setStyleSheet("""QPushButton {  background-color: white; /* 正常状态下的背景颜色 */  border: 2px solid gray;  /* 正常状态下的边框 */  border-radius: 10px;  padding: 5px;font-size: 14px; }  QPushButton:hover {  background-color: #f0f0f0;  /* 悬停状态下的背景颜色 */  }  
""")
self.loadModel.clicked.connect(self.load_model) # 绑定load_model函数进行模型加载
selectModel_layout.addWidget(self.selectModel) # 将下拉框加入到页面布局当中
selectModel_layout.addWidget(self.loadModel)  # 将按钮加入到页面布局当中

load_model函数代码如下:

def load_model(self):filename = self.selectModel.currentText()full_path = os.path.join(self.folder_path, filename + '.pt')self.base_name = os.path.splitext(os.path.basename(full_path))[0]if full_path.endswith('.pt'):# 加载预训练模型self.model = YOLO(full_path)self.start_detect.setEnabled(True)self.stopDetectBtn.setEnabled(True)self.openImageBtn.setEnabled(True)self.confudence_slider.setEnabled(True)self.outputField.append(f'{datetime.now().strftime("%Y-%m-%d %H:%M:%S")} - 模型加载成功: {filename}')self.outputField.append(f'{datetime.now().strftime("%Y-%m-%d %H:%M:%S")} - 请选择置信度阈值')else:self.outputField.append(f'{datetime.now().strftime("%Y-%m-%d %H:%M:%S")} - 请重新选择模型文件!')print("Reselect model")

4、创建置信度阈值滑动条

你可以根据自己的需求自定义置信度阈值,value值会绑定模型预测的conf,在预测过程中实时生效,效果图如下:

页面布局代码如下:

# 创建一个置信度阈值滑动条
self.con_label = QtWidgets.QLabel('置信度阈值', self)
self.con_label.setStyleSheet('font-size: 14px; font-family: "Microsoft YaHei";')# 创建一个QSlider,范围从0到99(代表0.01到0.99)
self.slider = QtWidgets.QSlider(Qt.Horizontal, self)
self.slider.setMinimum(1)  # 0.01
self.slider.setMaximum(99)  # 0.99
self.slider.setValue(50)  # 0.5
self.slider.setTickInterval(10)
self.slider.setTickPosition(QtWidgets.QSlider.TicksBelow)
self.slider.setFixedSize(170, 30)# 创建一个QDoubleSpinBox用于显示和设置滑动条的值
self.spinbox = QtWidgets.QDoubleSpinBox(self)
self.spinbox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
self.spinbox.setMinimum(0.01)
self.spinbox.setMaximum(0.99)
self.spinbox.setSingleStep(0.01)
self.spinbox.setValue(0.5)
self.spinbox.setDecimals(2)
self.spinbox.setFixedSize(60, 30)
self.spinbox.setStyleSheet('border: 2px solid gray; border-radius: 10px; ''padding: 5px; background-color: #f0f0f0; font-size: 14px;')
self.confudence_slider = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
hlayout = QtWidgets.QHBoxLayout()
self.confudence_slider.setFixedSize(250, 64)
layout.addWidget(self.con_label)
hlayout.addWidget(self.slider)
hlayout.addWidget(self.spinbox)
layout.addLayout(hlayout)
self.confudence_slider.setLayout(layout)
self.confudence_slider.setEnabled(False)# 连接信号和槽
self.slider.valueChanged.connect(self.updateSpinBox)
self.spinbox.valueChanged.connect(self.updateSlider)

5、文件上传

文件上传操作包括图片上传、视频上传,支持JPG格式和MP4格式,以文件流的形式读取需要被检测的文件。

# 对上传的文件根据后缀名称进行过滤
file_path, file_type = file_dialog.getOpenFileName(self, "选择检测文件", filter='*.jpg *.mp4')

页面布局代码如下:

# 文件上传按钮
self.openImageBtn = QtWidgets.QPushButton('🖼️文件上传')
self.openImageBtn.setFixedSize(100, 65)
self.openImageBtn.setStyleSheet("""QPushButton {  background-color: white; /* 正常状态下的背景颜色 */  border: 2px solid gray;  /* 正常状态下的边框 */  border-radius: 10px;  padding: 5px;font-size: 14px; margin-bottom: 15px;}  QPushButton:hover {  background-color: #f0f0f0;  /* 悬停状态下的背景颜色 */  }  
""")
self.openImageBtn.clicked.connect(self.upload_file) # 绑定upload_file事件
self.openImageBtn.setEnabled(False) # 初始化按钮默认不可操作,加载模型之后可以操作

文件上传成功之后会呈现在左侧的展示区域,效果图如下:

上传视频效果如下:

6、执行预测

图片预测效果图如下:

使用 OpenCV(cv2)库进行视频抽帧是一个常见的任务,可以用于从视频中提取特定的帧进行进一步处理或分析。

视频预测效果图如下:

页面布局代码如下:

# 执行预测按钮
self.start_detect = QtWidgets.QPushButton('🔍开始检测')
self.start_detect.setFixedSize(100, 50)
self.start_detect.setStyleSheet("""QPushButton {  background-color: white; /* 正常状态下的背景颜色 */  border: 2px solid gray;  /* 正常状态下的边框 */  border-radius: 10px;  padding: 5px;font-size: 14px;}  QPushButton:hover {  background-color: #f0f0f0;  /* 悬停状态下的背景颜色 */  }  
""")
self.start_detect.clicked.connect(self.show_detect) # 绑定show_detect函数事件
self.start_detect.setEnabled(False)

模型预测的核心代码:

将视频帧进行抽取之后转为QImage格式对预测结果进行展示。

frame = self.model(frame, imgsz=[448, 352], device='cuda',conf=self.value) if torch.cuda.is_available() \else self.model(frame, imgsz=[448, 352], device='cpu', conf=self.value)

7、停止检测

在视频检测的过程中可能发现上传错误,此时为了防止视频一直在后台检测导致占用内存,需要及时中断检测程序。

界面效果图如下所示:

日志打印区会输出“检测中断!”,检测区也会停在该视频的当前帧。

代码如下:

# 停止检测按钮
self.stopDetectBtn = QtWidgets.QPushButton('🛑停止')
self.stopDetectBtn.setFixedSize(100, 50)
self.stopDetectBtn.setEnabled(False)
self.stopDetectBtn.clicked.connect(self.stop_detect) # 绑定stop_detect中断检测事件# 中断检测事件
def stop_detect(self):if self.timer.isActive():self.timer.stop()if self.timer1.isActive():self.timer1.stop()if self.cap is not None:self.cap.release()self.cap = Noneself.video = Noneself.ini_labels()self.outputField.append(f'{datetime.now().strftime("%Y-%m-%d %H:%M:%S")} - 检测中断!')self.file_path = None

六、程序完整代码

(完整代码包含整体UI布局按钮绑定事件

上述内容为控件的页面布局和部分核心代码戳我头像获取代码,或者主页私聊博主哈~

内容为本人原创,诚心需要提供内容指导!

非本人同意禁止转载......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/7853.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用vuex动态设置全局字号

1.安装vuex npm install vuexnext --save 2.编写字号设置样式 // 定义字号变量 :root {--font-size: 18px;--font-size-step1: 16px;--font-size-step2: 14px;--font-size-step3: 12px; } // 定义样式&#xff08;全局样式文件&#xff09; body, page {font-size: var(--fo…

编程爱好者的福音:实用技巧与教程

引言 你是否曾经因为代码无法正常运行而感到挫败&#xff1f;或者在面对一行行复杂的代码时&#xff0c;不知道从何下手&#xff1f;编程&#xff0c;这项充满挑战与创造力的技能&#xff0c;往往让人既爱又恨。无论你是刚刚入门的初学者&#xff0c;还是已经具备一定经验的开发…

了解bootstrap改造asp.net core MVC的样式模板

我们都知道&#xff0c;在使用默认的asp.net core MVC模板建立项目的时候&#xff0c;里面的样式是已经事先被写好了的。一般来说都在css目录下的site.css和bootstrap.css及下面的bootstrap.min.css中。我们打开bootstrap这些样式文件&#xff0c;里面有大量的样式类的定义&…

通过使用 FFmpeg 提取某站视频 MV 中的音频为 MP3

无论是为了个人收藏、制作播客还是作为背景音乐&#xff0c;将视频中的音频提取出来都是一个非常实用的技能。本教程中简鹿办公将介绍两种方法来实现这一目标&#xff1a;一种是通过命令行工具 FFmpeg&#xff0c;另一种是使用图形界面工具 - 简鹿音频格式转换器。 使用 FFmpeg…

探秘国际数字影像产业园:数字化转型之路

数字化园区的概念正日益受到全球瞩目&#xff0c;这不仅是科技进步的必然产物&#xff0c;更是现代经济发展的迫切需求。对于国际数字影像产业园而言&#xff0c;打造数字化园区意味着通过尖端科技手段&#xff0c;全面提升园区的管理效率、服务质量及入驻企业和居民的生活体验…

外包干了2年,快要废了。。

先说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会让一…

5G的发展演进

5G发展的驱动力 什么是5G [远程会议&#xff0c;2020年7月10日] 在来自世界各地的政府主管部门、电信制造及运营企业、研究机构约200多名会议代表和专家们的共同见证下&#xff0c;ITU-R WP 5D#35e远程会议宣布3GPP 5G技术&#xff08;含NB-IoT&#xff09;满足IMT-2020 5G技…

【C++打怪之路Lv14】- “多态“篇

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

Github 2024-11-05 Python开源项目日报Top10

根据Github Trendings的统计,今日(2024-11-05统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10HTML项目1TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

如何从 Android 图库中恢复误删除的照片

如果您正在阅读这篇文章&#xff0c;那么您肯定意外地从 Android 设备中删除了照片。并且您正在寻找一种简单的方法来恢复 Android 图库中已删除的照片。 从图库恢复已删除的照片 随着技术的进步&#xff0c;现在使用单个设备&#xff08;即 Android 手机&#xff09;&#xf…

ESP-HaloPanel:用 ESP32-C2 打造超低成本智能家居面板

项目简介 在生活品质日益提升的今天&#xff0c;智能家居系统已经走进了千家万户&#xff0c;并逐渐成为现代生活的一部份。与此同时&#xff0c;一款设计精致、体积轻盈、操作简便的全屋智能家居控制面板&#xff0c;已经成为众多家庭的新宠。这种高效、直观的智能化的解决方…

人工智能:重塑未来的力量

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题 点这里。 实战项目访问&#xff1a;http://javapub.net.cn/ 人工智能技术的未来&#xff1a;变革与适应 引言 随着人工智能技术的不断发展&#xff0c;我们已经看到了它在各行业带来的巨大变革。从医疗行业的病例诊断到企业…

3D看车如何实现?有哪些功能特点和优势?

3D看车是一种创新的汽车展示方式&#xff0c;它基于网络世界&#xff0c;融合了三维建模与虚拟现实技术&#xff0c;为消费者带来前所未有的真实、立体观车体验。以下是对3D看车的详细解释&#xff1a; 一、3D看车的实现方式 高精度三维建模&#xff1a; 通过高精度三维建模…

消息队列的测试点

消息队列的测试点 一、常用的消息队列产品1、挑战性问题 二、kafka简介三、消息的生产四、消息的存储五、Kafka的特性六、kafka测试要点 一、常用的消息队列产品 基于内存的消息队列 RabbitMQ&#xff1a;适用于处理高并发场景&#xff0c;广泛用于即时消息传递RabbitMQ&…

web实操1——只使用tomcat发布网站

安装tomcat 下载 肯定是去官网&#xff1a; http://tomcat.apache.org/ 下载之后&#xff0c;解压&#xff1a; &#xff01;&#xff01;解压后&#xff1a; logs日志&#xff1a;就是一些输出&#xff0c;输到文本里。 temp:一些临时文件(不用管) webapps:放网站的 work&…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十七集:制作第二个BOSS燥郁的毛里克

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏第二个BOSS燥郁的毛里克 1.导入素材和制作相关动画1.5处理玩家受到战吼相关行为逻辑处理2.制作相应的行为控制和生命系统管理3.制作战斗场景和战斗…

HarmonyOS开发 - 餐饮APP中多门店多窗口打开实例补充

specified启动模式为指定实例模式&#xff0c;有一些特殊场景&#xff0c;例如多门店应用中每次打开一个门店都希望能新建一个门店实例&#xff0c;而重复打开同一个门店都是同一门店实例。 此篇为餐饮APP中多门店实例的补充内容&#xff0c;以解决同一门店多次点击重复创建新窗…

FreeRTOS 13:FreeRTOS队列的读原理

队列读取消息 FreeRTOS 中用于从队列中读取消息的 API 函数如下表所示&#xff1a; xQueueReceive BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait ) {BaseType_t xEntryTimeSet pdFALSE;TimeOut_t xTimeOut;Queue_t * con…

山东路远生态科技有限公司竣工投产仪式暨产品发布会圆满举行

第二十届三中全会于2024年7月15日至18日在北京举行。全会审议通过了《关于进一步全面深化改革、推进中国式现代化的决定》。其中提到,“要健全因地制宜发展新质生产力体制机制”。 新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生的当代先进生产力…

Vue + Vant Picker实现省市区三级联动

一、picker选择器的数据由columns属性控制&#xff0c;columns中有几个元素就代表该选择器有多少级&#xff0c;通过change方法来给对应列赋值 this.columns [{values: citys,className: "column1",defaultIndex: 0,flex: 1, //控制每列的宽度},{values: citys[0].…