DeepSort算法简介

SORT算法

SORT(Simple Online and Realtime Tracking)算法是一种目标追踪算法,其简单有效,基于IOU来匹配,并且融入了卡尔曼滤波和匈牙利算法来降低ID Switch(可以说,追踪算法的目标只有两个:1.提高速度 2.降低ID Switch)

Intersection over Union(IoU)分数是对象类别分割问题的标准性能度量在这里插入图片描述

SORT算法的组成主要包括三大部分:目标检测,卡尔曼滤波,匈牙利算法。

目标检测

SORT的作者使用了 Faster RCNN(还是Fast来着,忘了),来完成目标检测,目标检测的这一部分是可以替换的,可以理解为目标检测网络可以替换为其他的任何模型,如YOLO,Transformer系列。

卡尔曼滤波

下图展示了三个正态分布
在这里插入图片描述

图中我们能非常清晰的看到,我们有预测和测量两个方法得到的状态,而上图的高斯分布,我们可以视为使用这两种方法时判定物体出现在某一区域的概率。

预测修正,也就是我们图中的黄线,通俗来讲就是代表了预测和测量的高斯分布的交集的高斯分布。

这样子做的意义在于:我们对于连续帧中运动较快的物体出现区域,能够有较为准确的预测。

预测时我们对当前帧检测框需要7个数据:检测框中心的横坐标,检测框中心的纵坐标,检测框的面积,长宽比,横坐标速度,纵坐标速度,面积速度。

匈牙利算法

在ICPC经历里,图论的二分图问题会用到匈牙利算法。

这里的匈牙利算法解决的是一个匹配问题。

我们在卡尔曼滤波中得到了基于上一帧物体数据的预测框,然后用预测框和当前帧的检测框做IOU匹配(对轨迹的均值进行处理,得到轨迹目标的框坐标,计算轨迹框和检测目标框的坐标的IOU值,1减去其值,得到损失,进行配对),通过IOU计算结果来得到代价矩阵(1-IoU)计算相似度,显然如果计算结果认为不像似ID就会switch。


DeepSORT算法

无论是什么场景的跟踪,重叠问题是无法避免的,而SORT却忽略的这个问题,常常造成IDSW值过大。

DeepSORT算法是基于SORT算法做出的改进,其引入了ReID可以利用学习外观特征来进一步降低ID Switch(实际使用时,在镜头不稳定的情况下SORT和DeepSORT的差别最为明显)。

DeepSort算法则在Sort算法的基础上添加了鉴别网络,并在流程上增加了级联匹配和轨迹预测两个步骤,其流程如图所示。
在这里插入图片描述

将Detection和Track进行匹配,所以出现几种情况:
1.Detection和Track匹配,也就是Matched Tracks。普通连续跟踪的目标都属于这种情况,前后两帧都有目标,能够匹配上。
2. Detection没有找到匹配的Track,也就是Unmatched Detections。图像中突然出现新的目标的时候,Detection无法在之前的Track找到匹配的目标。
3.Track没有找到匹配的Detection,也就是Unmatched Tracks。连续追踪的目标超出图像区域,Track无法与当前任意一个Detection匹配。

遮挡情况,也属于第三种情况,我们希望遮挡的目标再出现后ID尽可能不变,这时需要用到阈值和级联匹配


级联匹配

确定态的跟踪框集合我们记为T,当前目标检测出来的结果集合我们记为D

通俗描述

通俗来讲,级联分为三步

第一步:检测和预测两个结果对应的图像,放入ReID中,通过外观特征信息计算余弦距离

第二步:根据马氏距离去除不匹配项(不是删掉)

第三步:根据预测框的更新状态。

建议去下面这个文章看具体的通俗理解。

多目标跟踪(二)DeepSort——级联匹配Matching Cascade


原理

马氏距离

DeepSort将采用8维变量x来描述某时刻目标的外观信息和位置信息,如式所示。

在这里插入图片描述
式中(在这里插入图片描述)代表小麦的中心坐标,在这里插入图片描述代表检测框的长宽比,代表检测框的高,而则代表了相应的速度信息。

对于运动信息,采用马氏距离来描述卡尔曼滤波预测的结果和检测结果的关联度,具体如式在这里插入图片描述

式中,dj 为第j个检测框,Yi代表第i个检测框的状态向量,Si代表i条运动路径间的标准差矩阵。然后用对目标进行筛选要用到马氏距离,当某次关联时马氏距离小于阙值t(1) 则表明运动状态匹配成功,否则代表运动状态匹配失败,其函数表达如式

在这里插入图片描述

式中t(1) 代表相关阙值=1,在这里插入图片描述代表阙值指示器.


余弦距离

当相机剧烈运动时马氏距离不能很好的对关联程度进行度量,此时会出现ID跳变导致错误计数。为了避免这类问题,将采用外观特征信息作为关联信息。对每一个检测目标dj求得一个128维的特征向量rj,并且规定限制条件‖rj‖=1为限制条件,同时对每一个小麦构建一个能预测其100帧后路径的特征向量,然后通过式(1)计算出检测的特征描述与追踪的特征描述之间的最小余弦距离,下一步将余弦距离与训练得到的相关阈值t(2)比较如式(2),如果小于阈值则代表关联成功。
公式1公式1
在这里插入图片描述公式2

式中d(i,j)代表最小余弦距离,rj代表检测框的特征向量,rk代表之后100帧里成功关联的特征向量,Ri代表目标外观特征集合,b(i,j)为外观指示器阙值。

上述最小余弦距离可以使得丢失目标重新出现后恢复其ID值

ReID特征提取网络

上面光说了,用REID,那么ReID是具体怎么搞得呢,ReID模块,用于提取表观特征,原论文中是生成了128维的embedding。

ReID在DeepSORT原文中是适用于人的,具体使用时可以替换其他泛化性更好的网络去预训练特征提取网络。

class Extractor(object):def __init__(self, model_name, model_path, use_cuda=True):self.net = build_model(name=model_name,num_classes=96)self.device = "cuda" if torch.cuda.is_available() and use_cuda else "cpu"state_dict = torch.load(model_path)['net_dict']self.net.load_state_dict(state_dict)print("Loading weights from {}... Done!".format(model_path))self.net.to(self.device)self.size = (128,128)self.norm = transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.3568, 0.3141, 0.2781],[0.1752, 0.1857, 0.1879])])def _preprocess(self, im_crops):"""TODO:1. to float with scale from 0 to 12. resize to (64, 128) as Market1501 dataset did3. concatenate to a numpy array3. to torch Tensor4. normalize"""def _resize(im, size):return cv2.resize(im.astype(np.float32) / 255., size)im_batch = torch.cat([self.norm(_resize(im, self.size)).unsqueeze(0) for im in im_crops],dim=0).float()return im_batchdef __call__(self, im_crops):im_batch = self._preprocess(im_crops)with torch.no_grad():im_batch = im_batch.to(self.device)features = self.net(im_batch)return features.cpu().numpy()

下图是整个DeepSort算法的类图,来自Deep SORT多目标跟踪算法代码解析
在这里插入图片描述

本文主要参考了三篇论文

自己的一篇SCI

Deep SORT多目标跟踪算法代码解析 建议去这里看代码具体怎么用

多目标跟踪(二)DeepSort——级联匹配Matching Cascade这里看DeepSORT的级联匹配的通俗步骤。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发的学习与未来展望:借助STM32 HAL库开创创新之路

引言: 嵌入式开发作为计算机科学领域的重要分支,为我们的日常生活和产业发展提供了无限的可能。STMicroelectronics的STM32系列芯片以其出色的性能和广泛的应用领域而备受关注。而STM32 HAL库作为嵌入式开发的高级库,为学习者提供了更高效、更…

在 Ubuntu 上安装 Docker 桌面

Ubuntu 22.04 (LTS) 安装 Docker 桌面 要成功安装 Docker Desktop,您必须: 满足系统要求拥有 64 位版本的 Ubuntu Jammy Jellyfish 22.04 (LTS) 或 Ubuntu Impish Indri 21.10。对于非 Gnome 桌面环境,必须安装 gnome-terminal:…

ApplicationContext在Spring Boot中是如何创建的?

一、ApplicationContext在Spring Boot中是如何创建的? 1. SpringApplication ApplicationContextFactory有三个实现类,分别是AnnotationConfigReactiveWebServerApplicationContext.Factory、AnnotationConfigServletWebServerApplicationContext.Facto…

keil显示中文代码正常,但是编译中文乱码的问题

Configuration---Editor---Encoding,ANSI或是UTF8,总之这2个,是A就改为U,是U就改为A。 MDK5中文编译乱码,不是显示乱码哦。

计蒜客T1115——字符串判等

水题不解释,考研复习压力偶尔写一道换换心情还不错~ 这里有一个比较有趣的知识点,对于同时输入多个字符串时还要允许空格的输入,那么普通的cin函数就不能满足要求了,这里采用getline函数解决,如下: string …

贪心-leetcode409最长回文串

贪心-leetcode409最长回文串 思考: 总的思路:从数字中选择个数是偶数的去union,最后如果有过奇数则多union一个作为中心;从数组中select然后feasible是如果该数字为偶数则union到两边,如果为奇数则按照偶数处理再给中…

LoRaWAN网关与网络服务器(NS)的通信LNS协议介绍

将 LoRaWAN网关连接到 LoRaWAN 网络服务器 (LNS) 是一个两步过程,该过程使用 WebSocket 作为传输协议来交换包含 JSON 编码对象的文本记录。 首先,网关向LNS查询LNS实际连接端点的URI。其次,它与该端点建立数据连接以接收设置信息。从那时起,LoRa 上行链路和下行链路帧通过…

fastadmin、vue、react图标库适用于多种框架

在二开fastadmin中,在写vue以及react时,侧边导航栏以及按钮中常常需要很多图标,那么这些图标应该去哪里得到呢,在这里给大家一个链接,这里有丰富的图标库,可以找到自己想要的进行使用。 点击下方链接&…

Redis过期键删除策略

如果一个键过期了,那么它什么时候会被删除呢? 这个问题有三种可能的答案,它们分别代表了三种不同的删除策略: 1.定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时…

NSS [UUCTF 2022 新生赛]ez_upload

NSS [UUCTF 2022 新生赛]ez_upload 考点:Apache解析漏洞 开题就是标准的上传框 起手式就是传入一个php文件,非常正常的有过滤。 .txt、.user.ini、.txxx都被过滤了,应该是白名单或者黑名单加MIME过滤,只允许.jpg、.png。 猜测二…

SpringBoot异步框架

参考:解剖SpringBoot异步线程池框架_哔哩哔哩_bilibili 1、 为什么要用异步框架,它解决什么问题? 在SpringBoot的日常开发中,一般都是同步调用的。但经常有特殊业务需要做异步来处理,例如:注册新用户&…

循环结构进阶

二重循环 import java.util.Scanner;public class Demo01 {public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 二重循环 外循环班级 内循环学生for (int i1; i<3; i) { // 外循环班级System.out.println("请输入第" i "…