YOLOv5 PyQt5(一起制作YOLOv5的GUI界面)

视频地址:[PyQt \YOLOv5\GUI]利用PyQt制作的YOLOv5GUI界面_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1ii4y1C75h#reply105653862912

原博文:

利用PyQt5制作YOLOv5的GUI界面_Time.Xu的博客-CSDN博客https://blog.csdn.net/vibration_xu/article/details/123406488自从上一个视频在B站发布之后,很多小伙伴想要我把项目代码来源,考虑到没有什么值得来源的代码,但又不能单单放一个演示视频,不如在此把我制作的过程和各位小伙伴分享一下。希望大家记得点赞&收藏&关注 !

一、基本条件

        本文Win11操作系统下进行,处理器型号Intel i5-12600KF,显卡为Nvidia GeForce RTX 3070Ti,内存16GB。以Python3.8作为编程语言,框架采用PyTorch1.7,加速环境为Cuda11.0,编程平台为PyCharm。界面使用PyQt5设计开发。

1.1、训练自己的YOLOv5

        因为我们要实现在自己数据集下的图像识别,那么训练一个自己的yolov5是少不了的。网上有许多用自己的数据集训练yolov5的博文,在这里就不再介绍如何训练了哈~

1.2、从pycharm里进入PyQt5

        其实我们在安装anaconda 的时候实际上已经装好了PyQt5的程序。所以现在我们需要把它放到pycharm的额外工具栏里。(导入之后可以在如下图所示的地方看到)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_12,color_FFFFFF,t_70,g_se,x_16

 怎么加进去呢?

        首先,在pycharm下点击File>Settings>Tools>>Extenal Tools,在左上角Create Tool。然后,按照如下图片填写一下新建的工具名称、工具作用描述、工具位置和工作空间之类的。(执行文件位置自己找一下哈,就是在你安装Anaconda下的文件夹下的Anaconda/Library/bin/里面)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_17,color_FFFFFF,t_70,g_se,x_16

 加进去之后怎样启动QTDesigner呢?

        我们可以在菜单栏Tools>>External Tools下找到我们刚刚加入的这个QTDesingner,然后check it   

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_12,color_FFFFFF,t_70,g_se,x_16

         这样我们就成功地打开了QTDesingner,在这里我们可以选择我们想要的界面类型,比如Window、Widget等等。(由于本设计在界面中不需要任务栏,所以选择了Widget)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_20,color_FFFFFF,t_70,g_se,x_16

如何设计界面呢?

         我们可以在左侧展现各种功能按钮的工具栏列表中挑选自己喜欢的放在窗口中了,下面把我做的登录界面和展示界面放出来供大家参考。(这里很多小伙伴问我登录界面如何做的好看(背景颜色、布局等),我之后单独出一个博文来说)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_20,color_FFFFFF,t_70,g_se,x_16 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 这里需要补充几个在制作界面是很有必要掌握的知识点:

1、建议大家在对象查看器里面更改一下自己设计的对象名称,比如把button_1改成button_Login,把button_2改为button_Exit,这样,便于代码理解与阅读,在后期编程时对我们极大有利。

2、属性编辑器里可以设置对象的大小和位置,其中可以通过sizePolicy>Fixed和minimumSize/maxmumSize使得窗口/功能键变为固定尺寸。

3、属性编辑器pbjectName里可以设置窗口的名称。

4、(有时间再补充)

 如何预览设计好的界面呢?

        在QTDesingner工具栏里找到窗体>预览选项,点击即可看到我们设计的界面。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_9,color_FFFFFF,t_70,g_se,x_16

 如何保存设计好的界面的代码呢?

        保存或者另存为就可以保存设计好的界面的代码,保存后的代码是.ui格式。 


 1.3、在pycharm中打开我们的界面

2022.3.21.继续写。。。 

首先,,把上一步生成的ui文件放进我们的工程里。

如何将.ui格式的代码转变为.py格式呢?

        这一步的操作方法和之前加载qtdesigner类似,在pycharm下点击File>Settings>Tools>>Extenal Tools,然后新建立一个PyUIC。

-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_17,color_FFFFFF,t_70,g_se,x_16

在成功建立这个名叫PyUIC的Extenal Tool之后,我们就可以在我们想要转换的ui文件上,右键>>Extenal Tools>>PyUIC,这样我们就生成了我们想要的ui文件所对应的py文件了。

如何在PyCharm里展现我们设计好的界面呢?

转换好的py文件大概如下图这样。在下图中我们千万不要把很多很多代码写在这个文件中,因为当我们想要重新利用QtDesigner生成ui文件并转化成py文件后,他就会把你之前的代码覆盖掉了,到时候欲哭无泪的可是你自己。我们需要修改一个地方(红色箭头所指的地方),为什么要改呢?因为如果我们是多个界面的话,它都会默认叫做一个类名容易出错。这里由于设置的是登录界面所以我管它叫Win_Login.

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 新建立一个py文件,然后写下以下代码。然后执行它。

from PyQt5.QtWidgets import QApplication,QMainWindow,QMessageBox
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPixmap, QImage
from Win_Login import Win_Login   # 改一下类的名字,(这个注释不要删掉)这行代码的意思是把Win_Login.py中名叫Win_Login的Class加载进来
#from Win_main import Win_Main    # 改一下类的名字,(这个注释不要删掉)
#import detect, detect_video, detect_IPcamera
import sys
import os
#from Share.share import SI
import cv2


class LoginWindow(QMainWindow):
    def __init__(self):
        # 继承界面
        super().__init__()
        self.ui = Win_Login() # 导入定义界面类
        self.ui.setupUi(self)   # 导入定义界面类

"""进入登陆界面"""
if __name__ == '__main__':
    app = QApplication([])
    win_login = LoginWindow()
    win_login.show()
    sys.exit(app.exec_())

如果没有问题,那么恭喜你,你已经完成了基本功能的一大半了。 

 1.3、在pycharm中打开我们的界面

如何把界面中设计的各个按钮赋予相应的功能呢?

在这里我们首先简单解释一下“槽 信号”

这里只是为了快速理解,不严谨…..

信号:是指一个事情/动作/行为的发生。比如鼠标点击了某个按钮、鼠标滑过了某个按钮、键盘按下了回车键等等。

槽:是指一个事件发生后要求关联发生的事件。比如你点击了收藏本文按钮后成功的做出了自己的GUI界面,这个自己做出GUI界面的事情就是收藏本文所对应的槽。比如你对本文打赏后博主拿钱去买了一杯咖啡,这个我去买咖啡的事情就是打赏本文所对应的槽。

信号(函数):一个对象想让另外一个对象完成某个操作,需要发送一些信息给另一个对象,通过信号函数发送

槽(函数):另一个需要完成的功能(函数去响应,另一个函数的信号)

再了解了槽和信号之后,我们就需要定义一些槽和信号,并且关联他们。

首先我们思考一下,信号是谁发出的?我们暂时可以简单理解为是操作者通过鼠标或者键盘控制发出的,比如按下了某一个按键或者输入了某一个字符。槽是做什么的?对操作者所要作的事情去执行一个程序。怎么关联信号和槽?那就是要去关联/定义一个单击事件

"""定义登录"""
class LoginWindow(QMainWindow):
    def __init__(self):
        # 继承界面
        super().__init__()
        self.ui = Win_Login() # 使用ui文件导入定义界面类
        self.ui.setupUi(self)   # 使用ui文件导入定义界面类
        ########### 定义单击事件##############
        self.ui.pushButton_login.clicked.connect(self.Login)
        self.ui.pushButton_exit.clicked.connect(self.Exit)
        self.ui.lineEdit_Password.returnPressed.connect(self.Login)

同样,我的检测界面单击事件也是这样定义的。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGltZS5YdQ==,size_20,color_FFFFFF,t_70,g_se,x_16

登录界面的代码中的self.Login\self.Exit 或者 检测界面中的各个self.XX就是我们想要去设置的槽。

是不是不难哇,如果感觉有收获可以在右下角打赏,请博主喝一杯咖啡。嘎嘎嘎嘎

我在代码里是这样写的,这里不建议你去复制我的代码,因为这个代码涉及到了一些共享参数的问题,所以大家参考一下就好。

def Exit(self):
    choice = QMessageBox.question(self,'confirm', 'Please confirm exit!')
    if choice == QMessageBox.Yes:
        print('你选择了yes')
        exit()
    if choice == QMessageBox.No:
        print('你选择了no')
        return
def Login(self):
    print("click_login")
    # 获取文字
    username_input = self.ui.lineEdit_usename.text().strip()
    SI.userName = self.ui.lineEdit_usename.text().strip()
    print("username is {}".format(username_input))
    password_input = self.ui.lineEdit_Password.text().strip()
    print("password is {}".format(password_input))
    # 设置真实密码
    T_username = "xuxingshi"
    T_password = "666"
    #进行条件判断
    if T_username != username_input:
        print("username is wrong, you input {}".format(username_input))
        QMessageBox.warning(self,'username wrong','username is wrong!\nyou input {}'.format(username_input))
        return
    if T_password != password_input:
        print("password is wrong, please check it")
        QMessageBox.warning(self, 'password wrong', 'password is wrong!')
        return
    print("The user name and password are correct!")
    QMessageBox.information(self,'Done','Please confirm login!')
    SI.win_main = DetectWindow()
    # 显示新窗口
    SI.win_main.show()
    # 关闭自己
    self.hide()
    self.ui.lineEdit_Password.clear()

弹出的临时窗口是怎样做到的?

常用控件4 | 白月黑羽 (byhy.net)https://www.byhy.net/tut/py/gui/qt_05_4/#%E6%8F%90%E7%A4%BA%E6%A1%86这里十分推荐学习这个链接里面介绍的内容。(侵删)

界面与界面直接是怎样切换的?

界面设计师 Qt Designer | 白月黑羽 (byhy.net)https://www.byhy.net/tut/py/gui/qt_03/#%E4%BB%8E%E4%B8%80%E4%B8%AA%E7%AA%97%E5%8F%A3%E8%B7%B3%E8%BD%AC%E5%88%B0%E5%8F%A6%E5%A4%96%E4%B8%80%E4%B8%AA%E7%AA%97%E5%8F%A3

如何在界面中显示图片呢?

我是在label控件中显示图片的。

filePath_ph, filetype_ph = QtWidgets.QFileDialog.getOpenFileName(self, "选取要检测的图片", "./", "*.*")
        print("图片路径和名称是:::{0}\n文件类型是:::{1}".format(filePath_ph,filetype_ph))
        Picture_path = filePath_ph

        WILLDetectPhoto = QPixmap(Picture_path)
        self.ui.label.setPixmap(WILLDetectPhoto)

如何在界面中播放视频呢?

这里需要一个QTime的类,大家可以先自己研究一下。

先写到这里,关注我,我会加快更新的

来源:Time.Xu

物联沃分享整理
物联沃-IOTWORD物联网 » YOLOv5 PyQt5(一起制作YOLOv5的GUI界面)

发表评论