当前位置: 首页 > news >正文

【深度学习|目标跟踪】DeepSort 详解

DeepSort详解

  • 1、Sort回顾
  • 2、DeepSort的状态向量
  • 3、DeepSort的外观特征
  • 4、DeepSort的track状态
  • 5、DeepSort的代价矩阵以及门控矩阵
  • 6、DeepSort的级联匹配

1、Sort回顾

查看这篇博客

2、DeepSort的状态向量

  Sort中的卡尔曼滤波使用的目标的状态向量是一个7维的向量,如下图所示:
在这里插入图片描述
其中,u,v表示目标中心的水平和垂直像素的位置;s,r表示目标边界框的面积和纵横比。
DeepSort的状态量中加入了一个纵横比的变化率,如下图所示:
在这里插入图片描述
从理论上来讲,加入了一个纵横比的变化率确实能够提高目标跟踪的准确性,比较目标一直在移动会有遮挡,显示的检测框的纵横比肯定也不是固定的。这是DeepSort的运动特征表示。下面我们看DeepSort的外观特征表示。

3、DeepSort的外观特征

  为了解决Sort跟踪算法中,对于目标遮挡或检测失效等问题带来的,id消失之后再出现时的id不断变化的问题,DeepSort加入了一个特征提取网络来进行对特征进行匹配,可以关联上长时间被遮挡但又出现的目标、。DeepSort使用了一个简单的卷积神经网络来提取检测框中的目标特征向量,这里的网络可以自己diy,也可以使用目前主流的现有的CNN,如ResNet18,ResNet50等。在跟踪的过程中,DeepSort会将目标在当前帧的特征向量进行提取,并保存在track对象的属性中。在后面的每一帧中,都会执行一次将当前帧的目标特征向量与gallery中的特征向量进行相似度的计算(比如余弦相似度)。这个相似度将会作为DeepSort匹配阶段的一个重要的判别依据。

4、DeepSort的track状态

  DeepSort源码中的track类有三种状态,Tentative(暂定状态),Confirmed(确定状态),Deleted(删除态)。在开始检测时,检测的对象都会初始化一个track对象,此时的track为Tentative暂定状态,当这个track关联的检测对象连续三帧被检测到并且关联上这个track时,那么在第四帧就会将这个track的状态升级为Confirmed状态,如果track状态为Tentative并且当前帧失配了或者track的update次数已经超过了最大age,则将track的状态降级为Deleted状态。

5、DeepSort的代价矩阵以及门控矩阵

  将当前帧的检测框与先前存在的track进行关联的方式可以依靠匈牙利匹配算法来实现。但是在这之前,我们需要解决代价矩阵的问题。Sort的代价矩阵是由当前帧的运动特征与前一帧的运动特征的卡尔曼预测值进行iou的比对来产生的,这样做会导致较大的局限性。因此,DeepSort寻找了两个适当的指标来结合运动特征和外观特征。

  • 首先我们来看运动特征:作者采用了马氏距离来衡量卡尔曼预测态和当前测量值之间的差异。关于马氏距离的解释可以查看这篇博客。下图则是DeepSort中外观特征的马氏距离计算公式:
    在这里插入图片描述
    其中yi,si表示第i个track分布到测量空间的投影,dj表示第j个目标检测框,在代码中的体现:
    在这里插入图片描述
    我们计算出外观特征的距离之后,我们还需要一个阈值来判断是否是我们想要的匹配,其中四维空间的马氏阈值为9.4877,这在代码中也有体现:
    在这里插入图片描述
    有了阈值之后,我们就可以来卡满足匹配要求的外观特征和不满足匹配要求的外观特征了:
    在这里插入图片描述
    在计算出了feature的余弦相似度之后,我们可以使用这个外观特征的门控特性来卡,大于这个马氏阈值的,我们将feature的余弦相似度设置成一个很大的固定值,小于这个马氏阈值的,我们则保留本来的余弦相似度,代码中的体现:
    在这里插入图片描述

  • 外观特征:作者在每一个track中都创建了一个gallery来存储这个track在不同帧中的外观特征,并且每个外观特征的模长为1(特征层经过了归一化),论文中用Rk表示,Rk中最多存储100个外观特征。因此,当我们获取当前帧的所有检测框时就得到了所有当前帧的外观特征,我们拿这些外观特征与不同track对象中的Rk库进行余弦相似度的计算,并得到其中的最小值:
    在这里插入图片描述
    其中rj表示当前帧的第j个检测框,rk(i)表示第i个track的gallery特征库(余弦相似度值越大,说明两个目标之间越相似),因此这里的值取最小值表示最相似的。同样,设定一个阈值来卡余弦相似度:
    在这里插入图片描述
    在源码中,这里的阈值设置为0.2,即大于0.2的都置为一个固定值:
    在这里插入图片描述
    在这里插入图片描述

  • 运动特征与外观特征的融合:运动特征与外观特征的作用是相辅相成的,试想一下,运动特征可以匹配上短期内的物体位移带来的目标位置变化,但是遮挡之后目标的位置中断导致无法匹配上,而外观特征可以搜寻过往的track的特征,来进行匹配。但是当画面中出现两个目标的外观特征十分相似而空间上的分离能让我们确定他们时两个物体时,这时使用外观特征则会导致将他们视为一个track的误判,这时就需要运动特征来提供判断依据,因此作者采用了加权的方式来综合两个代价矩阵,得到最终的代价矩阵:
    在这里插入图片描述
    最后,我们联合运动门控矩阵(马氏距离阈值得到)与外观门控矩阵(max_distance阈值得到),得到了最终的关联性门控矩阵:
    在这里插入图片描述
    然后结合最终的代价矩阵和门控矩阵来得到最终用于匈牙利匹配的矩阵并进行级联匹配。

6、DeepSort的级联匹配

  对confirmed状态下的tracks和当前的检测框进行级联匹配,这里的级联指的是不同update次数下的tracks我们都需要与当前的所有检测框进行匹配。先遍历当前的所有tracks,并将其分成confirmed和unconfirmed的两种track,记录下他们的索引在对应列表中。然后进入matching_cascade方法中,从0开始遍历到cascade_depth,源码中设置为70,即我们遍历到最多在有70帧还未更新的track,遍历当前level下的所有tracks,挑出满足的tracks,然后进入min_cost_matching函数中与当前帧的检测框进行匹配,返回的是已经配对上的track索引和检测框索引,以及还剩下的未匹配的检测框索引;这个循环一直持续,当未匹配的检测框列表为空时,提前退出循环,算法流程如下图所示:
在这里插入图片描述
min_cost_matching函数中调用了gated_metric函数来进行代价矩阵的计算:

        def gated_metric(tracks, dets, track_indices, detection_indices):features = np.array([dets[i].feature for i in detection_indices])targets = np.array([tracks[i].track_id for i in track_indices])# 通过最近邻(余弦距离)计算出成本矩阵(代价矩阵)cost_matrix = self.metric.distance(features, targets)# 计算门控后的成本矩阵(代价矩阵)cost_matrix = linear_assignment.gate_cost_matrix(self.kf, cost_matrix, tracks, dets, track_indices,detection_indices)return cost_matrix

gated_metric函数中得到了外观特征代价矩阵,并且得到了运动特征的马氏距离门控矩阵,对代价矩阵进行了第一次的门控。
在这里插入图片描述
这里的distance_metric就是我们刚才提到的gated_metric在这里的调用,然后红框内的第二行就是使用最大余弦相似度进行第二次的门控,这样一来,关于卡尔曼状态的门控和外观特征的门控我们就都用上了。

最后说一下我对公式5的理解,我一开始以为的是作者想每次都把这两者给算出来然后按照一定的权重进行相加得到代价矩阵,结果在代码中找了很久并没有发现这一个操作。然后我才发现,也许这里的lambda不是1就是0,也就是说外观的代价矩阵还是外观的,在这一阶段我们利用外观代价矩阵进行匹配,在另一个阶段我们就会利用运动代价矩阵进行匹配。因此在级联匹配之后,还有一个利用iou的运动代价矩阵来对级联匹配中还没有匹配成功的目标进行二次匹配。也就是上文中我说的相辅相成的功能。 如有理解不对的地方,还请大家多多指出~~

相关文章:

【深度学习|目标跟踪】DeepSort 详解

DeepSort详解 1、Sort回顾2、DeepSort的状态向量3、DeepSort的外观特征4、DeepSort的track状态5、DeepSort的代价矩阵以及门控矩阵6、DeepSort的级联匹配 1、Sort回顾 查看这篇博客 2、DeepSort的状态向量 Sort中的卡尔曼滤波使用的目标的状态向量是一个7维的向量&#xff0c…...

快速图像识别:落叶植物叶片分类

1.背景意义 研究背景与意义 随着全球生态环境的变化,植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础,也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…...

MTK Android12 user版本MtkLogger

目录 1.修改device/mediatek/system/common/device.mk 2.修改device/mediatek/system/common/mtklog/mtklog-config-bsp-eng.prop,修改为false是为了开机的时候不要自动启动 3.修改device/mediatek/vendor/common/device.mk 4.修改vendor/mediatek/proprietary/…...

Python数据结构day2

一、链表 1.1目的 解决顺序表存储数据有上限,并且插入和删除操作效率低的问题 1.2概念 链表:链式存储的线性表,使用随机物理内存存储逻辑上连续的数据 链表的组成:由一个个结点组成 结点:由数据域和链接域组成&a…...

后台通用tag面包屑

思路:要实现点击左侧菜单栏,页面跳转且显示面包屑(本文用的是TSVue3) 功能点: 最多显示5个标签超过5个时,自动移除最早的标签至少保留1个标签支持标签关闭功能 首先在store.ts 处理路由(点击过的路由,当前…...

oracle数据恢复—通过拼接数据库碎片的方式恢复Oracle数据的案例

Oracle数据库故障: 存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组…...

node.js fluent-ffmpeg 桌面推流

1,安装fluent-ffmpeg,npm install fluent-ffmpeg 2,推流代码: //stream.js const ffmpeg require(fluent-ffmpeg); const rtmpUrl "rtmp://localhost:1935/live/desktop"; //ffmpeg -f gdigrab -i desktop -vcode…...

AWS的流日志

文章目录 一、aws如何观察vpc的日志?二、aws观测其vpc的入口日志三、 具体配置3.1、配置你的存储神器 S33.2、建立子网的流日志 一、aws如何观察vpc的日志? 排查问题的时候除了去抓包看具体的端口信息的时候,还可以根据其所在的vpc的子网信息…...

大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

Qt入门1——认识Qt的几个常用头文件和常用函数

1.头文件 ① #include <QPushButton>——“按钮”头文件&#xff1b; ② #include <QLabel>——“标签”头文件&#xff1b; ③ #include <QFont>——“字体”头文件&#xff1b; ④#include <QDebug>——输出相关信息&#xff1b; 2. 常用函数/类的基…...

ElasticSearch学习篇17_《检索技术核心20讲》最邻近检索-局部敏感哈希、乘积量化PQ思路

目录 场景在搜索引擎和推荐引擎中&#xff0c;对相似文章去重是一个非常重要的环节&#xff0c;另外是拍照识花、摇一摇搜歌等场景都可以使用它快速检索。 基于敏感性哈希的检索更擅长处理字面上的相似而不是语义上的相似。 向量空间模型ANN检索加速思路 局部敏感哈希编码 随…...

在 Sublime Text 中直接预览 Markdown 文件

在 Sublime Text 中直接预览 Markdown 文件需要借助插件实现。以下是详细步骤&#xff1a; 1. 安装 Markdown Preview 插件 按下快捷键 CtrlShiftP (或 macOS 上的 CmdShiftP)&#xff0c;打开命令面板。输入 Install Package 并选择 Package Control: Install Package。等待包…...

分词器的概念(通俗易懂版)

什么是分词器&#xff1f;简单点说就是将字符序列转化为数字序列&#xff0c;对应模型的输入。 通常情况下&#xff0c;Tokenizer有三种粒度&#xff1a;word/char/subword word: 按照词进行分词&#xff0c;如: Today is sunday. 则根据空格或标点进行分割[today, is, sunda…...

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…...

数据库表设计范式

华子目录 MYSQL库表设计&#xff1a;范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09;三范式小结巴斯-科德范式&#xff08;BCNF&#xff09;第四范式&#xff08;4NF&#xff09;第五范式&#xff08;5NF&…...

经济增长初步

1.人均产出 人均产出&#xff0c;通常指的是一个国家、地区或组织在一定时期内&#xff0c;每个劳动人口平均创造的生产总值。它是衡量一个地区或国家经济效率和劳动生产率的重要指标。具体来说&#xff0c;人均产出可以通过以下公式计算&#xff1a; 人均产出总产出/劳动人口…...

【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍

文章目录 前言一、Zachman架构二、ToGAF架构三、FEA架构四、DoDAF 前言 企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;是指企业在信息技术和业务流程方面的整体设计和规划。 最近接触到“企业架构”这个概念&#xff0c;转念一想必定和我们软件架构…...

时间请求参数、响应

&#xff08;7&#xff09;时间请求参数 1.默认格式转换 控制器 RequestMapping("/commonDate") ResponseBody public String commonDate(Date date){System.out.println("默认格式时间参数 date > "date);return "{module : commonDate}"; }…...

PyTorch图像预处理:计算均值和方差以实现标准化

在深度学习中&#xff0c;图像数据的预处理是一个关键步骤&#xff0c;它直接影响模型的训练效果和收敛速度。PyTorch提供的transforms.Normalize()函数允许我们对图像数据进行标准化处理&#xff0c;即减去均值并除以方差。这一步骤对于提高模型性能至关重要。 为什么需要标准…...

slice介绍slice查看器

Android Jetpack架构组件(十)之Slices - 阅读清单 - 腾讯云开发者社区-腾讯云 slice 查看器apk 用adb intall 安装 Releases android/user-interface-samples GitHubMultiple samples showing the best practices in the user interface on Android. - Releases android/u…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...

TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析

1. 基本介绍 TPS3103K33DBVR 是 德州仪器&#xff08;Texas Instruments, TI&#xff09; 推出的一款 低功耗电压监控器&#xff08;Supervisor IC&#xff09;&#xff0c;属于 电源管理芯片&#xff08;PMIC&#xff09; 类别&#xff0c;主要用于 系统复位和电压监测。 2. …...