当前位置:   article > 正文

YOLOV5 部署:QT的可视化界面推理(根据UI窗口编写内部函数)_yolov5目标检测qt界面制作

yolov5目标检测qt界面制作

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 参数:当前文件夹、自定义模型、权重路径、本地项目

  1. import torch
  2. '''
  3. 解决下面的问题
  4. Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
  5. try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
  6. '''
  7. import pathlib
  8. temp = pathlib.PosixPath
  9. pathlib.PosixPath = pathlib.WindowsPath
  10. model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local')
  11. img = './datasets/images/train/180.jpg'
  12. result = model(img)
  13. 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 可视化图片检测的完整代码

代码:

  1. import sys
  2. from PySide6.QtWidgets import QMainWindow,QApplication,QFileDialog # 打开文件夹的函数
  3. from ui_main_window import Ui_MainWindow
  4. from PySide6.QtGui import QPixmap,QImage # 显示图片库,qt的图片格式
  5. import torch
  6. '''
  7. 解决下面的问题
  8. Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
  9. try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
  10. '''
  11. import pathlib
  12. temp = pathlib.PosixPath
  13. pathlib.PosixPath = pathlib.WindowsPath
  14. # 图片转换
  15. def convert2QImage(img):
  16. h,w,c = img.shape
  17. return QImage(img,w,h,w*c,QImage.Format_RGB888)
  18. class MainWindow(QMainWindow,Ui_MainWindow):
  19. def __init__(self):
  20. super(MainWindow,self).__init__()
  21. self.setupUi(self) # 根据ui文件编译成的 py类
  22. self.model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local') # 加载模型
  23. self.run() # 将按钮和事件绑定,通过鼠标点击触发
  24. def image_pred(self,file_path):
  25. results = self.model(file_path)
  26. image = results.render()[0] # 推理结果,是个数组
  27. image = convert2QImage(image) # 转成QT支持的数据
  28. return image
  29. def open_image(self): # 打开图片
  30. print('image detect')
  31. file_path = QFileDialog.getOpenFileName(self,dir='datasets/images/val',filter='*.jpg;*.png;*.jpeg')
  32. if file_path[0]: # 如果有图片的话
  33. file_path = file_path[0]
  34. self.input.setPixmap(QPixmap(file_path)) # 将图片显示到可视化窗口的输入部分
  35. qimage = self.image_pred(file_path)
  36. self.output.setPixmap(QPixmap.fromImage(qimage)) # # 将图片显示到可视化窗口的输出部分
  37. def open_video(self): # 打开视频
  38. print('video detect')
  39. def run(self): # 鼠标触发的事件
  40. self.detect_image.clicked.connect(self.open_image)
  41. self.detect_video.clicked.connect(self.open_video)
  42. if __name__ == '__main__':
  43. app = QApplication(sys.argv)
  44. window = MainWindow()
  45. window.show()
  46. app.exec()

控制台输出:

可视化结果展示:

5、视频检测事件

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

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

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

视频检测:

6、完整代码

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

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

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

 代码:

  1. import sys
  2. import cv2
  3. from PySide6.QtWidgets import QMainWindow,QApplication,QFileDialog # 打开文件夹的函数
  4. from ui_main_window import Ui_MainWindow
  5. from PySide6.QtGui import QPixmap,QImage # 显示图片库,qt的图片格式
  6. from PySide6.QtCore import QTimer # 显示视频的计时器
  7. import torch
  8. '''
  9. 解决下面的问题
  10. Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
  11. try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
  12. '''
  13. import pathlib
  14. temp = pathlib.PosixPath
  15. pathlib.PosixPath = pathlib.WindowsPath
  16. # 图片转换
  17. def convert2QImage(img):
  18. h,w,c = img.shape
  19. return QImage(img,w,h,w*c,QImage.Format_RGB888)
  20. class MainWindow(QMainWindow,Ui_MainWindow):
  21. def __init__(self):
  22. super(MainWindow,self).__init__()
  23. self.setupUi(self) # 根据ui文件编译成的 py类
  24. self.model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local') # 加载模型
  25. self.timer = QTimer() # 创建计时器
  26. self.timer.setInterval(1) # 计时器的间隔,ms
  27. self.video = None
  28. self.run() # 将按钮和事件绑定,通过鼠标点击触发
  29. def image_pred(self,file_path):
  30. results = self.model(file_path)
  31. image = results.render()[0] # 推理结果,是个数组
  32. image = convert2QImage(image) # 转成QT支持的数据
  33. return image
  34. def open_image(self): # 打开图片
  35. self.timer.stop()
  36. print('image detect')
  37. file_path = QFileDialog.getOpenFileName(self,dir='datasets/images/val',filter='*.jpg;*.png;*.jpeg')
  38. if file_path[0]: # 如果有图片的话
  39. file_path = file_path[0]
  40. self.input.setPixmap(QPixmap(file_path)) # 将图片显示到可视化窗口的输入部分
  41. qimage = self.image_pred(file_path)
  42. self.output.setPixmap(QPixmap.fromImage(qimage)) # 将图片显示到可视化窗口的输出部分
  43. def video_pred(self):
  44. ret, frame = self.video.read()
  45. if not ret:
  46. self.timer.stop() # 没有检测到视频,计时器停止
  47. else:
  48. frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  49. self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame))) # 将图片显示到可视化窗口的输入部分
  50. results = self.model(frame)
  51. image = results.render()[0] # 推理结果,是个数组
  52. self.output.setPixmap(QPixmap.fromImage(convert2QImage(image))) # 将图片显示到可视化窗口的输出部分
  53. def open_video(self): # 打开视频
  54. print('video detect')
  55. file_path = QFileDialog.getOpenFileName(self, dir='datasets', filter='*.mp4')
  56. if file_path[0]: # 如果有视频的话
  57. file_path = file_path[0]
  58. self.video = cv2.VideoCapture(file_path) # 打开视频
  59. self.timer.start()
  60. def run(self): # 鼠标触发的事件
  61. self.detect_image.clicked.connect(self.open_image)
  62. self.detect_video.clicked.connect(self.open_video)
  63. self.timer.timeout.connect(self.video_pred) # 计时器时间到就预测
  64. if __name__ == '__main__':
  65. app = QApplication(sys.argv)
  66. window = MainWindow()
  67. window.show()
  68. app.exec()

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

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/509550
推荐阅读
相关标签
  

闽ICP备14008679号