【深度学习|目标跟踪】StrongSort 详解(以及StrongSort++)

StrongSort详解

  • 1、论文及源码
  • 2、DeepSort回顾
  • 3、StrongSort的EMA
  • 4、StrongSort的NSA Kalman
  • 5、StrongSort的MC
  • 6、StrongSort的BOT特征提取器
  • 7、StrongSort++的AFLink
  • 8、未完待续

1、论文及源码

在这里插入图片描述
论文地址:https://arxiv.org/pdf/2202.13514
源码地址:https://github.com/dyhBUPT/StrongSORT?tab=readme-ov-file

2、DeepSort回顾

参考此篇博客

3、StrongSort的EMA

  EMA即指数加权移动平均,在StrongSort中,self.track在update时,会将当前提取到的目标特征向量进行如下两步操作:

  • 将特征向量归一化
  • 指数加权移动平均

在代码中的体现,在track脚本文件中,Track类:
在这里插入图片描述
相比较于DeepSort中将每次的匹配上的目标的特征向量直接存储到对应track的gallery中,StrongSort的做法可以有效的平滑视频中间由于遮挡,噪声或其他不利因素导致的目标特征的衰减,使得在特征在匹配时的准确率能够有效提升。
  在Trackerupdate的最后,我们会更新对应track的特征库:
在这里插入图片描述

nn_matching脚本中的NearestNeighborDistanceMetric类中:
在这里插入图片描述
这里的self.budget可以在config.yaml中指定,意思是存储当前帧的前多少帧的特征进特征库。本质上还是和DeepSort一样,给每个track弄了个特征库,只不过特征库中的特征向量是从第一帧开始就进行指数加权移动平均并归一化的特征向量。

4、StrongSort的NSA Kalman

  在DeepSort中使用的是一个普通的kalman filter,即通过状态量直接估计下一时刻的状态,只有位置信息,而StrongSort中融合了目标的置信度信息,在计算噪声的均值和方差时,加入了track对应的检测目标的置信度信息,自适应的调整噪声。自适应计算噪声协方差的公式:
在这里插入图片描述
其中,Rk是预设的常数测量噪声协方差,Ck 是状态 k 下的检测置信度分数。即当置信度高时,意味着这次检测的结果有较小的噪声,对下次的状态预测的影响较小。
  现在来看一下源码中关于NSA Kalman的流程:

  • strong_sort.py中StrongSort类的self.tracker.predict()
  • 进入tracker.py中的Tracker类的predict()方法,遍历self.tracks然后进入track的predict()预测,然后进入track.py中的Track类的predict()预测,然后进入kalman_filter.py中的KalmanFilter类中的predict()方法来计算均值和方差。
  • 然后回到strong_sort.py中的self.tracker.update(),进入tracker.py的Tracker类的update()方法,经过self._match()匹配完成之后,会得到匹配列表,未匹配的跟踪,未匹配的检测。然后我们遍历匹配列表来,跟新我们已经匹配上的track,进入track.py中的Track类的update()方法,在这里我们会看到加入了检测框的confidence来更新均值和方差:
    在这里插入图片描述
  • 进入kalman_filter.py中的KalmanFilter类中的update()方法,进入self.project()方法计算出融合了confidence后的均值和方差。

这便是代码中NSA Kalman的一个实现过程。

5、StrongSort的MC

  在DeepSort中,虽然说结合了外观特征和运动特征来进行跟踪,但是DeepSort的lambda权重是设置成0或1的,因此并没有真正的结合外观特征追踪和运动特征追踪,只是将他们分成两个阶段分别匹配。而在StrongSort中,在外观特征匹配阶段,引入了一个mc_lambda权重作用在运动特征的门控矩阵上,结合外观代价矩阵来计算得到最后的cost_matrix,公式如下:
在这里插入图片描述
代码如下:
在这里插入图片描述
这是在_match()方法中的gated_metric()方法中调用。

6、StrongSort的BOT特征提取器

  这是一个关于行人重识别的特征提取网络,具体的还没有深入了解过,我个人觉得这里的特征提取器用什么不是StrongSort的亮点,毕竟这个模块是个即插即用的模块,用不同的分类网络或者孪生网络训练出来的特征提取网络都可以用在这个地方。

7、StrongSort++的AFLink

  AFLink提出将两段30帧(可以自己调整,修改AFLink的分类网络重新训练即可)的时空序列作为输入,这两段tracklets分别是1 * 30 * 3维度的一个特征向量,其中30表示帧数,3分别表示帧数(时间),x,y(空间),即结合了时空的一段序列。网络将会输出这两段tracklets的相似置信度。

  • AFLink网络的定义:
    在这里插入图片描述
"""
@Author: Du Yunhao
@Filename: model.py
@Contact: dyh_bupt@163.com
@Time: 2021/12/28 14:13
@Discription: model
"""
import torch
from torch import nnclass TemporalBlock(nn.Module):def __init__(self, cin, cout):super(TemporalBlock, self).__init__()self.conv = nn.Conv2d(cin, cout, (7, 1), bias=False)self.relu = nn.ReLU(inplace=True)self.bnf = nn.BatchNorm1d(cout)self.bnx = nn.BatchNorm1d(cout)self.bny = nn.BatchNorm1d(cout)def bn(self, x):x[:, :, :, 0] = self.bnf(x[:, :, :, 0])x[:, :, :, 1] = self.bnx(x[:, :, :, 1])x[:, :, :, 2] = self.bny(x[:, :, :, 2])return xdef forward(self, x):x = self.conv(x)x = self.bn(x)x = self.relu(x)return xclass FusionBlock(nn.Module):def __init__(self, cin, cout):super(FusionBlock, self).__init__()self.conv = nn.Conv2d(cin, cout, (1, 3), bias=False)self.bn = nn.BatchNorm2d(cout)self.relu = nn.ReLU(inplace=True)def forward(self, x):x = self.conv(x)x = self.bn(x)x = self.relu(x)return xclass Classifier(nn.Module):def __init__(self, cin):super(Classifier, self).__init__()self.fc1 = nn.Linear(cin*2, cin//2)self.relu = nn.ReLU(inplace=True)self.fc2 = nn.Linear(cin//2, 2)def forward(self, x1, x2):x = torch.cat((x1, x2), dim=1)x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return xclass PostLinker(nn.Module):def __init__(self):super(PostLinker, self).__init__()self.TemporalModule_1 = nn.Sequential(TemporalBlock(1, 32),TemporalBlock(32, 64),TemporalBlock(64, 128),TemporalBlock(128, 256))self.TemporalModule_2 = nn.Sequential(TemporalBlock(1, 32),TemporalBlock(32, 64),TemporalBlock(64, 128),TemporalBlock(128, 256))self.FusionBlock_1 = FusionBlock(256, 256)self.FusionBlock_2 = FusionBlock(256, 256)self.pooling = nn.AdaptiveAvgPool2d((1, 1))self.classifier = Classifier(256)def forward(self, x1, x2):x1 = x1[:, :, :, :3]x2 = x2[:, :, :, :3]x1 = self.TemporalModule_1(x1)  # [B,1,30,3] -> [B,256,6,3]x2 = self.TemporalModule_2(x2)x1 = self.FusionBlock_1(x1)x2 = self.FusionBlock_2(x2)x1 = self.pooling(x1).squeeze(-1).squeeze(-1)x2 = self.pooling(x2).squeeze(-1).squeeze(-1)y = self.classifier(x1, x2)if not self.training:y = torch.softmax(y, dim=1)return yif __name__ == '__main__':x1 = torch.ones((3, 1, 30, 3))x2 = torch.ones((3, 1, 30, 3))m = PostLinker()m.eval()# 提取第一个维度的第二个元素作为置信度(0表示第一个维度,1表示该维度的索引)y1 = m(x1, x2)[0, 1].detach().cpu().numpy()print(y1)

输入两个tracklets,维度分别是[1, 1, 30, 3];
           ||
           v
Temporal module: 特征层维度[1, 256, 6, 3];
           ||
           v
Fusion module: 特征层维度[1, 256, 6, 1];
           ||
           v
Pooling + Squeeze:特征层维度[1, 256];
           ||
           v
Classifier:特征层维度[1, 2];

  • AFLink的推理:
    AFLink是一个离线模块,在目标检测+跟踪推理完成后,将每一帧的track信息(帧数,位置)保存到txt中,然后离线的使用AFLink读取这个txt来得到最终的推理结果,也将序列信息保存到txt中。我们可以根据txt中的帧数和坐标信息来将检测结果可视化在视频中。

8、未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10、PyTorch autograd使用教程

文章目录 1. 相关思考2. 矩阵求导3. 两种方法求jacobian 1. 相关思考 2. 矩阵求导 假设我们有如下向量: y 1 3 x 1 5 [ w T ] 5 3 b 1 3 \begin{equation} y_{1\times3}x_{1\times5}[w^T]_{5\times3}b_{1\times3} \end{equation} y13​x15​[wT]53​b13​​…

【AI】Sklearn

长期更新,建议关注、收藏、点赞。 友情链接: AI中的数学_线代微积分概率论最优化 Python numpy_pandas_matplotlib_spicy 建议路线:机器学习->深度学习->强化学习 目录 预处理模型选择分类实例: 二分类比赛 网格搜索实例&…

软件质量保证——软件测试流程

笔记内容及图片整理自XJTUSE “软件质量保证” 课程ppt,仅供学习交流使用,谢谢。 对于软件测试中产品/服务/成果的质量,需要细化到每个质量特性上,因此出现了较为公认的软件质量模型,包括McCall质量模型、ISO/IEC 9126…

代码美学2:MATLAB制作渐变色

效果: %代码美学:MATLAB制作渐变色 % 创建一个10x10的矩阵来表示热力图的数据 data reshape(1:100, [10, 10]);% 创建热力图 figure; imagesc(data);% 设置颜色映射为“cool” colormap(cool);% 在热力图上添加边框 axis on; grid on;% 设置热力图的颜色…

从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)

二、结构型设计模式 4、组合模式(Composite) 组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式,客户端可以以一致的方式处理单个对…

femor 第三方Emby应用全平台支持v1.0.54更新

femor v1.0.54 版本更新 mpv播放器增加切换后台和恢复时隐藏状态栏的功能修复服务器首页因为连接超时异常的问题 获取路径:【femor 历史版本收录】

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代,小程序以其轻便、无需下载安装即可使用的特点,成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业,小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序,本文将为你提供一个从零开始的详细…

nrm镜像管理工具使用方法

nrm(NPM Registry Manager)是一款专门用于管理 npm 包镜像源的命令行工具。在使用 npm 安装各种包时,默认会从官方的 npm 仓库(registry)获取资源,但有时候由于网络环境等因素,访问官方源可能速…

OpenCV截取指定图片区域

import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…

易速鲜花聊天客服机器人的开发(下)

目录 “聊天机器人”项目说明 方案 1 :通过 Streamlit 部署聊天机器人 方案2 :通过 Gradio 部署聊天机器人 总结 上一节,咱们的聊天机器人已经基本完成,这节课,我们要看一看如何把它部署到网络上。 “聊天机器人”…

STM32笔记(串口IAP升级)

一、IAP简介 IAP(In Application Programming)即在应用编程, IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 通常实…

斐波那契堆与二叉堆在Prim算法中的性能比较:稀疏图与稠密图的分析

斐波那契堆与二叉堆在Prim算法中的性能比较:稀疏图与稠密图的分析 引言基本概念回顾Prim算法的时间复杂度分析稀疏图中的性能比较稠密图中的性能比较|E| 和 |V| 的关系伪代码与C代码示例结论引言 在图论中,Prim算法是一种用于求解最小生成树(MST)的贪心算法。其性能高度依…

使用argo workflow 实现springboot 项目的CI、CD

文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern…

BUUCTF—Reverse—不一样的flag(7)

是不是做习惯了常规的逆向题目?试试这道题,看你在能不能在程序中找到真正的flag!注意:flag并非是flag{XXX}形式,就是一个’字符串‘,考验眼力的时候到了! 注意:得到的 flag 请包上 f…

insmod一个ko提供基础函数供后insmod的ko使用的方法

一、背景 在内核模块开发时,多个不同的内核模块,有时候可能需要都共用一些公共的函数,比如申请一些平台性的公共资源。但是,这些公共的函数又不方便去加入到内核镜像里,这时候就需要把这些各个内核模块需要用到的一些…

LangGraph中的State管理

本教程将介绍如何使用LangGraph库构建和测试状态图。我们将通过一系列示例代码,逐步解释程序的运行逻辑。 1. 基本状态图构建 首先,我们定义一个状态图的基本结构和节点。 定义状态类 from langgraph.graph import StateGraph, START, END from typi…

MATLAB中Simulink的基础知识

Simulink是MATLAB中的一种可视化仿真工具, 是一种基于MATLAB的框图设计环境,是实现动态系统建模、仿真和分析的一个软件包,被广泛应用于线性系统、非线性系统、数字控制及数字信号处理的建模和仿真中。 Simulink提供一个动态系统建模、仿真和…

最小生成树-Prim与Kruskal算法

文章目录 什么是最小生成树?Prim算法求最小生成树Python实现: Kruskal算法求最小生成树并查集 Python实现: Reference 什么是最小生成树? 在图论中,树是图的一种,无法构成闭合回路的节点-边连接组合称之为…

关闭AWS账号后,服务是否仍会继续运行?

在使用亚马逊网络服务(AWS)时,用户有时可能会考虑关闭自己的AWS账户。这可能是因为项目结束、费用过高,或是转向使用其他云服务平台。然而,许多人对关闭账户后的服务状态感到困惑,我们九河云和大家一起探讨…

Could not locate device support files.

报错信息:Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题:xcode15升级到xcode16之后,13.…