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

使用VMware克隆功能快速搭建集群

自己搭建的虚拟机,后续不管是学习java还是大数据,都需要集群,java需要分布式的微服务,大数据Hadoop的计算集群,如果从头开始搭建虚拟机会比较费时费力,这里分享一下如何使用克隆功能快速搭建一个集群 先把…...

使用homeassistant 插件将tasmota 接入到米家

我写一个一个 将本地tasmoat的的设备同通过ha集成到小爱同学的功能,利用了巴法接入小爱的功能,将本地mqtt转发给巴法以实现小爱控制的功能,前提条件。1需要tasmota 设备, 2.在本地搭建了mqtt服务可, 3.搭建了ha 4.在h…...

【见合八方平面波导外腔激光器专题系列】用于干涉光纤传感的低噪声平面波导外腔激光器2

----翻译自Mazin Alalus等人的文章 摘要 1550 nm DWDM 平面波导外腔激光器具有低相位/频率噪声、窄线宽和低 RIN 等特点。该腔体包括一个半导体增益芯片和一个带布拉格光栅的平面光波电路波导,采用 14 引脚蝶形封装。这种平面波导外腔激光器设计用于在振动和恶劣的…...

设计模式域——软件设计模式全集

摘要 软件设计模式是软件工程领域中经过验证的、可复用的解决方案,旨在解决常见的软件设计问题。它们是软件开发经验的总结,能够帮助开发人员在设计阶段快速找到合适的解决方案,提高代码的可维护性、可扩展性和可复用性。设计模式主要分为三…...

夏普比率(Sharpe ratio)​

具有投资常识的人都明白,投资光看收益是不够的,还要看承受的风险,也就是收益风险比。 夏普比率描述的正是这个概念,即每承受一单位的总风险,会产生多少超额的报酬。 用数学公式描述就是: 其中&#xff1…...

前端技能包

ES6 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><script>// 变量定义var a1;let b5; // 现在使用let 定义变量// 对象解构let person{&quo…...

JavaWeb:前端工程化-Vue

Vue工程化 介绍 什么是Vue? 小白眼里前端开发 前端工程化 环境准备 D:\Program Files\nodejs Vue项目-快速入门 步骤 D:\front\vue 安装依赖 目录结构 code . vscode打开 启动 VScode侧边栏左下角&#xff0c;没有NPM脚本&#xff0c;如何打开&#xff1f;&…...

在Windows下利用LoongArch-toolchain交叉编译Qt

文章目录 0.交叉编译的必要性1.下载交叉编译工具链1.1.直接在Windows下使用mingw&#xff08;不使用虚拟机&#xff09;编译&#xff08;还没成功&#xff0c;无法编译&#xff09;1.2.在虚拟机中的Ubuntu中进行交叉编译 2.下载qt源码3.编译Qt3.1.创建loongarch64的mkspec3.2.创…...

用 Lazarus IDE 写一个邮件客户端软件,能收发邮件,编写邮件

下面是一个使用Lazarus IDE开发的基本邮件客户端实现方案&#xff0c;包含收发邮件和编写邮件的核心功能。我们将使用Synapse库&#xff08;跨平台的网络通信库&#xff09;来处理邮件协议。 步骤1&#xff1a;安装依赖 安装Synapse库&#xff1a; 下载地址&#xff1a;https:…...

Docker 部署 Python 的 Flask项目

文章目录 一、构建运行 Docker 容器1. 查找合适镜像2.本地docker 拉取镜像3.项目配置1. python项目下生成 requirements.txt 依赖文件2. 生成Dockerfile文件3.忽略不必要文件4. 构建镜像 4. 运行容器5.测试 二、常见问题与解决方案 一、构建运行 Docker 容器 1. 查找合适镜像 …...