SORT与DeepSORT简介

news2024/9/21 3:31:44

一、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),面积 s s s,宽高比 r r r(SORT中认为 r r r是不变的常数,而DeepSORT认为其是一个变量),以及各自的速度变化值组成。

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

2.目标跟踪时,需要track在 t + 1 t+1 t+1时刻的状态(卡尔曼滤波器采用匀速模型和线性观测器模型)
x t + 1 = F x t P t + 1 = F P t F T + Q x_{t+1} = Fx_t \\ P_{t+1} = FP_tF^{T} + Q xt+1=FxtPt+1=FPtFT+Q
其中, F F F表示预测矩阵,在本算法(匀速模型: x t = x t − 1 + △ t x t − 1 ˙ x_t = x_{t-1} + \triangle t\dot{x_{t-1}} xt=xt1+txt1˙)中表示为:
F = [ 1 0 0 d t 0 0 0 0 1 0 0 d t 0 0 0 0 1 0 0 d t 0 0 0 0 1 0 0 d t 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ] 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
P P P是协方差矩阵为经验参数,初始状态为:
P = d i a g ( [ 2 σ p h , 2 σ p h , 1 e − 2 , 2 σ p h , 10 σ v h , 10 σ v h , 1 e − 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 = d i a g ( [ σ p h , σ p h , 1 e − 2 , σ p h , σ v h , σ v h , 1 e − 5 ) 2 Q = 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) H H H:测量矩阵,将track的均值向量 x ′ x' x映射到检测空间
H x ⇒ [ u v s r ] = [ 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 ] [ u v s r u ˙ 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} Hx uvsr = 1000010000100001000000000000 uvsru˙v˙s˙
检测结果 z z z与track的均值误差:
y = z − H x ′ y=z - Hx' y=zHx

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

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

d)计算跟新后的均值向量个协方差矩阵:
x = x ′ + K y P = ( I − K H ) 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次数。

运动特征:

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

外观特征:

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

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

之后,获得检测框 j j j的外观特征 r j r_j rj,求解所有已知gallery中的外观特征与检测框(编号为 j j j)的外观特征的最小余弦距离。
d 2 ( i , j ) = m i n { 1 − r j T r k ( i ) ∣ r k ( i ) ∈ R i } 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的编号。
C i , j = λ d 1 ( i , j ) + ( 1 − λ ) d 2 ( 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)
其中, d 1 d_1 d1为马氏距离, d 2 d_2 d2为余弦距离, λ \lambda λ为权重系数。

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

5、总结:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 3.0 Vue Router导航守卫的使用

目录前言:安装路由快速使用1. 创建路由模块2.规定路由模式3.使用路由规则4.声明路由链接和占位符5.重定向路由6.嵌套路由7.路径参数8. 声明式和编程式导航8.1 导航到不同的位置8.2 替换当前位置8.3 路由历史9.导航守卫9.1 全局前置守卫9.2全局路由守卫的语法参数9.3…

初阶C语言——操作符【详解】

文章目录1.算术操作符2.移位操作符2.1 左移操作符2.2 右移操作符3.位操作符按位与按位或按位异或4.赋值操作符复合赋值符5.单目操作符5.1单目操作符介绍6.关系操作符7.逻辑操作符8.条件操作符9.逗号表达式10.下标引用、函数调用和结构成员11表达式求值11.1 隐式类型转换11.2算术…

关于Java的深拷贝和浅拷贝

文章目录1.拷贝的引入1.1引用拷贝1.2对象拷贝2.深拷贝与浅拷贝2.1浅拷贝2.2深拷贝1.拷贝的引入 1.1引用拷贝 创建一个指向对象的引用变量的拷贝 Teacher teacher new Teacher("Taylor",26); Teacher otherteacher teacher; System.out.println(teacher); System…

vim常用命令

vim常用三种模式 命令模式(Command mode) 插入模式(Insert mode) 末行模式(Last line mode) (一)进入命令模式 vi 或者 vim(二)命令模式 -> 插入模式 &…

服务器部署流程与经验记录

服务器部署流程1.项目部署1.1 重置实例密码1.2 配置安全组规则1.3 远程连接服务器1.4 安装所需软件1.5 安装Tomcat1.6 配置宝塔安全组1.7 导入数据库和项目2. 域名注册3. 网站备案1.项目部署 1.1 重置实例密码 1.2 配置安全组规则 1.3 远程连接服务器 使用VNC远程连接&#…

实用调试技巧——“C”

各位CSDN的uu们你们好呀,今天小雅兰的内容是实用调试技巧,其实小雅兰一开始,也不知道调试到底是什么,一遇到问题,首先就是观察程序,改改这里改改那里,最后导致bug越修越多,或者是问别…

51单片机——定时器中断实验,小白讲解,相互学习

定时器介绍 1,CPU时序的有关知识 震荡周期:为单片机提供定时信号的震荡源的周期(晶振周期或外加震荡周期)。状态周期:2个震荡周期为1个状态周期,用S表示。震荡周期又称S周期或时钟周期。机器周期&#xff…

Java-多线程并发-线程的实现、调度和状态转换

线程的实现 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源( 内存地址、文件I/O等 ),又可以独立调度( 线程是CPU调度的基本单位 )。 Java语言则提供了在不…

300行代码手写spring初体验v1.0版本

70%猜想30%验证 spring:IOC 、DI、AOP、MVC MVC作为入口 web.xml 内部依赖一个DispathcheServlet这样一个接口 先来说一下springMVC的一些基础知识 整体的一个思路: 在web.xml里面进行了一个核心servlet的一个配置 核心就是这个DispatcherServlet …

用列表y表示序列x中每个元素是否被选中 根据列表y返回序列x中被选中的元素 itertools.compress(x,y)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 用列表y表示序列x中每个元素是否被选中 根据列表y返回序列x中被选中的元素 itertools.compress(x,y) [太阳]选择题 以下关于python代码表述错误的一项是? from itertools import compress …

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块(4)

目录 二、竞赛注意事项 (本模块20分) 一、项目和任务描述: 二、服务器环境说明 三、具体任务(每个任务得分以电子答题卡为准) A-1任务一 登录安全加固(Windows) 1.密码策略 a.更改或创建…

未来的城市:智慧城市定义、特征、应用、场景

智慧城市是通过连接一个地区的物理、经济和社会基础设施,以创新、有效和高效的方式应用和实施技术来发展城市的概念,以改善服务并实现更好的生活质量。智慧城市是一个将信息和通信技术融入日常治理的城市区域,旨在实现效率、改善公共服务、增…

Kafka优化篇-压测和性能调优

简介 Kafka的配置详尽、复杂,想要进行全面的性能调优需要掌握大量信息,这里只记录一下我在日常工作使用中走过的坑和经验来对kafka集群进行优化常用的几点。 Kafka性能调优和参数调优 性能调优 JVM的优化 java相关系统自然离不开JVM的优化。首先想到…

消息队列(kafka简单使用)

Dubbo远程调用的性能问题Dubbo调用普遍存在于我们的微服务项目中这些Dubbo调用全部是同步的操作这里的"同步"指:消费者A调用生产者B之后,A的线程会进入阻塞状态,等待生产者B运行结束返回之后,A才能运行之后的代码Dubbo消费者发送调用后进入阻塞状态,这个状态表示该线…

再学C语言39:指针操作(2)

在编写处理int这样的基本类型的函数时,可以向函数传递int数值,也可以传递指向int的指针 通常直接传递int数值,只有需要在函数中修改该值时,才传递指针 对于处理数组的函数,只能传递指针,这样能使程序效率…

如何运行YOLOv6的代码实现目标识别?

YOLOv6是由美团视觉团队开发的1.环境配置我们先把YOLOv6的代码clone下来git clone https://github.com/meituan/YOLOv6.git安装一些必要的包pip install pycocotools2.0作者要求pytorch的版本是1.8.0,我的环境是1.7.0,也是可以正常运行的pip install -r requirement…

C#服务号推送微信公众号模板消息

一、准备工作微信公众平台:https://mp.weixin.qq.com/申请测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?actionshowinfo&tsandbox/index微信推送消息模板不需要发布服务器,也不需要填写授权回调域名,只需要…

【Vagrant】下载安装与基本操作

文章目录概述软件安装安装VirtualBox安装Vagrant配置环境用Vagrant创建一个VMVagrantfile文件配置常用命令概述 Vagrant是一个创建虚拟机的技术,是用来创建和管理虚拟机的工具,本身自己并不能创建管理虚拟机。创建和管理虚拟机必须依赖于其他的虚拟化技…

11 OpenCV图像识别之人脸识别

文章目录1 Eigenfaces1.1 建模流程1.2 示例代码2 Fisherfaces2.1 建模流程2.2 示例代码3 Local Binary Histogram3.1 建模流程3.2 示例代码OpenCV 提供了三种人脸识别方法:Eigenfaces Eigenfaces是一种基于PCA(Principal Component Analysis&#xff0c…

多城市二手车买卖发布管理小程序开发

多城市二手车买卖发布管理小程序开发 功能特性: 为你介绍二手车微信小程序的功能特性。 车辆分类搜索,支持按品牌、售价、年龄、上牌时间、排量等筛选。 车源发布,支持用户一键发布二手车,平台审核上线,发布可编辑、删除等操作。…