【yolov8+人/车流量统计】yolov8案例的追踪case,业务化可以变成计数

news2024/9/23 9:24:26

文章目录

  • 前言
  • 修改点
    • Preprocess
    • Inference
  • 另一种方法,work了。
    • 一个难点,它走到了这里
  • 业务化修改
  • 总结


前言

之前写个yolov8的一个试用版,【深度学习】Yolov8追踪从0到1, 这要是做计数啥的,简单的一批,一套工程化的代码,给自己挖了个坑,说要实现一个基于yolov8的人/车流量统计.
现在要改进,想要做成能够处理多摄像头的,也就是多个摄像头共享一个算法来处理计数。

修改点

先修改最重要的点,前处理、推理和后处理,主要是吧原来单图片,修改成多图片的入参。yolov官方工程的track.py 注释的很清楚。Preprocess/Inference/Postprocess.
![在这里插入图片描述](https://img-blog.csdnimg.cn/e0b74bce1de14b1195605da3a53eac91.png
在这里插入图片描述
改造的整体思路是要搞清楚:

  1. 原输入是什么
  2. 原输出是什么
  3. 期望输入是什么
  4. 期望输入套到原方法是否工作良好
  5. 期望输出是什么

Preprocess

看150行
im0s 一个list,[array([[[125, 118, 1…ype=uint8)]
看一眼它的形状:HWC

im0s[0].shape
(1080, 1920, 3)

其输出im

im.shape
torch.Size([1, 3, 384, 640])

它的作用是将list的array 转成 torch.Tensor对象,并且转成BCHW的形状,注意这里应该是resize了,将最长边1920–>640,而短边等比例缩放到了384;
正常应该缩放到360,但不知道为啥它输出了384.(待定??)

经测试,im0s 输入修改成 [array([[[125, 118, 1…ype=uint8),array([[[125, 118, 1…ype=uint8)] 输出为:torch.Size([2, 3, 384, 640]) 满足预期。

Inference

来到了154行
input: im

im.shape
torch.Size([1, 3, 384, 640])

output:preds
在这里插入图片描述
preds[0]
在这里插入图片描述
对于yolov8的结构和输出解析看这里ref:https://zhuanlan.zhihu.com/p/598566644
在这里插入图片描述

preds[0]是一个tensor, 第一维度是 bz,第二维度是 80类和矩形框位置,第三维度未知(todo)应该是融合后的特征,正常来说若输入图片是640640 则是8400=(8080 + 40*40 + 20 *20),这个知乎的解读也不一定对,起码和我打印的结果不一致。
在这里插入图片描述
bz = 1 是可以跑出来的。
bz = 2 的时候,前两步没问题,到第三步就出问题了,跑不出来。
因为vscode 无法debug到python 环境路径的拓展包里:需要debug到/home/jianming_ge/miniconda/envs/xxx/lib/python3.9/site-packages/ultralytics/yolo/engine/model.py这里。
所以这个方法凉了。

另一种方法,work了。

ref:https://docs.ultralytics.com/modes/track/#multithreaded-tracking
这是yolov8 官方的case,藏的很深。我是三连跳找到的。
https://github.com/ultralytics/ultralytics/blob/main/examples/tutorial.ipynb—>
https://docs.ultralytics.com/tasks/ -->
https://docs.ultralytics.com/modes/track/#multithreaded-tracking

在这里插入图片描述

import threading

import cv2
from ultralytics import YOLO


def run_tracker_in_thread(filename, model):
    video = cv2.VideoCapture(filename)
    frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    for _ in range(frames):
        ret, frame = video.read()
        if ret:
            results = model.track(source=frame, persist=True)
            res_plotted = results[0].plot()
            cv2.imshow('p', res_plotted)
            if cv2.waitKey(1) == ord('q'):
                break


# Load the models
model1 = YOLO('yolov8n.pt')
model2 = YOLO('yolov8n-seg.pt')

# Define the video files for the trackers
video_file1 = 'path/to/video1.mp4'
video_file2 = 'path/to/video2.mp4'

# Create the tracker threads
tracker_thread1 = threading.Thread(target=run_tracker_in_thread, args=(video_file1, model1), daemon=True)
tracker_thread2 = threading.Thread(target=run_tracker_in_thread, args=(video_file2, model2), daemon=True)

# Start the tracker threads
tracker_thread1.start()
tracker_thread2.start()

# Wait for the tracker threads to finish
tracker_thread1.join()
tracker_thread2.join()

# Clean up and close windows
cv2.destroyAllWindows()

案例代码中model1 和 model2 用的模型不一样,一个检测,一个分割。其实两个也可以用检测。-----------这里有问题, todo
这是解决了追踪的问题,计数其实是对追踪的业务化。我另外的blog文章已经说明了。
这里还需要注意一点:

model1 = YOLO('yolov8n.pt')
model2 = YOLO('yolov8n-seg.pt')

这个方式若当前路径权重文件不存在,会把权重下载到当前目录,也可以指定路径,比如:
这个记录是在yolov5 vs yolov8的训练那篇文章的案例的代码。

from ultralytics import YOLO
model = YOLO('./yolov8m.pt')
model.train(data='data/firesmoke.yaml', epochs=500, imgsz=640, device=[0,1],save_period=20,workers=8,batch=24)

在这里插入图片描述

即使我用两个视频源做输入,跑了两个模型,可以看到所占的显存也不多。
在这里插入图片描述
在这里插入图片描述
一个分割,一个检测的模型,看起来还不错,用的是
在这里插入图片描述
发现问题:
在这里插入图片描述
这种方式其实是启动了多个model算法, 公用model1会出错,所以不是一个理想的方案。报错我也贴一下:

理想的方案应该是,比如四个摄像头,bz=4来实现目标检测/分割只用一个模型,追踪各走各的,才是一个好方案! todo。

一个难点,它走到了这里

在这里插入图片描述

业务化修改

待续

总结

参考:
git:https://github.com/MuhammadMoinFaisal/YOLOv8-DeepSORT-Object-Tracking
git:https://docs.ultralytics.com/modes/track/#multithreaded-tracking
blog:https://blog.csdn.net/liuxuan19901010/article/details/130555216

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

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

相关文章

abp vnext指定版本下载

在本地环境没有达到最新的开发环境时可能无法下载abp vnext的最新版本,我们应该指定下载符合本地开发环境的abp版本,下面一起看一下: 首先查看本地电脑的开发环境版本: cmd dotnet --version dotnet --list-version ABP VNext和…

师从美国四院院士|遗传学老师赴哥伦比亚大学访问交流

H老师为省公派访学,目标为美国知名高校,最终我们获得了哥伦比亚大学的邀请函,导师是美国科学院院士、美国艺术与科学院院士、美国微生物学院院士、美国科学促进会会士等四个学会的院士,堪称学术界的超级大牛。 H老师背景&#xff…

Spark性能调优指南来了!

1、什么是Spark Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Spark Core:实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed Dat…

【Ansible 的脚本 --- playbook 剧本】

目录 一、playbook 剧本介绍二、示例1、运行playbook2、定义、引用变量 三、使用playbook部署lnmp集群 一、playbook 剧本介绍 playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在…

从多个基础CMS中学习代码审计

代码审计 概念 什么是代码审计? 代码审计是在一个编程中对源代码旨在发现错误、安全漏洞或违反编程约定的项目。 说人话就是找它这些代码中可能存在问题的地方,然后看它是否真的存在漏洞。(博主小白,可能存在问题,请见谅) 分类…

ScrumMaster认证培训(CSM)记录篇-Leangoo领歌

前不久参加了Leangoo领歌CSM认证公开班,简单记录下我的学习之旅 当初选课程时也很是纠结,最终选择了Leangoo领歌,Leangoo领歌是Scrum中文网旗下的一款敏捷研发管理工具。 Leangoo领歌由Scrum中文网资深的敏捷顾问团队和敏捷研发团队经过近十…

Python scipy Moudle 中的 optimize 方法

Python scipy Moudle 中的 optimize 方法 scipy Moudle 中的 optimize 方法 minimize 最小化一个函数 它提供了多种算法,如 BFGS、Nelder-Mead、Powell 可选参数 fun:要最小化的目标函数x0:函数的初始猜测值。可以是一个数组或列表metho…

Python入门一

目录: python基本操作python基本数据类型python字符串基本操作python的运算符python控制流-判断python控制流-循环python常用数据结构-列表python常用数据结构-元组python常用数据结构-集合python常用数据结构-字典python函数python函数进阶与参数处理pythonlambda…

【7.31】C++编写7254是一个不寻常的数,可以表示为7254 = 39 x 186,这个式子中1~9每个数字正好出现一次

题目题干 7254是一个不寻常的数,因为它可以表示为7254 39 x 186,这个式子中1~9每个数字正好出现一次,输出所有这样的不同的式子(乘数交换被认为是相同的式子)。结果小的先输出;结果相同的,较小…

IPsec VPN小实验

IPSec 是什么: IPSec是一个框架,它不是具体指某个协议,而是定义了一个框架,由各种协议组和协商而成。该框架涉及到的主要有加密算法、验证算法、封装协议、封装模式、密钥有效期等等。 IPSecVPN建立的前提:要想在两个…

【性能测试】性能测试的概念、策略、指标

一、性能测试的概念 1.1 什么是性能 - 时间:系统处理用户请求的响应时间 -资源:系统运行过程中,系统资源的消耗情况 1.2 什么是性能测试 使用自动化工具,模拟不同的场景,对软件各项性能指标进行测试和评估的过程 …

适配器模式与装饰器模式对比分析:优雅解决软件设计中的复杂性

适配器模式与装饰器模式对比分析:优雅解决软件设计中的复杂性 在软件设计中,我们常常面临着需要将不同接口或类协调工作的情况,同时还要满足灵活性和可扩展性的需求。为了应对这些挑战,适配器模式和装饰器模式应运而生&#xff0c…

12-4_Qt 5.9 C++开发指南_创建和使用共享库

文章目录 1. 创建共享库2. 使用共享库2.1 共享库的调用方式2.2 隐式链接调用共享库2.3 显式链接调用共享库 1. 创建共享库 除了静态库,Qt 还可以创建共享库,也就是 Windows 平台上的动态链接库。动态链接库项目编译后生成 DLL 文件,DLL 文件…

【机器学习】Overfitting and Regularization

Overfitting and Regularization 1. 过拟合添加正则化2. 具有正则化的损失函数2.1 正则化线性回归的损失函数2.2 正则化逻辑回归的损失函数 3. 具有正则化的梯度下降3.1 使用正则化计算梯度(线性回归 / 逻辑回归)3.2 正则化线性回归的梯度函数3.3 正则化…

SpringCloud集成OpenTelemetry的实现

SpringCloud项目做链路追踪,比较常见的会集成SleuthZipKin来完成,但这次的需求要集成开源框架OpenTelemetry,这里整理下实现过程。相关文章: 【SpringCloud集成SleuthZipkin进行链路追踪】 【OpenTelemetry框架Trace部分整理】 …

JavaSE运算符

大体上,与C语言差不多,不同的地方,我用红色字体标注了 算术运算符 1. 基本四则运算符:加减乘除模 ( - * / %) int a 10 ; int b 20 ; System . out . println ( a b ); // 30 System . out . println ( a - b…

校园跑腿小程序开发需要哪些核心功能?

提起校园跑腿小程序大家都不陌生,尤其是对上大学的伙伴们来说,更是熟悉得不能再熟悉了,和我们的生活息息相关,密不可分。 对于现在的年轻人来说,网购是非常简单和方便的一种购物方式,随之快递也会越来越多。在我们国家…

白盒测试和黑盒测试的区别是什么?

前言 曾言道“黑猫,白猫,只要能抓住老鼠就是好猫”。我们的测试亦是如此,不管是黑盒测试还是白盒测试,只要能测试出来bug,可以找出问题所在,保障软件质量就是好的测试方法。 对于刚入门的软件测试小白来说…

【Git系列】Git到远程仓库

🐳Git到远程仓库 🧊1. github账号注册🧊2. 初始化本地仓库🧊3. 创建GitHub远程仓库🧊4. 给本地仓库起别名🪟4.1 查看远程库的连接地址🪟4.2 起别名 🧊5. git推送操作🧊6.…

【SEO基础】百度权重是什么意思及网站关键词应该怎么选?

百度权重是什么意思及网站关键词应该怎么选? 正文共:3253字 20图 预计阅读时间:9分钟 ​ 1.什么是网站权重? 这段时间和一些朋友聊到网站权重以及关键词,发现蛮多人对于这两个概念的认知还是存在一些错误的&#xf…