StrongSORT(deepsort强化版)学习体会

2023-11-11

少废话,先做备忘录

  1. StrongSORT(deepsort强化版)浅实战+代码解析
    参考:https://blog.csdn.net/weixin_50862344/article/details/127070391
  2. https://github.com/phil-bergmann/tracking_wo_bnw
  3. https://www.zhihu.com/question/511584675
  4. https://blog.51cto.com/u_15316394/3215952
  5. https://github.com/KaiyangZhou/deep-person-reid
  6. https://www.jianshu.com/p/dc6a866600c2
  7. https://blog.csdn.net/sc1434404661/article/details/126973759
  8. https://drive.google.com/drive/folders/1xhG0kRH1EX5B9_Iz8gQJb7UNnn_riXi6
    遇到问题:
    https://github.com/ultralytics/yolov5/issues/1855

deepsort:几篇不错的文章
https://blog.csdn.net/didiaopao/article/details/120272947?spm=1001.2014.3001.5502
https://blog.csdn.net/didiaopao/article/details/120274519?spm=1001.2014.3001.5502
https://blog.csdn.net/didiaopao/article/details/120276922?spm=1001.2014.3001.5502

1. 如何使用

2. 代码解读

blog指引: https://blog.csdn.net/weixin_40620310/article/details/124501917

2.1 两个模型:

  1. 基于yolov5的detector模型
  2. tracker 基于跟踪器的tracker 模型,更新状态。

2.2 跟进一下demo.py

既然是视频跟踪解析,送入视频流一定需要while True结构,进行逐帧推理
创建一个检测器实例,不要被它的名字蒙蔽,虽然叫检测器,但是远比yolov5的检测器复杂,否则没法维护状态矩阵进行状态的维护和更新

det = Detector()

先来看一下Detector类的基类

class baseDet(object):
    def __init__(self):
        self.img_size = 640
        self.threshold = 0.3
        self.stride = 1

    def build_config(self):
        self.frameCounter = 0
    
    def feedCap(self, im, func_status):
        # 送入图片流
        retDict = {
            'frame': None,
            'list_of_ids': None,
            'obj_bboxes': []
        }
        self.frameCounter += 1
        # 这里和追踪器建立了关联, objtracker.update() im是送入的某一帧图片,会调用ReID模型得到特征,然后进行匹配
        im, obj_bboxes = objtracker.update(self, im)
        retDict['frame'] = im
        retDict['obj_bboxes'] = obj_bboxes

        return retDict

    def init_model(self):
        raise EOFError("Undefined model type.")

    def preprocess(self):
        raise EOFError("Undefined model type.")

    def detect(self):
        # detect 方法是yolov5真正的检测方法
        raise EOFError("Undefined model type.")

这里是真正的检测类

# 对YOLOV5检测器的一个封装,使得使用起来更加简便
class Detector(baseDet):
    def __init__(self):
        super(Detector, self).__init__()
        self.init_model()
        self.build_config()
    # 加载模型
    def init_model(self):
        self.weights = DETECTOR_PATH
        self.device = '0' if torch.cuda.is_available() else 'cpu'
        self.device = select_device(self.device)
        model = attempt_load(self.weights, map_location=self.device)
        model.to(self.device).eval()
        model.half()
        self.m = model
        self.names = model.module.names if hasattr(
            model, 'module') else model.names
    # 对传进来的视频帧进行预处理
    def preprocess(self, img):
        img0 = img.copy()
        img = letterbox(img, new_shape=self.img_size)[0]
        img = img[:, :, ::-1].transpose(2, 0, 1)
        img = np.ascontiguousarray(img)
        img = torch.from_numpy(img).to(self.device)
        img = img.half()  # 半精度
        img /= 255.0  # 图像归一化
        if img.ndimension() == 3:
            img = img.unsqueeze(0)
        return img0, img # img0是原始的图像,img是处理后的图像

    def detect(self, im):
        """
        detect 方法就是传统一样上的检测方法,更为关键的是基类的feedCap方法,
        feedCap方法中最重要的是objtracker.update(self, im) 这个self其实就是yolov5的detector, 
        再update方法内部,用到了,这个方法detect,吐槽一下,他这个写法破坏了类的封装性,类之间有了依赖关系
        """
        im0, img = self.preprocess(im)
        pred = self.m(img, augment=False)[0] # 将图像传入检测器中,得到推理后的结果
        pred = pred.float()
        pred = non_max_suppression(pred, self.threshold, 0.4) # 进行非极大值抑制
        pred_boxes = []
        for det in pred:
            if det is not None and len(det):
                det[:, :4] = scale_coords(
                    img.shape[2:], det[:, :4], im0.shape).round()
                for *x, conf, cls_id in det:
                    lbl = self.names[int(cls_id)]
                    if not lbl in OBJ_LIST:	
                       # 这里就是判断类别,不在我们需要检测的类别中就跳过。 @todo其实这里可以修改成不是这个关注的类,就不关注,而不是检测出来再过滤,但是否更省资源,要看源码。
                        continue
                    x1, y1 = int(x[0]), int(x[1])
                    x2, y2 = int(x[2]), int(x[3])
                    pred_boxes.append(
                        (x1, y1, x2, y2, lbl, conf))
        return im, pred_boxes # 最后返回原始图像以及检测到的目标框

cfg = get_config()
cfg.merge_from_file("deep_sort/configs/deep_sort.yaml")
deepsort = DeepSort(cfg.DEEPSORT.REID_CKPT,
                    max_dist=cfg.DEEPSORT.MAX_DIST, min_confidence=cfg.DEEPSORT.MIN_CONFIDENCE,
                    nms_max_overlap=cfg.DEEPSORT.NMS_MAX_OVERLAP, max_iou_distance=cfg.DEEPSORT.MAX_IOU_DISTANCE,
                    max_age=cfg.DEEPSORT.MAX_AGE, n_init=cfg.DEEPSORT.N_INIT, nn_budget=cfg.DEEPSORT.NN_BUDGET,
                    use_cuda=True)

def update(target_detector, image):
        # 这里也就是用之前的检测器得到检测框
        _, bboxes = target_detector.detect(image)
        bbox_xywh = []
        confs = []
        bboxes2draw = []
        if len(bboxes):
            # Adapt detections to deep sort input format
            for x1, y1, x2, y2, _, conf in bboxes:
                obj = [
                    int((x1+x2)/2), int((y1+y2)/2),
                    x2-x1, y2-y1
                ]
                bbox_xywh.append(obj)
                confs.append(conf)
            xywhs = torch.Tensor(bbox_xywh)
            confss = torch.Tensor(confs)

            # Pass detections to deepsort(这里就可以得到最终的这一帧的目标框和目标ID)
            outputs = deepsort.update(xywhs, confss, image)
            for value in list(outputs):
                x1,y1,x2,y2,track_id = value
                bboxes2draw.append(
                    (x1, y1, x2, y2, '', track_id)
                )
        # 这里起到一个将检测框和ID信息绘制到图像上的作用
        image = plot_bboxes(image, bboxes2draw)
        return image, bboxes2draw

用的是yolov5的2022.4月份之前的版本,还没有把focus网络去掉。关于focus网络的解读看这里
https://blog.csdn.net/qq_38253797/article/details/119684388

fuseforward

设计思路:理论上从高分辨率图像中,周期性的抽出像素点重构到低分辨率图像中,即将图像相邻的四个位置进行堆叠,聚焦wh维度信息到c通道空,提高每个点感受野,并减少原始信息的丢失。这个组件并不是为了增加网络的精度的,而是为了减少计算量,增加速度。
后来的版本中已经去掉了,证明其没卵用

3. 其它

需要代码的私信流邮箱,或者我找一个其它方式,看如何搞定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StrongSORT(deepsort强化版)学习体会 的相关文章

  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • 使用 python 中的公式函数使从 Excel 中提取的值的百分比相等

    import xlrd numpy excel Users Bob Desktop wb1 xlrd open workbook excel assignment3 xlsx sh1 wb1 sheet by index 0 colA co
  • Pandas:GroupBy 到 DataFrame

    参考这个关于 groupby 到 dataframe 的非常流行的问题 https stackoverflow com questions 10373660 converting a pandas groupby object to dat
  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • Gspread如何复制sheet

    在 Stackoverflow 上进行谷歌搜索和搜索后 我想我找不到有关如何复制现有工作表 现有模板工作表 并将其保存到另一个工作表中的指南 根据文档 有重复表 https gspread readthedocs io en latest
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • 将seaborn.palplot轴添加到现有图形中以可视化不同调色板

    将seaborn人物添加到子图中是usually https seaborn pydata org examples cubehelix palette html创建图形时通过传递 ax 来完成 例如 sns kdeplot x y cma
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • TKinter 中的禁用/启用按钮

    我正在尝试制作一个像开关一样的按钮 所以如果我单击禁用按钮 它将禁用 按钮 有效 如果我再次按下它 它将再次启用它 我尝试了 if else 之类的东西 但没有成功 这是一个例子 from tkinter import fenster Tk
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS

随机推荐

  • easyui combtree 单选的时候实现 再次点击取消选中

    easyui combtree 单选的时候实现 再次点击取消选中 原理 就是在 select 的时候判断当前节点是否选中 选中了的话就通过改变 节点 的class 属性来取消选中 并且清空combotree 的值 同时 return fal
  • 你知道Python基础包含哪些内容?学习什么吗?

    Python基础包含哪些内容 学习什么 学习Python基础了解Python语言起源 设计目标 设计哲学 Python语言的优缺点和面向对象的基本概念 执行方式 集成开发环境PyCharm的使用为Python的深入学习做铺垫 接下来小编就介
  • ajax全选功能,jq checkbox 的全选并ajax传参的实例

    Box prop checked true else checkBox removeAttr checked form on click ids function var chknum input name ids checkBox siz
  • Convolutional Networks(3)

    CONTENTS Random or Unsupervised Features Typically the most expensive part of convolutional network training is learning
  • usart和uart的主要区别

    USART 通用同步和异步收发器UART 通用异步收发器 当进行异步通信时 这两者是没有区别的 区别在于USART比UART多了同步通信功能 这个同步通信功能可以把USART当做SPI来用 比如用USART来驱动SPI设备 同步是指 发送方
  • BMP转JPG(法一)使用jpeglib库实现bmp转jpg

    一 vc编译jpeglib库 1 下载源代码 下载地址 http www ijg org 注意 一定要下载win32 版本 2 编译源代码 A 解压源代码 修改源代码中jconfig vc为jconfig h B 添加环境变量PATH C
  • 微信卡券 java_微信小程序领取卡券(java)

    最近做了个领取微信卡券的小程序 看了很多文档资料以及花了很多时间才算搞定的 不过也算是好事多磨 这边记录分享一下 也算给一点提升 一 开发前准备 1 申请微信公众号 和 微信小程序 这是两个不同的东西 都需要单独申请 不同的帐号 2 微信公
  • swiper-item @touchmove.stop false不好用

    我理解你的问题是说你在使用 Vue js 框架中的 swiper item 组件时 你想禁止它的 touchmove 事件 但是 touchmove stop 这个修饰符却不起作用 首先 touchmove stop 这个修饰符是用来阻止浏
  • 【编译原理】LALR(1)语法分析方法(c++实现)

    前文回顾 编译原理 LR 0 分析方法 c 实现 编译原理 SLR 1 分析方法 c 实现 编译原理 LR 1 分析方法 c 实现 这几个程序的代码大部分是一样的 根据不同算法特点做了部分修改而已 代码 LALR 1 的代码就是在LR 1
  • 元宇宙通证-七、元宇宙外:千行万业的元宇宙化

    七 元宇宙外 千行万业的元宇宙化 元宇宙将会赋能所有行业 激发传统行业的发展新动能 实现行业高质量发展 千行万业的元宇宙化 其中最重要的是经济体系 沉浸感 社交关系的代入 一方面 元宇宙将会赋能现实世界的所有行业领域 基于现有商业模式进行元
  • CTF加密解密—CRYPTO—crypto8

    0x00 考察知识点 这道题和上道Ook的题目同源 直接通过Ook底层的解码进行解码 因为Ook本身就是在brainfuck的基础上完成的 0x01 题目 gt lt gt lt gt lt gt lt gt lt gt lt gt lt
  • Ubuntu系统下《汇编语言》环境配置

    说明 1 系统 Ubuntu codists pc lsb release a No LSB modules are available Distributor ID Ubuntu Description Ubuntu 21 10 Rele
  • C语言实现快速排序与归并排序

    快排 代码如下 include
  • 深度学习框架太抽象?其实不外乎这五大核心组件

    转 http www leiphone com news 201701 DZeAwe2qgx8JhbU8 html 导语 一般深度学习框架都会包括的五大核心组件都有哪些 许多初学者觉得深度学习框架抽象 虽然调用了几个函数 方法 计算了几个数
  • 电阻中联分压电路的计算

    方法一 如下图所示 大概1K 分压1V Vp Vin x R2 R1 R2 3Vx2K 1K 2K 2V 结论 R2增加P增加 R1减小 P增加 方法二 用工具计算 如下图
  • 软件设计师备考——第七章 面向对象

    软件设计师备考 第七章 面向对象 一 面向对象基础 1 面向对象的基本概念 2 类 3 对象 4 消息 二 方法 1 方法重载 2 封装 3 继承 4 多态 5 静态 动态绑定 三 面向对象设计 1 面向对象设计原则 2 面向对象分析 3
  • Git:husky > npm run -s precommit

    git commit前检测husky与pre commit 问题 我是通过vs code 编辑器中进行提交代码 以往都是在勾选上需要提交的文件后 并输入提交描述 点击commit就提交成功了 但是今天点击commit突然报错 思路 先想办法
  • centos red5 添加成为服务并且设置开机自启动

    1 vi etc init d red5 创建tomcat red5 2 在red5中添加如下的内容 一定要在头部添加java环境的引用 否则可能启动不成功 说明 其中的JAVA HOME要设置为本机真实的java路径 RED5 HOME也
  • matlab 画随机数图,怎么用matlab生成100个标准正态分布的随机数并画出直方图

    正态分布是normpdf x mu sigma mu sigma 默认是 0 1例子ez 由热心网友提供的答案1 生成一组随机数 正态分布 data normrnd 0 1 1 500 绘制直方图hist d f normrnd 0 1 1
  • StrongSORT(deepsort强化版)学习体会

    少废话 先做备忘录 StrongSORT deepsort强化版 浅实战 代码解析 参考 https blog csdn net weixin 50862344 article details 127070391 https github