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

news2024/11/25 2:40:31

 

综合视觉分析系统

技术栈:
  • 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 cv


class 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.3
        self.iou_thr = 0.45
        self.frame_interval = 0
        self.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.click
            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(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 == []:
            return
        for 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_source
        else:
            return None

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())



 目标检测:

语义分割: 

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

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

相关文章

便携式气象仪器的主要特点

TH-BQX9】便携式气象仪器,也称为便携式气象仪或便携式自动气象站,是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍: 主要特点 高精度与多功能:便携式气象仪器…

打造线上+线下相结合的O2O平台预约上门服务小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 本系统采用前后端分离的设计架构,前端以微信小程序为载体,提供直观、易用的用户界面;后端则采用稳定的服务器架构,确保数据处理的高效与安全。系统主要包括用户端、商户端和管理员端三大模块,通过API接口实现…

VeRA——更高效的大型语言模型微调方法

人工智能咨询培训老师叶梓 转载标明出处 大模型在特定任务上的高效适应性训练面临着巨大的挑战,尤其是在需要针对大量用户或任务进行个性化调整时,存储和计算资源的需求急剧增加。为了解决这一问题,来自阿姆斯特丹大学QUVA实验室的研究者团队…

sse简单介绍

sse fetch-event-source插件的使用https://blog.csdn.net/weixin_42400404/article/details/141896061?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22141896061%22%2C%22source%22%3A%22weixin_42400404%22%7D 严格意义上&…

【漏洞复现】泛微OA E-Cology XmlRpcServlet 任意文件读取漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

使用docker打包项目的流程(小白可懂)

🎉 前言 这并不完全是一个正经的教程,而是根据我的学习经验总结出来的一个模版,大家可以尝试一下,权当了解一下项目打包的流程。 🎉 克隆演示项目 我在我的GitHub仓库里已经上传了演示项目,大家可以使用…

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出预测效果基本介绍模型介绍PSO模型LSTM模型PSO-LSTM模型程序设计参考资料致谢预测效果 Matlab实现PSO-LSTM多变量回归…

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:C 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C的类型转换 📒1. C语言…

Qt多语言/多语种详细开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语…

【Python知识宝库】使用Python进行网络请求:requests库入门

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、requests库简介二、安装requests库三、发送GET请求四、发送POST请求五、处理响应内容1. 获取状态码2. 获取文…

使用 Python Guardrails 提高 LLM 输出的可靠性

利用验证函数防止您的 LLM 输出崩溃 合理使用IF可以使您的LLM输出更可靠 虽然在创造力和解决复杂任务方面表现出色,但LLM往往难以遵循严格的规则,并且经常提供略微超出设定边界的答案。在构建应用程序时,这一缺陷可能导致失败和荒谬的答案&a…

智能巡检机器人助力新型信息基础设施建设与发展

为深入贯彻落实党的二十大和二十届二中、三中全会精神,推动新型信息基础设施协调发展,近日,工业和信息化部等十一部门关于推动新型信息基础设施协调发展有关事项。 新型信息基础设施是以信息网络为基础,以新一代信息通信技术创新为…

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨…

大数据-126 - Flink State 03篇 状态原理和原理剖析:状态存储 Part1

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知…

海外盲盒系统开发搭建,助力盲盒出海!

随着盲盒全球化发展,盲盒出口海外已经成为了大多数盲盒企业的选择。在互联网时代中,盲盒出口主要通过跨境电商和独立海外盲盒系统。而在目前市场发展趋势中,对于企业来说,一个独立的盲盒系统至关重要。海外盲盒APP可以帮助盲盒企业…

【ACM出版-高录用EI稳检索!九大高校联合举办】2024年人工智能、数字媒体技术与交互设计国际学术会议(ICADI2024)

​【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】 2024年人工智能、数字媒体技术与交互设计国际学术会议(ICADI2024) 2024 International Conference on artificial intelligence, digital media technology and …

期权开户攻略:期权开户主要的流程是什么?

今天期权懂带你了解期权开户攻略:期权开户主要的流程是什么?交易期权可以为投资者提供多种灵活性和机会,但同时也伴随风险。因此,了解期权的基本概念和策略,结合自身的风险承受能力,才能更好地进行投资决策…

解决el-date-picker切换类型type时错位

vue代码如下 样式效果如下 切换日期类型时,立马点日期会出现错位,检查发现是日期的展开面板并没有插入到body中导致的错位 解决方法 给el-date-picker加上唯一key值就可以

智慧园区,为园区多场景提供智能化赋能

智慧园区解决方案旨在通过现代信息技术手段,为园区空间多场景提供智能化赋能,以提升园区的运营效率、管理水平和服务质量。以下是对智慧园区解决方案的详细阐述: 一、智慧园区解决方案的核心目标 智慧园区解决方案的核心目标是实现园区的“…