【深度学习|目标跟踪】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维的向量,…...

快速图像识别:落叶植物叶片分类
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>——“按钮”头文件; ② #include <QLabel>——“标签”头文件; ③ #include <QFont>——“字体”头文件; ④#include <QDebug>——输出相关信息; 2. 常用函数/类的基…...

ElasticSearch学习篇17_《检索技术核心20讲》最邻近检索-局部敏感哈希、乘积量化PQ思路
目录 场景在搜索引擎和推荐引擎中,对相似文章去重是一个非常重要的环节,另外是拍照识花、摇一摇搜歌等场景都可以使用它快速检索。 基于敏感性哈希的检索更擅长处理字面上的相似而不是语义上的相似。 向量空间模型ANN检索加速思路 局部敏感哈希编码 随…...
在 Sublime Text 中直接预览 Markdown 文件
在 Sublime Text 中直接预览 Markdown 文件需要借助插件实现。以下是详细步骤: 1. 安装 Markdown Preview 插件 按下快捷键 CtrlShiftP (或 macOS 上的 CmdShiftP),打开命令面板。输入 Install Package 并选择 Package Control: Install Package。等待包…...

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

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

数据库表设计范式
华子目录 MYSQL库表设计:范式第一范式(1NF)第二范式(2NF)第三范式(3NF)三范式小结巴斯-科德范式(BCNF)第四范式(4NF)第五范式(5NF&…...
经济增长初步
1.人均产出 人均产出,通常指的是一个国家、地区或组织在一定时期内,每个劳动人口平均创造的生产总值。它是衡量一个地区或国家经济效率和劳动生产率的重要指标。具体来说,人均产出可以通过以下公式计算: 人均产出总产出/劳动人口…...

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

时间请求参数、响应
(7)时间请求参数 1.默认格式转换 控制器 RequestMapping("/commonDate") ResponseBody public String commonDate(Date date){System.out.println("默认格式时间参数 date > "date);return "{module : commonDate}"; }…...
PyTorch图像预处理:计算均值和方差以实现标准化
在深度学习中,图像数据的预处理是一个关键步骤,它直接影响模型的训练效果和收敛速度。PyTorch提供的transforms.Normalize()函数允许我们对图像数据进行标准化处理,即减去均值并除以方差。这一步骤对于提高模型性能至关重要。 为什么需要标准…...

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…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...

leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...