YoloV8 +可视化界面+GUI+交互式界面目标检测与跟踪

YoloV8 可视化界面 GUI

在这里插入图片描述

  • 本项目旨在基于 YoloV8 目标检测算法开发一个直观的可视化界面,使用户能够轻松上传图像或视频,并对其进行目标检测
  • 通过图形用户界面,用户可以方便地调整检测参数、查看检测结果,并将结果保存或导出。同时,该界面还将提供实时目标检测功能,让用户能够在视频流中实时观察目标的检测情况。
  • 这个项目将结合 YoloV8 强大的检测能力和直观的用户交互,为用户提供一种全新的目标检测体验。

如何运行

  • python>=3.8
  • pip install ultralytics==8.0.48
  • pip install pyside6==6.4.2
 - python main.py

运行上述指令,则可以看到介入下界面!

!!必须安装相应版本的库
!!否则,将出现以下错误:not enough values to unpack (expected 5, got 4)
注意事项
ultralytics 遵循 GPL-3.0 协议,如需商业使用,需获得其许可。

在这里插入图片描述

建议

资源文件为 resources.qrc,如果您修改了默认图标,需要使用 pyside6-rcc resoures.qrc >
ui/resources_rc.py 命令来重新生成 .py 文件。

  • 如果您希望使用自己的模型,您需要使用 ultralytics 先训练 yolov8/5 模型,然后将训练好的 .pt 文件放入
    models 文件夹中。
  • 软件中仍然存在一些 bug,我会在有时间的情况下持续优化并增加一些更有趣的功能。
  • 如果您勾选保存结果,结果将保存在 ./run 路径下。
  • UI 设计文件为 home.ui,如果您对其进行修改,需要使用 pyside6-uic home.ui > ui/home.py
    命令来重新生成 .py 文件。
  • 资源文件为 resources.qrc,如果您修改了默认图标,需要使用 pyside6-rcc resoures.qrc >
    ui/resources_rc.py 命令来重新生成 .py 文件。
    在这里插入图片描述

更改自己想要的界面,你可以按照以下步骤进行操作:

  • 修改 UI 设计文件: 打开 UI 设计文件(如 .ui 文件),使用 PySide6 的 pyside6-uic 工具将其转换为
    Python 代码。然后在生成的 Python 代码中进行修改,包括布局、组件样式、交互逻辑等。
  • 修改资源文件: 如果界面中使用了自定义图标、图片等资源,你需要编辑资源文件(如 .qrc 文件),将新的资源添加进去,并使用
    pyside6-rcc 工具将其编译成 Python 代码。
  • 重新编译界面: 保存所有修改后的文件,并重新编译生成的 Python 代码。确保所有文件路径和引用都正确。
  • 运行程序: 运行程序,查看界面效果,并进行调试和优化。

主要代码

class YoloPredictor(BasePredictor, QObject):
    yolo2main_pre_img = Signal(np.ndarray)   # raw image signal
    yolo2main_res_img = Signal(np.ndarray)   # test result signal
    yolo2main_status_msg = Signal(str)       # Detecting/pausing/stopping/testing complete/error reporting signal
    yolo2main_fps = Signal(str)              # fps
    yolo2main_labels = Signal(dict)          # Detected target results (number of each category)
    yolo2main_progress = Signal(int)         # Completeness
    yolo2main_class_num = Signal(int)        # Number of categories detected
    yolo2main_target_num = Signal(int)       # Targets detected

    def __init__(self, cfg=DEFAULT_CFG, overrides=None): 
        super(YoloPredictor, self).__init__() 
        QObject.__init__(self)

        self.args = get_cfg(cfg, overrides)
        project = self.args.project or Path(SETTINGS['runs_dir']) / self.args.task
        name = f'{self.args.mode}'
        self.save_dir = increment_path(Path(project) / name, exist_ok=self.args.exist_ok)
        self.done_warmup = False
        if self.args.show:
            self.args.show = check_imshow(warn=True)

        # GUI args
        self.used_model_name = None      # The detection model name to use
        self.new_model_name = None       # Models that change in real time
        self.source = ''                 # input source
        self.stop_dtc = False            # Termination detection
        self.continue_dtc = True         # pause   
        self.save_res = False            # Save test results
        self.save_txt = False            # save label(txt) file
        self.iou_thres = 0.45            # iou
        self.conf_thres = 0.25           # conf
        self.speed_thres = 10            # delay, ms
        self.labels_dict = {}            # return a dictionary of results
        self.progress_value = 0          # progress bar
    

        # Usable if setup is done
        self.model = None
        self.data = self.args.data  # data_dict
        self.imgsz = None
        self.device = None
        self.dataset = None
        self.vid_path, self.vid_writer = None, None
        self.annotator = None
        self.data_path = None
        self.source_type = None
        self.batch = None
        self.callbacks = defaultdict(list, callbacks.default_callbacks)  # add callbacks
        callbacks.add_integration_callbacks(self)

    # main for detect
    @smart_inference_mode()
    def run(self):
        try:
            if self.args.verbose:
                LOGGER.info('')

            # set model    
            self.yolo2main_status_msg.emit('Loding Model...')
            if not self.model:
                self.setup_model(self.new_model_name)
                self.used_model_name = self.new_model_name

            # set source
            self.setup_source(self.source if self.source is not None else self.args.source)

            # Check save path/label
            if self.save_res or self.save_txt:
                (self.save_dir / 'labels' if self.save_txt else self.save_dir).mkdir(parents=True, exist_ok=True)

            # warmup model
            if not self.done_warmup:
                self.model.warmup(imgsz=(1 if self.model.pt or self.model.triton else self.dataset.bs, 3, *self.imgsz))
                self.done_warmup = True

            self.seen, self.windows, self.dt, self.batch = 0, [], (ops.Profile(), ops.Profile(), ops.Profile()), None

            # start detection
            # for batch in self.dataset:


            count = 0                       # run location frame
            start_time = time.time()        # used to calculate the frame rate
            batch = iter(self.dataset)
            while True:
                # Termination detection
                if self.stop_dtc:
                    if isinstance(self.vid_writer[-1], cv2.VideoWriter):
                        self.vid_writer[-1].release()  # release final video writer
                    self.yolo2main_status_msg.emit('Detection terminated!')
                    break
                
                # Change the model midway
                if self.used_model_name != self.new_model_name:  
                    # self.yolo2main_status_msg.emit('Change Model...')
                    self.setup_model(self.new_model_name)
                    self.used_model_name = self.new_model_name
                
                # pause switch
                if self.continue_dtc:
                    # time.sleep(0.001)
                    self.yolo2main_status_msg.emit('Detecting...')
                    batch = next(self.dataset)  # next data

                    self.batch = batch
                    path, im, im0s, vid_cap, s = batch
                    visualize = increment_path(self.save_dir / Path(path).stem, mkdir=True) if self.args.visualize else False

                    # Calculation completion and frame rate (to be optimized)
                    count += 1              # frame count +1
                    if vid_cap:
                        all_count = vid_cap.get(cv2.CAP_PROP_FRAME_COUNT)   # total frames
                    else:
                        all_count = 1
                    self.progress_value = int(count/all_count*1000)         # progress bar(0~1000)
                    if count % 5 == 0 and count >= 5:                     # Calculate the frame rate every 5 frames

最后,看下方的推广,可联系本人。计算机视觉、图像处理、毕业辅导、作业帮助、代码获取,私聊会回复!


http://www.niftyadmin.cn/n/5381771.html

相关文章

人工智能驱动下的网络安全六大发展趋势

2023年生成式AI技术的异军突起,给动荡的全球网络安全威胁态势增加了不确定性、不对称性和复杂性。在2024年,随着生成式AI攻防对抗、网络犯罪规模化、全球大选与地缘政治动荡和新型网络威胁的快速增长,网络安全也将迎来一次重大变革和洗牌。 以…

数据库||数据库的完整性

1.实验题目:数据库的完整性 2.实验目的和要求: 掌握数据库的实体完整性约束定义,完整性检查及违约处理方式。 掌握数据库的参照完整性约束定义,完整性检查及违约处理方式。 掌握数据库的用户定义完整性约束定义,完…

Apache Flink连载(二十九):Flink细粒度资源管理(2)-用法、测试及局限性

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1.细粒度资源用法

利用HTTP隧道在Linux系统上实现安全远程访问

在一个阳光明媚的下午,Linux小侠坐在电脑前,捋了捋他那一头乌黑亮丽的代码发,开始琢磨如何通过HTTP隧道实现安全远程访问。毕竟,在这个信息爆炸的时代,远程访问的安全性可是每个技术宅都绕不开的话题。 Linux小侠知道…

MCU中断响应流程及注意事项

本文介绍MCU中断响应流程及注意事项。 1.中断响应流程 中断响应的一般流程为: 1)断点保护 硬件操作,将PC,PSR等相关寄存器入栈保护 2)识别中断源 硬件操作,识别中断的来源,如果多个中断同时发生,高优…

Spring Event详解

Spring Event详解 1.详细介绍2.使用场景3.注意事项4.案例分析5.代码实现6.与消息队列的区别7.SpringEvent结合线程池异步实现 1.详细介绍 Spring Event是Spring框架内建的一种发布/订阅(Publish-Subscribe)模式的实现,它允许应用内部不同组件…

『运维备忘录』之 Ln 链接命令详解

运维人员不仅要熟悉操作系统、服务器、网络等知识,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

ASUS华硕枪神8笔记本电脑G614JIR,G814JVR,G634JYR,G834JZR工厂模式出厂Windows11系统 带重置还原功能

适用ROG枪神8系列笔记本型号: G614JIR、G614JVR、G634JYR、G634JZR G814JIR、G814JVR、G834JYR、G834JZR 链接:https://pan.baidu.com/s/1tYZt6XFNC2d6YmwTbtFN7A?pwd3kp8 提取码:3kp8 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主…