deepsort

liuboblog liuboblog     2023-05-01     795

关键词:

目标跟踪任务的难度和复杂度要比分类和目标检测高不少,具有更大的挑战性。

技术图片
目前主流的目标跟踪算法都是基于Tracking-by-Detection(检测加跟踪,使效果更稳定)策略,即基于目标检测的结果来进行目标跟踪。DeepSORT运用的就是这个策略,上面的视频是DeepSORT对人群进行跟踪的结果,每个bbox左上角的数字是用来标识某个人的唯一ID号。

这里就有个问题,视频中不同时刻的同一个人,位置发生了变化,那么是如何关联上的呢?答案就是匈牙利算法和卡尔曼滤波。匈牙利算法可以告诉我们当前帧的某个目标,是否与前一帧的某个目标相同。卡尔曼滤波可以基于目标前一时刻的位置,来预测当前时刻的位置,并且可以比传感器(在目标跟踪中即目标检测器,比如Yolo等)更准确的估计目标的位置。

1、匈牙利算法

首先,先介绍一下什么是分配问题(Assignment Problem):假设有N个人和N个任务,每个任务可以任意分配给不同的人,已知每个人完成每个任务要花费的代价不尽相同,那么如何分配可以使得总的代价最小。
举个例子,假设现在有3个任务,要分别分配给3个人,每个人完成各个任务所需代价矩阵(cost matrix)如下所示(这个代价可以是金钱、时间等等):
技术图片
怎样才能找到一个最优分配,使得完成所有任务花费的代价最小呢?
匈牙利算法(又叫KM算法)就是用来解决分配问题的一种方法,它基于定理:

如果代价矩阵的某一行或某一列同时加上或减去某个数,则这个新的代价矩阵的最优分配仍然是原代价矩阵的最优分配。

算法步骤(假设矩阵为NxN方阵):
(1)对于矩阵的每一行,减去其中最小的元素
(2)对于矩阵的每一列,减去其中最小的元素
(3)用最少的水平线或垂直线覆盖矩阵中所有的(4)如果线的数量等于N,则找到了最优分配,算法结束,否则进入步骤5
(5)找到没有被任何线覆盖的最小元素,每个没被线覆盖的行减去这个元素,每个被线覆盖的列加上这个元素,返回步骤3

继续拿上面的例子做演示:

step1 每一行最小的元素分别为15、20、20,减去得到:
技术图片

step2 每一列最小的元素分别为0、20、5,减去得到:
技术图片

step3 用最少的水平线或垂直线覆盖所有的0,得到:
技术图片
step4 线的数量为2,小于3,进入下一步;
step5 现在没被覆盖的最小元素是5,没被覆盖的行(第一和第二行)减去5,得到:
技术图片

被覆盖的列(第一列)加上5,得到:
技术图片

跳转到step3,用最少的水平线或垂直线覆盖所有的0,得到:
技术图片

step4:线的数量为3,满足条件,算法结束。显然,将任务2分配给第1个人、任务1分配给第2个人、任务3分配给第3个人时,总的代价最小(0+0+0=0):
技术图片

所以原矩阵的最小总代价为(40+20+25=85):
技术图片

在DeepSORT中,匈牙利算法用来将前一帧中的跟踪框tracks与当前帧中的检测框detections进行关联,通过外观信息(appearance information)和马氏距离(Mahalanobis distance),或者IOU来计算代价矩阵。

2、卡尔曼滤波

卡尔曼滤波被广泛应用于无人机、自动驾驶、卫星导航等领域,简单来说,其作用就是基于传感器的测量值来更新预测值,以达到更精确的估计。

假设我们要跟踪小车的位置变化,如下图所示,蓝色的分布是卡尔曼滤波预测值,棕色的分布是传感器的测量值,灰色的分布就是预测值基于测量值更新后的最优估计。
技术图片

在目标跟踪中,需要估计track的以下两个状态:

  • 均值(Mean):表示目标的位置信息,由bbox的中心坐标 (cx, cy),宽高比r,高h,以及各自的速度变化值组成,由8维向量表示为 x = [cx, cy, r, h, vx, vy, vr, vh],各个速度值初始化为0。
  • 协方差(Covariance ):表示目标位置信息的不确定性,由8x8的对角矩阵表示,矩阵中数字越大则表明不确定性越大,可以以任意值初始化。

卡尔曼滤波分为两个阶段:(1) 预测track在下一时刻的位置,(2) 基于detection来更新预测的位置。

预测

基于track在t-1时刻的状态来预测其在t时刻的状态。

技术图片
技术图片

在公式1中,x为track在t-1时刻的均值,F称为状态转移矩阵,该公式预测t时刻的x‘:

技术图片

矩阵F中的dt是当前帧和前一帧之间的差,将等号右边的矩阵乘法展开,可以得到cx‘=cx+dtvx,cy‘=cy+dtvy...,所以这里的卡尔曼滤波是一个匀速模型(Constant Velocity Model)。

在公式2中,P为track在t-1时刻的协方差,Q为系统的噪声矩阵,代表整个系统的可靠程度,一般初始化为很小的值,该公式预测t时刻的P‘。

更新

基于t时刻检测到的detection,校正与其关联的track的状态,得到一个更精确的结果。

技术图片
技术图片
技术图片
技术图片
技术图片

在公式3中,z为detection的均值向量,不包含速度变化值,即z=[cx, cy, r, h],H称为测量矩阵,它将track的均值向量x‘映射到检测空间,该公式计算detection和track的均值误差;
在公式4中,R为检测器的噪声矩阵,它是一个4x4的对角矩阵,对角线上的值分别为中心点两个坐标以及宽高的噪声,以任意值初始化,一般设置宽高的噪声大于中心点的噪声,该公式先将协方差矩阵P‘映射到检测空间,然后再加上噪声矩阵R;
公式5计算卡尔曼增益K,卡尔曼增益用于估计误差的重要程度;
公式6和公式7得到更新后的均值向量x和协方差矩阵P。

3、DeepSort工作流程

DeepSORT对每一帧的处理流程如下:
检测器得到bbox → 生成detections → 卡尔曼滤波预测→ 使用匈牙利算法将预测后的tracks和当前帧中的detecions进行匹配(级联匹配和IOU匹配) → 卡尔曼滤波更新

Frame 0:检测器检测到了3个detections,当前没有任何tracks,将这3个detections初始化为tracks
Frame 1:检测器又检测到了3个detections,对于Frame 0中的tracks,先进行预测得到新的tracks,然后使用匈牙利算法将新的tracks与detections进行匹配,得到(track, detection)匹配对,最后用每对中的detection更新对应的track

检测
检测器检测
生成detections
使用卡尔曼滤波预测前一帧中的tracks在当前帧的状态
卡尔曼滤波预测阶段
使用卡尔曼滤波预测前一帧中的tracks在当前帧的状态
匹配
首先对基于外观信息的马氏距离计算tracks和detections的代价矩阵,然后相继进行级联匹配和IOU匹配,最后得到当前帧的所有匹配对、未匹配的tracks以及未匹配的detections
卡尔曼滤波更新阶段
对于每个匹配成功的track,用其对应的detection进行更新,并处理未匹配tracks和detections

多目标跟踪算法|deepsort(代码片段)

前言本文分享多目标跟踪算法的经典算法DeepSort,它是一个两阶段的算法,达到实时跟踪效果,曾被应用于工业开发。DeepSort是基于Sort目标跟踪进行的改进,它引入深度学习模型,在实时目标跟踪过程中,... 查看详情

多目标跟踪c++实现支持deepsort和bytetrack(代码片段)

多目标跟踪C++实现支持deepsort和bytetrackflyfish文章目录多目标跟踪C++实现支持deepsort和bytetrack前言deepsortv1.21使用方法deepsortv1.1版本更新说明依赖的库文件下载使用方法1onnxruntime2模型配置3主函数扩展方式前言代码采用C&#... 查看详情

用c++部署yolov5+deepsort+tensorrt实现目标跟踪(代码片段)

...掘金创作之路。​一、参考资料Jetson系列——基于yolov5和deepsort的多目标头部识别,跟踪,使用tensorrt和c++加速二、相关介绍2.1重要说明==该项目能部署在Jetson系列的产品,也能部署在X86服务器中。==2.2项目结构.├──assets│└─... 查看详情

视频实时行为检测——基于yolov5+deepsort+slowfast算法(代码片段)

...、核心功能设计二、核心实现步骤1.yolov5实现目标检测2.deepsort实现目标跟踪3.slowfast动作识别三、核心代码解析1.参数2.主函数3.将结果保存成视频总结前言前段时间打算做一个目标行为检测的项目,翻阅了大量资料,也借... 查看详情

视频实时行为检测——基于yolov5+deepsort+slowfast算法(代码片段)

...、核心功能设计二、核心实现步骤1.yolov5实现目标检测2.deepsort实现目标跟踪3.slowfast动作识别三、核心代码解析1.参数2.主函数3.将结果保存成视频总结前言前段时间打算做一个目标行为检测的项目,翻阅了大量资料,也借... 查看详情

深度学习和目标检测系列教程21-300:deepsorts测试小车经过的时间和速度(代码片段)

@Author:RunsendeepDeepSortDeepSort是一种用于跟踪目标的模型,为每个目标分配ID,为每一个不同的类别分配label。在DeepSort中,过程如下。使用YOLO计算边界框(检测)使用Sort(卡尔曼滤波器)和ReID... 查看详情

目标跟踪实战deepsort+yolov5(上)

文章目录前言算法简介sort算法deepsort项目结构前言今天的主要目的还是快速上手目标跟踪,先前的话我是简单说了一下卡尔曼滤波,然后由于博客的问题,没有说完。本来是想做一个系列的,但是很难整理,... 查看详情

yoloyolov5+deepsort实现mot评估(开源数据集+自定义数据集)(代码片段)

引言YOLOv5+DeepSort实现目标跟踪,并利用MOTChallengeEvalKit实现多目标跟踪结果的评估。YOLOv5+DeepSort实现目标跟踪可以参考笔者的【YOLOv5】yolov5目标识别+DeepSort目标追踪实现步骤1安装MATLAB安装MATLABMATLAB是一款商业数学软... 查看详情

ubuntu部署deepsort目标跟踪算法,无人车/无人机应用(代码片段)

🍉1、算法简介DeepSort是对SimpleOnlineandRealtimeTracking(Sort)的扩展,它通过预先训练的深度关联度量来整合外观信息。使用视觉外观空间中的最近邻查询来建立测量到跟踪的关联,能够通过更长时间的遮挡来跟... 查看详情

deepsort会生成结果的txt文件吗

参考技术Adeepsort会生成结果的txt文件。拓展资料:这不是yolo3的问题了,这要看你常规代码能力够不够。而且你说的yolo3是代码是很泛泛的东西,因为yolo3已经有好多版本了。你要去找模型的输出结果。一般模型都有训练和预测两... 查看详情

跟踪算法-deepsort详细简介(代码片段)

目录跟踪的基本思想跟踪框与检测框卡尔曼滤波算法---预测匈牙利算法----匹配对于目标跟踪,前提是能够对单张图片中的车辆进行检测,从而知道图片中车辆的位置,根据连续的图像中目标位置的轨迹预测,从而... 查看详情

deepsort

...更稳定)策略,即基于目标检测的结果来进行目标跟踪。DeepSORT运用的就是这个策略,上面的视频是DeepSORT对人群进行跟踪的结果,每个bbox左上角的数字是用来标识某个人的唯一ID号。这里就有个问题,视频中不同时刻的同一个人... 查看详情

深度学习和目标检测系列教程21-300:deepsorts测试小车经过的时间和速度(代码片段)

@Author:RunsendeepDeepSortDeepSort是一种用于跟踪目标的模型,为每个目标分配ID,为每一个不同的类别分配label。在DeepSort中,过程如下。使用YOLO计算边界框(检测)使用Sort(卡尔曼滤波器)和ReID... 查看详情

用yolov5+deepsort,打造实时多目标跟踪模型

作者:神经三羊来源:HyperAI超神经内容概要目标跟踪作为一个非常有前景的研究方向,常常因为场景复杂导致目标跟丢的情况发生。本文按照跟踪目标数量的差异,分别介绍了单目标跟踪及多目标跟踪。关键词&#x... 查看详情

deepsort+yolo实现行人检测和轨迹追踪(代码片段)

作者|李秋键出品|AI科技大本营(ID:rgznai100)引言行人检测是近年来计算机视觉领域的研究热点,同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的行人,在许多领域中都有广泛的应用。交通安全方面,... 查看详情

简单易上手yolov5-deepsort(windows)(代码片段)

YOLOV5模型训练以及deepsort目标追踪的简单上手操作,并总结了常见问题目录文章目录一、YOLOV5模型训练1.下载源码文件2.环境设置3.准备工作4.开始运行 二、YOLOV5-deepsort的目标识别 1.修改配置 三、常见问题与解决 四、如何... 查看详情

深入浅出——零基础一文读懂deepsort(原理篇)(代码片段)

Intro本文是笔者对DeepSORT算法学习的阶段性总结,基于笔者接触到的所有开源学习资料,辅以个人理解进行重新编排而成,力求清晰,使非专业的读者也能迅速对该算法原理有较为透彻的理解,便于后续代码学... 查看详情

技术分享吊舱目标追踪---deepsort原理讲解

参考技术A二、sort流程Deepsort的前身是sort算法,sort算法的核心是卡尔曼滤波算法和匈牙利算法。卡尔曼滤波算法作用:该算法的主要作用就是当前的一系列运动变量去预测下一时刻的运动变量,但是第一次的检测结果用来初始化... 查看详情