Deepsort从入门到精通

news2024/9/9 0:28:01

1 ,sort和Deepsort算法

在目标检测领域,sort(Simple Online and Realtime Tracking)算法和 DeepSORT(Deep Learning for Multi-Object Tracking)算法是两种常用的目标追踪算法,它们通常与目标检测器结合使用,用于在视频中跟踪和识别目标。

  1. SORT算法: SORT 算法是一种简单高效的多目标跟踪算法,其主要思想是通过关联检测框和已知轨迹来进行目标追踪。SORT 算法首先利用目标检测器检测出目标,并根据检测框的位置、大小等信息建立轨迹和检测框之间的关联。接着,利用匈牙利算法对每帧的检测结果进行关联,然后根据关联结果更新轨迹信息。SORT 算法简单易懂,并且能够实现实时目标跟踪,但在处理遮挡、长时间不可见等复杂场景时表现可能较差。

  2. DeepSORT算法: DeepSORT 算法是在 SORT 算法基础上加入深度学习模型进行目标特征提取和关联的改进版本。DeepSORT 使用卷积神经网络(CNN)从目标检测框中提取特征,然后利用这些特征信息进行目标的关联和轨迹更新。相较于 SORT,DeepSORT 在处理外观变化大、遮挡严重等复杂场景下具有更好的性能。

SORT 算法是一种简单而高效的多目标跟踪算法,适用于一般的目标跟踪任务

 DeepSORT 算法则通过引入深度学习模型,能够更好地处理复杂场景下的目标追踪问题,提高了目标识别和跟踪的准确性和鲁棒性

2,Deep sort算法的基本思想

如下图所示,设T1和T2是视频中连续的两帧图像, 如要在T2帧中跟踪T1中的红色框中的车辆,首先,在T2中进行车辆检测,检测到了三辆车,如黄色框所示;然后需要解决的问题是,要在T1中红色框和T2中黄色框之间建立关联,根据关联关系,确定T2中检测到的车哪辆是T1中的跟踪结果,并用该检测结果作为更新跟踪目标,进行后续T3时刻的跟踪。

在这类检测方法中,将视频理解成连续的图片,我们会发现,在视频中,车辆的位置是在连续变化的,如下图,如果我们持续将图中左侧汽车的检测框画出来,会发现红色框中的车辆一直在变化位置。

假设上图中的某一帧,因为光线影响或者图片质量为题造成红色小车在第315帧无法检测到,那么这一帧将会缺失检测框信息,但是会在320帧的时候重新被检测出来。

2.1,跟踪框与检测框

跟踪框:其实就相当与警察抓犯人,警察是跟踪框,犯人是检测框,警察去预测判断犯人的位置,从而去实现跟踪。

基本跟踪过程如下:

我们可以每帧知道检测框的位置

跟踪框会通过检测框当前帧的位置和运动状态,预测下一帧这辆车的位置

如果检测框与预测的跟踪框位置不同,要修正跟踪框的位置从而更好的对后面的跟踪框进行预测

然而我们要在这里理解的目标跟踪,并不完全等同于警匪片里的跟踪逃犯的概念,区别是:我们的警察追上了逃犯,他的任务就已经完成了;而跟踪框要尽量保证跟检测框位置的重合,从而更好的进行下一帧位置的预测。

检测框可以理解为是一个静态的概念,它主要针对单张图片找出明确车辆在其中的位置;跟踪框是一个动态的概念,关注的是连续视频流中图片之间汽车位置的关联
 

2.2 ,卡尔曼滤波算法—预测

卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。

首先我们给出卡尔曼滤波解决问题的场景和目标:卡尔曼滤波可以应用于有多个不同的观测数据,每个数据有一定的可靠程度时,我们希望能够得出尽量贴近真实情况的数据。卡尔曼滤波的一个典型实例是从一组有限的,包含噪声的,对物体位置的观察序列(可能有偏差)预测出物体的位置的坐标及速度。

以车辆举例,我们的车辆前方有一个障碍物,为了使距离测定更准确,我们有一个距离传感器获得车辆到前方障碍物的距离。

1) 在T1时刻,距离传感器告诉我们车辆距离前面障碍物的距离是10m。同时我们可以知道车辆速度是4m/s。为了简化问题,我们假设这两个数值是绝对准确的。

2) 在T2时刻(T1之后1秒),距离传稿器告诉我们当前距离障碍物的距离是7m。同时,在T2时刻,如果考虑到T1时刻我们的速度是4m/s,经过1s后我们应该从距离障碍物10m变成6m(10-4)。

于是,我们在T2时刻得到了两个数据:距离传感器告诉我们的结果7m,和我们通过计算的结果6m。

理想状况下,这个问题并不复杂:我们直接用距离传感器的数值不是就最准确了吗?但是现实是,距离传感器随着距离远近的不同,它的精确度是可能发生变化的;如果只是相信速度传感器,我们在1秒内的速度又不是绝对一致的。所以单独采用两者的任何一个都不够准确。因此如果我们希望T2时刻的结果更准确,我们最好将距离传感器的数值跟速度计算的数值做一下加权平均(予以不同的权重以算均值)。

例如,我们认为距离传感器的数值更加准确一些,认为它在T2时刻的准确度应该是90%,速度估算的值不够准确,因此给予80%的可信度。那么最终估计的距离结果就是:


这就是卡尔曼算法的主要思路:它将两个都不是那么可靠的方式做了融合,从而可以有效抵抗噪点等外部影响,得到相对准确的预测值。以T1时刻的最优的估计X_T1 为准,预测T2时刻的状态变量X_T2. 同时又对该状态进行观测得到观测变量Z_T2 ,再在预测和观测之间进行分析,或者说是以观测量对预测量进行修正,从而得到T2时刻的最优状态估计。

卡尔曼滤波算法目前已经应用于NASA(美国航空航天局)的阿波罗计划等计划中,用于进行飞行器的轨道预测等作用。它还有更多更广泛的使用场景。也许你会在你未来的某些应用场景中想到它并进行应用

简单来说,卡尔曼滤波算法就是根据你检测框的位置去预测目标在下一帧的位置,他是线性的
 

2.3 匈牙利算法----匹配

通过不断寻找增广路径的办法,寻找最大匹配数量。这就是匈牙利算法的主要思路

其实跟贪心算法差不多
我们有三样在售的食品,分别是面包、三明治、方便面。现在同时来了三个不同的客人A、B、C。其中A喜欢面包和三明治,B只喜欢面包,C只喜欢三明治:

对于车辆跟踪来说,就是将检测框跟踪框(卡尔曼滤波预测出来的跟踪框)他们匹配起来,找到最优(最佳)的匹配,从而实现跟踪

3,工作流程

 那么如何对多目标进行跟踪呢?

常见的跟踪策略就是track+detection

为什么选择与detection进行结合呢?

这是因为目标检测算法大多是基于多目标的

为什么不可以直接用detection进行多目标跟踪呢?

这是因为检测算法有时会出现漏检的情况. 在跟踪算法中一旦跟踪丢了目标就很难再继续跟踪下去了。 如果遇到漏检的情况,将失去身份ID。所以仅仅使用detection进行跟踪结果也并不理想。

检测算法主要关注在当前帧中准确地标识和定位目标,通常是静态图像或者视频的第一帧。

跟踪算法则会考虑上下文信息,通过对前一帧或多帧的目标位置和状态进行分析,以实现对目标的持续跟踪。

跟踪算法中,利用了时间序列数据的连续性,以便更好地理解目标在不同帧之间的运动和变化。这种联系上下文信息的能力使得跟踪算法能够应对目标遮挡、姿态变化、光照变化等情况,从而实现对目标的鲁棒跟踪。

也就是说检测算法是针对当前帧的,而跟踪算法会联系上下两帧

3.1 重识别(ReID)问题

对于跟踪,算法并不知道自己跟踪的目标内容是什么,它只负责跟踪,具体是什么并不需要知道,那么就会出现重识别ReID)的问题

紫色框表示上一帧的目标track,黑框表示当前帧检测到的四个目标,上一帧的目标(紫)跟检测出来的四个目标(黑)中哪一个是同一个目标呢?

这也是多目标跟踪要做的数据关联:上一时刻的目标,和当前时刻的目标,怎么匹配关联起来。实现策略有很多,思路就是训练一个网络使它最小化类内误差,最大化类间误差
 

3.2 身份变换IDswitch)问题

白色框表示track,蓝色框表示detection;
    图1中有四个ID:37,41,45,38。随着目标移动,ID41把ID38挡住(图4),detection检测不到ID38,而ID37如果刚好走到ID38原来的位置附近(从图片可以看出来,37走向和38走向是相对的,38被从右侧走到了左侧途中经过了遮挡,37从左侧走到了右侧可能也发生了遮挡),检测器可能会把37识别成38,把后继帧出现的38识别成37,从而导致身份变换。也就是说如何在目标交叉的过程中保证身份不会发生变化呢?
 

3.3 由上述两个问题引出我们的Deepsort算法

在DeepSORT提出之前是SORT算法(SORT论文链接),但是它对身份变换的问题,仅仅采取框和框之间距离的匹配方式,没有考虑框内的内容,所以容易发生身份变换,不过这个问题已经在2017年的论文中进行了解决,即DeepSORT。


 首先来看一下DeepSORT的核心流程

预测(track)——>观测(detection+数据关联)——>更新

 预测:预测下一帧的目标的bbox,即后文中的tracks
    观测:对当前帧进行目标检测,仅仅检测出目标并不能与上一帧的目标对应起来,所以还要进行数据关联
    更新:预测Bbox和检测Bbox都会有误差,所以进行更新,更新后的跟踪结果通常比单纯预测或者单纯检测的误差小很多。

 如图所示:
    在T1时刻track预测到一个行人的轨迹(图1紫框)后;
    T2时刻detection对图中物体进行检测,检测出了四个目标(图2黑框),通过数据关联,将代表ID1的物体跟踪的BBOX(图2紫框,其实就对应图1track的紫框)与对应的检测BBOX(图2黑框)关联;
    同样还是T2时刻,确定关联关系后,更新track预测的结果,用物体检测的Bbox来代表T2时刻物体追踪的Bbox。(这里不太清楚是detection直接代替track的Bbox,还是融合了track与detection的结果)
 

3.4 DeepSORT流程

下面来看一下Deep SORT的大体流程:

 下面来逐步看一下DeepSORT到底是如何工作的吧。
    1.首先是核心流程:绿框部分。

   1)从预测(Tracks)开始,由于每一时刻的track Bbox组在一起就相当于构成一组轨迹,所以写的是复数tracks,并且后文都会称跟踪的Bbox为轨迹;
    2)经过kalman滤波预测后,会对当前帧预测一个轨迹Bbox,先不看unconfirmed,假如预测出的是confirmed(对于confirmed和unconfirmed,是用来区别跟踪的目标是不是一个东西,比如一个杂七杂八的背景那就是unconfirmed,真真切切的人或者车就是confirmed);
    3)对当前帧进行detection,然后将detection Bboxs结果和预测的confirmed track Bbox进行数据关联(matched tracks);
    4)匹配完成后,更新跟踪的bbox(卡尔曼滤波预测的Bbox)。这里要注意,更新和匹配不是在时刻上顺延的(不是T2时刻匹配,T3时刻更新的关系),而是在下一帧时刻需要完成的两项流程(T2时刻匹配,继续在T2时刻更新)。

    5)更新后,对当前帧预测,下一帧观测,并更新;再预测,下一帧观测,更新…………

    上面只讨论了跟踪目标是真实存在的物体且匹配成功的情况下的流程,显然匹配过程中不可能所有都实现一对一的匹配,肯定有的track是匹配不上detection的,也有detection匹配不到track的,那么如何处理呢?

    2.匹配失败的第一种情况,那就是对于匹配不上的tracks和detection再次进行匹配,会出现两种情况,一个是匹配成功了,一个是依然还有部分匹配不到,先来看再次匹配能匹配成功的情况,流程如下:

 依然从预测的tracks开始,经过卡尔曼滤波预测,与detection匹配
    1)发现此时的tracks匹配失败,为什么会有tracks匹配失败的情况呢?
    检测可能发生了漏检,某时刻,预测的轨迹tracks还在,但是检测器没有检测到与之对应的目标。
    2)为什么会有detection匹配失败的情况呢?
    可能某一时刻有一个物体是新进入的镜头(比如,之前一直只有三个物体,某时刻突然镜头中出现了第四个新物体),就会发生detection匹配不到tracks的情况,因为这个物体是新来的,在这之前并没有它的轨迹用于预测;还有一种情况就是物体长时间被遮挡,导致检测到的物体没有可以与之匹配的轨迹。
    针对上述匹配失败问题,处理方法就是对匹配失败的tracks和匹配失败的detection进行IOU匹配。如果能匹配成功,则再进行更新,然后继续进行预测–观测–更新的追踪流程。
    3.再次匹配也匹配不成功的怎么办呢?如下图:

   对于再次匹配依然失败的detections,前面讨论过detections匹配失败的原因可能是新出现的目标在之前没有它的轨迹tracks,或者长时遮挡的也没有轨迹tracks,所以对其建立一个new tracks,前面也提到,tracks都会设置confirmed/unconfirmed,对于新建立的tracks,尚未确定是否就是真切存在的,万一是检测错的杂七杂八呢,所以将其设置为unconfirmed,并对其进行三次考察,如果是实际目标修改为confirmed,再进行 预测-观测-更新
 

 对于再次匹配依然失败的tracks,前面讨论过可能是检测器漏检了目标,此时看其是否是confirmed,如果是unconfirmed,将其删除;反之,为其设置寿命,在寿命时间之内都没发生变化(>max_age)则将其delete,认为其已移出镜头;如果寿命之内(<max_age),同样对其进行三次考察,是否是跟踪的杂七杂八,再进行 预测-观测-更新

参考文献:


1,DeepSORT(工作流程):https://blog.csdn.net/weixin_41761357/article/details/107360483

2,跟踪算法-Deep sort简介_deepsort_醉公子~的博客-CSDN博客

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

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

相关文章

京东数据分析:2023年Q3户外鞋服市场分析报告(冲锋衣行业销售数据分析)

从露营、骑行、徒步、桨板、垂钓、飞盘、滑雪到如今的city walk&#xff0c;近两年户外运动已经成为了年轻人新的生活方式。户外运动的爆发也刺激了人们对于鞋服在穿搭、场景化、专业性功能等方向的需求&#xff0c;户外鞋服市场迎来增长。 而全国性的降温则带给目前的户外鞋服…

嵌入式养成计划-52----ARM--开发板介绍--相关硬件基础内容介绍--GPIO讲解

一百三十一、开发板介绍 131.1 核心板介绍 131.2 拓展板 一百三十二、相关硬件基础内容介绍 132.1 PCB PCB&#xff08; Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷线路板&#xff0c; 是重要的电子部件&#xff0c;是电子元器…

WPS的JS宏基础(一)

基础知识 1、简单的第一个宏 //注意function只能全部用小写 function demo(){alert("你好!") }2、录制宏生成工资条 function 使用录制宏自动生成代码以JS宏为例()//使用相对引用 {Selection.Copy(undefined);ActiveCell.Offset(5, 0).Range("A1:M4").I…

【C++】new和delete深度解析

文章目录 一、new/delete是什么&#xff1f;1.new2.delete 二、new/delete怎么用&#xff1f;1.new2.delete3.new[]4.[]delete 三、new/delete为什么&#xff1f;1.为什么有operator new/operator delete?2.为什么要匹配使用new和delete? new/delete测试环境&#xff1a;visu…

使用Pytorch的一些小细节(一)

文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码&#xff0c;所以对于python语言中的常见数据结构的用法也不是很熟悉&#xff0c;对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的&#xff0c;属性都是自己定义&a…

vue3使用element plus时遇到的问题

1.el-form中input无法输入 问题描述&#xff1a;在el-form中的el-input中输入数字或字母时出现卡顿&#xff0c;输入不进去的现象 问题原因&#xff1a;el-form的ref和model的名称写成了一样的单词 问题解决&#xff1a;两个不能一样 2.input去除边框 问题描述&#xff1a;…

【python海洋专题三十九】海洋指数画法--折线图样式三--不同颜色的线条

【python海洋专题三十九】海洋指数画法–折线图样式三–不同颜色的线条 数据:AMO_index 图像展示: 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画…

文心一言 VS 讯飞星火 VS chatgpt (132)-- 算法导论11.2 4题

四、用go语言&#xff0c;说明在散列表内部&#xff0c;如何通过将所有未占用的槽位链接成一个自由链表&#xff0c;来分配和释放元素所占的存储空间。假定一个槽位可以存储一个标志、一个元素加上一个或两个指针。所有的字典和自由链表操作均应具有 O(1)的期望运行时间。该自由…

单元测试工具-Junit

文章目录 一. 认识Junit二. Junit中常用的注解1. Test2. Disabled3. BeforeAll & AfterAll4. BeforeEach & AfterEach 三. ParameterizedTest参数化1. 单参数2. 多参数2.1. CSV 获取参数2.2. 方法获取参数 四. Order控制测试用例的执行顺序五. 断言六. 测试套件1. 通过…

node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)

前言 提示&#xff1a;使用mongoose 的前提是你安装了node和 MongoDB。 mongoose 官网文档&#xff1a;http://mongoosejs.net/docs/index.html 文章目录 前言一、安装二、基本使用1. 打开bin目录的mongod.exe文件2. 基本使用的代码&#xff08;连接mongodb 服务&#xff09;3.…

【C++优先队列使用】问题总结

说明&#xff1a; 文章内容为关于priority_queue的使用总结&#xff0c;在C中要包含头文件<queue>文章内容为个人的学习整理&#xff0c;如有错误&#xff0c;欢迎指正。 文章目录 1. 优先队列默认是大根堆2. 关于优先队列和sort的比较逻辑2.1 sort的比较逻辑2.2 优先队…

【学术综述】-如何写出一篇好综述-写好综述要注意的问题

文章目录 1.前置1.1 SSD 的结构1.2 FTL的架构和作用 2 动机-why&#xff1f;3 做了什么【做了哪些方面的survey】&#xff1f;4 背景知识【上下文】5 研究的问题6 每个问题对应的解决方案 从昨天晚上【2023.11.09 22:00】到今天22:29的&#xff0c;花了一天的时间在读这篇surve…

gcc [linux]

目录 背景知识 gcc如何完成 格式 预处理&#xff08;进行宏替换&#xff09; 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可执行码&#xff09; 连接&#xff08;生成可执行文件或库文件&#xff09; 函数库 静态库 静态链接优势 动态库 动态链…

Ubuntu配置Yolov8环境并训练自己的数据集

文章目录 一、环境配置与功能测试1.1 安装1.2 目标检测1.3 实例分割1.4 分类1.5 姿态检测 二、训练数据标注三、数据集训练方法3.1 命令训练3.2 代码训练 前言&#xff1a;需要先安装CUDA和Anaconda&#xff0c;它们的安装参考我这篇文章&#xff1a;Ubuntu配置深度学习环境&am…

局域网下搭建SVN服务器

文章目录 1. 下载SVN服务器(VisualSVN Server)2. 安装SVN服务器(VisualSVN Server)3. 下载并安装TortoiseSVN4. 搭建SVN服务器 1. 下载SVN服务器(VisualSVN Server) 下载地址 2. 安装SVN服务器(VisualSVN Server) 默认安装即可 Location&#xff1a;VisualSVN Server的安装…

SpringBoot前后端分离整合cas(客户端)

SpringBoot前后端分离整合cas&#xff08;客户端&#xff09; cas认证详细流程&#xff1a; 前后端分离&#xff1a;项目前端使用nginx启动&#xff0c;后端是springBoot服务&#xff1b; nginx可以统一管理Cookie&#xff0c;避免出现跨域问题。 添加依赖 <dependency&g…

探索未来,开启无限可能:打造智慧应用,亚马逊云科技大语言模型助您一臂之力

文章目录 什么是大模型&#xff1f;大模型训练方法亚马逊云科技推出生成式AI新工具 —— aws toolkit使用教程 总结 什么是大模型&#xff1f; 近期&#xff0c;生成式大模型是人工智能领域的研究热点。这些生成式大模型&#xff0c;诸如文心一言、文心一格、ChatGPT、Stable …

strcat()用法

描述 头文件&#xff1a;<string.h>char *strcat&#xff08;char *dest&#xff0c; const char *src&#xff09;功能&#xff1a;将src字符串加到dest上&#xff0c;并返回指向dest字符串的指针。 举例 #include<stdio.h> #include<string.h> int mai…

使用非递归的方式实现归并排序

使用非递归的方式实现归并排序 话不多说&#xff0c;直接上代码&#xff1a; public class MergySort {public static void main(String[] args) {int[] nums {38, 27, 43, 3, 9, 82, 10};int[] sortedArray MergySort.mergySort(nums);// 输出排序后的数组for (int num : …

神仙打架!腾讯云阿里云谁更棋高一着?

现在&#xff0c;腾讯云和阿里云都在打价格战&#xff0c;推出了一系列的优惠政策。其中&#xff0c;腾讯云服务器只需要88元&#xff0c;而阿里云服务器也只需要99元。这么便宜的价格&#xff0c;是不是让你心动不已呢&#xff1f; 腾讯云的88元服务器&#xff1a;https://te…