当前位置: 首页 > 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…...

Android音频采集

在 Android 开发领域&#xff0c;音频采集是一项非常重要且有趣的功能。它为各种应用程序&#xff0c;如语音聊天、音频录制、多媒体内容创作等提供了基础支持。今天我们就来深入探讨一下 Android 音频采集的两大类型&#xff1a;Mic 音频采集和系统音频采集。 1. Mic音频采集…...

通过轻易云平台实现聚水潭数据高效集成到MySQL的技术方案

聚水潭数据集成到MySQL的技术案例分享 在本次技术案例中&#xff0c;我们将详细探讨如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据高效、可靠地集成到MySQL数据库中。具体方案为“聚水谭-店铺查询单-->BI斯莱蒙-店铺表”。这一过程不仅需要处理大量数据的快速写入…...

类和对象( 中 【补充】)

目录 一 . 赋值运算符重载 1.1 运算符重载 1.2 赋值运算符重载 1.3 日期类实现 1.3.1 比较日期的大小 : 1.3.2 日期天数 : 1.3.3 日期 - 天数 : 1.3.4 前置/后置 1.3.5 日期 - 日期 1.3.6 流插入 << 和 流提取 >> 二 . 取地址运算符重载 2.1 const…...

如何使用gpio模拟mdio通信?

一、前言 实际项目开发中&#xff0c;由于设计原因&#xff0c;会将phy的mdio引脚连接到SoC的2个空闲gpio上&#xff0c; 这样就无法通过Gmac自有的架构实现修改phy&#xff0c; 因此只能通过GPIO模拟的方式实现MDIO&#xff0c; 好在Linux支持MDIO via GPIO功能。 该功能…...

C# 中的事件和委托:构建响应式应用程序

C#中的事件和委托。事件和委托是C#中用于实现观察者模式和异步回调的重要机制&#xff0c;它们在构建响应式和交互式应用程序中发挥着重要作用。以下是一篇关于C#中事件和委托的文章。 引言 事件和委托是C#语言中非常重要的特性&#xff0c;它们允许你实现观察者模式和异步回…...

科技赋能健康:多商户Java版商城系统引领亚健康服务数字化变革

在当今社会&#xff0c;随着生活节奏的加快和工作压力的增大&#xff0c;越来越多的人处于亚健康状态。据《The Lancet》期刊2023年的统计数据显示&#xff0c;全球亚健康状态的人群比例已高达82.8%&#xff0c;这一数字背后&#xff0c;隐藏着巨大的健康风险和社会成本。亚健康…...

区块链网络示意图;Aura共识和Grandpa共识(BFT共识)

目录 区块链网络示意图 Aura共识和Grandpa共识(BFT共识) Aura共识 Grandpa共识(BFT共识) Aura与Grandpa的结合 区块链网络示意图 CP Blockchain:这是中央处理区块链(或可能指某种特定的处理单元区块链)的缩写。它可能代表了该区块链网络的主要处理或存储单元。在这…...

Javaweb梳理18——JavaScript

今日目标 掌握 JavaScript 的基础语法掌握 JavaScript 的常用对象&#xff08;Array、String&#xff09;能根据需求灵活运用定时器及通过 js 代码进行页面跳转能通过DOM 对象对标签进行常规操作掌握常用的事件能独立完成表单校验案例 18.1 JavaScript简介 JavaScript 是一门跨…...

面向对象-接口的使用

1. 接口的概述 为什么有接口&#xff1f; 借口是一种规则&#xff0c;对于继承而言&#xff0c;部分子类之间有共同的方法&#xff0c;为了约束方法的使用&#xff0c;使用接口。 接口的应用&#xff1a; 接口不是一类事物&#xff0c;它是对行为的抽象。 2. 接口的定义和使…...

失落的Apache JDBM(Java Database Management)

简介 Apache JDBM&#xff08;Java Database Management&#xff09;是一个轻量级的、基于 Java 的嵌入式数据库管理系统。它主要用于在 Java 应用程序中存储和管理数据。这个项目已经过时了&#xff0c;只是发表一下以示纪念&#xff0c;现在已经大多数被SQLite和Derby代替。…...