yolov8(Ultralytics)可视化界面ui设计,基于pyqt5,单py文件即插即用

embedded/2024/10/18 2:05:28/

本次YOLOV8.html" title=yolov8>yolov8可视化界面Ui相较之前文章中的界面进行了部分改动,比较明显的改动为本文使用的YOLOV8.html" title=yolov8>yolov8版本为8.2.0,有了较新的范围内统计目标数量的功能(目前还没整合进来,后续更新),且分为左右两个区域分别显示原始图像和处理后的图像,还可以分别对图片,视频,摄像头以及云ip摄像头分别进行识别并展示,本文仅针对图像处理做出代码示例,所有代码只需要在根目录下新建一个ui.py即可正常运行,无需新建过多的文件,对于视频及摄像头处理可以根据图像处理进行修改后实现功能,或者私聊我获取成品。

目录

Ultralytics%E6%BA%90%E7%A0%81%E6%97%A0%E8%AF%AF%E4%B8%94%E7%8E%AF%E5%A2%83%E6%AD%A3%E5%B8%B8%E9%85%8D%E7%BD%AE-toc" style="margin-left:0px;">1.准备工作

YOLOV8.html" title=yolov8>yolov8%EF%BC%88Ultralytics%EF%BC%89%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96-toc" style="margin-left:40px;">1.1 YOLOV8.html" title=yolov8>yolov8(Ultralytics)源码获取

YOLOV8.html" title=yolov8>yolov8%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE-toc" style="margin-left:40px;">1.2 YOLOV8.html" title=yolov8>yolov8环境配置

2.完整界面展示

2.1 主界面展示

2.2 功能展示

3.界面实现

3.1 相关库

3.2 导入库

3.3 功能实现

3.3.1 添加按钮

3.3.2 功能函数定义

3.3.3 完整代码

3.4 界面展示


Ultralytics%E6%BA%90%E7%A0%81%E6%97%A0%E8%AF%AF%E4%B8%94%E7%8E%AF%E5%A2%83%E6%AD%A3%E5%B8%B8%E9%85%8D%E7%BD%AE">1.准备工作

YOLOV8.html" title=yolov8>yolov8%EF%BC%88Ultralytics%EF%BC%89%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96">1.1 YOLOV8.html" title=yolov8>yolov8(Ultralytics)源码获取

源代码文件获取请查看之前文章,或者点此链接下载,压缩包内为整合源码及权重文件夹。

YOLOV8.html" title=yolov8>yolov8官方地址为  GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀 ,建议下载YOLOV8.html" title=yolov8>yolov8 8.2.0版本源码。

YOLOV8.html" title=yolov8>yolov8%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE">1.2 YOLOV8.html" title=yolov8>yolov8环境配置

环境异常请根据下文配置相应python环境,再尝试使用本文提供的可视化界面

深度学习目标检测:YOLOV8.html" title=yolov8>yolov8(Ultralytics)环境配置,适合0基础小白,超详细_ultralytics 安装-CSDN博客文章浏览阅读1.2w次,点赞78次,收藏214次。深度学习目标检测YOLOV8.html" title=yolov8>yolov8小白教程环境搭建,纯新手方便理解_ultralytics 安装https://blog.csdn.net/qq_67105081/article/details/137519207?spm=1001.2014.3001.5502

建议使用Anaconda3+pycharm,下载YOLOV8.html" title=yolov8>yolov8 8.2.0版本源码。

2.完整界面展示

2.1 主界面展示

界面整体分为三部分,左右图像展示框以及下方功能按钮,下图为运行后界面展示

2.2 功能展示

首先选择模型,选择完之后可以分别进行图片或者视频或者打开摄像头进行实时检测,检测之后的图像会实时显示在界面上,左边显示原始图像,右边显示检测后的图像

也可以选择视频进行检测,效果如下图(显示检测物体没录制上)

点击显示检测物体即可显示出当前检测到的所有物体

3.界面实现

本文仅对图片检测进行展示,如需其它功能界面请私聊获取。

3.1 相关库

除了YOLOV8.html" title=yolov8>yolov8所用库之外,本文所用到的额外库为pyqt5,输入指令进行安装

pip install PyQt5

3.2 导入库

我这里导入的是以下这些,同官方源码兼容。

python">import sys
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, QMessageBox, QFileDialog
from PyQt5.QtGui import QImage, QPixmap,QIcon
import cv2
from ultralytics import YOLO

3.3 功能实现

3.3.1 添加按钮

这里只实现了简单的权重选择和图片检测功能并添加了对应的按钮

python"># 添加模型选择按钮
self.load_model_button = QPushButton("📁模型选择")
self.load_model_button.clicked.connect(self.load_model)
self.load_model_button.setFixedSize(120, 30)
hbox_buttons.addWidget(self.load_model_button)# 添加图片检测按钮
self.image_detect_button = QPushButton("💾图片检测")
self.image_detect_button.clicked.connect(self.detect_image)
self.image_detect_button.setEnabled(False)
self.image_detect_button.setFixedSize(120, 30)
hbox_buttons.addWidget(self.image_detect_button)# 添加显示检测物体按钮
self.display_objects_button = QPushButton("🔍显示检测物体")
self.display_objects_button.clicked.connect(self.show_detected_objects)
self.display_objects_button.setEnabled(False)
self.display_objects_button.setFixedSize(120, 30)
hbox_buttons.addWidget(self.display_objects_button)# 添加退出按钮
self.exit_button = QPushButton("❌退出")
self.exit_button.clicked.connect(self.exit_application)
self.exit_button.setFixedSize(120, 30)
hbox_buttons.addWidget(self.exit_button)

3.3.2 功能函数定义

检测图片并分别在左右窗口进行显示

python">def detect_image(self):image_path, _ = QFileDialog.getOpenFileName(None, "选择图片文件", "", "图片文件 (*.jpg *.jpeg *.png)")if image_path:image = cv2.imread(image_path)if image is not None:self.current_results = self.worker.detect_image(image)if self.current_results:annotated_image = self.current_results[0].plot()image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为 RGBheight1, width1, channel1 = image_rgb.shapebytesPerLine1 = 3 * width1qimage1 = QImage(image_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap1 = QPixmap.fromImage(qimage1)self.label1.setPixmap(pixmap1.scaled(self.label1.size(), Qt.KeepAspectRatio))annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)  # 转换为 RGBheight2, width2, channel2 = annotated_image.shapebytesPerLine2 = 3 * width2qimage2 = QImage(annotated_image.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap2 = QPixmap.fromImage(qimage2)self.label2.setPixmap(pixmap2.scaled(self.label2.size(), Qt.KeepAspectRatio))

加载模型及调用部分代码

python">def load_model(self):model_path, _ = QFileDialog.getOpenFileName(None, "选择模型文件", "", "模型文件 (*.pt)")if model_path:self.model = YOLO(model_path)return self.model is not Nonereturn Falsedef detect_image(self, image):results = self.model.predict(image)return results

3.3.3 完整代码

完整代码如下,全部复制后粘贴进一个空白的py文件即可运行

python">import sys
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, QMessageBox, QFileDialog
from PyQt5.QtGui import QImage, QPixmap, QIcon
import cv2
from ultralytics import YOLOclass Worker:def __init__(self):self.model = Nonedef load_model(self):model_path, _ = QFileDialog.getOpenFileName(None, "选择模型文件", "", "模型文件 (*.pt)")if model_path:self.model = YOLO(model_path)return self.model is not Nonereturn Falsedef detect_image(self, image):results = self.model.predict(image)return resultsclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("@author:笑脸惹桃花")#self.setWindowIcon(QIcon("icon.png"))self.setGeometry(300, 150, 800, 400)# 创建两个 QLabel 分别显示左右图像self.label1 = QLabel()self.label1.setAlignment(Qt.AlignCenter)self.label1.setMinimumSize(580, 450)  # 设置大小self.label1.setStyleSheet('border:3px solid #6950a1; background-color: black;')  # 添加边框并设置背景颜色为黑色self.label2 = QLabel()self.label2.setAlignment(Qt.AlignCenter)self.label2.setMinimumSize(580, 450)  # 设置大小self.label2.setStyleSheet('border:3px solid #6950a1; background-color: black;')  # 添加边框并设置背景颜色为黑色# 水平布局,用于放置左右两个 QLabellayout = QVBoxLayout()# layout.addWidget(self.label1)hbox_video = QHBoxLayout()hbox_video.addWidget(self.label1)  # 左侧显示原始图像hbox_video.addWidget(self.label2)  # 右侧显示检测后的图像layout.addLayout(hbox_video)self.worker = Worker()# 创建按钮布局hbox_buttons = QHBoxLayout()# 添加模型选择按钮self.load_model_button = QPushButton("📁模型选择")self.load_model_button.clicked.connect(self.load_model)self.load_model_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.load_model_button)# 添加图片检测按钮self.image_detect_button = QPushButton("💾图片检测")self.image_detect_button.clicked.connect(self.detect_image)self.image_detect_button.setEnabled(False)self.image_detect_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.image_detect_button)# 添加显示检测物体按钮self.display_objects_button = QPushButton("🔍显示检测物体")self.display_objects_button.clicked.connect(self.show_detected_objects)self.display_objects_button.setEnabled(False)self.display_objects_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.display_objects_button)# 添加退出按钮self.exit_button = QPushButton("❌退出")self.exit_button.clicked.connect(self.exit_application)self.exit_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.exit_button)layout.addLayout(hbox_buttons)central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)self.current_results = Nonedef detect_image(self):image_path, _ = QFileDialog.getOpenFileName(None, "选择图片文件", "", "图片文件 (*.jpg *.jpeg *.png)")if image_path:image = cv2.imread(image_path)if image is not None:self.current_results = self.worker.detect_image(image)if self.current_results:annotated_image = self.current_results[0].plot()image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为 RGBheight1, width1, channel1 = image_rgb.shapebytesPerLine1 = 3 * width1qimage1 = QImage(image_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap1 = QPixmap.fromImage(qimage1)self.label1.setPixmap(pixmap1.scaled(self.label1.size(), Qt.KeepAspectRatio))annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)  # 转换为 RGBheight2, width2, channel2 = annotated_image.shapebytesPerLine2 = 3 * width2qimage2 = QImage(annotated_image.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap2 = QPixmap.fromImage(qimage2)self.label2.setPixmap(pixmap2.scaled(self.label2.size(), Qt.KeepAspectRatio))def show_detected_objects(self):if self.current_results:det_info = self.current_results[0].boxes.clsobject_count = len(det_info)object_info = f"识别到的物体总个数:{object_count}\n"object_dict = {}class_names_dict = self.current_results[0].namesfor class_id in det_info:class_name = class_names_dict[int(class_id)]if class_name in object_dict:object_dict[class_name] += 1else:object_dict[class_name] = 1sorted_objects = sorted(object_dict.items(), key=lambda x: x[1], reverse=True)for obj_name, obj_count in sorted_objects:object_info += f"{obj_name}: {obj_count}\n"self.show_message_box("识别结果", object_info)else:self.show_message_box("识别结果", "未检测到物体")def show_message_box(self, title, message):msg_box = QMessageBox(self)msg_box.setWindowTitle(title)msg_box.setText(message)msg_box.exec_()def load_model(self):if self.worker.load_model():self.image_detect_button.setEnabled(True)self.display_objects_button.setEnabled(True)def exit_application(self):# 终止程序运行sys.exit()if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

3.4 界面展示

这样一个简单的ui界面就写好了

需要更加复杂更多功能的及其他需求可以私聊,遇到报错可以在评论区交流~


http://www.ppmy.cn/embedded/127287.html

相关文章

LangChain中使用Prompt01

1.引入提示模板 from langchain.prompts import (SystemMessagePromptTemplate,AIMessagePromptTemplate,HumanMessagePromptTemplate, )2.设置系统提示 system_template_text"你是一位专业的翻译,能够将{input_language}翻译成{output_language}&#xff0c…

观察者模式和发布-订阅模式的区别

观察者模式是,当被观察者的数据发生变化时,调用被观察者的 notify 方法,去通知所有观察者执行 update 方法进行更新; 对于发布-订阅模式,首先发布者与订阅者互相并不知道彼此的存在,他们是通过事件中心来进…

智能手机、平板和笔记本电脑出口俄罗斯认证解析

智能手机、笔记本电脑和平板电脑,它们的监管范围相似,需要获得EAC 合格证、FAC电信认证和FSS加密认证,才能进口、清关并在俄罗斯市场上销售。 一、海关联盟EAC 认证 是根据 EAC 要求强制批准的证书,并且受到所有国家海关和市场的…

SpringCloud的学习(四)Micrometer、GateWay

Micrometer 分布式链路追踪 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起…

Path、File、FileInfo、Directory、DirectoryInfo

当程序运行时,系统为程序开辟内存空间,但是这种空间会随着程序的而结束而释放。如果需要将处理好的数据永久保存,那么就需要IO流技术将处理好的数据存入文件中,文件又是按照路径存储在磁盘上的,因此我们要学会路径的操作。 Path类就是系统为我们提供的用于操作路径的静态…

【C++ 真题】B2059 奇数求和

奇数求和 题目描述 计算非负整数 m m m 到 n n n(包括 m m m 和 n n n)之间的所有奇数的和,其中, m m m 不大于 n n n,且 n n n 不大于 300 300 300。例如 m 3 , n 12 , m3,n12, m3,n12, 其和则为&#xf…

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用:是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,它和你的网络行为有关,记录了当前用户的状态 形式:keyvalue 例如:当我们登录某个账号后,服务器会在cookies进行记录 个人理解&#xf…

Kafka服务端SASL/PLAIN+ACL认证授权安装操作

Kafkazookeeper安全认证技术介绍 Kafka 目前支持多种认证方式,生产环境常见应用的SASL有以下几种: SSL/TLS认证:本认证是基于SSL/TLS的加密方式,使用SSL/TLS证书对客户端和服务器进行身份验证,确保在传输层上安全保证…