用 pyqt5给深度学习目标检测yolov3搭建界面(1)

最终效果图:
在这里插入图片描述注意一点:在窗口初始化中建立yolov3模型并进行相应的初始化,直接将预测处理的函数加到槽函数中。不这样做,会使得检测速度十分的慢。
代码如下:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from pyqt5.yolov3.util import *
import torch
import time
from pyqt5.yolov3.cam_demo import write, prep_image, arg_parse
from pyqt5.yolov3.darknet import Darknet
from pyqt5.yolov3.preprocess import prep_image


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1042, 921)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        # 显示摄像头画面
        self.cam_frame = QtWidgets.QFrame(self.centralwidget)
        self.cam_frame.setGeometry(QtCore.QRect(10, 110, 521, 571))
        self.cam_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.cam_frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.cam_frame.setObjectName("cam_frame")

        self.label_img_show = QtWidgets.QLabel(self.cam_frame)
        self.label_img_show.setGeometry(QtCore.QRect(10, 10, 501, 551))
        self.label_img_show.setObjectName("label_img_show")
        # self.label_img_show.setStyleSheet(("border:2px solid red"))

        # 显示检测画面
        self.detect_frame = QtWidgets.QFrame(self.centralwidget)
        self.detect_frame.setGeometry(QtCore.QRect(540, 110, 491, 571))
        self.detect_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.detect_frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.detect_frame.setObjectName("detect_frame")
        self.label_detect_show = QtWidgets.QLabel(self.detect_frame)
        self.label_detect_show.setGeometry(QtCore.QRect(10, 10, 481, 551))
        self.label_detect_show.setObjectName("label_detect_show")
        # self.label_detect_show.setStyleSheet(("border:2px solid green"))
        # 按钮框架
        self.btn_frame = QtWidgets.QFrame(self.centralwidget)
        self.btn_frame.setGeometry(QtCore.QRect(10, 20, 1021, 80))
        self.btn_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.btn_frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.btn_frame.setObjectName("frame_3")

        # 按钮水平布局
        self.widget = QtWidgets.QWidget(self.btn_frame)
        self.widget.setGeometry(QtCore.QRect(20, 10, 501, 60))
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 20, 20, 20)
        self.horizontalLayout.setSpacing(20)
        self.horizontalLayout.setObjectName("horizontalLayout")
        # 打开摄像头
        self.btn_opencam = QtWidgets.QPushButton(self.widget)
        self.btn_opencam.setObjectName("btn_opencam")
        self.horizontalLayout.addWidget(self.btn_opencam)
        # 加载模型文件
        self.btn_model_add_file = QtWidgets.QPushButton(self.widget)
        self.btn_model_add_file.setObjectName("btn_model_add_file")
        self.horizontalLayout.addWidget(self.btn_model_add_file)
        # 加载cfg文件
        self.btn_cfg_add_file = QtWidgets.QPushButton(self.widget)
        self.btn_cfg_add_file.setObjectName("btn_cfg_add_file")
        self.horizontalLayout.addWidget(self.btn_cfg_add_file)
        # 开始检测
        self.btn_detect = QtWidgets.QPushButton(self.widget)
        self.btn_detect.setObjectName("btn_detect")
        self.horizontalLayout.addWidget(self.btn_detect)
        # 退出
        self.btn_exit = QtWidgets.QPushButton(self.widget)
        self.btn_exit.setObjectName("btn_exit")
        self.horizontalLayout.addWidget(self.btn_exit)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1042, 17))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        # 这里将按钮和定义的动作相连,通过click信号连接openfile槽?
        # 加载模型文件
        self.btn_model_add_file.clicked.connect(self.open_model)
        # 加载cfg文件
        self.btn_cfg_add_file.clicked.connect(self.open_cfg)
        # 打开摄像头
        self.btn_opencam.clicked.connect(self.opencam)
        # 开始识别
        self.btn_detect.clicked.connect(self.detect)
        # 这里是将btn_exit按钮和Form窗口相连,点击按钮发送关闭窗口命令
        self.btn_exit.clicked.connect(MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "目标检测"))

        self.label_img_show.setText(_translate("MainWindow", "摄像头原始画面"))
        self.label_detect_show.setText(_translate("MainWindow", "实时检测效果"))
        self.btn_opencam.setText(_translate("MainWindow", "打开摄像头"))
        self.btn_model_add_file.setText(_translate("MainWindow", "加载模型文件"))
        self.btn_cfg_add_file.setText(_translate("MainWindow", "加载cfg文件"))
        self.btn_detect.setText(_translate("MainWindow", "开始检测"))
        self.btn_exit.setText(_translate("MainWindow", "退出"))

    def open_model(self):
        global openfile_name_mdoel
        openfile_name_mdoel, _ = QFileDialog.getOpenFileName(self.btn_model_add_file, '选择模型文件',
                                                             '/home/ljw/桌面/demo/project_demo/pyqt5/yolov3/')
        print('加载模型文件地址为:' + str(openfile_name_mdoel))

    def open_cfg(self):
        global openfile_name_cfg
        openfile_name_cfg, _ = QFileDialog.getOpenFileName(self.btn_cfg_add_file, '选择cfg文件',
                                                           '/home/ljw/桌面/demo/project_demo/pyqt5/yolov3/')
        print('加载cfg文件地址为:' + str(openfile_name_cfg))

    def opencam(self):
        self.camcapture = cv2.VideoCapture(0)
        self.timer = QtCore.QTimer()
        self.timer.start()
        self.timer.setInterval(3)  # 0.1s刷新一次
        self.timer.timeout.connect(self.camshow)

    def camshow(self):
        # global self.camimg
        _, self.camimg = self.camcapture.read()
        camimg = cv2.cvtColor(self.camimg, cv2.COLOR_BGR2RGB)
        showImage = QtGui.QImage(camimg.data, camimg.shape[1], camimg.shape[0], QtGui.QImage.Format_RGB888)
        self.label_img_show.setPixmap(QtGui.QPixmap.fromImage(showImage))

    def detect(self):
        self.frames = 0
        self.start = time.time()
        cfgfile = openfile_name_cfg
        weightsfile = openfile_name_mdoel
        self.num_classes = 80
        args = arg_parse()
        self.confidence = float(args.confidence)
        self.nms_thesh = float(args.nms_thresh)
        self.CUDA = torch.cuda.is_available()

        self.model = Darknet(cfgfile)
        self.model.load_weights(weightsfile)

        self.model.net_info["height"] = args.reso
        self.inp_dim = int(self.model.net_info["height"])
        assert self.inp_dim % 32 == 0
        assert self.inp_dim > 32
        self.timerdec = QtCore.QTimer()
        self.timerdec.start()
        self.timerdec.setInterval(3)  # 0.1s刷新一次
        self.timerdec.timeout.connect(self.object_detection)

    def object_detection(self):
        if self.CUDA:
            self.model.cuda()
        self.model.eval()
        img, orig_im, dim = prep_image(self.camimg, self.inp_dim)
        output = self.model(Variable(img), self.CUDA)
        output = write_results(output, self.confidence, self.num_classes, nms=True, nms_conf=self.nms_thesh)
        output[:, 1:5] = torch.clamp(output[:, 1:5], 0.0, float(self.inp_dim)) / self.inp_dim
        output[:, [1, 3]] *= self.camimg.shape[1]
        output[:, [2, 4]] *= self.camimg.shape[0]
        list(map(lambda x: write(x, orig_im), output))
        self.frames += 1
        print("FPS of the video is {:5.2f}".format(self.frames / (time.time() - self.start)))
        camimg = cv2.cvtColor(self.camimg, cv2.COLOR_BGR2RGB)
        showImage = QtGui.QImage(camimg.data, camimg.shape[1], camimg.shape[0], QtGui.QImage.Format_RGB888)
        self.label_detect_show.setPixmap(QtGui.QPixmap.fromImage(showImage))
        QApplication.processEvents()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = QMainWindow()
    ui = Ui_MainWindow()
    # 向主窗口上添加控件
    ui.setupUi(mainWindow)
    mainWindow.show()
    sys.exit(app.exec_())

注意修改自己模型与cfg文件的路径,然后就是注意调用yolov3的包的头文件。
我这里使用的yolov3的代码为
yolov3的代码
后续将对这个界面进行改进,加入一个文本显示框用来显示帧率以及检测的内容。

  • 13
    点赞
  • 215
    收藏
    觉得还不错? 一键收藏
  • 45
    评论
### 回答1: "Bpyqt5 Yolov5目标检测界面"是一个基于PyQt5和Yolov5算法实现的目标检测界面。通过使用Yolov5算法对图片或视频进行检测和识别,界面将识别结果呈现给用户。这种界面可以用于安防监控、智能交通、人脸识别等场景。 ### 回答2: PyQt5是一种Python编程语言下的GUI工具包,可以用于快速构建交互式的图形界面。而YoloV5目标检测则是一种深度学习算法,能够对图像或视频中的目标进行实时识别和跟踪。结合起来,可以实现一个实时目标检测的图形界面,让用户可以在图形化界面上进行实时目标检测的操作。 首先,需要安装PyQt5和YoloV5的相关依赖库。在PyQt5中,可以通过创建QWidget或QDialog窗口来实现图形界面的构建,通过布局管理器来控制组件的位置和大小。在界面中可以添加按钮、文本框等组件,还可以添加用于显示检测结果的画布组件。 在YoloV5中,需要先训练出一个能够进行目标检测深度学习模型。该模型需要能够对图像或视频进行实时识别和跟踪,同时还需要能够将识别的结果进行可视化显示。可以使用Python中的openCV来读取摄像头的数据流,并调用深度学习模型来进行目标检测,最终将识别结果显示在界面的画布组件上。 在界面上的交互操作中,可以增加“开始检测”、“停止检测”、“切换摄像头”等按钮来控制目标检测的开始和停止,以及摄像头的切换。同时还可以添加滑动条等组件来控制检测的参数,比如识别的阈值、帧速率等。 总之,通过PyQt5和YoloV5的结合,可以实现一个实时的目标检测GUI界面使用户可以方便地对图像或视频进行目标检测任务。不过要注意的是,这种技术需要一定的计算资源,需要确保设备的计算能力和性能满足要求。 ### 回答3: PyQt5和YoloV5都是现今非常流行的技术,其结合可以实现一个非常强大的目标检测界面。在这个界面中,用户可以输入需要检测的图片或者实时视频流,然后系统会自动检测其中的各个物体并标记出来,给用户一个直观的感受。在制作这个界面的时候,我们需要考虑以下几方面: 1. YoloV5的部署:在制作这个界面之前,我们需要先部署好YoloV5的模型。这里我们可以使用PyTorch或者TensorFlow等框架来实现。在模型部署好之后,我们需要将其集成进我们的PyQt5应用程序中。 2. 界面设计:接下来我们需要设计一个可以方便用户使用界面。在这个界面中,我们可以包括一个输入框来让用户输入需要检测的图片或者视频。在检测过程中,我们需要将检测到的物体以框的形式标记出来,给用户一个直观的感受。 3. 界面交互:我们需要在界面上加入一些交互元素,例如按钮、菜单等等。这些交互元素可以让用户对检测过程进行一些操作,例如重新检测、暂停检测、保存结果等等。 4. 性能优化:在进行物体检测的时候,我们需要实时处理大量的数据。因此,在这个界面中,我们需要进行一定的性能优化。例如可以使用多线程来加速物体检测的过程,同时可以设置一定的检测阈值来降低误报率,提高检测准确率。 总的来说,在制作PyQt5 YoloV5目标检测界面时,我们需要考虑到模型部署、界面设计、界面交互以及性能优化等方面。如果完成得好,这样的目标检测界面将能够为用户提供非常方便、直观、快速的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值