YOLOv11(Ultralytics)可视化界面ui设计,基于pyqt5,单文件即插即用,支持文件夹检测及云摄像头检测并保存

本文的可视化界面对于YOLOv11/Ultralytics/YOLOv8的检测、分割、分类、姿势估算(detection, segmentation, obb, classification, and pose estimation)等均可正常显示。本次新增了图片及视频的保存,可以选择传入文件夹进行检测并显示,可以对本地摄像头或者云摄像头获取的视频进行分段保存,本文仅针对图像处理部分给出代码示例,所有代码只需要在根目录下新建一个main.py即可正常运行,对于视频及摄像头处理可以根据图像处理进行修改后实现功能,或者私聊我获取成品,之前购买过的可私信我免费获取最新的代码。

目录

1.准备工作

1.1 YOLOv11(Ultralytics)源码获取

1.2 YOLOv11环境配置

2.完整界面展示

2.1 主界面展示

2.2 功能展示

2.3 完整功能展示

3.界面实现

3.1 相关库

3.2 导入库

3.3 功能实现

3.3.1 添加按钮

3.3.2 功能函数定义

3.3.3 完整代码

3.4 界面展示


1.准备工作

1.1 YOLOv11(Ultralytics)源码获取

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

YOLOv11官方地址为 

 https://github.com/ultralytics/ultralytics

1.2 YOLOv11环境配置

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

目标检测:YOLOv11(Ultralytics)环境配置,适合0基础纯小白,超详细-CSDN博客文章浏览阅读4k次,点赞28次,收藏67次。YOLO11是Ultralytics公司YOLO系列实时目标检测器的最新迭代版本,它以尖端的准确性、速度和效率重新定义了可能实现的性能。在之前YOLO版本取得的显著进步基础上,YOLO11在架构和训练方法上进行了重大改进,使其成为各种计算机视觉任务中的通用选择。除了传统的目标检测外,YOLO11 还支持目标跟踪、实例分割、姿态估计、OBB定向物体检测(旋转目标检测)等视觉任务。如果已经会配置YOLOv8的环境,本文不需要重复配置,下载最新的YOLOv11训练文件即可。_yolov11https://blog.csdn.net/qq_67105081/article/details/143270109?spm=1001.2014.3001.5502建议使用Anaconda3+pycharm,下载8.3.20版本源码。

2.完整界面展示

2.1 主界面展示

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

2.2 功能展示

首先选择模型,选择完之后可以分别点击图片检测选择单张图片检测后显示在界面上,可点击保存到指定位置,点击文件夹检测可以选择一个文件夹后将其按照一定的速度展示,文件夹检测会将检测结果自动保存,视频检测完可以选择保存视频,也可以在检测过程中将视频分段保存,摄像头可选本地和云摄像头,本地会自动获取摄像头编号可选择,云摄像头则需要输入ip后开始检测,均可点击保存为视频。检测之后的图像会实时显示在界面上,左边显示原始图像,右边显示检测后的图像。

也可以选择视频进行检测,效果如下图,可以点击查看当前检测到的所有物体

2.3 完整功能展示

每个按钮的功能及云摄像头的调用都试了一下,效果如下图

有其它需求可私信联系定制。 

3.界面实现

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

3.1 相关库

除了yolov8所用库之外,本文所用到的额外库为pyqt5,输入指令进行安装

pip install PyQt5

3.2 导入库

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

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

3.3 功能实现

3.3.1 添加按钮

这里实现了权重选择和选择图片及选择文件夹功能并添加了对应的按钮

# 添加模型选择按钮
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.select_image)
self.image_detect_button.setEnabled(False)
self.image_detect_button.setFixedSize(120, 30)
hbox_buttons.addWidget(self.image_detect_button)# 添加图片文件夹检测按钮
self.folder_detect_button = QPushButton("️📁文件夹检测")
self.folder_detect_button.clicked.connect(self.detect_folder)
self.folder_detect_button.setEnabled(False)
self.folder_detect_button.setFixedSize(120, 30)
hbox_buttons.addWidget(self.folder_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.save_button = QPushButton("💾保存检测结果")
self.save_button.clicked.connect(self.save_detection)
self.save_button.setEnabled(False)
self.save_button.setFixedSize(120, 30)
hbox_buttons.addWidget(self.save_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 功能函数定义

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

def detect_image(self, image_path):if image_path:print(image_path)image = cv2.imread(image_path)if image is not None:if self.flag == 0:results = self.worker.model.predict(image)elif self.flag == 1:results = self.worker.model.predict(image_path, save=True)self.worker.detection_type = "image"if results:self.current_results = resultsself.worker.current_annotated_image = results[0].plot()annotated_image = self.worker.current_annotated_imageimage_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)height1, 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)height2, 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))self.save_button.setEnabled(True)

加载模型部分代码

def load_model(self):model_path, _ = QFileDialog.getOpenFileName(None, "选择模型文件", "", "模型文件 (*.pt)")if model_path:self.model = YOLO(model_path)return self.model is not Nonereturn False

 选择图片/文件夹部分代码

    def select_image(self):image_path, _ = QFileDialog.getOpenFileName(None, "选择图片文件", "", "图片文件 (*.jpg *.jpeg *.png)")self.flag = 0if image_path:self.detect_image(image_path)def detect_folder(self):folder_path = QFileDialog.getExistingDirectory(self, "选择图片文件夹")self.flag = 1if folder_path:image_paths = []for filename in os.listdir(folder_path):if filename.lower().endswith((".jpg", ".jpeg", ".png")):image_path = os.path.join(folder_path, filename)image_paths.append(image_path)for image_path in image_paths:self.detect_image(image_path)

3.3.3 完整代码

完整代码如下,全部复制后粘贴进一个空白的py文件即可运行,想要调整文件夹下图片切换速度可以修改 cv2.waitKey(300) 的参数,1秒为1000

import sys
import os
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, QFileDialog, QMessageBox
from PyQt5.QtGui import QImage, QPixmap, QIcon
import cv2
from ultralytics import YOLOclass Worker:def __init__(self):self.model = Noneself.current_annotated_image = Noneself.detection_type = Nonedef load_model(self):model_path, _ = QFileDialog.getOpenFileName(None, "选择模型文件", "", "模型文件 (*.pt)")if model_path:self.model = YOLO(model_path)if self.model:return Trueelse:return Falsedef detect_objects(self, frame):det_info = []class_ids = frame[0].boxes.clsclass_names_dict = frame[0].namesfor class_id in class_ids:class_name = class_names_dict[int(class_id)]det_info.append(class_name)return det_infodef save_image(self, image):if image is not None:file_name, _ = QFileDialog.getSaveFileName(None, "保存图片", "", "JPEG (*.jpg);;PNG (*.png);;All Files (*)")if file_name:cv2.imwrite(file_name, image)class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("@author:笑脸惹桃花")#self.setWindowIcon(QIcon("icon.png"))self.setGeometry(300, 150, 1200, 600)# 创建两个 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()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.select_image)self.image_detect_button.setEnabled(False)self.image_detect_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.image_detect_button)# 添加图片文件夹检测按钮self.folder_detect_button = QPushButton("️📁文件夹检测")self.folder_detect_button.clicked.connect(self.detect_folder)self.folder_detect_button.setEnabled(False)self.folder_detect_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.folder_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.save_button = QPushButton("💾保存检测结果")self.save_button.clicked.connect(self.save_detection)self.save_button.setEnabled(False)self.save_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.save_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)def save_detection(self):detection_type = self.worker.detection_typeif detection_type == "image":self.save_detection_results()def select_image(self):image_path, _ = QFileDialog.getOpenFileName(None, "选择图片文件", "", "图片文件 (*.jpg *.jpeg *.png)")self.flag = 0if image_path:self.detect_image(image_path)def detect_folder(self):folder_path = QFileDialog.getExistingDirectory(self, "选择图片文件夹")self.flag = 1if folder_path:image_paths = []for filename in os.listdir(folder_path):if filename.lower().endswith((".jpg", ".jpeg", ".png")):image_path = os.path.join(folder_path, filename)image_paths.append(image_path)for image_path in image_paths:self.detect_image(image_path)def detect_image(self, image_path):if image_path:print(image_path)image = cv2.imread(image_path)if image is not None:if self.flag == 0:results = self.worker.model.predict(image)elif self.flag == 1:results = self.worker.model.predict(image_path, save=True)self.worker.detection_type = "image"if results:self.current_results = resultsself.worker.current_annotated_image = results[0].plot()annotated_image = self.worker.current_annotated_imageimage_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)height1, 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)height2, 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))self.save_button.setEnabled(True)cv2.waitKey(300) # 修改图片切换时间def save_detection_results(self):if self.worker.current_annotated_image is not None:self.worker.save_image(self.worker.current_annotated_image)def show_detected_objects(self):frame = self.current_resultsif frame:det_info = self.worker.detect_objects(frame)if det_info:object_count = len(det_info)object_info = f"识别到的物体总个数:{object_count}\n"object_dict = {}for obj in det_info:if obj in object_dict:object_dict[obj] += 1else:object_dict[obj] = 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.folder_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_())

 使用本代码仅需在Ultralytics文件夹中新建一个main.py或者其它名字的py文件然后运行即可,运行有报错可以发在评论区,看到都会及时回复。

3.4 界面展示

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/11883.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

colmap软件用法

文档地址:Tutorial — COLMAP 3.11.0.dev0 documentation background: Structure-from-Motion 分为三个阶段(colmao软件也是按这个阶段进行划分解耦的): Feature detection and extraction Feature matching and geometric verification …

uniapp使用里image标签图片无法撑满全屏问题,uniapp image填充不满父容器解决方案

问题效果 底部有一个白条,查看元素之后也没有padding也没有margin 解决方案 vertical-align: bottom;解决后效果图

嵌入式开发系列----入门保姆级必看博客

嵌入式开发是指为特定的硬件平台编写软件的过程,通常涉及硬件资源有限、实时性要求高的应用。嵌入式系统广泛应用于消费电子、工业自动化、汽车、医疗设备等领域。本文将介绍嵌入式开发的基础内容,包括硬件和软件的构成、开发工具链、常用的编程语言以及…

计算机网络(4)

同轴电缆 由一根空心的外圆柱导体和一根位于中心轴线的内导线组成,内导线和圆柱 导体及外界之间用绝缘材料隔开,按直径的不同,同轴电缆分为粗缆和细缆 两种 与双绞线相比,同轴电缆的抗干扰能力强,屏蔽性好,…

Cesium基础-(Entity)-(label )

里边包含Vue、React框架代码详细步骤、以及代码详细解释 Label 在 Cesium 中表示一个可以在三维地球上显示的文本标签。它通常用于在特定位置显示信息,比如地名、地标名称或其他注释。Label 可以自定义样式、颜色、大小,并能根据距离视角动态调整显示效果。 以下是 Label 的…

云计算虚拟化-自用服务器购买指南

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 首先强调:这个不是必需品,请各位根据自己的情况来。技术的进步这些只能算锦上添花,重要的…

基于gewe制作第一个微信聊天机器人

现在我们制作一个微信智能聊天机器人。发送文字它可以回复一段话,或一张图片,是不是有点小酷! 当然,这种智能回复的算法和数据库我们自己肯定是没有的,所以我们借助于gewe框架的开放API接口来完成我们的功能。 请求参…

C++模板进阶

C教学总目录 C模板进阶 1、模板初阶的补充2、非类型模板参数3、模板的特化3.1、函数模板特化3.2、类模板特化3.2.1、全特化3.2.2、偏特化3.2.3、类模板特化的应用 4、模板的分离编译 1、模板初阶的补充 现在假设我们有一个vector对象,我们要遍历输出vector对象中的…

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本 Shell脚本源码地址: Gitee:https://gitee.com/raymond9/shell Github:https://github.com/raymond999999/shell脚本可以去上面的Gitee或Github代码仓库拉取。 支持的功能和系统&am…

Iotop使用

文章目录 Iotop依赖及编译1:内核配置2: 环境配置3.依赖库ncurses3.1 Ncurses的编译配置 4. Iotop的编译及修改5.测试效果如下: Iotop依赖及编译 源码路径:https://github.com/Tomas-M/iotop#how-to-build-from-source (GitHub - Tomas-M/iotop: A top u…

CVPR力推!预训练+医学图像这么玩,审稿人都得为你让条路!

最近发现Nature、CVPR、NeurIPS等顶会顶刊上,涌现了不少预训练医学图像的文章,不仅效果拔群,思路也很有启发性。 像是Nature上的REFERS,便颠覆了传统方法,使标注数据量直降90%!此外还有CVPR24上…

Spark 共享变量:广播变量与累加器解析

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

基于Matlab 疲劳驾驶检测

Matlab 疲劳驾驶检测 课题介绍 该课题为基于眼部和嘴部的疲劳驾驶检测。带有一个人机交互界面GUI,通过输入视频,分帧,定位眼睛和嘴巴,通过眼睛和嘴巴的张合度,来判别是否疲劳。 二、操作步骤 第一步:最…

强化学习不愧“顶会收割机”!2大创新思路带你上大分,毕业不用愁!

强化学习之父Richard Sutton悄悄搞了个大的,提出了一个简单思路:奖励聚中。这思路简单效果却不简单,等于是给几乎所有的强化学习算法上了一个增强buff,所以这篇论文已经入选了首届强化学习会议(RLC 2024)&a…

个人记录。改错huggingface,离线使用

huggingface_hub.utils._errors.LocalEntryNotFoundError: Connection error, and we cannot find the requested files in the disk cache. Please try again or make sure your Internet connection is on. 下载 true改false

【计算机网络】网络框架

一、网络协议和分层 1.理解协议 什么是协议?实际上就是约定。如果用计算机语言进行表达,那就是计算机协议。 2.理解分层 分层是软件设计方面的优势(低耦合);每一层都要解决特定的问题 二、网络传输基本流程 1.预备…

C++练习 字符串反转

从界面上输入一个C风格的字符串&#xff0c;如果输入的是"abc"&#xff0c;反转后"cba"。 要求&#xff1a; 1&#xff09;反转的结果存放在另一字符串中。 2&#xff09;原地反转&#xff0c;不借助其它的字符串。 #include <iostream> using n…

Postman常见问题及解决方法

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 1、网络连接问题 如果Postman无法发送请求或接收响应&#xff0c;可以尝试以下操作&#xf…

LED和QLED的区别

文章目录 1. 基础背光技术2. 量子点技术的引入3. 色彩表现4. 亮度和对比度5. 能效6. 寿命7. 价格总结 LED和 QLED都是基于液晶显示&#xff08;LCD&#xff09;技术的电视类型&#xff0c;但它们在显示技术、色彩表现和亮度方面有一些关键区别。以下是两者的详细区别&#xff…

光流法(Optical Flow)

一、简介 光流法&#xff08;Optical Flow&#xff09;是一种用于检测图像序列中像素运动的计算机视觉技术。其基于以下假设&#xff1a; 1.亮度恒定性假设&#xff1a;物体在运动过程中&#xff0c;其像素值在不同帧中保持不变。 2.空间和时间上的连续性&#xff1a;相邻像素之…