当前位置:   article > 正文

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

(小白保姆级)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)首先导入相关库

  1. import sys
  2. from PyQt5 import QtWidgets, QtCore
  3. from PyQt5.QtWidgets import QFileDialog
  4. from PyQt5.QtGui import QPixmap, QImage
  5. import cv2
  6. from ultralytics import YOLO
  7. 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官网下载,同时我的网盘里也可以下载,也可以换成你自己的模型文件

  1. class MainWindow(QtWidgets.QWidget, Ui_Form):
  2. def __init__(self):
  3. try:
  4. super().__init__()
  5. self.setupUi(self)
  6. self.model = YOLO("yolov8n.pt")
  7. self.timer = QtCore.QTimer()
  8. self.timer.timeout.connect(self.update_frame)
  9. self.cap = None
  10. self.is_detection_active = False
  11. self.current_frame = None
  12. # 各个按钮绑定功能
  13. self.picture_detect_pushButton.clicked.connect(self.load_picture)
  14. self.video_detect_pushButton.clicked.connect(self.load_video)
  15. self.camera_detect_pushButton.clicked.connect(self.start_camera)
  16. self.start_detect_pushButton.clicked.connect(self.start_detection)
  17. self.stop_detect_pushButton.clicked.connect(self.stop_detection)
  18. self.pause_detect_pushButton.clicked.connect(self.pause_detect)
  19. except Exception as e:
  20. print(e)

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

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

  1. def load_picture(self):
  2. try:
  3. fileName, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files (*.jpg *.png)")
  4. self.is_detection_active = False
  5. if fileName:
  6. if self.timer.isActive():
  7. self.timer.stop()
  8. if self.cap:
  9. self.cap.release()
  10. self.cap = None
  11. self.current_frame = cv2.imread(fileName)
  12. self.display_image(self.current_frame, self.original_image)
  13. results = self.model.predict(self.current_frame)
  14. self.detected_frame = results[0].plot() # 获取检测结果的帧并保存
  15. self.display_image(self.detected_frame, self.detected_image)
  16. except Exception as e:
  17. print(e)
  18. def load_video(self):
  19. fileName, _ = QFileDialog.getOpenFileName(self, "选择视频", "", "Video Files (*.mp4 *.avi)")
  20. if fileName:
  21. if self.cap:
  22. self.cap.release()
  23. self.cap = None
  24. self.cap = cv2.VideoCapture(fileName)
  25. if self.cap.isOpened():
  26. ret, frame = self.cap.read()
  27. if ret:
  28. self.current_frame = frame.copy()
  29. self.display_image(frame, self.original_image)
  30. self.display_image(frame, self.detected_image)
  31. else:
  32. QtWidgets.QMessageBox.warning(self, 'Error', '无法读取视频文件的第一帧。')
  33. def start_camera(self):
  34. self.is_detection_active = False
  35. if self.cap:
  36. self.cap.release()
  37. self.cap = cv2.VideoCapture(0)
  38. self.timer.start(20)
  39. def update_frame(self):
  40. if self.cap:
  41. ret, frame = self.cap.read()
  42. if ret:
  43. self.current_frame = frame.copy()
  44. self.display_image(frame, self.original_image)
  45. if self.is_detection_active:
  46. results = self.model.predict(frame)
  47. self.detected_frame = results[0].plot() # 获取检测结果的帧并保存
  48. self.display_image(self.detected_frame, self.detected_image)
  49. def start_detection(self):
  50. if self.cap and not self.cap.isOpened():
  51. self.cap.open(self.fileName)
  52. if self.cap and not self.timer.isActive():
  53. self.timer.start(20)
  54. self.is_detection_active = True
  55. def display_image(self, frame, target_label):
  56. frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  57. height, width, channel = frame.shape
  58. step = channel * width
  59. qImg = QImage(frame.data, width, height, step, QImage.Format_RGB888)
  60. pixmap = QPixmap.fromImage(qImg)
  61. scaled_pixmap = pixmap.scaled(target_label.size(), QtCore.Qt.KeepAspectRatio)
  62. target_label.setPixmap(scaled_pixmap)
  63. def pause_detect(self):
  64. self.is_detection_active = False
  65. if self.timer.isActive():
  66. self.timer.stop()
  67. def stop_detection(self):
  68. self.is_detection_active = False
  69. if self.timer.isActive():
  70. self.timer.stop()
  71. if self.cap:
  72. self.cap.release()
  73. self.cap = None
  74. self.clear_display(self.original_image)
  75. self.clear_display(self.detected_image)
  76. def clear_display(self, target_label):
  77. target_label.clear()
  78. target_label.setText('')
  79. if __name__ == "__main__":
  80. app = QtWidgets.QApplication(sys.argv)
  81. main_window = MainWindow()
  82. main_window.show()
  83. sys.exit(app.exec_())

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

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

四、实际运行效果

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号