首页 > 编程问答 >我如何为 yolov5 制作 gui,从 pytorch 和 opencv 加载到 tkinker?

我如何为 yolov5 制作 gui,从 pytorch 和 opencv 加载到 tkinker?

时间:2024-07-23 10:15:23浏览次数:11  
标签:python opencv user-interface tkinter yolov5

请帮助我,我不明白如何使用 yolo 和 tkinker 作为 gui 来制作用于实时检测的 gui。以及如何将边界框从 pytorch 渲染到 tkinker?

这里是代码:

import torch

from matplotlib import pyplot as plt

import numpy as np
import cv2

model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)


cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()  
    result = model(frame)
    cv2.imshow('Screen', np.squeeze(result.render()))
    if cv2.waitKey(10) & 0xff == ord('x'):
        break
    if cv2.getWindowProperty("Screen", cv2.WND_PROP_VISIBLE) <1:
        break
        
cap.release()
cv2.destroyAllWindows()

当然,我们可以创建一个将 YOLOv5 与 tkinter 结合用于实时对象检测的 GUI。以下是分步指南以及带有说明的代码:

1. 安装必要的库

确保你已安装以下 Python 库。如果没有,你可以使用 pip 安装它们:

pip install tkinter opencv-python pillow torch

2. 代码

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import cv2
import torch

# 加载 YOLOv5 模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

class App:
    def __init__(self, window, window_title):
        self.window = window
        self.window.title(window_title)

        # 创建一个画布来显示视频流
        self.canvas = tk.Canvas(window, width=640, height=480)
        self.canvas.pack()

        # 用于打开视频文件的按钮
        self.btn_open = tk.Button(window, text="打开视频文件", command=self.open_video)
        self.btn_open.pack(side="bottom")

        # 用于启动/停止检测的按钮
        self.btn_toggle = tk.Button(window, text="开始检测", command=self.toggle_detection)
        self.btn_toggle.pack(side="bottom")

        # 视频源(初始值为无)
        self.vid = None

        # 检测标志
        self.detecting = False

        self.window.mainloop()

    def open_video(self):
        # 打开文件对话框以选择视频文件
        self.pause_detection()
        self.video_path = filedialog.askopenfilename()

        # 如果选择了文件,则开始处理视频
        if self.video_path:
            self.vid = cv2.VideoCapture(self.video_path)
            self.process_video()

    def process_video(self):
        # 从视频中读取帧
        ret, frame = self.vid.read()

        if ret:
            # 检测对象
            if self.detecting:
                frame = self.detect_objects(frame)

            # 将帧转换为 RGB 并显示在画布上
            self.photo = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
            self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)

            # 每 30 毫秒后调用自身以显示下一帧
            self.window.after(30, self.process_video)
        else:
            # 如果视频结束,则释放视频捕获对象
            self.vid.release()

    def detect_objects(self, frame):
        # 使用 YOLOv5 进行对象检测
        results = model(frame)

        # 处理结果并绘制边界框和标签
        for *xyxy, conf, cls in results.xyxy[0]:
            x1, y1, x2, y2 = map(int, xyxy)
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            label = f"{model.names[int(cls)]} {conf:.2f}"
            cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

        return frame

    def toggle_detection(self):
        # 切换检测标志
        self.detecting = not self.detecting
        if self.detecting:
            self.btn_toggle.config(text="停止检测")
            if self.vid:
                self.process_video()
        else:
            self.btn_toggle.config(text="开始检测")

    def pause_detection(self):
        # 暂停检测
        self.detecting = False
        self.btn_toggle.config(text="开始检测")

# 创建主窗口
App(tk.Tk(), "YOLOv5 对象检测")

说明:

  1. 导入必要的库: tkinter 用于 GUI, cv2 用于视频处理, PIL 用于在画布上显示图像, torch 用于 YOLO。

  2. 加载 YOLOv5 模型: model = torch.hub.load(...) 加载预训练的 YOLOv5s 模型。你可以将其替换为任何其他 YOLOv5 模型。

  3. 创建 App 类:

  4. 它初始化主窗口和按钮(“打开视频”和“开始检测”)。
  5. open_video 函数打开文件对话框,使用户可以选择视频文件,并初始化视频处理。
  6. process_video 函数从视频中读取帧,如果 self.detecting 为真,则将其发送以进行对象检测,使用 ImageTk 将其转换为 tkinter 兼容格式,并在画布上显示。
  7. detect_objects 函数接收一个帧,使用 YOLOv5 进行对象检测,在检测到的对象周围绘制边界框和标签,并返回修改后的帧。
  8. toggle_detection 函数启动和停止检测过程。
  9. pause_detection 函数在需要时停止检测。

  10. 创建应用程序实例: App(tk.Tk(), "YOLOv5 对象检测") 创建应用程序窗口并运行主事件循环。

现在,当你运行代码时,你将获得一个带有两个按钮的 GUI 窗口:“打开视频文件”和“开始检测”。你可以单击“打开视频文件”以选择视频文件或摄像头流,然后单击“开始检测”以开始对象检测。检测到的对象将带有边界框和标签叠加在视频流上。你可以再次单击“停止检测”来停止检测。

这就是在 tkinter 中使用 YOLOv5 的基本设置!你可以根据自己的需要扩展此功能,例如添加更多控件或改进 GUI。

标签:python,opencv,user-interface,tkinter,yolov5
From: 71970056

相关文章

  • 强制从当前包自动导入的 Python 以此包的名称为前缀
    我在VSCode中使用Python和Pylance扩展。在我正在编辑的自己的包中,自动添加的导入(设置“导入格式:绝对”)如下所示:frommydirectory.myfileimportmyclass但是,我的Python包正在被被一个(非常愚蠢且不可协商的)外部系统消耗,该系统拒绝正确解释它,除非导入的格式特别......
  • Python语言-面向对象
    知识代码classJobSalary(object):job=''def__init__(self,city):self.jobname="数据分析师"self.exp=''self.city=city#方法defdata_normalize(self,data):print(f'正在规范化......
  • 需要帮助使用 Selenium Python 单击 Microsoft Teams 按钮
    我将Python与Selenium结合使用,并自动登录MicrosoftTeams。进入后,弹出窗口显示我需要单击“立即切换”以切换到V2版本。我似乎无法使用SeleniumPython成功单击此按钮。谁能帮我自动点击这个按钮?这是我不成功的尝试:self.driver.find_element(By.CLASS_NAME,......
  • __yolov5+deepsort+slowfast win部署
     运行程序报错:yolov5_trt_create...yolov5_trt_createcudaengine...yolov5_trt_createbuffer...yolov5_trt_createstream...yolov5_trt_createdone...createyolov5-trt,instance=000001AFB3B05EC0[07/19/2024-21:23:10][E][TRT]1:[stdArchiveRea......
  • python接口自动化(四十)- logger 日志 - 下(超详解)
    宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类。可能有的小伙伴在这里会有个疑问一个logging为什么分两篇的篇幅......
  • Python面试题:使用NumPy进行高效数组运算
    NumPy是Python中进行高效数组运算的基础库。以下是一些示例,展示了如何使用NumPy进行高效的数组运算,包括创建数组、数组操作、数学运算以及一些高级操作。安装NumPy如果你还没有安装NumPy,可以通过以下命令进行安装:pipinstallnumpy示例代码1.创建数组import......
  • Python面试题:使用Matplotlib和Seaborn进行数据可视化
    使用Matplotlib和Seaborn进行数据可视化是数据分析中非常重要的一部分。以下示例展示了如何使用这两个库来创建各种图表,包括基本的线图、柱状图、散点图和高级的分类数据可视化图表。安装Matplotlib和Seaborn如果你还没有安装这两个库,可以使用以下命令进行安装:pipins......
  • 20、Python之容器:红楼主角都有谁?10行代码生成《红楼梦》词云图
    引言Python系列前面的文章中,我们介绍了Python中容器的基本使用,上一篇中,我们又重点介绍了Counter计数器的使用。这些介绍,应该足以应付日常的工作需求了。在今天的文章中,我想以词云图的生成这个综合案例,巩固一下前面关于容器、字典推导式、Counter的使用。同时,介绍两个比较好......
  • 使用snowflake.connector 3.0.3上的密钥对从python连接到snowflake
    我正在尝试使用Snowflake.connector包从我的Python代码连接到Snowflake。不幸的是,由于遗留代码,我只能在python3.7.3上使用Snowflake连接器版本3.0.3,并且无法升级我确实设法从我自己的计算机进行连接,使用:con=Snowflake.connector。连接(...私有密钥文件=......
  • python 文件(txt)操作
    我有一个txt文件,其中包含一列(大约2000个)单词。每个单词只用一个新行分隔。我想将所有这些单词存储在一个数组中words.txt文件的示例:applebananaorange我尝试过的代码:importrandomwithopen('E:/Code/learn/Projects/word-guessing-game/words.txt','r')a......