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

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

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

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

本文将指导你如何使用PySide6实现这一功能。

b0b70466fa674cff8cfd6997630b1a78.png
  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

a88de7a216164c4497051c91cfe44554.png

也可以根据自己的需要安装对应的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 = None self.timer = QtCore.QTimer() self.timer1 = QtCore.QTimer() self.cap = None self.video = None self.file_path = None self.base_name = None self.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、创建图片/视频展示区域

e7f71d9f9a374c83a8e8bb03405fdb10.png

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

页面布局代码如下:

# 界面上半部分: 视频框 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的目标检测当中,我们需要记录一些操作日志,从而方便后续维护。此外,在实际生产环境中,如果置信度大于我们所设定的阈值,需要产生告警信息,而这些信息需要记录标签预测框的坐标信息、产生告警的时间以及告警的标签内容。日志打印区的效果图如下:

1259d0cb3c8b41428532b6cbd6f5eb95.png
4deb8e9ed53f4c16acb321399a35c4cb.png

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

2e11645362114959adfe398464f53e0f.png

在日志打印区当中会生成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预训练模型,选择自己的预测模型进行加载.....

933a22f01f8f4dc1a71e07f09622a91c.png

修改模型本地路径:

def init_gui(self): self.folder_path = "./models" # 自定义修改:设置文件夹路径 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)

代码如下:

# 遍历文件夹并添加文件名到下拉框 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'): # 确保是文件且后缀为.pt base_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、创建置信度阈值滑动条

7e39823a2f7d4157a202423fe4cf7fae.png
06d66a3fa1fa443bb19bb8a0a1d9abf2.png
6b71d9f9402140d8877363427b82d8d2.png

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

288deac87b3846d3b2675a4345dc41bf.png
b8c710327ebf43f5962fef514aa851c7.png

页面布局代码如下:

# 创建一个置信度阈值滑动条 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')

 修改图片/视频上传路径:

def upload_file(self): self.outputField.append(f'{datetime.now().strftime("%Y-%m-%d %H:%M:%S")} - 请选择检测文件') file_dialog = QtWidgets.QFileDialog() file_dialog.setDirectory(QDir("./valid_file")) # 修改上传文件路径 
aae962e799354b4c82d4f53c753f27f9.png

页面布局代码如下:

# 文件上传按钮 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) # 初始化按钮默认不可操作,加载模型之后可以操作

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

a5e4bcaa340d43b3a87c9fa206b1c52a.png

上传视频效果如下:

627a6c8f37064833aee70fd2d74d5d88.png

6、执行预测

图片预测效果图如下:

bc653fabcf5a49b79655fe0637023dca.png

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

视频预测效果图如下:

627a6c8f37064833aee70fd2d74d5d88.png

页面布局代码如下:

# 执行预测按钮 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、停止检测

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

界面效果图如下所示:

7d50cf5cfb3a43cd983801ff3b586aec.png

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

代码如下:

# 停止检测按钮 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 = None self.video = None self.ini_labels() self.outputField.append(f'{datetime.now().strftime("%Y-%m-%d %H:%M:%S")} - 检测中断!') self.file_path = None

六、程序完整代码

主页私聊博主哈~

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

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

Read more

Hunyuan-MT-7B-WEBUI快速上手:10分钟完成翻译服务部署

Hunyuan-MT-7B-WEBUI快速上手:10分钟完成翻译服务部署 1. 这不是普通翻译工具,是能开箱即用的专业级多语种翻译服务 你有没有遇到过这些情况: * 需要快速把一份维吾尔语产品说明书转成中文,但主流翻译API不支持; * 客户发来一封西班牙语技术邮件,想立刻看懂又不想反复粘贴到网页版; * 团队在做跨境内容运营,每天要处理日、法、葡、西四语种的社媒文案,但人工翻译成本太高…… Hunyuan-MT-7B-WEBUI 就是为这类真实需求而生的——它不是另一个需要调接口、写代码、配环境的“半成品模型”,而是一个预装好、点开就能用、连GPU显存都帮你算好了的完整翻译服务。 它背后跑的是腾讯混元团队开源的 Hunyuan-MT-7B 模型,专为高质量机器翻译设计,在 WMT2025 多语种翻译评测中拿下30个语种综合第一。更关键的是,它不是只支持“中英日韩”这种常见组合,而是实打实覆盖了38种语言互译,包括日语、法语、西班牙语、葡萄牙语、阿拉伯语、俄语、越南语、泰语、印尼语,以及维吾尔语、藏语、蒙古语、壮语、

美食推荐商城设计与实现信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

美食推荐商城设计与实现信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着互联网技术的快速发展和电子商务的普及,线上美食推荐商城逐渐成为消费者获取美食信息和购买相关产品的重要渠道。传统的美食推荐方式存在信息分散、个性化不足等问题,难以满足用户多样化的需求。基于此,开发一个高效、智能的美食推荐信息管理系统具有重要的现实意义。该系统能够整合各类美食资源,通过数据分析为用户提供精准推荐,同时优化商城的运营管理流程,提升用户体验和商业价值。关键词:美食推荐、电子商务、信息管理、个性化推荐、数据分析。 本系统采用前后端分离的架构设计,后端基于SpringBoot框架实现,具备高效的数据处理和接口服务能力;前端采用Vue.js框架开发,提供流畅的用户交互体验;数据库选用MySQL,确保数据存储的安全性和稳定性。系统主要功能包括用户管理、美食分类展示、智能推荐算法、订单管理及数据分析等模块。通过JWT实现用户身份认证,结合协同过滤算法提升推荐精准度,同时利用ECharts实现数据可视化,为管理员提供决策支持。系统源码完整,可直接运行,便于二次开发和实际部署。关键词:SpringBoot、Vue.js、MySQL、JWT、协同过滤、数据可视化。 数据表 用

Flutter 三方库 deepyr 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、高颜值的类型安全 daisyUI 响应式 Web 应用架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 deepyr 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、高颜值的类型安全 daisyUI 响应式 Web 应用架构 在鸿蒙(OpenHarmony)系统的分布式 Web 容器、轻量级 JS 服务或高性能 Web 控制台中,如何快速搭建一套既符合现代审美又具备强类型约束的 UI?deepyr 做为对 daisyUI 组件库的类型安全(Typesafe)封装,为鸿蒙上的 Jaspr Web 应用提供了极致流畅的开发体验。本文将带您领略其在鸿蒙生态中的美学实战。 前言 什么是 Deepyr?它是一套基于 Jaspr(下一代 Dart Web 框架)的 UI

从零开始玩转PaddleOCR-VL-WEB:Jupyter一键启动教程

从零开始玩转PaddleOCR-VL-WEB:Jupyter一键启动教程 1. 简介与学习目标 PaddleOCR-VL-WEB 是基于百度开源的 PaddleOCR-VL 技术构建的一款高效、多语言支持的文档解析系统。该模型融合了动态分辨率视觉编码器与轻量级语言模型,能够在低资源消耗下实现对文本、表格、公式和图表等复杂元素的高精度识别,广泛适用于全球化场景下的智能文档处理任务。 本文将带你从零开始部署并使用 PaddleOCR-VL-WEB 镜像,通过 Jupyter Notebook 实现一键启动网页推理服务。无论你是 AI 初学者还是有一定工程经验的开发者,都能快速上手,完成本地化 OCR 大模型的部署与调用。 学习目标 * 掌握 PaddleOCR-VL-WEB 镜像的基本结构与核心能力 * 完成镜像部署与环境配置 * 在 Jupyter 中执行一键启动脚本 * 使用 Web 界面进行图像 OCR 推理 * 理解常见问题及解决方案 前置知识 * 基础 Linux 操作命令(cd、ls、chmod 等)