目标检测系列(四)利用pyqt5实现yolov8目标检测GUI界面

目录

1、pyqt5安装

2、PyCharm添加Qt Designer、PyUIC

3、Qt Designer设计界面

4、根据ui文件自动生成py文件

5、修改py文件来调用检测程序

6、执行py文件启动


1、pyqt5安装

Qt Designer:一个用于创建图形用户界面的工具,可轻松构建复杂的用户界面。它基于MVC架构,可以将界面设计与逻辑分离,使得开发更为便捷。在Qt Designer中,可以通过拖拽控件来灵活地调整界面,并可以实时查看控件效果。。

PyUIC:一个命令行工具,它将Qt Designer中设计的.ui文件转换为Python代码。这一功能极大地帮助了开发人员快速地将设计好的Qt Designer的.ui文件转换为可用的Python代码,从而提高了开发速度。

安装方法:

pip install pyqt5

pip install pyqt5-tools

然后搜索“designer”就可以看到是否安装好

2、PyCharm添加Qt Designer、PyUIC

点击菜单栏File——选择Setting,弹出设置界面。在设置界面中选择Tools—>External Tools

然后重启pycharm即可看见添加的外部工具:

3、Qt Designer设计界面

可以先打开Qt Designer,创建一个.ui然后保存到本地:

4、根据ui文件自动生成py文件

选中一个.ui,然后点击配置好的外部工具:Tools->External Tools->pyuic5,就会自动生成对应的.py文件的。

如果实在不知道怎么配置pycharm,也可以直接用终端命令来生成:

先用cd命令进入ui文件所在的路径下,然后执行命令:pyuic5 -o demo.py demo.ui

5、修改py文件来调用检测程序

经过前面几步只是对界面构建元素控件,接下来需要写代码来对每个控件进行点击响应操作:

①选择图片上传

②显示环境

③启动程序

④在setupui中添加上述点击响应函数

⑤修改继承类为QmainWindow并添加初始化函数

完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'BscanObjDetection.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
import sys

from PyQt5 import QtCore, QtGui, QtWidgets
import torch
import torchvision
import cv2

from ultralytics import YOLO


class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.retranslateUi(self)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1131, 932)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(40, 20, 98, 26))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(220, 20, 98, 26))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(390, 20, 98, 26))
        self.pushButton_3.setObjectName("pushButton_3")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(40, 70, 1031, 61))
        self.textBrowser.setObjectName("textBrowser")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 180, 511, 451))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(590, 180, 491, 461))
        self.label_2.setObjectName("label_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1131, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        # 点击响应函数
        self.pushButton.clicked.connect(self.uploadImage)
        self.pushButton_2.clicked.connect(self.showEnvironment)
        self.pushButton_3.clicked.connect(self.startProgram)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "上传图片"))
        self.pushButton_2.setText(_translate("MainWindow", "显示环境"))
        self.pushButton_3.setText(_translate("MainWindow", "启动程序"))
        self.label.setText(_translate("MainWindow", "                           原图"))
        self.label_2.setText(_translate("MainWindow", "                        识别后图片"))


    def uploadImage(self):
        file_dialog = QFileDialog()
        image_path, _ = file_dialog.getOpenFileName(self, '选择图片', '', 'Images (*.png *.xpm *.jpg *.bmp)')
        self.image_path = image_path
        if image_path:
            # 在这里添加加载图片的逻辑,例如显示图片到label
            pixmap = QtGui.QPixmap(image_path)
            self.label.setPixmap(pixmap)
            self.label.setScaledContents(True)

    def showEnvironment(self):
        pytorch_version = torch.__version__
        torchvision_version = torchvision.__version__
        self.textBrowser.setText(f"PyTorch Version: {pytorch_version}\n"
                            f"Torchvision Version: {torchvision_version}")

    def startProgram(self):
        self.textBrowser.setText(self.image_path)
        model = YOLO(r'C:\work\PycharmProjects\BscanObjDetection\frame_count\runs\detect\best.pt')
        results = model(self.image_path)
        annotated_frame = results[0].plot()
        # 图片暂存
        save_image_name = self.image_path.split("/")[-1].split(".")[0] + "_pred"
        cv2.imwrite(f"C:\work\PycharmProjects\BscanObjDetection\data\predict\{save_image_name}.jpg", annotated_frame)

        # 将图像数据转换为QImage格式
        height, width, channel = annotated_frame.shape
        bytes_per_line = 3 * width
        qimage = QtGui.QImage(annotated_frame.data, width, height, bytes_per_line, QtGui.QImage.Format_RGB888)
        # 将QImage转换为QPixmap
        pixmap = QtGui.QPixmap.fromImage(qimage)

        # 都执行:
        self.label_2.setPixmap(pixmap)
        self.label_2.setScaledContents(True)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow1 = QMainWindow()  # MainWindow1随便改
    ui = Ui_MainWindow()  # 随便改
    ui.setupUi(MainWindow1)
    MainWindow1.show()
    sys.exit(app.exec_())

6、执行py文件启动

效果如下视频:

qt designer

基于YOLOv8+pyqt5实现的过马路玩手机打电话检测告警系统源码(GUI界面+数据集+模型+评估曲线+部署说明) 检测斑马线、玩手机、打电话、行人、车辆、其他。简易的GUI界面,含有训练好的模型、评估指标曲线、数据集、详细部署操作文档,有问题可以私信留言。 以下内容为项目部署详细过程和说明 1、项目代码分为两部分 main_gui_code和ultralytics,其中main_gui_code代码包含GUI界面代码+训练好的模型+YOLOv8推理逻辑融合GUI的代码,也就是说这部分可以打开GUI界面,加载模型和图片、视频、视频流 进行测试。ultralytics则为YOLOv8源代码,可用来训练各种模型,当然也可以用来测试,输出结果,只不过不带GUI界面。故我们使用ultralytics来训练模型,然后拷贝模型到main_gui_code中, 进行GUI界面测试。 2、搭建环境 安装anaconda 和 pycharm windows系统、mac系统、Linux系统都适配 在anaconda中新建一个新的envs虚拟空间(可以参考博客来),命令窗口执行:conda create -n YOLOv8-GUI python==3.8 创建完YOLOv8-GUI虚拟空间后,命令窗口执行:source activate YOLOv8-GUI 激活虚拟空间 然后就在YOLOv8-GUI虚拟空间内安装requirements.txt中的所有安装包,命令窗口执行:pip install -r requirements.txt 使用清华源安装更快 3、打开GUI推理测试 当以上步骤顺利完成后,环境已经搭建完毕,下面我们尝试打开GUI界面进行测试 pycharm中打开整个项目,导入配置anaconda安装的YOLOv8-GUI虚拟环境(参考博客) 运行main_jiemian.py即可成功打开界面,模型文件放在main_gui_code/models/文件夹,后缀为.pt。可以存放多个模型,可通过界面来选择要使用的模型 点击选择模型按钮选择pt模型,然后点击选择路径按钮,选择待测图片或者视频,最后点击开始检测按钮,开始推理测试并显示画框及得分值 4、训练模型过程 进入到\ultralytics\ultralytics\yolo\v8\detect\文件夹下,datasets即为我们准备好的数据集,训练其他模型同理。 data文件夹下的cross_line.yaml文件为数据集配置文件,博文有介绍https://blog.csdn.net/DeepLearning_?spm=1011.2415.3001.5343 train.py中208行,修改为的data = cfg.data or './cross_line.yaml' # or yolo.ClassificationDataset("mnist") 207行修改自己使用的预训练模型 若自己有显卡,修改211行,如我有张显卡,即改成args = dict(model=model, data=data, device=”0,1,2,3“) 以上配置完成后运行train.py开始训练模型,训练完毕后会在runs/detect/文件夹下生成train*文件夹,里面包含模型和评估指标等 5、无GUI推理测试 训练好模型,打开predict.py,修改87行,model = cfg.model or 'yolov8n.pt',把yolov8n.pt换成我们刚才训练完生成的模型路径,待测试的图片或者视频存放于ultralytics\ultralytics\assets文件夹, 运行predict.py即可,检测结果会在runs/detect/train文件夹下生成。 【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能。
### 创建或使用 YOLOv8s 目标检测的用户界面 (UI) 设计与实现 #### 用户界面的需求分析 对于基于YOLOv8s的目标检测系统而言,用户界面应当具备友好的交互体验以及高效的性能表现。考虑到系统的功能特性,用户界面需支持实时显示航拍小目标检测的结果,并允许用户方便地管理和查看历史记录[^1]。 #### 技术选型 为了满足上述需求,在技术栈的选择上推荐采用Qt框架作为开发工具之一。Qt是一个跨平台的应用程序和UI库,提供了丰富的组件用于构建图形化的应用程序。具体来说,可以通过`Ui_MainWindow`类来定义主窗口布局及其内部控件的位置关系;借助于信号-槽机制,则可以在不破坏原有结构的前提下轻松添加新的业务逻辑[^2]。 #### 实现步骤概览 以下是创建此类用户界面的一个简化流程: 1. **初始化项目** 首先安装必要的依赖项,比如PyQt5等Python包。 2. **搭建基本框架** 使用Qt Designer绘制初步草图,确定各个区域的功能划分(如菜单栏、状态栏、中央工作区),并将设计文件转换成对应的`.py`脚本。 3. **集成YOLOv8s模型** 导入已训练完成的最佳权重文件至指定位置(`runs/detect/train/weights/best.pt`),并通过调用相应API接口加载此预训练模型实例。 4. **编写核心代码片段** ```python from PyQt5.QtWidgets import QApplication, QMainWindow import sys from Ui_mainwindow import Ui_MainWindow # 假设这是由.ui转出来的.py文件名 from ultralytics import YOLO class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # 初始化YOLOv8s模型 self.model = YOLO("path_to_best_model.pt") # 绑定事件处理函数到界面上的相关按钮或其他控件... if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 这段简单的例子展示了如何将自定义的用户界面YOLOv8s相结合,从而形成一个完整的解决方案。当然,实际应用场景可能会更加复杂一些,涉及到更多细节上的考量,例如多线程编程以提高响应速度、错误提示信息的设计等方面的工作。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trisyp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值