当前位置: 首页 > news >正文

YOLOv8+Deepsort+PyQt+GUI 语义分割+目标检测+姿态识别 三者合一(集成于一套系统)综合视觉分析系统

 

综合视觉分析系统

技术栈:
  • YOLOv8:用于目标检测,是一个快速且准确的目标检测框架。
  • DeepSORT:用于目标跟踪,结合了深度学习特征提取和卡尔曼滤波器来预测目标轨迹。
  • GUI:提供一个直观易用的图形用户界面,使得非技术用户也能方便地使用该系统。
  • 语义分割:通过YOLOv8或其他语义分割算法,可以区分图像中的不同区域或对象,并赋予它们特定的标签。
  • 姿态识别:利用深度学习模型来识别物体或人体的姿态,如关键点的位置等。
功能描述:
  • 目标检测与分类:系统能够识别视频或图像中的特定对象,并对其进行分类。
  • 目标跟踪:使用DeepSORT算法,可以在连续的视频帧中持续跟踪已识别的对象。
  • 语义分割:系统不仅限于检测对象边界框,还能区分图像的不同部分,例如船只及其背景。
  • 姿态识别:能够识别目标对象的姿态,对于人形目标来说,可以检测出肢体的关键点位置,对于其他类型的目标,则可以根据应用场景定制姿态识别功能。
  • 实时展示与交互:通过GUI,用户可以实时查看处理结果,并与系统进行交互,比如调整参数、保存结果等。
应用场景:
  • 安全监控:在机场、车站等人流密集场所,帮助识别异常行为或可疑人物。
  • 智能交通管理:监控道路情况,识别车辆、行人等,并进行交通流量管理。
  • 工业自动化:在生产线上,用于质量控制,识别产品缺陷。
  • 无人机监控:在海上或空中,用于船只或飞行物的自动识别与跟踪。
优势:
  • 高效性:由于采用了先进的深度学习模型,系统能够以较高的帧率处理视频数据。
  • 准确性:通过优化后的模型,系统能更准确地区分不同的对象和背景。
  • 易用性:图形用户界面使得配置和操作变得简单,降低了用户的使用门槛。

这样的系统可以为多种行业提供强大的视觉分析能力,具有广泛的应用前景。

姿态识别:

关键代码:
main.py
from src.qt.stream.video_capture import CameraCaptureThread
from src.qt.stream.visualize import VideoVisualizationThread
from src.qt.stream.ai_worker import AiWorkerThread
from src.ui.main_window import Ui_MainWindow
from src.qt.video.video_worker import FileProcessThread
from PyQt5 import QtGui, QtWidgets
from PyQt5.QtCore import Qt
import sys
import numpy as np
import cv2 as cvclass MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.setupUi(self)self.ai_thread = AiWorkerThread()self.camera_thread = CameraCaptureThread()self.display_thread = VideoVisualizationThread()self.file_process_thread = FileProcessThread()self.conf_thr = 0.3self.iou_thr = 0.45self.frame_interval = 0self.model_name = "yolov8n"self.ai_task = "object_detection"self.tracker_name = "deepsort"self.init_slots()self.buttons_states("waiting_for_setting")def init_slots(self):self.radioButton_det.toggled.connect(lambda: self.get_ai_task(self.radioButton_det))self.radioButton_pose.toggled.connect(lambda: self.get_ai_task(self.radioButton_pose))self.radioButton_seg.toggled.connect(lambda: self.get_ai_task(self.radioButton_seg))self.doubleSpinBox_conf.valueChanged.connect(lambda x: self.update_parameter(x, 'doubleSpinBox_conf'))self.doubleSpinBox_interval.valueChanged.connect(lambda x: self.update_parameter(x, 'doubleSpinBox_interval'))self.doubleSpinBox_iou.valueChanged.connect(lambda x: self.update_parameter(x, 'doubleSpinBox_iou'))self.horizontalSlider_conf.valueChanged.connect(lambda x: self.update_parameter(x, 'horizontalSlider_conf'))self.horizontalSlider_interval.valueChanged.connect(lambda x: self.update_parameter(x, 'horizontalSlider_interval'))self.horizontalSlider_iou.valueChanged.connect(lambda x: self.update_parameter(x, 'horizontalSlider_iou'))self.comboBox_model.currentTextChanged.connect(self.choose_model)self.comboBox_tracker.currentTextChanged.connect(self.choose_tracker)self.pushButton_cam.clicked.connect(self.process_camera)self.pushButton_file.clicked.connect(self.process_file)self.pushButton_stop.clicked.connect(self.stop_video)self.pushButton_play.clicked.connect(self.file_process_thread.toggle_play_pause)def resizeEvent(self, event:QtGui.QResizeEvent):self.screen_size = (self.label_display.width(), self.label_display.height())self.display_thread.get_screen_size(self.screen_size)self.file_process_thread.get_screen_size(self.screen_size)QtWidgets.QMainWindow.resizeEvent(self, event)def update_parameter(self, x, flag):if flag == 'doubleSpinBox_conf':self.horizontalSlider_conf.setValue(int(x*100))self.conf_thr = float(x)elif flag == 'doubleSpinBox_interval':self.horizontalSlider_interval.setValue(int(x))self.frame_interval = int(x)self.file_process_thread.set_frame_interval(self.frame_interval)elif flag == 'doubleSpinBox_iou':self.horizontalSlider_iou.setValue(int(x*100))self.iou_thr = float(x)elif flag == 'horizontalSlider_conf':self.doubleSpinBox_conf.setValue(x/100)self.conf_thr = float(x/100)elif flag == 'horizontalSlider_interval':self.doubleSpinBox_interval.setValue(x)self.frame_interval = int(x)self.file_process_thread.set_frame_interval(self.frame_interval)elif flag == 'horizontalSlider_iou':self.doubleSpinBox_iou.setValue(x/100)self.iou_thr = float(x/100)if self.ai_thread.isRunning:self.ai_thread.set_confidence_threshold(self.conf_thr)self.ai_thread.set_iou_threshold(self.iou_thr)if self.file_process_thread.isRunning:self.file_process_thread.set_confidence_threshold(self.conf_thr)self.file_process_thread.set_iou_threshold(self.iou_thr)def get_ai_task(self, btn):if btn.text() == 'Detection':if btn.isChecked() == True:self.ai_task = "object_detection"elif btn.text() == 'Pose Estimation':if btn.isChecked() == True:self.ai_task = "pose_detection"elif btn.text() == 'Segmentation':if btn.isChecked() == True:self.ai_task = "segmentation"def choose_model(self):self.model_name = self.comboBox_model.currentText()self.model_name = self.model_name.lower()def choose_tracker(self):self.tracker_name = self.comboBox_tracker.currentText()self.tracker_name = self.tracker_name.lower()def buttons_states(self, work_state):if work_state == "waiting_for_setting":self.radioButton_det.setDisabled(False)self.radioButton_pose.setDisabled(False)self.radioButton_seg.setDisabled(False)self.comboBox_model.setDisabled(False)self.comboBox_tracker.setDisabled(False)self.pushButton_cam.setDisabled(False)self.pushButton_file.setDisabled(False)self.pushButton_play.setDisabled(True)self.pushButton_stop.setDisabled(True)self.doubleSpinBox_conf.setDisabled(False)self.horizontalSlider_conf.setDisabled(False)self.doubleSpinBox_interval.setDisabled(False)self.horizontalSlider_interval.setDisabled(False)self.doubleSpinBox_iou.setDisabled(False)self.horizontalSlider_iou.setDisabled(False)self.doubleSpinBox_interval.setDisabled(False)self.horizontalSlider_interval.setDisabled(False)elif work_state == "processing_on_camera":self.pushButton_play.clickself.radioButton_det.setDisabled(True)self.radioButton_pose.setDisabled(True)self.radioButton_seg.setDisabled(True)self.comboBox_model.setDisabled(True)self.comboBox_tracker.setDisabled(True)self.pushButton_cam.setDisabled(True)self.pushButton_file.setDisabled(True)self.pushButton_play.setDisabled(True)self.pushButton_stop.setDisabled(False)self.doubleSpinBox_conf.setDisabled(False)self.horizontalSlider_conf.setDisabled(False)self.doubleSpinBox_interval.setDisabled(True)self.horizontalSlider_interval.setDisabled(False)self.doubleSpinBox_iou.setDisabled(False)self.horizontalSlider_iou.setDisabled(False)self.doubleSpinBox_interval.setDisabled(True)self.horizontalSlider_interval.setDisabled(True)elif work_state == "processing_on_file":self.radioButton_det.setDisabled(True)self.radioButton_pose.setDisabled(True)self.radioButton_seg.setDisabled(True)self.comboBox_model.setDisabled(True)self.comboBox_tracker.setDisabled(True)self.pushButton_cam.setDisabled(True)self.pushButton_file.setDisabled(True)self.pushButton_play.setDisabled(False)self.pushButton_stop.setDisabled(False)self.doubleSpinBox_conf.setDisabled(False)self.horizontalSlider_conf.setDisabled(False)self.doubleSpinBox_interval.setDisabled(False)self.horizontalSlider_interval.setDisabled(False)self.doubleSpinBox_iou.setDisabled(False)self.horizontalSlider_iou.setDisabled(False)self.doubleSpinBox_interval.setDisabled(False)self.horizontalSlider_interval.setDisabled(False)def process_camera(self):video_source = self.get_stream_source()print("SOURCE", video_source)if video_source is not None:self.ai_thread.set_start_config(ai_task=self.ai_task,model_name=self.model_name,tracker_name=self.tracker_name)self.camera_thread.set_start_config(video_source=video_source)self.display_thread.set_start_config([self.label_display.width(),self.label_display.height()])self.camera_thread.send_frame.connect(self.display_thread.get_fresh_frame)self.camera_thread.send_frame.connect(self.ai_thread.get_frame)self.ai_thread.send_ai_output.connect(self.display_thread.get_ai_output)self.display_thread.send_displayable_frame.connect(self.update_display_frame)self.display_thread.send_ai_output.connect(self.update_statistic_table)self.display_thread.send_thread_start_stop_flag.connect(self.buttons_states)self.ai_thread.start()self.display_thread.start()self.camera_thread.start()def process_file(self):img_fm = (".tif", ".tiff", ".jpg", ".jpeg", ".gif", ".png", ".eps", ".raw", ".cr2", ".nef", ".orf", ".sr2", ".bmp", ".ppm", ".heif")vid_fm = (".flv", ".avi", ".mp4", ".3gp", ".mov", ".webm", ".ogg", ".qt", ".avchd")file_list = " *".join(img_fm+vid_fm)file_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "choose an image or video file", "./data", f"Files({file_list})")if file_name:self.file_process_thread.set_start_config(video_path=file_name,ai_task=self.ai_task,screen_size=[self.label_display.width(),self.label_display.height()],model_name=self.model_name,tracker_name=self.tracker_name,confidence_threshold=self.conf_thr,iou_threshold=self.iou_thr,frame_interval=self.frame_interval)self.file_process_thread.send_ai_output.connect(self.update_statistic_table)self.file_process_thread.send_display_frame.connect(self.update_display_frame)self.file_process_thread.send_play_progress.connect(self.progressBar_play.setValue)self.file_process_thread.send_thread_start_finish_flag.connect(self.buttons_states)self.file_process_thread.start()def stop_video(self):self.display_thread.stop_display()self.ai_thread.stop_process()self.camera_thread.stop_capture()self.file_process_thread.stop_process()def update_display_frame(self, showImage):self.label_display.setPixmap(QtGui.QPixmap.fromImage(showImage))def clean_table(self):while (self.tableWidget_results.rowCount() > 0):self.tableWidget_results.removeRow(0)def update_statistic_table(self, ai_output):self.clean_table()self.tableWidget_results.setRowCount(0)if ai_output == []:returnfor box in ai_output:each_item = [str(box["id"]),str(box["class"]), "{:.1f}%".format(box["confidence"]*100), str(box["bbox"])]row = self.tableWidget_results.rowCount()self.tableWidget_results.insertRow(row)for j in range(len(each_item)):item = QtWidgets.QTableWidgetItem(str(each_item[j]))item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)self.tableWidget_results.setItem(row, j, item)def get_stream_source(self):video_source, okPressed = QtWidgets.QInputDialog.getText(self, "Input Camera_ID or RTSP", "Camera ID or RTSP")if okPressed:if video_source.isdigit():return int(video_source)else:return video_sourceelse:return Noneif __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)mainWindow = MainWindow()mainWindow.show()sys.exit(app.exec_())
 目标检测:

语义分割: 

相关文章:

YOLOv8+Deepsort+PyQt+GUI 语义分割+目标检测+姿态识别 三者合一(集成于一套系统)综合视觉分析系统

综合视觉分析系统 技术栈: YOLOv8:用于目标检测,是一个快速且准确的目标检测框架。DeepSORT:用于目标跟踪,结合了深度学习特征提取和卡尔曼滤波器来预测目标轨迹。GUI:提供一个直观易用的图形用户界面&am…...

机器学习无监督学习

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 无监督学习概述 1.1 定义与特点 无监督学习是一种数据挖掘技术,它允许机器通过观察数据来学习数据的内在结构和模式,而无需预先标注的输出变量。这种方法特别适用于数据探索和发现隐藏在数据…...

windows10-VMware17-Ubuntu-22.04-海康2K摄像头兼容问题,求解(已解决)

文章目录 1.webrtc camera测试2.ffmpeg 测试3.Ubuntu 自带相机4.解决办法 环境:windows10系统下,VMware的Ubuntu-22.04系统 问题:摄像头出现兼容问题,本来是想开发测试的,Ubuntu方便些。买了海康2K的USB摄像头&#xf…...

【系统架构设计师】解释器模式

解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了文法的表示,并定义了一个解释器,该解释器使用该表示来解释语言中的句子。在解释器模式中,通常包括一个抽象语法树(Abstract Synt…...

Hive原理剖析

1. 概述 背景介绍 Apache Hive是一个基于Hadoop的开源数据仓库软件,为分析和管理大量数据集提供了SQL-like的接口。最初由Facebook开发并贡献给Apache,Hive现已成为大数据处理领域的重要工具之一。它将传统的SQL功能与Hadoop的强大分布式处理能力结合&…...

在 Ubuntu 上查看重复文件

一般情况下 1. 使用 fdupes 工具 fdupes 是一个专门用于查找重复文件的工具。 安装: sudo apt-get install fdupes 使用: fdupes -r /path/to/directory -r 选项会递归查找子目录中的重复文件。 2. 使用 rmlint 工具 rmlint 是另一个强大的重复文件查找工具&#xf…...

docker容器高效连接 Redis 的方式

在微服务架构中,Redis 是一种常见的高效缓存解决方案,通常用于存储临时数据、会话信息或 token。如何在服务容器中高效、稳定地连接 Redis 是架构设计中的一个重要环节。 这篇博客将以实际项目为例,详细介绍如何配置 Flask 应用中的服务容器…...

手撕Python之生成器、装饰器、异常

1.生成器 生成器的定义方式&#xff1a;在函数中使用yield yield值&#xff1a;将值返回到调用处 我们需要使用next()进行获取yield的返回值 yield的使用以及生成器函数的返回的接收next() def test():yield 1,2,3ttest() print(t) #<generator object test at 0x01B77…...

LabVIEW步进电机控制方式

在LabVIEW中控制步进电机可以通过多种方式实现。每种方法都有其独特的优缺点&#xff0c;适用于不同的应用场合。下面详细介绍几种常见的步进电机控制方式&#xff0c;并进行比较。 1. 开环控制&#xff08;Open-Loop Control&#xff09; 特点 通过定期发出脉冲信号来控制步进…...

vllm源码解析(五):LLM模型推理

八 模型推理细节探索 8.1 回顾下step的流程 def step(self) -> List[Union[RequestOutput, EmbeddingRequestOutput]]:# 多GPU并行推理时走AsyncLLMEngine分支。如果进入当前LLMEngine,性能会下降&#xff0c;这里会抛出异常。if self.parallel_config.pipeline_parallel_s…...

数学建模笔记——熵权法(客观赋权法)

数学建模笔记——熵权法[客观赋权法] 熵权法(客观赋权法)1. 基本概念2. 基本步骤3. 典型例题3.1 正向化矩阵3.2 对正向化矩阵进行矩阵标准化3.3 计算概率矩阵P3.4 计算熵权3.5 计算得分 4. python代码实现 熵权法(客观赋权法) 1. 基本概念 熵权法,物理学名词,按照信息论基本原…...

XGBoost算法-确定树的结构

我们在求解上面的w和obj的过程中&#xff0c;都是假定我们的树结构是确定的&#xff0c;因为当我们改变树中划分条件的时候&#xff0c;每个叶子节点对应的样本有可能是不一样的&#xff0c;我们的G和H也是不一样的&#xff0c;得到的最优w和最优obj肯定也是不一样的。 到底哪一…...

concurrentHashMap线程安全实现的原理

1. Segment 数组 ConcurrentHashMap 内部维护一个 Segment 数组&#xff0c;每个 Segment 都是一个小型的 HashMap。Segment 继承自 ReentrantLock&#xff0c;因此每个 Segment 都是一个可重入锁。 2. 并发级别 ConcurrentHashMap 在构造时可以指定并发级别&#xff08;con…...

域名证书,泛域名证书,sni

文章目录 前言一、证书1.全域名证书2.泛域名证书 二、域名证书的使用1、浏览器请求域名证书流程对全域名证书的请求流程对泛域名证书的请求流程ssl client-hello携带server name 报文 2、浏览器对证书的验证流程 三、域名证书和sni 前言 本文介绍了泛域名证书和全域名证书的区别…...

Pytest夹具autouse参数使用。True表示会自动在测试中使用,而无需显式指定

1. 全局conftest文件日志记录功能 # 当前路径(使用 abspath 方法可通过dos窗口执行) current_path os.path.dirname(os.path.abspath(__file__)) # 上上级目录 ffather_path os.path.abspath(os.path.join(current_path,"../"))LOG_FILE_PATH f{ffather_path}/lo…...

Linux:归档及压缩

tar命令 • tar 集成备份工具 – -c&#xff1a;创建归档 – -x&#xff1a;释放归档 – -f&#xff1a;指定归档文件名称,必须在所有选项的最后 – -z、-j、-J&#xff1a;调用 .gz、.bz2、.xz 格式工具进行处理 – -t&#xff1a;显示归档中的文件清单 – -C&#xff1a;指定…...

jenkins 安装

jenkins安装 jenkins官网 中文网址 安装设置 所有jenkins版本 内存512M以上&#xff0c;10Gb磁盘&#xff1b;安装jdk&#xff0c;需要java8以上下载较新的版本&#xff0c;否则安装插件时可能报错版本过低 # 搜索java yum search java | grep -iE "jdk"# 安装jd…...

mysql学习教程,从入门到精通,MySQL 删除数据库教程(6)

1、MySQL 删除数据库 使用普通用户登陆 MySQL 服务器&#xff0c;你可能需要特定的权限来创建或者删除 MySQL 数据库&#xff0c;所以我们这边使用 root 用户登录&#xff0c;root 用户拥有最高权限。 在删除数据库过程中&#xff0c;务必要十分谨慎&#xff0c;因为在执行删除…...

C语言:刷题日志(2)

一.币值转换 输入一个整数&#xff08;位数不超过9位&#xff09;代表一个人民币值&#xff08;单位为元&#xff09;&#xff0c;请转换成财务要求的大写中文格式。如23108元&#xff0c;转换后变成“贰万叁仟壹百零捌”元。为了简化输出&#xff0c;用小写英文字母a-j顺序代…...

微带结环行器仿真分析+HFSS工程文件

微带结环行器仿真分析HFSS工程文件 工程下载&#xff1a;微带结环行器仿真分析HFSS工程文件 我使用HFSS版本的是HFSS 2024 R2 参考书籍《微波铁氧体器件HFSS设计原理》和视频微带结环行器HFSS仿真 1、环形器简介 环行器是一个有单向传输特性的三端口器件&#xff0c;它表明…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...