(小白保姆级)YoloV8+PyQt5,快速上手教程(含源码)

目录

前言

一、安装PyQt5和Ultralytics库

二、QtDesigener绘制界面

三、YOLOV8嵌入进Pyqt5界面

四、实际运行效果


前言

基于自己的经验,给大家总结出了一套YoloV8结合PyQt5的教程,希望对大家能够有帮助,同时我的代码给大家提供了下载方式

链接: https://pan.baidu.com/s/1xBVSrPdALdXNdKQntRsU5w?pwd=gps8 提取码: gps8 
--来自百度网盘超级会员v4的分享

一、安装PyQt5和Ultralytics库

1.创建虚拟环境,作者这里使用Anaconda3创建虚拟环境。

2.安装所需库,为加速下载这里使用清华大学镜像源。 

(1)安装PyQt5

pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/

(2)安装pyqt5-tools

pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/

(3)安装ultralytics

pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple/

二、QtDesigener绘制界面

1.定位并打开designer.exe程序

安装好PyQt5及pyqt5-tools之后,打开QtDesigener,如果你和我一样使用的Anaconda3创建虚拟环境下载的库,首先在文件管理器中打开Anaconda3所在位置并定位至虚拟环境所在位置,按照以下位置定位QtDesigner,点击运行。

2.开始绘制界面

(1)进入应用,这里选择Widget即可

(2)拖动相关部件进入界面,主要用到PushButton和Label即可

(3)给每个标签和按钮命名以便后期代码操作,对控件和布局稍做美化,这里可以查询相关教程,不再做过多描述;

3.保存并转化文件

(1)打开Pycharm,新建一个名为YOLO_QT的项目,使用上面创建的虚拟环境,并将上述UI文件保存到项目下

(2)将yolov8.ui文件转化成py文件,终端输入,即可看到项目下生成了一个.py后缀的Python文件

pyuic5 -o yolov8.py yolov8.ui

三、YOLOV8嵌入进Pyqt5界面

根据第二步操作我们得到了名为yolov8.py的文件,这个文件就是整个可视化界面部分,为了做到前后端分开,我们这里新建一个名为main.py的文件,新建一个类并继承yolov8.py中的类

(1)首先导入相关库

import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtGui import QPixmap, QImage
import cv2
from ultralytics import YOLO
from yolov8 import  Ui_Form

这里指的一提的是,from yolov8 import Ui_Form是从yolov8.py中导入Ui_Form这个类,仔细观察yolov8.py可以发现,所有的代码都是写在Ui_Form这个类里面的,这部分内容对没有学过面向对象的同学不太好理解

(2)新建一个类MainWindow,导入模型文件以及设置好相关变量,绑定好按钮对应的函数,由于我已经在QtDesigner里面更改了控件名称,所以可能有的同学代码会报错,可以用我上述链接里的yolov8.py替换掉你项目下的yolov8.py,这里的yolov8.pt模型文件,可以自行去yolov8官网下载,同时我的网盘里也可以下载,也可以换成你自己的模型文件

class MainWindow(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        try:
            super().__init__()
            self.setupUi(self)
            self.model = YOLO("yolov8n.pt")
            self.timer = QtCore.QTimer()
            self.timer.timeout.connect(self.update_frame)

            self.cap = None
            self.is_detection_active = False
            self.current_frame = None

            # 各个按钮绑定功能
            self.picture_detect_pushButton.clicked.connect(self.load_picture)
            self.video_detect_pushButton.clicked.connect(self.load_video)
            self.camera_detect_pushButton.clicked.connect(self.start_camera)
            self.start_detect_pushButton.clicked.connect(self.start_detection)
            self.stop_detect_pushButton.clicked.connect(self.stop_detection)
            self.pause_detect_pushButton.clicked.connect(self.pause_detect)


        except Exception as e:
            print(e)

这里继承了Ui_Form类,这样Ui_Form类里面所有的按钮以及其他布局,都被MainWindow类拿过来使用了,同时,定义了两个变量is_detection_active、current_frame,主要作用是为了视频检测的开始与暂停

(3)各按钮所对应的核心函数

    def load_picture(self):
        try:
            fileName, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files (*.jpg *.png)")
            self.is_detection_active = False

            if fileName:
                if self.timer.isActive():
                    self.timer.stop()
                if self.cap:
                    self.cap.release()
                    self.cap = None

                self.current_frame = cv2.imread(fileName)
                self.display_image(self.current_frame, self.original_image)
                results = self.model.predict(self.current_frame)
                self.detected_frame = results[0].plot()  # 获取检测结果的帧并保存
                self.display_image(self.detected_frame, self.detected_image)
        except Exception as e:
            print(e)

    def load_video(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "选择视频", "", "Video Files (*.mp4 *.avi)")
        if fileName:
            if self.cap:
                self.cap.release()
                self.cap = None

            self.cap = cv2.VideoCapture(fileName)

            if self.cap.isOpened():
                ret, frame = self.cap.read()
                if ret:
                    self.current_frame = frame.copy()
                    self.display_image(frame, self.original_image)
                    self.display_image(frame, self.detected_image)
                else:
                    QtWidgets.QMessageBox.warning(self, 'Error', '无法读取视频文件的第一帧。')

    def start_camera(self):
        self.is_detection_active = False
        if self.cap:
            self.cap.release()
        self.cap = cv2.VideoCapture(0)
        self.timer.start(20)

    def update_frame(self):
        if self.cap:
            ret, frame = self.cap.read()
            if ret:
                self.current_frame = frame.copy()
                self.display_image(frame, self.original_image)

                if self.is_detection_active:
                    results = self.model.predict(frame)
                    self.detected_frame = results[0].plot()  # 获取检测结果的帧并保存
                    self.display_image(self.detected_frame, self.detected_image)

    def start_detection(self):
        if self.cap and not self.cap.isOpened():
            self.cap.open(self.fileName)
        if self.cap and not self.timer.isActive():
            self.timer.start(20)
        self.is_detection_active = True

    def display_image(self, frame, target_label):
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        height, width, channel = frame.shape
        step = channel * width
        qImg = QImage(frame.data, width, height, step, QImage.Format_RGB888)
        pixmap = QPixmap.fromImage(qImg)
        scaled_pixmap = pixmap.scaled(target_label.size(), QtCore.Qt.KeepAspectRatio)
        target_label.setPixmap(scaled_pixmap)

    def pause_detect(self):
        self.is_detection_active = False

        if self.timer.isActive():
            self.timer.stop()

    def stop_detection(self):
        self.is_detection_active = False

        if self.timer.isActive():
            self.timer.stop()

        if self.cap:
            self.cap.release()
            self.cap = None

        self.clear_display(self.original_image)
        self.clear_display(self.detected_image)

    def clear_display(self, target_label):
        target_label.clear()
        target_label.setText('')

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

其中检测部分最核心部分代码如下

results = self.model.predict(self.current_frame)

四、实际运行效果

希望以上教程能够对大家有帮助,有任何疑问可以在评论区留言。

基于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、如果基础还行,也可在此代码基础上进行修改,以实现其他功能。
以下是使用PyQtYolov5实现物体检测应用程序的简单教程: 1. 安装PyQt和PyTorch 在开始之前,需要确保已安装PyQt和PyTorch。可以使用以下命令在终端中安装: ``` pip install PyQt5 pip install torch torchvision ``` 2. 准备Yolov5模型 下载yolov5模型文件和相应的权重文件,可以从官方GitHub仓库中下载。将下载的权重文件和模型文件放在同一个文件夹中。 3. 创建PyQt界面 使用Qt Designer创建一个PyQt界面,可以添加一个QLabel控件用于显示检测结果,以及一个QPushButton控件用于触发物体检测操作。 4. 加载模型 在PyQt代码中,使用PyTorch加载yolov5模型。可以使用以下代码: ```python import torch model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) ``` 5. 进行物体检测 在PyQt代码中,使用OpenCV将待检测的图片转换为适合yolov5模型输入的格式。然后,使用加载的模型进行推理,得到物体检测的结果。可以使用以下代码: ```python import cv2 # read image image = cv2.imread('image.jpg') # resize image resized_image = cv2.resize(image, (640, 640)) # convert to tensor tensor_image = torch.from_numpy(resized_image).permute(2, 0, 1).float().div(255.0).unsqueeze(0) # run model results = model(tensor_image) # get labels and scores labels = results.xyxyn[0][:, -1].numpy().astype(int) scores = results.xyxyn[0][:, -2].numpy() ``` 6. 在界面上显示结果 使用PyQt代码,在QLabel控件中显示检测结果。可以使用以下代码: ```python import numpy as np from PyQt5.QtGui import QImage, QPixmap # draw bounding boxes on image for i in range(len(labels)): label = labels[i] score = scores[i] # filter low confidence detections if score < 0.5: continue # get bounding box coordinates x1, y1, x2, y2 = results.xyxyn[0][i, :4].numpy() # draw bounding box cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2) # draw label and score label_text = f"{model.names[label]} {score:.2f}" cv2.putText(image, label_text, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # convert image to QPixmap image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) qimage = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888) qpixmap = QPixmap.fromImage(qimage) # set QLabel pixmap ui.label.setPixmap(qpixmap) ``` 7. 运行应用程序 将PyQt代码保存为.py文件,然后在终端中运行该文件即可启动应用程序。点击QPushButton控件即可进行物体检测。 这是一个简单的PyQtYolov5联合的教程,可以根据自己的需求进行修改和扩展。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值