DeepSort目标跟踪算法

news2024/11/16 0:41:20

DeepSort目标跟踪算法是在Sort算法基础上改进的。
首先介绍一下Sort算法
Sort算法的核心便是卡尔曼滤波与匈牙利匹配算法
卡尔曼滤波是一种通过运动特征来预测目标运动轨迹的算法
在这里插入图片描述
其核心为五个公式,包含两个过程:
请添加图片描述
其分为先验估计(预测
其中Xt-表示预测的位置状态,包含位置速度等信息,F为状态转移矩阵,描述前一帧如何影响该帧,ut-1为控制量,可认为是加速度B为控制矩阵,表示如何控制ut-1作用于当前状态。

P-为当前帧的预测协方差矩阵,是描述变化关系的,要知道,变量之间是有联系而非独立的,比如身高与体重存在关联,其维度取决于X变量有几个,比如在sort算法中,有(x,y,t,h,vx,vy,vr,vh)八个变量,那么其协方差阵即为8*8,该公式也是在变化的,Q代表噪声,其服从正态分布,表示随机进行抑制或增强,但总体全局来看是无影响的。

后验估计即更新(使用观测值来进行修正),我们知道,在目标检测跟踪中,无论是根据数学公式去推导得到的验证框,还是通过YOLO等检测器所得到的检测框(观测值)其都是有误差的,而更新过程便是要融合两个所得结果来确定一个更接近真实值的过程。
在这里插入图片描述
首先要计算Kk,其表示卡尔曼增益,实际上是一种权重,由科学家推导所得,我们也就不要去纠结了,其中R代表检测误差。

接下来便是当前帧的Xt,其表示我们的修正值,也是我们这一帧的一个预测的最终值,该公式表示根据上一帧的运行特征的预测与观测值的一个融合,权重值Kk表示我们应该更相信谁多一点,值得注意的是,当检测误差R=0时,可认为预测值等于观测值。

随后完成Xt的更新后便是更新Pt,这是我们要送入下一帧中使用的协方差阵。

其在Matlab中的实现:可以看到我们直接使用公式即可。
在这里插入图片描述
接下来便是ID匹配,使用的是匈牙利算法,其最早是用于二分图匹配中
二分图:
在这里插入图片描述
匈牙利算法是一个处理指派问题的算法,在这里可认为ID匹配
指派问题:n个人,n个任务,如何才能是任务完成时间最少,代价最小。
在这里插入图片描述
其完成的就是一个指派问题,具体实现过程我们不需要深究,在SK-learn库的linear_assignment_和scipy库的linear_sum_assignment都实现了这一算法,只需要输入cost_matrix即代价矩阵就能得到最优匹配。
Sort算法流程图:
在这里插入图片描述

Sort算法总结

SORT是一个粗略的框架,核心就是两个算法:卡尔曼滤波和匈牙利匹配。

卡尔曼滤波:在图中被分为两个过程:预测和更新。预测过程:当一个小车经过移动后,且其初始定位和移动过程都是高斯分布时,则最终估计位置分布会更分散,即更不准确;更新过程:当一个小车经过传感器(也就是我们的Detections)观测定位,且其初始定位和观测都是高斯分布时,则观测后的位置分布会更集中,即更准确。但是由于我们得到的是一堆Track和一堆Detection,因此只有在用匈牙利算法进行分配后,才能把Track按照对应的Detection结果更新。

匈牙利算法:解决的是一个二分图分配问题(Assignment Problem),即如何分配使成本最小。在上图中是IOU Match那里,即基于IOU距离构造的成本矩阵对Detection和Track作匹配
即每个检测框与预测框的IOU距离最小构成代价矩阵。
SK-learn库的linear_assignment_和scipy库的linear_sum_assignment都实现了这一算法,只需要输入cost_matrix即代价矩阵就能得到最优匹配。不过要注意的是这两个库函数虽然算法一样,但给的输出格式不同。具体算法步骤也很简单,是一个复杂度 的算法。

SORT的问题:ID-switch很高,即同一个人的ID会变化。这主要是由于该算法中的一帧不匹配删除机制及IOU 成本矩阵的问题。

DeepSort算法

Sort算法采用IOU加 权的匈牙利算法进行数据关联,用最小IOU作为代价矩阵。

目前主流的目标跟踪算法都是基于Tracking-by-Detecton策略,即基于目标检测的结果来进行目标跟踪。DeepSORT运用的就是这个策略,DeepSORT对人群进行跟踪的结果即:每个bbox左上角的数字是用来标识某个人的唯一ID号。
从名字中就可以看出,DeepSort算法中应用了深度学习,其在原有sort算法的基础上使用了CNN网络来实现检测框表观特征的提取,通过将提取的表观特征与预测框(跟踪框)的表观特征技术余弦相似度来衡量两者之间的匹配度。

运动特征匹配

在这里插入图片描述

表观特征衡量

马氏距离虽然可以通过检测框和跟踪框的偏差以计算状态估计的不确定性,但仍存 在不足,由于实际跟踪环境复杂,目标运动不受控制,存在因遮挡而丢失目标或身份切 换的问题。因此,DeepSort算法中引入了针对表观特征匹配的余弦距离度量方式。
在这里插入图片描述
将表观特征与运动特征融合构造匈牙利算法的代价矩阵。

在DeepSORT中,匈牙利算法用来将前一帧中的跟踪框tracks与当前帧中的检测框detections进行关联,通过外观信息(appearance information)和马氏距离(Mahalanobis distance),或者IOU来计算代价矩阵。
在这里插入图片描述
将上述的表观匹配与运动特征匹配运用到匈牙利算法,并引入了级联匹配的概念:

级联匹配

目的:长时间遮挡中。卡尔曼滤波的prediction会发散,不确定性增加,而这样不确定性强的track的马氏距离反而更容易竞争到detection匹配。因此,需要按照遮挡时间n从小到大给track分配匹配的优先级。基于匈牙利算法。
输入为:
1、基于第k-1帧由卡尔曼滤波predict到的当前第k帧所有confirmed状态的track;
2、当前第k帧的所有detection
输出为:
1、match上的detection、track;
2、没有match上的track;
3、没有match上的detection。
具体过程:

#input:基于第k-1帧由卡尔曼滤波predict到的当前第k帧所有confirmed状态的track索引T={1,...,N},当前第k帧所有detections D={1,...,M},最大未匹配帧数Amax=30

1.用外观最小余弦距离和马氏距离计算成本矩阵C(实操中lambda=0,只会用到外观最小余弦距离)
2.用外观最小余弦距离和马氏距离计算阈值矩阵B,用来滤掉不可能的匹配
3.用空集初始化match上的集合M
4.用D来初始化unmatch集合U
5. for n 属于 {1,...,Amax} : #n是每个track未匹配帧数
6.    从T中挑出一个子集Tn,即那些未匹配帧数=n的track的索引
7.    用匈牙利算法 对上一步选出的子集Tn和D进行匹配
8.    向M中添加匹配的序列号对(i,j),确保这个匹配满足阈值矩阵B(即bij=1)   
9.    从未匹配索引集合U中删去匹配的序列号对(i,j)的j,确保这个匹配满足阈值矩阵B(即bij=1) 
10. end  
11. return M,U

级联匹配流程图里上半部分就是特征提取和相似度估计,也就是算这个分配问题的代价函数。主要由两部分组成:代表运动模型的马氏距离和代表外观模型的Re-ID特征

级联匹配流程图里下半部分匈牙利算法数据关联作为流程的主体。为什么叫级联匹配,主要是它的匹配过程是一个循环。从missing age=0的轨迹(即每一帧都匹配上,没有丢失过的)到missing age=30的轨迹(即丢失轨迹的最大时间30帧)挨个的和检测结果进行匹配。也就是说,对于没有丢失过的轨迹赋予优先匹配的权利,而丢失的最久的轨迹最后匹配。

IOU匹配

IOU匹配是在级联匹配之后做的东西,从SORT中继承而来,用来解决突然的外观变换导致级联匹配难以match的情况,如部分遮挡等。也是基于匈牙利算法做的。

输入:
1、candidate track,包括:
1.1 级联匹配中剩下的unmatched,n=1的track;
1.2 基于第k-1帧由卡尔曼滤波predict到的当前第k帧所有unconfirmed状态(即tenative)的track;
2、级联匹配中剩下的unmatched detection
输出:
1、match上的detection、track;
2、没有match上的track;
3、没有match上的detection。
然后进行更新处理,包括:

1、卡尔曼滤波 update track在第k帧状态的均值和方差

2、是否有track需要转为confirmed(到本帧match上且已连续命中3帧)

3、是否有要删除的track,即n>Amax

4、对unmatched detections分配新的track ID,为unconfirmed态即tenative态。
三者关系:
在这里插入图片描述

DeepSort改进

特征提取网络OSNet,其为一种新颖的深度CNN,称为全方位网络( Omni-Scale Network,OSNet),用于ReID中的全方位特征学习。这是通过设计由多个卷积特征流组成的残差块来实现的,每个残差块都以一定比例检测特征。 重要的是,引入了一种新颖的统一汇聚门,以动态融合多尺度特征和与输入有关的通道权重。为了有效地学习空间通道相关性并避免过度拟合,构件块同时使用了点向和深度卷积。

OSNet,每个流关注的特征比例由指数决定,指数是一个新的尺寸因数,在整个流中线性增加,以确保在每个块中捕获各种比例。至关重要的是,通过统一汇聚门(AG)生成的通道权重将生成的多尺度特征图动态融合。AG是一个子网,可在所有流之间共享参数,并具有许多有效的模型训练所需属性。使用可训练的AG,生成的通道权重将取决于输入,因此实现了动态标度融合。

OSNet是一个轻量级的网络,它可带来以下好处:
(1)轻量级网络具有更少的模型参数,不容易过拟合
(2)在大型监视应用程序中(例如,使用数千个摄像头的城市范围的监视),ReID的唯一实用方法是在摄像头端执行特征提取。
对于设备上的处理,小型ReID网络显然是首选。

OSBlock (bottleneck)

主要由多个轻量的3x3卷积,和AG组成,AG就是一个通道注意力,然后他们4个分支共享这个注意力网络
bottleneck只用来调整输入输出通道,图像大小没变。
在这里插入图片描述

class OSBlock(nn.Module):
    """Omni-scale feature learning block."""

    def __init__(
            self,
            in_channels,
            out_channels,
            IN=False,
            bottleneck_reduction=4,
            **kwargs
    ):
        super(OSBlock, self).__init__()
        mid_channels = out_channels // bottleneck_reduction
        self.conv1 = Conv1x1(in_channels, mid_channels)
        self.conv2a = LightConv3x3(mid_channels, mid_channels)
        self.conv2b = nn.Sequential(
            LightConv3x3(mid_channels, mid_channels),
            LightConv3x3(mid_channels, mid_channels),
        )
        self.conv2c = nn.Sequential(
            LightConv3x3(mid_channels, mid_channels),
            LightConv3x3(mid_channels, mid_channels),
            LightConv3x3(mid_channels, mid_channels),
        )
        self.conv2d = nn.Sequential(
            LightConv3x3(mid_channels, mid_channels),
            LightConv3x3(mid_channels, mid_channels),
            LightConv3x3(mid_channels, mid_channels),
            LightConv3x3(mid_channels, mid_channels),
        )
        self.gate = ChannelGate(mid_channels)
        self.conv3 = Conv1x1Linear(mid_channels, out_channels)
        self.downsample = None
        if in_channels != out_channels:
            self.downsample = Conv1x1Linear(in_channels, out_channels)
        self.IN = None
        if IN:
            self.IN = nn.InstanceNorm2d(out_channels, affine=True)

    def forward(self, x):#torch.Size([1, 64, 64, 32])
        identity = x
        x1 = self.conv1(x)#torch.Size([1, 64, 64, 32])
        x2a = self.conv2a(x1)#torch.Size([1, 64, 64, 32])
        x2b = self.conv2b(x1)
        x2c = self.conv2c(x1)
        x2d = self.conv2d(x1)#torch.Size([1, 64, 64, 32])
        x2 = self.gate(x2a) + self.gate(x2b) + self.gate(x2c) + self.gate(x2d)
        x3 = self.conv3(x2)#torch.Size([1, 256, 64, 32])
        if self.downsample is not None:
            identity = self.downsample(identity)
        out = x3 + identity
        if self.IN is not None:
            out = self.IN(out)
        return F.relu(out)

OSNet

左图就是bottleneck,注意右图中conv2,3,4,5只负责通道上的变化,transition负责图像大小的变化
OSnet一共有5层[conv1], [conv2,transition], [conv3,transition], conv4, conv5
在这里插入图片描述

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

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

相关文章

[附源码]计算机毕业设计人事管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

UE4中抛体物理模拟UProjectileMovementComponent

UE4中抛体物理模拟UProjectileMovementComponent1.简述2.使用方法3.绘制抛物曲线4.绘制抛物曲线1.简述 背景:实现抛体运动,反弹效果,抛物曲线等功能 通用实现可以使用spline绘制,物体按照下图接口可以根据时间更新位置 USplineC…

CN_MAC介质访问控制子层@CSMA协议

文章目录常用方法静态方法信道划分MAC特点动态方法随机访问MACCSMA协议CSMA/CD多点接入(或多点访问):载波监听Note:🎈碰撞检测碰撞:碰撞冲突过程传播时延对载波侦听的影响🎈争用期发现碰撞的最迟情况电磁波的速率是有限最短帧长🎈小结&#x…

CAD重复圆绘制机械图形

这次CAD必练图形第四个,这个图形主要用到了CAD圆、直线、修剪、旋转等多个命令,看着不简单,等绘制出来后就觉得还是挺简单的。 目标图形 操作步骤 1.使用CAD直线命令绘制一条水平的直线和四条垂直的直线,四条垂直的直线之间的距…

【网络层】DHCP协议(应用层)、ICMP、IPv6详解

注:最后有面试挑战,看看自己掌握了吗 文章目录DHCP------DHCP服务器来动态分配IP--------应用层协议----允许地址重用ICMP字段----差错报文、询问报文差错报文-----终点不可达无法交付--------源点抑制、拥塞丢数据(现在废弃)----…

JAVA小区物业管理系统(源代码+论文)

毕业设计(论文) [摘要] 物业管理系统是紧随当今时代发展的需要,目的在于实现不同的人员对物业系统的不同的需要,有利于社会的稳定和顺利发展。 关键词:小程序Applet;应用程序Application;数据库;数据库实现&#xf…

12.5 - 每日一题 - 408

每日一句:没有醒不来的早晨,弄不懂的题目,熬不过的迷茫,只有你不敢追的梦。 数据结构 1 在最后一趟排序开始之前,所有记录有可能都不在其最终位置上的是______。 A. 直接插入排序B. 冒泡排序C. 堆排序D. 快速排…

底层逻辑-理解Go语言的本质

1.Java VS Go语言 Java,从源代码到编译成可运行的代码 上图已经展示了这个过程:从Java的源代码编译成jar包或war包(字节码),最终运行在JVM中。 我们把Java源代码编译后的jar包或war包看成是工程师生产出来的产品,操作系统是一个平台,JVM就是…

【RCNN系列】RCNN论文总结

目标检测论文总结 【RCNN系列】 RCNN RCNN目标检测论文总结前言一、Pipeline二、模型设计1.warp2.SVM3.阈值设定4.box回归三、思考四、缺点前言 一些经典论文的总结。 一、Pipeline 首先传入Input image,利用Selective Search(比较古老)算法…

【计算机网络】数据链路层:拓展的以太网

在物理层拓展以太网: 使用光纤拓展:主机使用光纤和一对光纤调制解调器连接到集线器。 使用集线器拓展:使用集线器连成更大的以太网 集线器优点: 使原来不同碰撞域的计算机能够跨碰撞域通信,扩大了以太网覆盖的地理范…

GDB使用技巧和相关插件

GDB使用-小技巧 参考:《100个gdb小技巧》 链接中的文档有许多关于GDB的使用小技巧; $info functions - 列出函数的名称 $s/step - 步入,进入带有调试信息的函数 $n/next - 下一个要执行的程序代码 $call/print - 直接调用函数执行 $i/info …

jvm简介

.什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相…

Postman如何做接口测试,那些不得不知道的技巧

目录:导读 前言 Postman如何做接口测试1:如何导入 swagger 接口文档 Postman如何做接口测试2:如何切换测试环境 Postman如何做接口测试3:什么?postman 还可以做压力测试? Postman如何做接口测试4&…

电源控制测试老化系统-国产电源测试仪器-电源模块测试系统NSAT-8000

*测试仪器:可编程直流电源、可编程直流电子负载、数字示波器、功率计 *测试产品:电源模块。纳米软件电源ATE自动测试系统适用于大功率工业电源、AC/DC类DC电源供应器、适配器、充电器、LED电源等开关电源之综合性能测试。 *被测项目:有效值电…

快来组战队,赢iPhone啦!

常见问题 问:我邀请的人再去邀请,也算我的战队队员么?我最多可以有多少个队员? 答:您将和您直接邀请的人组成战队,并担任该战队的队长。如果被您邀请的小伙伴再去邀请其他人,那么您邀请的小伙…

跨域推荐(Cross-Domain Recommendation)的最新综述

论文解读系列第十六篇:IJCAI 2021--跨域推荐(Cross-Domain Recommendation)的最新综述 - 知乎 数据稀疏问题 目录 1.背景介绍 (1)内容层级相关性(content-level relevance) (2)用户层级相关性(user-level relevance) (3)产品层级相关性…

OpenCV从2到3的过渡

与版本2.4相比,OpenCV 3.0引入了许多新算法和功能。有些模块已被重写,有些已经重组。尽管2.4中的大多数算法仍然存在,但接口可能不同。本节描述了一般性的最显着变化,过渡操作的所有细节和示例都在本文档的下一部分中。 1、贡献存…

nginx安装与配置反向代理

Nginx (engine x) 是一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev(伊戈尔赛索耶夫)所开发.话不多说直接上步骤 1.安装nginx,我是在root用户下不需要加sudo yum install nginx 安…

嵌入式分享合集116

一、DC-DC升压电路模块原理 DC-DC 转换器是一种电力电子电路,可有效地将直流电从一个电压转换为另一个电压。 DC-DC 转换器在现代电子产品中扮演着不可或缺的角色。这是因为与线性稳压器相比,它们具有多项优势。尤其是线性稳压器会散发大量热量&#x…

什么是天气预报 API 接口?如何获取天气预报 API?

什么是天气预报API接口? 天气的好坏和人们的生活、工作息息相关,每天的天气如何?总是牵动着人们的心,关注天气就行了人们茶余饭后的话题了。如何获得准确的天气预报?还得从天气预报API接口说起。 天气预报API是提供未…