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

SORT与DeepSORT简介

一、MOT( mutil-object tracking)步骤

在《DEEP LEARNING IN VIDEO MUTIL-OBJECT TEACKING: A SURVEY》这篇基于深度学习多目标跟踪综述中,描绘了MOT问题的四个主要步骤
1.跟定视频原始帧
2.使用目标检测器如Faster-rcnn, YOLO, SSD等进行检测,获取目标检测框。
3.将所有目标框中对应的目标抠出来,进行特征提取(表观特征或者运动特征)
4.进行相似度计算,计算前后两帧目标之间的匹配程度(前后属于同一个目标的之间距离比较小,不同目标的距离比较大)
5.数据关联,为每一个对象分配目标ID
总结起来,MOT算法主要为四个步骤:1.检测;2.特征提取,运动预测;3.相似度计算;4.数据关联。

二、SORT:Simple Online and Realtime Tracking

1、算法流程:

算法的核心是卡尔曼滤波和匈牙利算法,这两个算法比较偏数学,所以需要学习这两个算法的数学知识,比较有难度。

卡尔曼滤波的基本知识建议看这篇博客:https://blog.csdn.net/u010720661/article/details/63253509,本文不再对其进行数学证明。

匈牙利算法基本知识:https://blog.csdn.net/NIeson2012/article/details/94472313?ops_request_misc,本文不再对其算法细节进行讨论。

如图:
请添加图片描述

2、卡尔曼滤波:

基于传感器(在目标跟踪中即目标检测器)的测量值与跟踪器(卡尔曼滤波)的预测值,实现更精确的跟踪目标估计。

卡尔曼滤波的假设变量都是随机的,并且都服从高斯分布(正态分布),每一个变量都有一个均值μ\muμ,表示随机分布的中心(最可能的状态),以及方差σ2\sigma^2σ2,表示不确定性。

1.目标跟踪中,需要track以下两个状态:

均值μ\muμ:表示目标的位置信息,其由8维向量表示x=[u,v,s,r,u˙,v˙,s˙]x=[u, v, s, r, \dot{u}, \dot{v}, \dot{s}]x=[u,v,s,r,u˙,v˙,s˙],分别为:bbox的中心坐标(u,v)(u, v)(u,v),面积sss,宽高比rrr(SORT中认为rrr是不变的常数,而DeepSORT认为其是一个变量),以及各自的速度变化值组成。

协方差PPP:表示目标位置信息的不确定信息,由8×8的对角矩阵PPP表示。

2.目标跟踪时,需要track在t+1t+1t+1时刻的状态(卡尔曼滤波器采用匀速模型和线性观测器模型)
xt+1=FxtPt+1=FPtFT+Qx_{t+1} = Fx_t \\ P_{t+1} = FP_tF^{T} + Q xt+1=FxtPt+1=FPtFT+Q
其中,FFF表示预测矩阵,在本算法(匀速模型:xt=xt−1+△txt−1˙x_t = x_{t-1} + \triangle t\dot{x_{t-1}}xt=xt1+txt1˙)中表示为:
F=[100dt0000100dt0000100dt0000100dt000010000000100000001]F=\begin{bmatrix} 1 & 0 & 0 & dt & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & dt & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & dt & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & dt \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ \end{bmatrix} F=100000001000000010000dt0010000dt0010000dt0010000dt001
PPP是协方差矩阵为经验参数,初始状态为:
P=diag([2σph,2σph,1e−2,2σph,10σvh,10σvh,1e−5)P=diag([2\sigma_ph, 2\sigma_ph, 1e-2, 2\sigma_p h, 10 \sigma_vh, 10 \sigma_v h, 1e-5) P=diag([2σph,2σph,1e2,2σph,10σvh,10σvh,1e5)
Q是系统噪声,初始状态为:
Q=diag([σph,σph,1e−2,σph,σvh,σvh,1e−5)2Q = diag([\sigma_ph, \sigma_ph, 1e-2, \sigma_ph, \sigma_vh, \sigma_vh,1e-5)^2 Q=diag([σph,σph,1e2,σph,σvh,σvh,1e5)2

3.基于预测结果进行匹配并更新卡尔曼滤波器:

首先利用匈牙利算法关联卡尔曼滤波器的预测阶段(第2步)的估计结果和实际观测结果:若1.匹配成功则更新卡尔曼滤波器;2.匹配失败的跟踪轨迹视为丢失;3.匹配失败的观测量记为新增轨迹。

若匹配成功,则track根据匹配结果进行更新

a)HHH:测量矩阵,将track的均值向量x′x'x映射到检测空间
Hx⇒[uvsr]=[1000000010000000100000001000][uvsru˙v˙s˙]Hx \Rightarrow \begin{bmatrix}u\\ v\\s\\r \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} u\\v\\s\\r\\\dot{u}\\\dot{v}\\\dot{s}\\ \end{bmatrix} Hxuvsr=1000010000100001000000000000uvsru˙v˙s˙
检测结果zzz与track的均值误差:
y=z−Hx′y=z - Hx' y=zHx

b)将协方差矩阵Pt+1P_{t+1}Pt+1映射到检测空间,加上噪声矩阵RRR
S=HP′HT+RS=HP'H^{T} + R S=HPHT+R
其中,检测器噪声矩阵:R=diag([σph,σph.1e−1,σph]T)2R=diag([\sigma_ph, \sigma_ph. 1e-1, \sigma_ph]^T)^2R=diag([σph,σph.1e1,σph]T)2

c)计算卡尔曼增益KKK(关于KKK的定义请查看推荐博文):
K=P′HTS−1K = P'H^TS^{-1} K=PHTS1

d)计算跟新后的均值向量个协方差矩阵:
x=x′+KyP=(I−KH)P′x = x' + Ky \\ P = (I - KH)P' x=x+KyP=(IKH)P

e)进行下一轮的跟踪,直至当前轨迹跟踪结束。

3、匈牙利算法:

匈牙利算法在多目标跟踪中解决数据关联(检测框和预测框与实际框的匹配)的问题。

当前帧目标检测的框上一帧通过卡尔曼滤波预测的框一一进行IOU匹配,再通过IOU匹配的结果计算其代价矩阵(cost matrix)。而代价矩阵作为匈牙利算法的输入,得到线性的匹配结果。

缺点:造成了Sort算法无法解决行人重叠的问题。所以其IDSW(ID switch)这个指标很差。(IDSW(ID switch),对于同一个目标,由于跟踪算法误判,导致其ID发生切换的次数称为IDSW。跟踪算法中理想的ID switch应该为0。)且其直接丢弃掉IOU小于阈值的作法也导致了无法解决遮挡的问题。

4、总结:

1.SORT算法原文使用匀速直线运动模型,故在一些应用场景下可能不适用。
2.关联匹配中没有使用特征,造成物体间在重合度比较高的情况下会发生ID-Switch。
3.速度非常快而且计算量小。

二、DeepSORT

1、算法流程:

卡尔曼滤波+匈牙利算法+级联匹配+状态估计

其中,卡尔曼滤波和匈牙利算法在SORT中已经介绍,在此不在赘述

算法流程如图:
请添加图片描述
DeepSORT算法在SORT算法的基础上增加了级联匹配(matching cascade)和状态估计(confirmed)。因此,本文只介绍级联匹配和状态估计。

DeepSORT相对SORT的主要改进为:

考虑两个目标遮挡的情况。匹配的目标的Track无法匹配Detection,目标暂时从图像中消失。之后被遮挡的目标再次出现的时候,应该让被遮挡的目标分配的ID不再变化,减少ID-Switch的次数。

2、Deep由来:

为了减少ID-Switch的次数,在跟踪框跟丢且max age仍没达到最大阈值时,track应保存该跟踪框的外观特征,以便其再出现时仍能对其跟踪。DeepSORT通过一个小型的CNN网络来提取跟踪目标的外观特征,在每次(每帧)检测+追踪后,进行一次物体外观特征的提取并保存。后面每执行一步,都要执行一次当前帧被检测物体外观特征之前存储的外观特征相似度计算,这个相似度将作为一个重要的判别依据(不是唯一的,因为作者说是将运动特征外观特征结合作为判别依据,这个运动特征就是SORT中卡尔曼滤波做的事)。
请添加图片描述
如图,CNN网络最终输出为128维的特征向量。注意:DeepSORT的原文数据集是行人检测,在其他应用场景时可以修改网络输入框的大小。

3、状态估计

请添加图片描述

对于一个轨迹,都计算当前帧距上次匹配成功帧的差值,该变量在卡尔曼滤波器predict的时候递增,在轨迹和detection关联的时候重置为0。

超过max age的轨迹被认为离开图片区域,从轨迹集合中删除,设置为删除状态。代码中max age默认值为70,是级联匹配中的循环次数。

如果detection没有和现有track匹配上的,那么将对这个detection进行初始化,转变为新的Track。新的Track初始化的时候的状态是未确定态,只有满足连续三帧都成功匹配,才能将未确定态转化为确定态。如果处于未确定态的Track没有在n_init帧中匹配上detection,将变为删除态,从轨迹集合中删除。

4、级联匹配

请添加图片描述
如图:

1.上半部分计算相似度矩阵的方法使用了外观模型(ReID)和运动模型(马氏距离)来计算相似度,得到代价矩阵;另一个则是门控矩阵,用于限制代价矩阵中过大的值。
2.下半部分是级联匹配的数据关联步骤,匹配过程是一个循环(max_age个迭代,默认为70),从missing age=0到missage age=70的轨迹和Detection进行匹配,没有丢失过的轨迹优先被匹配,丢失较为较为久远的靠后匹配。通过这部分处理,可以重新将遮挡目标找回,降低被遮挡然后再出现目标发生的ID Switch次数。

运动特征:

使用马氏距离,衡量预测到的卡尔曼滤波状态和新获得的检测框之间的距离。
d1(i,j)=(dj−yj)TSi−1(dj−yi)d_1(i, j)=(d_j-y_j)^TS_i^{-1}(d_j-y_i) d1(i,j)=(djyj)TSi1(djyi)
其中:(yi,Si)(y_i,S_i)(yi,Si)表示第iii个跟踪分布(卡尔曼滤波分布)在测量空间的投影,yiy_iyi为均值,SiS_iSi为协方差。马氏距离通过测量卡尔曼滤波器的追踪位置均值(mean track location)之间的标准差与检测框来计算状态估计间的不确定性,即 di(i,j)d_i(i, j)di(i,j)为第i个追踪分布和第j个检测框之间的马氏距离(不确定度)。对马氏距离设定一定的阈值,可以排除那些没有关联的目标,原文以倒卡方分布计算出来的95%置信区间作为阈值。

外观特征:

外观特征使用CNN残差网络提取,返回128维的特征向量。对于每个检测框(编号为j)内物体djd_jdj ,其128维度的向量设为 rjr_jrj ,该向量的模长为1,即 ∣∣rj∣∣=1||r_j||=1∣∣rj∣∣=1

接着作者对每个目标k创建了一个gallery,该gallery用来存储目标在每一帧中的外观特征(128维向量),论文中用RkR_kRk表示。注意,这里的k的含义是追踪的目标k,也就是object-in-track的序号,不是物体的ID号。Rk={rk(i)}k=1(Lk)R_k = \{r^{(i)}_{k}\}^{(L_k)}_{k=1}Rk={rk(i)}k=1(Lk)就是gallery。作者限定了LkL_kLk的大小最大为100,即最多只能存储目标kkk时刻前100帧的目标外观特征。iii为跟踪的编号。

之后,获得检测框jjj的外观特征rjr_jrj,求解所有已知gallery中的外观特征与检测框(编号为jjj)的外观特征的最小余弦距离。
d2(i,j)=min{1−rjTrk(i)∣rk(i)∈Ri}d_2(i, j)=min\{ 1-r_j^Tr_k^{(i)} | r_k^{(i)} \in R_i \} d2(i,j)=min{1rjTrk(i)rk(i)Ri}
运动(motion)特征和外观(appearance)特征的融合:

motion提供了物体定位的可能信息,这在短期预测中非常有效;

appearance(余弦距离计算)可在目标被长期遮挡后恢复ID的编号。
Ci,j=λd1(i,j)+(1−λ)d2(i,j)C_{i, j}= \lambda d_1(i, j) + (1 - \lambda)d_2(i, j) Ci,j=λd1(i,j)+(1λ)d2(i,j)
其中,d1d_1d1为马氏距离,d2d_2d2为余弦距离,λ\lambdaλ为权重系数。

对刚初始化的目标等无法确认(匹配)的追踪,因为没有之前的运动信息和外观信息,采用IOU匹配关联进行追踪。

5、总结:

1.目标检测的效果对结果影响非常非常大,并且Recall和Precision都应该很高才可以满足要求。
2.表观特征:也就是ReID模型,原论文中用的是CNN残差神经网络,含有的参数量比较大,可以考虑用新的、性能更好、参数量更低的ReID模型来完成这部分工作。

相关文章:

SORT与DeepSORT简介

一、MOT( mutil-object tracking)步骤 在《DEEP LEARNING IN VIDEO MUTIL-OBJECT TEACKING: A SURVEY》这篇基于深度学习多目标跟踪综述中,描绘了MOT问题的四个主要步骤 1.跟定视频原始帧 2.使用目标检测器如Faster-rcnn, YOLO, SSD等进行检测,获取目标…...

TCP/IP网络编程——多播与广播

完整版文章请参考: TCP/IP网络编程完整版文章 文章目录第 14 章 多播与广播14.1 多播14.1.1 多播的数据传输方式以及流量方面的优点14.1.2 路由(Routing)和 TTL(Time to Live,生存时间),以及加入组的办法14…...

K8S DNS解析过程和延迟问题

一、Linux DNS查询解析原理(对于调用glibc库函数gethostbyname的程序)我们在浏览器访问www.baidu.com这个域名,dns怎么查询到这台主机呢?  1、在浏览器中输入www.baidu.com域名,操作系统会先查找本地DNS解析器缓存&a…...

【JavaScript】js实现深拷贝的方法

前言 在js中我们想要实现深拷贝,首先要了解深浅拷贝的区别。 浅拷贝:只是拷贝数据的内存地址,而不是在内存中重新创建一个一模一样的对象(数组) 深拷贝:在内存中开辟一个新的存储空间,完完全全…...

RK3288 GPIO记录

1、引脚对应的GPIO 编号第一种 使用/sys/kernel/debug/gpio查询所有gpio引脚的基数第二种 cat /sys/class/gpio/gpiochip248/label对应的label就是GPIO引脚,例如下图GPIO8对应的基数就是2482、计算编号编号 基数 PIN脚如GPIO8的基数是248, GPIO8_A6的编…...

MongoDB介绍及使用教程

文章目录一、MongoDB介绍1. 什么是MongoDB2. 为什么要用MongoDB3. MongoDB的应用场景4. MongoDB基本概念二、MongoDB使用教程1.下载安装(Windows)2.MongoDB Conpass简单使用(选学)3.使用navicat连接MongoDB4.JAVA项目中使用MongoD…...

51单片机开发环境搭建 - VS Code 从编写到烧录

我安装并测试成功的环境: 操作系统:Windows 10 (22H2)单片机:STC89C52RCPython version: 3.7.6 在这之前,给51单片机写程序是用 Keil 5(编写编译)、STC-ISP(烧录),由于…...

python datetime、字符串和时间戳之间的相互转换12小时制和24小时制时间相互转化

文章目录1.字符串转datetime格式2.datetime转字符串3.时间戳转datetime格式4.datetime格式转时间戳5.应用:将12小时制的字符串转换为时间戳1.字符串转datetime格式 把字符串转换为datetime的格式 项目字符串的样子‘%m/%d/%Y %H:%M:%S’2/3/2023 15:30:20‘%m-%d-…...

百度百科词条怎么做?百度百科词条创建攻略分享

只要是想要将自己宣传出去的企业或是个人,都建议创建属于自己的百度百科词条,因为百度百科词条流量大、权重高、排名靠前,创建百度百科词条可以提高企业或是个人的知名度和口碑。 百度百科词条怎么做?每天都有用户在百度上搜索这…...

基于Hive的河北新冠确诊人数分析系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...

k8s二进制部署

目录 一、环境准备 常见的k8s部署方式 关闭防火墙 关闭selinux 关闭swap 根据规划设置主机名 在master添加hosts 将桥接的IPv4流量传递到iptables的链 时间同步 二、部署etcd集群 1、master节点部署 #查看证书的信息 上传etcd-cert.sh 和etcd.sh 到/opt/k8s/ 目录…...

Windows出现0xc00d36e5错误怎么办?

当我们使用Windows Media Player来播放视频文件时,可能会出现无法播放,并显示0xc00d36e5错误代码。该错误可能是因为Windows Media Player不支持视频格式、注册表项损坏、系统配置问题、第三方应用程序冲突等。下面将开始介绍0xc00d36e5错误的解决方法&a…...

Idea搭建Spring5.3.x源码阅读环境

1. 概述 Spring是一个轻量级Java开源框架,在Java项目开发过程中已经离不开Spring全家桶了,包括Spring、SpringBoot、SpringCloud等,学习好Spring基础源码也有助于更好在项目中使用Spring相关组件,在学习源码前需要搭建好源码学习…...

2.20jdbc

一.数据库编程的必备条件编程语言:java c c Python数据库 Oracle,MySQL,SQL Server数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包:MySQL提供了Java的驱动包mysqlconnector-java,需要就Java操作MySQL需要该驱动包二.Java的数据库编程JDBC,即…...

【代码随想录训练营】【Day19休息】【Day20】第六章|二叉树|654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树

最大二叉树 题目详细:LeetCode.654 这道题在题目几乎就说明了解题的思路了: 创建一个根节点,其值为 nums 中的最大值;递归地在最大值左边的子数组上构建左子树;递归地在最大值右边的子数组上构建右子树;…...

华为云计算之容灾技术

容灾是物理上的容错技术,不是逻辑上的容错同步远程复制:主备距离≤200km,只有在主备设备上都写成功,才会告诉主机写成功,不会丢失数据异步远程复制:主备距离>200km,只要主设备上写成…...

React系列之Redux

1 Redux概述 Redux 是 JavaScript 状态容器,提供可预测化的状态管理。Redux中文文档 Redux 和react没有必然关系,redux可以应用于各种框架,包括jquery,甚至js都可以使用redux,只不过redux和react更加搭配。redux也推…...

最简单得方法解决TCP分包粘包问题

如何用最简单的方法解决TCP传输中的分包粘包问题? 首先需要说明一点,分包粘包等等一系列的问题并不是协议本身存在的问题,而是程序员在写代码的时候,没有搞清楚数据的边界导致的。 看个简单的例子,TCP客户端不断的向服…...

免费使用通配符域名证书

文章目录前言一、手动安装acme.sh操作1、安装acme.sh2、使用dns api自动续签二、宝塔自动操作【推荐】总结前言 之前个人站点一般都是使用阿里云免费单域名证书,虽然好用但是只有一年有效,到期只能手动重新申请,并且每次弄个子域名出来就要重…...

0基础成功转行Python自动化测试工程师,年薪30W+,经验总结都在这(建议收藏)

两年前的决定我觉得还是非常正确的,就是自学了python,然后学习了自动化测试、性能测试、框架、持续集成,同时也把前面的软件测试基础知识全部补全了。目前的收入还比较满意,月入2W(仅代表个人收入),13薪&am…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...