PySide6多线程处理yolov5目标检测

两种多线程处理方法:

1. QThreadPool+QRunnable方法

# -*- coding: utf-8 -*-
"""
Created on Wed Jul  6 10:05:38 2022@author: wenqingzhou@gmail.com
"""import uuid
import cv2
import sys
from PySide6.QtCore import Qt, QSize, QTimer, QThread, Slot, Signal, QRunnable, QThreadPool, QObject
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QLabel, QMainWindow, QStatusBar, QMainWindow
from PySide6.QtGui import QPixmap, QImage, QIcon
import torch
from time import time
import numpy as np
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# model = torch.hub.load(r"D:\Files\yolov5", "yolov5s6", source='local', pretrained=True, force_reload=True)
model.to('cpu')# img = cv2.imread(PATH_TO_IMAGE)
classes = model.names
# results = model(imgs, size=640)  # includes NMS
def plot_boxes(results, frame):labels, cord = resultsn = len(labels)x_shape, y_shape = frame.shape[1], frame.shape[0]for i in range(n):row = cord[i]if row[4] >= 0.2:x1, y1, x2, y2 = int(row[0]*x_shape), int(row[1]*y_shape), int(row[2]*x_shape), int(row[3]*y_shape)bgr = (0, 255, 0)cv2.rectangle(frame, (x1, y1), (x2, y2), bgr, 2)cv2.putText(frame, classes[int(labels[i])], (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.9, bgr, 2)return framedef score_frame(frame):"""转换标签和坐标"""frame = [frame]results = model(frame,size=640)labels, cord = results.xyxyn[0][:, -1].cpu().numpy(), results.xyxyn[0][:, :-1].cpu().numpy()return labels, cordclass Thread(QThread):changePixmap = Signal(QImage)def run(self):cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if ret:# https://stackoverflow.com/a/55468544/6622587results = score_frame(frame)  # includes NMSframe = plot_boxes(results, frame)rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)h, w, ch = rgbImage.shapebytesPerLine = ch * wconvertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)p = convertToQtFormat.scaled(640, 480, Qt.KeepAspectRatio)self.changePixmap.emit(p)class WorkerSignal(QObject):data = Signal(QImage)process_time = Signal(str)class Worker(QRunnable):def __init__(self):super().__init__()self.job_id = uuid.uuid4().hexself.signal = WorkerSignal()self.is_running = Truedef run(self):cap = cv2.VideoCapture(0)while self.is_running:ret, frame = cap.read()if ret:start_time = time()results = score_frame(frame)  frame = plot_boxes(results, frame)rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)h, w, ch = rgbImage.shapebytesPerLine = ch * wconvertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)p = convertToQtFormat.scaled(640, 480, Qt.KeepAspectRatio)end_time = time()fps = 1/np.round(end_time - start_time, 3)print(f"Frames Per Second : {fps:.2f}")self.signal.data.emit(p)self.signal.process_time.emit(f'{fps:.2f}')def stop(self):self.is_running = Falseclass App(QMainWindow):def __init__(self):super().__init__()self.setWindowIcon(QIcon(r"E:\smile.ico"))self.initUI()def initUI(self):self.setWindowTitle('App')self.resize(640, 480)self.label = QLabel(self)self.label.resize(640, 480)self.statusbar = self.statusBar()self.statusbar.showMessage('Ready')# QThreadPool+QRunnable方法self.thread_pool = QThreadPool()self.worker = Worker()self.worker.signal.data.connect(self.setImage)self.worker.signal.process_time.connect(self.showFPS)self.thread_pool.start(self.worker)self.show()# 关闭程序后退出线程池def closeEvent(self, event):if self.worker is not None:self.worker.stop()self.thread_pool.waitForDone()self.thread_pool.clear()event.accept()@Slot(QImage)def setImage(self, image):self.label.setPixmap(QPixmap.fromImage(image))@Slot(str)def showFPS(self, fps):self.statusbar.showMessage(fps)
if __name__ == '__main__':# main()# 创建Qt应用程序# app = QApplication(sys.argv)if not QApplication.instance():app = QApplication(sys.argv)else:app = QApplication.instance()win = App()sys.exit(app.exec())

2. QThread方法

# -*- coding: utf-8 -*-
"""
Created on Sun Jan  7 00:17:49 2024@author: wentsingzhou@qq.com
"""import uuid
import cv2
import sys
from PySide6.QtCore import Qt, QSize, QTimer, QThread, Slot, Signal, QRunnable, QThreadPool, QObject
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QLabel, QMainWindow, QStatusBar, QMainWindow
from PySide6.QtGui import QPixmap, QImage, QIcon
import torch
from time import time
import numpy as np
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# model = torch.hub.load(r"D:\Files\yolov5", "yolov5s6", source='local', pretrained=True, force_reload=True)
model.to('cpu')# img = cv2.imread(PATH_TO_IMAGE)
classes = model.names
# results = model(imgs, size=640)  # includes NMS
def plot_boxes(results, frame):labels, cord = resultsn = len(labels)x_shape, y_shape = frame.shape[1], frame.shape[0]for i in range(n):row = cord[i]if row[4] >= 0.2:x1, y1, x2, y2 = int(row[0]*x_shape), int(row[1]*y_shape), int(row[2]*x_shape), int(row[3]*y_shape)bgr = (0, 255, 0)cv2.rectangle(frame, (x1, y1), (x2, y2), bgr, 2)cv2.putText(frame, classes[int(labels[i])], (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.9, bgr, 2)return framedef score_frame(frame):"""转换标签和坐标"""frame = [frame]results = model(frame,size=640)labels, cord = results.xyxyn[0][:, -1].cpu().numpy(), results.xyxyn[0][:, :-1].cpu().numpy()return labels, cordclass Worker(QThread):data = Signal(QImage)process_time = Signal(str)def __init__(self):super().__init__()self.is_running = Truedef run(self):cap = cv2.VideoCapture(0)while self.is_running:ret, frame = cap.read()if ret:start_time = time()results = score_frame(frame)  frame = plot_boxes(results, frame)rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)h, w, ch = rgbImage.shapebytesPerLine = ch * wconvertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)p = convertToQtFormat.scaled(640, 480, Qt.KeepAspectRatio)end_time = time()fps = 1/np.round(end_time - start_time, 3)print(f"Frames Per Second : {fps:.2f}")self.data.emit(p)self.process_time.emit(f'{fps:.2f}')def stop(self):self.is_running = Falseclass App(QMainWindow):def __init__(self):super().__init__()self.setWindowIcon(QIcon(r"E:\smile.ico"))self.initUI()self.worker = Nonedef initUI(self):self.setWindowTitle('App')self.resize(640, 480)self.label = QLabel(self)self.label.resize(640, 480)self.statusbar = self.statusBar()self.statusbar.showMessage('Ready')self.show()def closeEvent(self, event):if self.worker is not None:self.worker.stop()self.worker.wait()event.accept()# QThread方法def startWorker(self):self.worker = Worker()self.worker.data.connect(self.setImage)self.worker.process_time.connect(self.showFPS)self.worker.start()def setImage(self, image):self.label.setPixmap(QPixmap.fromImage(image))def showFPS(self, fps):self.statusbar.showMessage(fps)if __name__ == '__main__':# app = QApplication([])if not QApplication.instance():app = QApplication(sys.argv)else:app = QApplication.instance()win = App()win.startWorker()sys.exit(app.exec())

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 初始化列表

文章目录 一、基本格式二、使用场景 一、基本格式 C提供了初始化列表语法&#xff0c;用来初始化属性。 基本格式: 构造函数(参数1&#xff0c;参数2&#xff0c;参数3...):属性1(值1)&#xff0c;属性2(值2)... {// 构造函数体 }例子 #include <iostream> using name…

Java Swing手搓童年坦克大战游戏(I)

前言 业余偶尔对游戏有些兴趣&#xff0c;不过这样的时代&#xff0c;硬件软件飞速进步&#xff0c;2D游戏画面都无比精美&#xff0c;之前的8bit像素游戏时代早就过去了&#xff0c;不过那时候有许多让人印象深刻的游戏比如魂斗罗、超级玛丽、坦克大战(Battle City)等等。 学…

MCS-51单片机的基本结构

目录 一.单片机的逻辑结构 1.单片机的基本结构 2.引脚 3.中断系统 4.时钟电路 5.时序 6.典型指令的取指、执行时序 7.80C51中定时器/计数器 二.单片机的复位 三.程序的执行方式 1.单步执行方式 2.低功耗操作方式 3.EPROM编程和校验方式 首先补充一个知识点&#x…

ASP.NET Core中实现个人资料上传图片功能

当用户需要在ASP.NET Core中实现修改个人资料的功能时&#xff0c;其中一个常见的需求就是允许上传个人头像图片。下面将详细介绍如何在ASP.NET Core中实现修改个人资料上传图片的功能。 步骤一&#xff1a;控制器中添加一个HttpPost方法 首先&#xff0c;我们在控制器中添加…

案例099:基于微信小程序的外卖小程序的研究与开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

竞赛保研 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…

UE5 给自己的数字人重定向Mixamo动画

1 、准备动画骨格文件&#xff0c;动画文件&#xff0c;下面是Mixamo动画素材下载网站Mixamo动画骨格文件下载网站https://www.mixamo.com/2、下载动画骨格文件&#xff0c;打Mixamo网站&#xff0c;选择Characters骨格菜单&#xff0c;在下面找到对应的骨格。如下图所示&#…

Qt pro文件

1. 项目通常结构 2.pri文件 pri文件可定义通用的宏&#xff0c;例如创建一个COMMON.pri文件内容为 COMMON_PATH D:\MyData 然后其它pri或者pro文件如APPTemplate.pro文件中通过添加include(Common.pri) &#xff0c;QtCreator就会自动在项目结构树里面创建对应的节点 3.变量…

Robot Operating System 2: Design, Architecture, and Uses In The Wild

Robot Operating System 2: Design, Architecture, and Uses In The Wild (机器人操作系统 2&#xff1a;设计、架构和实际应用) 摘要&#xff1a;随着机器人在广泛的商业用例中的部署&#xff0c;机器人革命的下一章正在顺利进行。即使在无数的应用程序和环境中&#xff0c;也…

2023年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:统计指定范围里的数 给定一个数的序列S,以及一个区间[L, R], 求序列中介于该区间的数的个数,即序列中大于等于L且小于等于R的数的个数。 时间限制:1000 内存限制:65536 输入 第一行1个整数n,分别表示序列的长度。(0 < n ≤…

用邮件及时获取变更的公网IP--------python爬虫+打包成exe文件

参考获取PC机公网IP并发送至邮箱 零、找一个发送邮件的邮箱 本文用QQ邮箱为发送邮箱&#xff0c;网易等邮箱一般也有这个功能&#xff0c;代码也是通用的。 第一步&#xff1a;在设置中找到账户&#xff0c;找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务&#xff0c;点击获…

HttpRunner的测试用例分层机制

测试用例分层介绍&#xff1a; 在接口自动化测试维护过程中&#xff0c;由于测试用例的增加和需求变更导致测试用例的调整&#xff0c;使自动化测试用例的维护非常麻烦&#xff0c;直接关系到自动化测试能否持续有效地在项目中开展。 概括来说&#xff0c;测试用例分层机制的核…

手搓没有softmax 的gpt

手搓没有softmax 的gpt 代码解析代码 代码 import pandas as pd from tqdm import tqdm import numpy as np import paddle# class FeedForward(paddle.nn.Layer):def __init__(self, hidden_dim):super(FeedForward, self).__init__()self.fc_one paddle.nn.Linear(hidden_…

C#-数组

数组 (array) 是一种包含若干变量的数据结构&#xff0c;这些变量都可以通过计算索引进行访问。数组中包含的变量&#xff08;又称数组的元素&#xff09;具有相同的类型&#xff0c;该类型称为数组的元素类型。 数组类型为引用类型&#xff0c;因此数组变量的声明只是为数组实…

python 使用hash 给超级多文件高速去重

python 使用hash 给超级多文件高速去重 代码解释代码 import os from glob import globfrom tqdm import tqdm import hashlib def gen_hash(text):# 创建一个SHA256哈希对象hash_object = hashlib.sha256()

C语言基础知识(6):UDP网络编程

UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下&#xff0c;虽然可以确保发送消息的大小&#xff0c;却不能保证消息一定会到达。因此&#xff0c;应用有时会根据自己的需要进行重发处理。 1.UDP协议的主要特点&#xff1a; &#xf…

c#调试程序一次启动两个工程(多个工程)

概述 c# - Visual Studio : debug multiple projects at the same time? 以在解决方案中设置多个启动项目(右键单击解决方案&#xff0c;转到设置启动项目&#xff0c;选择多个启动项目)&#xff0c;并为包含在解决方案(无、开始、不调试就开始)。如果您将多个项目设置为开始…

Oracle文件自动“减肥”记

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

最近 ChatGPT 对 Plus 用户逐步开放一些多模态的功能&#xff0c;包括 &#xff08;图像生成&#xff09;、 GPT-4V&#xff08;图像识别&#xff09;等&#xff0c;很多网友乐此不疲地对这些新功能进行试用&#xff0c; 目前已经解锁了不少有趣的玩法&#xff0c;我将这些好玩…

C#,入门教程(09)——运算符的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(08)——基本数据类型及使用的基础知识https://blog.csdn.net/beijinghorn/article/details/123906998 一、算术运算符号 算术运算符号包括&#xff1a;四则运算 加 , 减-, 乘*, 除/与取模%。 // 加法&#xff0c;运算 int va 1 …