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_())
 目标检测:

语义分割: 

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

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

相关文章

随着Batch size增加,最佳learning rate如何选择?

最近读到《Surge Phenomenon in Optimal Learning Rate and Batch Size Scaling》这篇论文,里面通过实验和理论证明了learning rate和batch size之间的关系,觉得很有意思,就简答写个blog记录下。 1. 简介 在影响模型训练效果的所有参数中&a…

顶刊算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测

顶刊算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测 目录 顶刊算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现顶刊算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测(程序可以作为JCR…

录屏工具 win10:优化你的Windows 10屏幕录制体验,高清好用录屏软件推荐

在数字时代,屏幕录制已成为日常工作和娱乐中不可或缺的一部分。无论是制作教程、录制游戏高光时刻,还是进行远程协作,一个好的录屏工具都是你成功的关键。Windows 10作为全球广泛使用的操作系统,其自带的录屏工具已经为许多用户所…

【Go】Go语言介绍与开发环境搭建

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

大语言模型之ICL(上下文学习) - In-Context Learning Creates Task Vectors

本文译自 《In-Context Learning Creates Task Vectors》 —— 论文中的作者也在用LLaMA模型,笔者自我感觉拉近和世界顶级人才的距离,哈哈内容较长,如想看结论直接看 摘要、介绍与结论几个章节即可,看细节请看目录索引。经验风险最…

分类预测|2024年最新优化算法鹦鹉优化器PO|基于鹦鹉优化SVM支持向量机数据分类预测Matlab程序PO-SVM

分类预测|2024年最新优化算法鹦鹉优化器PO|基于鹦鹉优化SVM支持向量机数据分类预测Matlab程序PO-SVM 文章目录 一、基本原理**原理****PO-SVM 流程****总结** 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 PO-SVM 是一种将鹦鹉优化算法(Parrot Opti…

机器学习 第8章 集成学习

目录 个体与集成BoostingBagging与随机森林Bagging随机森林 结合策略平均法投票法学习法 个体与集成 定义:集成学习,也叫多分类器系统、基于委员会的学习等,它是一种通过结合多个学习器来构建一个更强大的学习器的技术。如下图所示 在这里&a…

计算机网络八股总结

这里写目录标题 网络模型划分(五层和七层)及每一层的功能五层网络模型七层网络模型(OSI模型) 三次握手和四次挥手具体过程及原因三次握手四次挥手 TCP/IP协议组成UDP协议与TCP/IP协议的区别Http协议相关知识网络地址,子…

新能源汽车 BMS 学习笔记篇——如何选择继电器 MOS 管作为开关

序:继电器和 MOSFET(俗称 MOS 管)都可以用作 BMS(Battery Management System,电池管理系统) 中控制电池充放电的开关,但它们在原理、结构和特性上存在一些区别,以下总结它们之间主要…

.net core 通过Sqlsugar生成实体

通过替换字符串的方式生成代码&#xff0c;其他代码也可以通这种方式生成 直接上代码 设置模板 将这几个模板文件设置为&#xff1a;嵌入资源 模板内容&#xff1a; using SqlSugar;namespace {Namespace}.Domain.Admin.{ModelName}; /// <summary> /// {TableDisplay…

重学SpringBoot3-SpringApplicationRunListener

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-SpringApplicationRunListener 1. 基本作用2. 如何实现2.1. 创建SpringApplicationRunListener2.2. 注册SpringApplicationRunListener2.3. 完整示例 3.…

跨国公司撤出背后的启示:中国IT产业的挑战与机遇

目录 前言 1. 全球化背景下的战略调整 2. 中国IT人才的应对之策 3. 中国IT产业的机遇与挑战 4. 未来的中国IT产业&#xff1a;自主创新与全球化并行 5. 结语 相关推荐 前言 IBM中国近日宣布撤出其在华两大研发中心&#xff0c;这一决定在IT行业内引发了广泛的讨论和思考…

iceoryx共享内存通信

共享内存原理 当POSIX系统中的进程启动时,它会被赋予自己的虚拟地址空间。 虚拟地址空间跨越的范围对于不同的进程可能是相同的,但是在特定地址可访问的数据对于每个进程可能是不同的。 在进程的虚拟地址空间内,有许多“内存区域”用于加载或映射数据。这些内存区域通常是…

MacBook上怎么查找历史复制记录?

你是否经常遇到这样的情况:做内容或方案时,需要用到素材就去找,找到后回来粘贴,然后再去找,再回来粘贴?这个过程是不是很繁琐? 那么找到的素材要不要保存下来呢?每个都存成文件似乎太麻烦了。但如果不单独保存,过两天想再利用又找不到了,怎么办? 在网上看到的一段好文案、…

Centos入门必备基础知识

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个开源的Linux发行版&#xff0c;基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建。以下是CentOS入门必备的一些基础知识&#xff1a; 前言 本文由浪浪云赞助发布&#xff0c;…

JavaScript 将 json 美化输出

https://andi.cn/page/621741.html

STM32G474RE之RTC

STM32G474RE之RTC使用HAL库实现RTC时间配置&#xff0c;以及报警配置&#xff0c;支持双路报警。 1、STM32G474RE的RTC晶振引脚&#xff1a; OSC32_IN为PC14&#xff0c;OSC32_OUT为PC15&#xff1b; 2、Vbat引脚 Vbat引脚是用来给外部晶振LSE和备份寄存器提供电源。当没有“…

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道&#xff0c;Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求&#xff0c;需要播放端&#xff0c;能支持YUV或ARG的数据回调&#xff0c;一般来说&#xff0c;可参考的方法如下&#xff1a; 1. 使用…

Xcode 16 RC (16A242) 发布下载,正式版下周公布

Xcode 16 RC (16A242) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-16/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Xcode 16 的新功…

3D Gaussian Splatting 论文学习

概述 目前比较常见的渲染方法大致可以分为2种&#xff1a; 将场景中的物体投影到渲染平面&#xff1a;传统的渲染管线就是这种方式&#xff0c;主要针对Mesh数据&#xff0c;可以将顶点直接投影成2D的形式&#xff0c;配合光栅化、深度测试、Alpha混合等就可以得到渲染的图像…