DeepSort算法简介

news2024/9/23 13:27:30

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 1
            2. resize to (64, 128) as Market1501 dataset did
            3. concatenate to a numpy array
            3. to torch Tensor
            4. 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_batch

    def __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.coloradmin.cn/o/855084.html

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

相关文章

JMeter有对手了?RunnerGo这些功能真不错!

当谈到对于性能测试的需求时,JMeter和RunnerGo在测试场景设置、执行性能测试、性能测试结果分析等方面都提供了很多功能,但两个工具仍然存在一些区别。以下是详细的比较分析: 层次分明的模块化设计告别文件管理混乱: JMeter的设…

SpringBoot异步框架

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

idea找不到DataBase

一、我想把数据库跟我的idea链接,结果发现找不到。如图。 二、解决方案 找到 file ---setting 找到plugin------找到marketplace 我的已经出现了

贪心-leetcode409最长回文串

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

Java版企业电子招标采购系统源码—企业战略布局下的采购寻源tbms

​ 项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以…

分布式 - 消息队列Kafka:Kafka生产者发送消息的分区策略

文章目录 1. PartitionInfo 分区源码2. Partitioner 分区器接口源码3. 自定义分区策略4. 轮询策略 RoundRobinPartitioner5. 黏性分区策略 UniformStickyPartitioner6. hash分区策略7. 默认分区策略 DefaultPartitioner 分区的作用就是提供负载均衡的能力,或者说对数…

【Shell编程】Linux Shell编程入门:输入输出、变量、条件判断、函数和运算

在Linux操作系统中,Shell编程是一项非常重要的技能。通过Shell编程,我们可以自动化执行各种任务,提高工作效率。无论是系统管理、数据处理还是软件开发,都离不开Shell脚本的应用。本篇博客将带领大家深入了解Shell编程的基础知识&…

木马免杀(篇一)基础知识学习

木马免杀(篇一)基础知识学习 ———— 简单的木马就是一个 exe 文件,比如今年hw流传的一张图:某可疑 exe 文件正在加载。当然木马还可能伪造成各式各样的文件,dll动态链接库文件、lnk快捷方式文件等,也可能…

音视频基础:分辨率、码率、帧率之间关系

基础 人类视觉系统 分辨率 像素: 是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子;可以将像素视为整个图像中不可分割的单位或者是元素;像素…

php通过递归获取分公司的上下级数据

1.表结构 2.php核心代码 /*** param $branches 全部分公司数据* param $parentId 查询的分公司id,传0则全部排序。大于0,则查询该分公司下的下级* param int $level 层级,方便界面特效* param int $level_grade 层级叠加数* return array*/f…

CNN的特性

1、位移不变性 它指的是无论物体在图像中的什么位置,卷积神经网络的识别结果都应该是一样的。 因为CNN就是利用一个kernel在整张图像上不断步进来完成卷积操作的,而且在这个过程中kernel的参数是共享的。换句话说,它其实就是拿了同一张“通…

Docker+rancher部署SkyWalking8.5并应用在springboot服务中

1.Skywalking介绍 Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Jav…

预测成真,国内传来三个消息,中国年轻人变了,创新力产品崛起

中国的年轻人真的变了! 最近,国内传来三个消息,让外媒的预测成真。 第一,奥迪要开始用国产车的平台了。这里需要说明的是新能源汽车,奥迪也曾多次公开表示,承认了当前中国新能源汽车核心技术上的领先。 第…

【计算机网络】概述及数据链路层

每一层只依赖于下一层所提供的服务,使得各层之间相互独立、灵活性好,已于实现和维护,并能促进标准化工作。 应用层:通过应用进程间的交互完成特定的网络应用,HTTP、FTP、DNS,应用层交互的数据单元被称为报…

java编程规范

一、时间格式为什么有大写有小写呢? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");为了区分月份和分钟,用大写M代表月份,小写m代表分钟 而大写的H代表24小时制,小写h代表12小时制 二、下面的程序判断等值的方式&…

【人工智能前沿弄潮】—— SAM自动生成物体mask

SAM自动生成物体mask 由于SAM可以高效处理提示,可以通过在图像上抽样大量的提示来生成整个图像的mask。这种方法被用来生成数据集SA-1B。 类SamAutomaticMaskGenerator实现了这个功能。它通过在图像上的网格中对单点输入提示进行抽样,从每个提示中SAM可…

基于关系有向图的知识推理2022ACM 8.9

基于关系有向图的知识推理 摘要介绍相关工作基于路径的方法基于GNN的方法 关系有向图RED-GCN实验 摘要 知识图推理旨在从已有的知识中推断出新的事实。基于关系路径的方法在文献中显示出较强的可解释性和归纳推理能力。然而,在KG中 捕获复杂拓扑(Capturing complex…

饮用水除硝酸盐、饮用水除砷、饮用水除氟、饮用水除铁锰的技术汇总

我们所说的“自来水”是指从水龙头里放出来的水。但从水龙头里放出来并不等于安全卫生。实际上,原水必须经过各种处理措施之后才能称为安全卫生的饮用水。每一滴水都要经过了混凝、沉淀、过滤、消毒四个步骤的处理,才能去除杂质和细菌,变得安…

Three.js纹理贴图

目录 Three.js入门 Three.js光源 Three.js阴影 Three.js纹理贴图 纹理是一种图像或图像数据,用于为物体的材质提供颜色、纹理、法线、位移等信息,从而实现更加逼真的渲染结果。 纹理可以应用于Three.js中的材质类型,如MeshBasicMaterial…

本质矩阵E、基本矩阵F、单应矩阵H

1. E (归一化坐标对进行计算) t ^ R 为3*3的矩阵, 因为R,t共有6个自由度,又因为单目尺度等价性,所以实际上E矩阵共有5个自由度。因此至少需要5个点对来求解。 2. 基本矩阵F:根据两帧间匹配的像素点对儿计算 3*3且自由度为7的矩阵kF也为基础矩阵&#x…