YOLOV5 部署:QT的可视化界面推理(根据UI窗口编写内部函数)

1、前言

上一章,UI的可视化界面已经创建好了。并且通过UI文件编译成了python可以处理的py文件,为了方便使用,我们新建了qt_inference 对ui的py脚本进行调用,效果如下

UI可视化的生成:YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)-CSDN博客

本章将接着上面操作,完成一个可以实时检测的YOLOV5可视化推理界面

下面将根据项目一步一步实现函数,可能会看得有点头昏,或者害怕代码缺失的问题。不用担心,文末会有脚本的全部代码,可以拷贝下面跟着博文一起实现就行了

2、简单的图片、视频检测函数

下面对ui的每一个按钮绑定一个事件,达到理想的效果

run 方法的detect_image 就是上一章中,按钮的重新命名,当然在编译生成ui_main_window脚本里也可以看到按钮的名称

如下:点击按钮,就能出现信息啦

3、torch.hub 检测

因为yolov5的检测参数太多,不方便可视化的部署,所以这里介绍一个简单的推理方法

代码如下:

前面的pathlib是为了解决path报错的问题,如果没有报错的话,可以删除这三行

torch.hub.load 参数:当前文件夹、自定义模型、权重路径、本地项目

import torch

'''
解决下面的问题
Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
'''
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath


model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local')

img = './datasets/images/train/180.jpg'

result = model(img)

result.show()

运行:其实pycharm控制台也可以看见解释器的位置

结果:

result.render()[0]  添加这个,可以将推理结果的图片数组提出来,而非show

4、图片检测事件

既然按钮已经和我们的代码绑定在一起了,只要在代码里实现想要的操作就易如反掌了,这也是我们擅长的

4.1 读取文件夹、图片

因为点击图片检测按钮的时候,应该会弹出一个窗口,让我们在本地的目录下进行查找待推理的图片,这里需要导入下面的库函数

这里的dir 是默认打开的文件路径,filter 是指定打开的文件格式,这里是图片格式

效果如下:

如果什么都不选,点击取消的话,也会返回两个元组,只不过都是空的。而我们只需要第一个元组,因为这个是图片的路径!!

4.2 在UI界面中显示图片

需要导入函数,用于QT的显示图片

然后把路径传入input窗口即可(还记得吗,input是我们定义的显示图片的组件名称

4.3 推理部分

那么根据第三节的hub检测,推理的代码就很好写了

首先导入库

然后导入模型,并且推理即可

4.4 显示推理结果

因为image 是个数组形式,虽然也是个图片,但是QT不支持,所以需要转成QT的格式

将数组转入QT格式的数据

调用推理函数,并且输出即可

4.5 可视化图片检测的完整代码

代码:

import sys
from PySide6.QtWidgets import QMainWindow,QApplication,QFileDialog      # 打开文件夹的函数
from ui_main_window import Ui_MainWindow
from PySide6.QtGui import QPixmap,QImage           # 显示图片库,qt的图片格式


import torch
'''
解决下面的问题
Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
'''
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath


# 图片转换
def convert2QImage(img):
    h,w,c = img.shape
    return QImage(img,w,h,w*c,QImage.Format_RGB888)


class MainWindow(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(MainWindow,self).__init__()
        self.setupUi(self)      # 根据ui文件编译成的 py类
        self.model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local')     # 加载模型
        self.run()              # 将按钮和事件绑定,通过鼠标点击触发

    def image_pred(self,file_path):
        results = self.model(file_path)
        image = results.render()[0]     # 推理结果,是个数组
        image = convert2QImage(image)   # 转成QT支持的数据
        return image

    def open_image(self):       # 打开图片
        print('image detect')
        file_path = QFileDialog.getOpenFileName(self,dir='datasets/images/val',filter='*.jpg;*.png;*.jpeg')

        if file_path[0]:        # 如果有图片的话
            file_path = file_path[0]
            self.input.setPixmap(QPixmap(file_path))        # 将图片显示到可视化窗口的输入部分
            qimage = self.image_pred(file_path)
            self.output.setPixmap(QPixmap.fromImage(qimage))         # # 将图片显示到可视化窗口的输出部分

    def open_video(self):       # 打开视频
        print('video detect')

    def run(self):              # 鼠标触发的事件
        self.detect_image.clicked.connect(self.open_image)
        self.detect_video.clicked.connect(self.open_video)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    app.exec()

控制台输出:

可视化结果展示:

5、视频检测事件

视频检测的部分可图片检测一样,抽取每帧然后推理、输出,这里只做简单介绍

传统的while 循环在QT里面可能会有较大延迟,为了方便,这里使用计时器来实现视频检测

代码的逻辑很简单,通过计时器计数,达到一定时间自动抽取一帧进行预测

视频检测:

6、完整代码

项目的逻辑很简单,首先可视化窗口,检测鼠标是否点击了检测的按钮(run函数)

如果检测了图片,将根据路径找到图片进行推理,并且展示在窗口中

如果检测了视频,则计时器开始计时,每到一个间隔,自动运行video_pred 函数,也就是视频检测,自动读取一帧

 代码:

import sys
import cv2
from PySide6.QtWidgets import QMainWindow,QApplication,QFileDialog      # 打开文件夹的函数
from ui_main_window import Ui_MainWindow
from PySide6.QtGui import QPixmap,QImage           # 显示图片库,qt的图片格式
from PySide6.QtCore import QTimer               # 显示视频的计时器

import torch
'''
解决下面的问题
Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
'''
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath


# 图片转换
def convert2QImage(img):
    h,w,c = img.shape
    return QImage(img,w,h,w*c,QImage.Format_RGB888)


class MainWindow(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(MainWindow,self).__init__()
        self.setupUi(self)      # 根据ui文件编译成的 py类
        self.model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local')     # 加载模型
        self.timer = QTimer()       # 创建计时器
        self.timer.setInterval(1)   # 计时器的间隔,ms
        self.video = None
        self.run()              # 将按钮和事件绑定,通过鼠标点击触发

    def image_pred(self,file_path):
        results = self.model(file_path)
        image = results.render()[0]     # 推理结果,是个数组
        image = convert2QImage(image)   # 转成QT支持的数据
        return image

    def open_image(self):       # 打开图片
        self.timer.stop()
        print('image detect')
        file_path = QFileDialog.getOpenFileName(self,dir='datasets/images/val',filter='*.jpg;*.png;*.jpeg')

        if file_path[0]:        # 如果有图片的话
            file_path = file_path[0]
            self.input.setPixmap(QPixmap(file_path))        # 将图片显示到可视化窗口的输入部分
            qimage = self.image_pred(file_path)
            self.output.setPixmap(QPixmap.fromImage(qimage))         # 将图片显示到可视化窗口的输出部分

    def video_pred(self):
        ret, frame = self.video.read()
        if not ret:
            self.timer.stop()       # 没有检测到视频,计时器停止
        else:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))  # 将图片显示到可视化窗口的输入部分
            results = self.model(frame)
            image = results.render()[0]     # 推理结果,是个数组
            self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))  # 将图片显示到可视化窗口的输出部分

    def open_video(self):       # 打开视频
        print('video detect')
        file_path = QFileDialog.getOpenFileName(self, dir='datasets', filter='*.mp4')
        if file_path[0]:  # 如果有视频的话
            file_path = file_path[0]
            self.video = cv2.VideoCapture(file_path)             # 打开视频
            self.timer.start()

    def run(self):              # 鼠标触发的事件
        self.detect_image.clicked.connect(self.open_image)
        self.detect_video.clicked.connect(self.open_video)
        self.timer.timeout.connect(self.video_pred)    # 计时器时间到就预测


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    app.exec()

项目完整下载:YOLOV5部署,利用QT部署可视化的图片、视频推理界面资源-CSDN文库

订阅本专栏,根据文章自动生成即可,不需要下载

  • 18
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: YoloV5是一个非常流行的目标检测算法,PyQt5是一个Python GUI框架,可以用来构建可视化界面。下面是一个简单的例子,展示如何使用PyQt5构建一个YoloV5可视化界面。 1. 安装PyQt5和YoloV5 在终端中执行以下命令安装PyQt5 ``` pip install PyQt5 ``` 在终端中执行以下命令安装YoloV5 ``` git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt ``` 2. 构建PyQt5界面 在Python文件中导入PyQt5模块,使用PyQt5的QMainWindow类创建一个主窗口,设置窗口标题和大小等属性。 ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("YoloV5 GUI") self.setGeometry(100, 100, 800, 600) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 3. 添加控件 可以在主窗口中添加控件,如按钮、文本框、标签等等。下面是一个添加按钮的示例。 ```python from PyQt5.QtWidgets import QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("YoloV5 GUI") self.setGeometry(100, 100, 800, 600) # 添加一个按钮 self.btn = QPushButton("Run YoloV5", self) self.btn.move(50, 50) self.btn.clicked.connect(self.run_yolov5) def run_yolov5(self): print("Run YoloV5!") ``` 4. 使用YoloV5进行目标检测 可以在主窗口中添加一个按钮,点击按钮时使用YoloV5模型进行目标检测。下面是一个使用YoloV5进行目标检测的示例。 ```python from PyQt5.QtWidgets import QFileDialog from yolov5.detect import YoloV5Detector class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("YoloV5 GUI") self.setGeometry(100, 100, 800, 600) # 添加一个按钮 self.btn = QPushButton("Run YoloV5", self) self.btn.move(50, 50) self.btn.clicked.connect(self.run_yolov5) # 创建一个YoloV5检测器 self.detector = YoloV5Detector() def run_yolov5(self): # 打开文件选择对话框,选择需要检测的图片 file_dialog = QFileDialog() file_dialog.setNameFilter("Images (*.png *.xpm *.jpg)") file_dialog.selectNameFilter("Images (*.png *.xpm *.jpg)") if file_dialog.exec_() == QFileDialog.Accepted: file_path = file_dialog.selectedFiles()[0] print("Detecting objects in file: ", file_path) # 使用YoloV5检测器进行目标检测 results = self.detector.detect(file_path) # 输出检测结果 for result in results: print(result) ``` 在这个示例中,我们使用YoloV5Detector类进行目标检测,该类使用YoloV5模型进行目标检测。可以根据需要自定义YoloV5Detector类。 运行程序,点击“Run YoloV5”按钮,选择需要检测的图片,YoloV5模型会自动进行目标检测,并输出检测结果。 这里只是一个简单的例子,你可以根据需要添加更多的控件和功能。 ### 回答2: YOLOv5 是一种先进的目标检测算法,而PyQt5是一种用于创建跨平台桌面应用程序的界面工具。结合这两者可以实现YOLOv5可视化界面。 首先,我们需要将YOLOv5的源代码集成到我们的项目中。在PyQt5中,我们可以创建一个主窗口来容纳我们的界面组件。我们可以使用PyQt5的设计师工具来设计界面,也可以通过代码编写界面组件。在主窗口中,我们可以添加按钮、文本框、图像区域等。 接下来,我们可以在界面中添加一个按钮来加载图像。通过点击该按钮,我们可以选择要检测的图像文件。一旦图像加载完成,我们可以将其显示在界面的图像区域中。 然后,我们需要为界面添加一个开始检测的按钮。当用户点击该按钮时,我们将调用YOLOv5算法来对加载的图像进行目标检测。检测结果可以以图像形式显示在界面中,我们可以在每个检测到的目标周围框出边界框,并显示目标类别的标签。 此外,我们可以在界面中添加一些控件来调整检测的参数,例如检测置信度的阈值、NMS的阈值等。用户可以根据需要调整这些参数,并重新进行目标检测。 最后,在界面中我们可以添加一个保存结果的按钮。当用户点击该按钮时,我们可以将目标检测结果保存到文件中,或者将其复制到剪贴板中以供其他用途。 通过将YOLOv5和PyQt5相结合,我们可以创建一个功能强大且易于使用的目标检测可视化界面。用户可以通过界面加载图像、进行目标检测、调整参数并保存结果,从而更加方便地进行目标检测任务。 ### 回答3: YOLOv5是一个流行的目标检测算法,PyQt5是一个基于Python的GUI库,用于创建可视化界面YOLOv5与PyQt5结合可以实现一个功能丰富的可视化界面,用于实时目标检测和图像处理。 在使用YOLOv5和PyQt5创建可视化界面时,可以按照以下步骤进行操作: 1. 安装依赖库:首先需要安装YOLOv5和PyQt5的依赖库。可以使用pip命令或者conda命令来安装这些库。 2. 导入必要的库:在Python代码中,需要导入YOLOv5和PyQt5的库。例如,可以导入PyQt5.QtWidgets模块来创建窗口和部件,导入YOLOv5相关模块来进行目标检测。 3. 创建GUI窗口:使用PyQt5创建一个GUI窗口,可以使用QtWidgets.QMainWindow类。这个窗口将包含用于目标检测和图像处理的各种部件,如按钮、标签和图像显示区域。 4. 添加按钮和事件处理函数:在窗口中添加按钮,用于触发目标检测和图像处理的功能。通过连接按钮的点击事件和相应的事件处理函数,实现按钮功能。 5. 实现目标检测功能:在事件处理函数中,调用YOLOv5的方法进行目标检测。可以将目标检测结果显示在图像显示区域,或者在标签中显示。 6. 图像处理:除了目标检测,还可以在界面中添加其他图像处理功能,如裁剪、旋转或滤波等。在事件处理函数中调用相应的图像处理函数以实现这些功能。 7. 运行界面:完成界面设计和功能实现后,使用app.exec_()来运行界面。 通过以上步骤,可以实现一个基于YOLOv5和PyQt5的可视化界面,用于实时目标检测和图像处理。用户可以通过界面上的按钮触发相应的功能,获得目标检测结果或进行图像处理操作。这样的界面可以提供更友好的交互方式,方便用户进行目标检测和图像处理的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

听风吹等浪起

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

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

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

打赏作者

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

抵扣说明:

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

余额充值