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


    YoloV8结合可视化界面和GUI,实现了交互式目标检测与跟踪,为用户提供了一体化的视觉分析解决方案。通过YoloV8算法,该系统能够高效准确地检测各类目标,并实时跟踪它们的运动轨迹。

    用户可以通过直观的可视化界面进行操作,实现目标检测与跟踪的交互式体验。GUI的设计使得用户可以轻松选择不同的参数设置,调整算法运行方式,以满足不同场景下的需求。

    这一集成系统的优势在于其简单易用性和高效性。用户无需深入了解复杂的算法原理,通过直接操作界面即可完成目标检测与跟踪任务。同时,系统的快速响应速度和准确性保证了用户能够及时获取到需要的信息。

    总的来说,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 代码。确保所有文件路径和引用都正确。
    • 运行程序: 运行程序,查看界面效果,并进行调试和优化。

    主要代码
    1. class YoloPredictor(BasePredictor, QObject):
    2. yolo2main_pre_img = Signal(np.ndarray) # raw image signal
    3. yolo2main_res_img = Signal(np.ndarray) # test result signal
    4. yolo2main_status_msg = Signal(str) # Detecting/pausing/stopping/testing complete/error reporting signal
    5. yolo2main_fps = Signal(str) # fps
    6. yolo2main_labels = Signal(dict) # Detected target results (number of each category)
    7. yolo2main_progress = Signal(int) # Completeness
    8. yolo2main_class_num = Signal(int) # Number of categories detected
    9. yolo2main_target_num = Signal(int) # Targets detected
    10. def __init__(self, cfg=DEFAULT_CFG, overrides=None):
    11. super(YoloPredictor, self).__init__()
    12. QObject.__init__(self)
    13. self.args = get_cfg(cfg, overrides)
    14. project = self.args.project or Path(SETTINGS['runs_dir']) / self.args.task
    15. name = f'{self.args.mode}'
    16. self.save_dir = increment_path(Path(project) / name, exist_ok=self.args.exist_ok)
    17. self.done_warmup = False
    18. if self.args.show:
    19. self.args.show = check_imshow(warn=True)
    20. # GUI args
    21. self.used_model_name = None # The detection model name to use
    22. self.new_model_name = None # Models that change in real time
    23. self.source = '' # input source
    24. self.stop_dtc = False # Termination detection
    25. self.continue_dtc = True # pause
    26. self.save_res = False # Save test results
    27. self.save_txt = False # save label(txt) file
    28. self.iou_thres = 0.45 # iou
    29. self.conf_thres = 0.25 # conf
    30. self.speed_thres = 10 # delay, ms
    31. self.labels_dict = {} # return a dictionary of results
    32. self.progress_value = 0 # progress bar
    33. # Usable if setup is done
    34. self.model = None
    35. self.data = self.args.data # data_dict
    36. self.imgsz = None
    37. self.device = None
    38. self.dataset = None
    39. self.vid_path, self.vid_writer = None, None
    40. self.annotator = None
    41. self.data_path = None
    42. self.source_type = None
    43. self.batch = None
    44. self.callbacks = defaultdict(list, callbacks.default_callbacks) # add callbacks
    45. callbacks.add_integration_callbacks(self)
    46. # main for detect
    47. @smart_inference_mode()
    48. def run(self):
    49. try:
    50. if self.args.verbose:
    51. LOGGER.info('')
    52. # set model
    53. self.yolo2main_status_msg.emit('Loding Model...')
    54. if not self.model:
    55. self.setup_model(self.new_model_name)
    56. self.used_model_name = self.new_model_name
    57. # set source
    58. self.setup_source(self.source if self.source is not None else self.args.source)
    59. # Check save path/label
    60. if self.save_res or self.save_txt:
    61. (self.save_dir / 'labels' if self.save_txt else self.save_dir).mkdir(parents=True, exist_ok=True)
    62. # warmup model
    63. if not self.done_warmup:
    64. self.model.warmup(imgsz=(1 if self.model.pt or self.model.triton else self.dataset.bs, 3, *self.imgsz))
    65. self.done_warmup = True
    66. self.seen, self.windows, self.dt, self.batch = 0, [], (ops.Profile(), ops.Profile(), ops.Profile()), None
    67. # start detection
    68. # for batch in self.dataset:
    69. count = 0 # run location frame
    70. start_time = time.time() # used to calculate the frame rate
    71. batch = iter(self.dataset)
    72. while True:
    73. # Termination detection
    74. if self.stop_dtc:
    75. if isinstance(self.vid_writer[-1], cv2.VideoWriter):
    76. self.vid_writer[-1].release() # release final video writer
    77. self.yolo2main_status_msg.emit('Detection terminated!')
    78. break
    79. # Change the model midway
    80. if self.used_model_name != self.new_model_name:
    81. # self.yolo2main_status_msg.emit('Change Model...')
    82. self.setup_model(self.new_model_name)
    83. self.used_model_name = self.new_model_name
    84. # pause switch
    85. if self.continue_dtc:
    86. # time.sleep(0.001)
    87. self.yolo2main_status_msg.emit('Detecting...')
    88. batch = next(self.dataset) # next data
    89. self.batch = batch
    90. path, im, im0s, vid_cap, s = batch
    91. visualize = increment_path(self.save_dir / Path(path).stem, mkdir=True) if self.args.visualize else False
    92. # Calculation completion and frame rate (to be optimized)
    93. count += 1 # frame count +1
    94. if vid_cap:
    95. all_count = vid_cap.get(cv2.CAP_PROP_FRAME_COUNT) # total frames
    96. else:
    97. all_count = 1
    98. self.progress_value = int(count/all_count*1000) # progress bar(0~1000)
    99. if count % 5 == 0 and count >= 5: # Calculate the frame rate every 5 frames

     代码获取,交流学习

    企鹅耗子:767172261

  • 相关阅读:
    技术学习:Python(21)|爬虫篇|selenium自动化操作浏览器
    RabbitMQ(四):RabbitMQ高级特性
    API 接口:原理、设计与应用
    QT+OSG/osgEarth编译之二十一:FreeXL+Qt编译(一套代码、一套框架,跨平台编译,版本:FreeXL-1.0.6)
    利用WebSocket +MQ发送紧急订单消息,并在客户端收到消息的用户的页面自动刷新列表
    解决方法:STM32使用cJSON解析数据失败
    tomcat部署和优化(二)----- 轻松搭建博客、状态页优化、虚拟主机配置
    上帝视角看Vue源码整体架构+相关源码问答
    聊聊芯片制造中的金属杂质
    【C++】list的使用(上)
  • 原文地址:https://blog.csdn.net/2301_78240361/article/details/136227042