【pytorch】使用deepsort算法进行目标跟踪,原理+pytorch实现

目录

  • deepsort流程
    • 一、匈牙利算法
    • 二、卡尔曼滤波
      • 车速预测例子
      • 动态模型的概念
      • 卡尔曼滤波在deepsort中的动态模型
    • 三、预测值及测量值的含义
  • deepsort在pytorch中的运行

deepsort流程

DeepSORT是一种常用的目标跟踪算法,它结合了深度学习和传统的目标跟踪方法。DeepSORT的核心思想是将深度学习的目标检测结果与传统的目标跟踪器相结合,实现在连续帧之间对目标的跟踪。
DeepSORT主要包括两个部分:目标检测和目标跟踪。对于目标检测,DeepSORT使用现有的目标检测算法,例如YOLO、Faster R-CNN等,来检测出图像中的目标。对于目标跟踪,DeepSORT使用卡尔曼滤波器来预测目标的位置,同时通过匈牙利算法来匹配跟踪目标和检测目标。
具体来说,DeepSORT的目标跟踪过程如下:

对于输入的当前帧,使用目标检测算法检测出所有的目标。

对于之前的每个跟踪目标,使用卡尔曼滤波器预测它在当前帧中的位置。

使用匈牙利算法将检测到的目标与之前的跟踪目标进行匹配,以便为每个跟踪目标分配检测目标。

对于未被分配的检测目标,将其视为新的跟踪目标,并使用卡尔曼滤波器进行位置预测。

对于长时间未被检测到的跟踪目标,将其删除。

重复上述步骤,以进行下一帧的目标跟踪。
总的来说,DeepSORT通过结合目标检测和目标跟踪,能够更加准确地跟踪目标,具有较高的实时性和鲁棒性。

一、匈牙利算法

在DeepSORT中,匈牙利算法用来将前一帧中的跟踪框tracks与当前帧中的检测框detections进行关联,通过外观信息(appearance information)和马氏距离(Mahalanobis distance),或者IOU来计算代价矩阵,通过代价矩阵完成新一帧检测框与原被跟踪对象的最优匹配。即匈牙利算法可以告诉我们当前帧的某个目标,是否与前一帧的某个目标相同。

二、卡尔曼滤波

卡尔曼滤波的核心思想是通过动态模型和测量模型来估计系统的状态。动态模型描述了系统的状态如何随时间变化,测量模型描述了如何将系统的状态转换为测量结果。卡尔曼滤波将这两个模型结合起来,通过状态预测和测量更新来估计系统的状态。
卡尔曼滤波的过程可以分为两个阶段:预测和更新。在预测阶段,卡尔曼滤波器根据动态模型预测系统的状态,并计算出预测误差。在更新阶段,卡尔曼滤波器将预测的状态与测量结果进行比较,计算出状态的估计值和估计误差。卡尔曼滤波器通过不断进行预测和更新,逐步提高对系统状态的估计精度。
卡尔曼滤波的优点在于可以根据系统的动态模型和测量模型来估计状态,可以适应不同的系统和环境。同时,卡尔曼滤波器可以对测量结果进行加权平均,有效抑制测量误差和干扰。不过,卡尔曼滤波的缺点在于需要对系统进行建模,并且对于非线性系统需要进行扩展卡尔曼滤波等变种方法的处理。
卡尔曼滤波被广泛应用于无人机、自动驾驶、卫星导航等领域,简单来说,其作用就是基于传感器的测量值来更新预测值,以达到更精确的估计。

DeepSORT算法使用卡尔曼滤波进行预测的原因是,通过对目标运动状态的建模,能够更加准确地预测目标的未来位置,从而提高目标跟踪的准确性和鲁棒性。
如果不使用卡尔曼滤波进行预测,直接跟踪目标的位置和大小,可能会受到多种因素的影响,例如目标运动的加速度、噪声干扰等等,从而导致目标跟踪的不稳定,容易出现跟踪丢失或误判的情况。而卡尔曼滤波则可以对这些因素进行建模,并对目标的位置、速度等状态进行估计和预测,从而在一定程度上保证目标跟踪的稳定性和准确性。
此外,卡尔曼滤波还能够根据目标的运动特性对跟踪结果进行优化,例如对于匀速直线运动的目标,卡尔曼滤波能够更加准确地预测目标的位置和速度,从而提高跟踪的效果。

车速预测例子

假设你有一个车速传感器,但是由于传感器的误差和外界干扰等原因,传感器测量的车速数据会存在一定程度的误差。现在你希望通过这个传感器测量的数据来估计车辆的真实速度,这时候就可以使用卡尔曼滤波。
卡尔曼滤波的基本思想是将观测数据和模型预测结果加权平均,得到更精确的状态估计结果。因此,在这个例子中,我们可以将车速传感器的测量结果作为观测值,将车速模型预测的结果作为模型预测值,然后使用卡尔曼滤波算法来对两者进行融合,得到更加准确的车速估计值。
具体来说,卡尔曼滤波算法可以分为两个步骤:预测和更新。在预测步骤中,我们使用车速模型来预测当前时刻车速的值和协方差矩阵;在更新步骤中,我们将车速传感器测量的值和预测值进行比较,计算卡尔曼增益,然后使用卡尔曼增益对预测值进行修正,得到当前时刻的最优估计值和协方差矩阵。
通过这种方式,我们可以将传感器测量的数据和模型预测的结果进行融合,得到更加精确的车速估计值,从而提高了行车安全。

动态模型的概念

动态模型指的是描述系统状态随时间变化的数学模型。在卡尔曼滤波中,动态模型通常用状态转移矩阵和控制向量来表示系统状态的演化规律。
状态转移矩阵描述了系统状态在没有控制输入情况下的演化规律,它将当前时刻的状态向量映射到下一时刻的状态向量,表示为:
X_k = F_k * X_{k-1}
其中,X_k和X_{k-1}分别表示第k和第k-1时刻的系统状态向量,F_k为状态转移矩阵。
控制向量描述了外部输入对系统状态的影响,它通常用来修正状态转移矩阵,表示为:
X_k = F_k * X_{k-1} + B_k * u_k
其中,B_k为控制矩阵,u_k为控制向量。
动态模型的建立需要根据具体的系统进行选择和设计,一般需要考虑系统的物理特性、运动规律等因素。在卡尔曼滤波中,动态模型的准确性对滤波器的估计精度有重要影响,因此需要根据实际情况进行适当的调整和优化。

卡尔曼滤波在deepsort中的动态模型

在DeepSORT中,卡尔曼滤波的动态模型是针对目标运动状态建立的。具体来说,DeepSORT使用了一个匀速模型,即假设目标在运动过程中保持匀速运动。在这个假设下,目标的状态向量可以表示为:
X_k = [u, v, s, r, a, b]^T
其中,u和v表示目标在图像平面上的位置,s和r表示目标的大小和纵横比,a和b表示目标的加速度。
状态转移矩阵F_k可以表示为:
F_k = [1, 0, Δt, 0, 0, 0;
0, 1, 0, Δt, 0, 0;
0, 0, 1, 0, 0, 0;
0, 0, 0, 1, 0, 0;
0, 0, 0, 0, 1, 0;
0, 0, 0, 0, 0, 1]
其中,Δt表示两帧之间的时间间隔。
控制向量u_k为0,即没有外部控制影响。
根据上述动态模型,可以使用卡尔曼滤波器预测目标在下一帧中的状态,并计算出预测误差。同时,在更新阶段,可以将预测的状态与测量结果进行比较,计算出状态的估计值和估计误差,从而对目标进行跟踪。
需要注意的是,在实际应用中,动态模型的建立需要根据实际情况进行调整,例如对于不同的目标,可以根据其运动特征和目标跟踪的要求进行相应的优化。

三、预测值及测量值的含义

注意,预测值和测量值都不是真值,卡尔曼滤波最终输出值是对于真值的最优估计值。

预测值:指根据目标的历史状态和运动模型(上一帧的跟踪结果),对目标在当前帧出现的位置进行预测

测量值:指在当前帧中通过目标检测得到的目标位置和大小信息。‘

在DeepSORT算法中,对于每一帧输入的目标检测结果,首先需要对其进行匹配,将其与之前跟踪的目标进行匹配,得到目标的标识信息以及当前帧中目标的位置和大小信息。然后,需要对这些目标进行预测,得到它们在下一帧中的位置和大小信息。这里的预测值是指在当前帧中通过之前跟踪的目标状态以及卡尔曼滤波来预测下一帧中目标的位置和大小信息。
需要注意的是,预测值和测量值并不是同一帧中的数据。预测值是根据之前的跟踪结果和模型预测出来的目标位置和大小信息,而测量值是当前帧中通过目标检测获取的目标位置和大小信息。因此,预测值和测量值是不同的,它们来自于不同的帧,用于不同的目的。
至于时间概念和帧间关系,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

deepsort在pytorch中的运行

下载https://github.com/HowieMa/DeepSORT_YOLOv5_Pytorch.git相关代码。
在base内已经装有pytorch环境,配置详见:
pytorch的docker环境的安装

conda create -n deepsort  --clone base
conda activate deepsort  

将清华源替换后,安装一个requirements.txt:

pip install -r requirements.txt 

安装依赖库:

sudo apt-get install libgl1-mesa-glx

解决报错:
(1)在upsampling.py中报错行改为:return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners)
(2)报错行self.update(yaml.load(fo.read()))改为self.update(yaml.load(fo, Loader=yaml.FullLoader))
工程main.py中的视频源文件改为:

parser.add_argument('--input_path', type=str, default='/home/DeepSORT_YOLOv5_Pytorch-master/001.avi', help='source')  

即可运行demo:

python3 main.py

效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WireShark如何抓包,各种协议(HTTP、ARP、ICMP)的过滤或分析,用WireShark实现TCP三次握手和四次挥手

WireShark一、开启WireShark的大门二、如何抓包 搜索关键字2.1 协议过滤2.2 IP过滤2.3 过滤端口2.4 过滤MAC地址2.5 过滤包长度2.6 HTTP模式过滤三、ARP协议分析四、WireShark之ICMP协议五、TCP三次握手与四次挥手5.1 TCP三次握手实验5.2 可视化看TCP三次握手5.3 TCP四次挥手5.…

PCL 使用ICP点云拼接

一、简介 ICP算法详解——我见过最清晰的解释_负壹的博客-CSDN博客 两个点集,source和target,target不变,source经过旋转(Rotation)和平移(Translation)甚至加上尺度(Scale&#x…

大聪明教你学Java | 深入浅出聊 SpringBoot 中的 starter 机制

前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言&#x1f4…

网络安全横向移动指南

在网络安全方面,了解威胁参与者的工具、技术和思维过程非常重要。 一旦对手获得对网络的初始访问权限,横向移动允许他们通过破坏目标组织网络中的其他主机来扩展访问权限并保持持久性。 威胁行为者可以收集有关公司用户活动和凭据、重要数据位置的信息…

Spark - 继承 FileOutputFormat 实现向 HDFS 地址追加文件

目录 一.引言 二.源码浅析 1.RDD.saveAsTextFile 2.TextOutputFormat 3.FileOutputFormat 三.源码修改 1.修改文件生成逻辑 - getRecordWriter 2.允许目录存在 - checkoutputSpecs 3.全部代码 - TextOutputFormatV2 四.追加存储代码实战 五.总结 一.引言 Output d…

关于STM32用DMA传输UART空闲中断中接收的数据时无法接收数据问题以及解决办法

一、stm32 cube ide 配置 1、DMA串口接收数据的ide配置如下图所示 串口1相关的设置及printf函数的使用,这里没放,建议先实现串口打印功能 2、相关的知识点 普通模式和循环模式的区别在于,普通模式下,DMA只会接收一次数据&#x…

微前端(无界)

前言:微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现有方案,在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题,或无法提供支持。本…

DS18B20温度传感器简介和1-Wire驱动程序

目录DS18B20简介DS18B20的两种供电方式64位ROM温度传感器1-Wire Bus简介DS18B20通信时序初始化ROM相关命令(后续包含任何数据交换的操作)功能相关命令(后续包含任何数据交换的操作)单个DS18B20读取温度值驱动多个DS18B20读取温度值驱动DS18B20简介 DS18B20数字温度计提供9位到…

学习系统编程No.7【进程替换】

引言: 北京时间:2023/3/21/7:17,这篇博客本来昨天晚上就能开始写的,但是由于笔试强训的原因,导致时间用在了做题上,通过快2个小时的垂死挣扎,我充分意识到了自己做题能力的缺陷和运用新知识的缺…

致远OA敏感信息泄露漏洞合集(含批量检测POC)

文章目录前言敏感信息泄露A6 status.jsp 信息泄露漏洞漏洞描述漏洞影响网络测绘漏洞复现POC 批量检测getSessionList.jsp Session泄漏漏洞漏洞描述网络测绘批量检测POC致远OA 帆软组件 ReportServer 目录遍历漏洞漏洞描述漏洞影响网络测绘POC(批量检测)A6 createMysql.jsp 数据…

Java stream性能比较

环境 Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17CPU:8核 ➜ ~ cat /proc/cpuinfo | egrep -ie physical id|cpu cores physical id : 0 cpu cores : 1 physical id : 2 cpu cores : 1 physical id : 4 cpu cores : 1 physical id : 6 cpu cores : 1 physical id …

浏览器工作原理

一、JavaScript 的历史 JavaScript(简称JS)Web前端开发的脚本语言。 它诞生1995年,由网景公司的 Brendan Eich 开发。最初,JavaScript 被设计用于在网页上嵌入动态内容和交互式功能。 1996年,JavaScript 1.1 成为国…

C++虚函数与多态

C虚函数与多态虚函数抽象类纯虚函数虚析构函数多态虚函数的几个问题纯虚函数和ADT虚函数 virtual修饰的成员函数就是虚函数, 1.虚函数对类的内存影响:增加一个指针类型大小(32位和64位) 2.无论有多少个虚函数,只增加一…

【ansible】模块介绍超详解(下)

目录 六,软件包管理 1,yum_repository模块 (1)yum_repository模块常用选项 (2)yum_repository模块案例 2,mount模块 (1)mount模块选项 (2)mount模…

大数据简介

大数据概论和职业规划Linux服务器系统Hadoop概论HDFS分布式文件系统Hive数据仓库SparSQL指令Zepplin框架Sqoop框架Superset数据可视化大数据数仓实战-didi出行大数据概念大数据特点大数据应用场景大数据分析业务步骤大数据职业规划大数据学习路线。大数据概念数据:世…

基于YOLOv5的舰船检测与识别系统(Python+清新界面+数据集)

摘要:基于YOLOv5的舰船检测与识别系统用于识别包括渔船、游轮等多种海上船只类型,检测船舰目标并进行识别计数,以提供海洋船只的自动化监测和管理。本文详细介绍船舰类型识别系统,在介绍算法原理的同时,给出Python的实…

【系统开发】WebSocket + SpringBoot + Vue 搭建简易网页聊天室

文章目录一、数据库搭建二、后端搭建2.1 引入关键依赖2.2 WebSocket配置类2.3 配置跨域2.4 发送消息的控制类三、前端搭建3.1 自定义文件websocket.js3.2 main.js中全局引入websocket3.3 App.vue中声明websocket对象3.4 聊天室界面.vue3.5 最终效果一、数据库搭建 很简单的一个…

数据结构与算法——二叉树+带你实现表达式树(附源码)

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段,因为最近参加新星计划算法赛道(白佬),所以加快了脚步,果然急迫感会增加动力>——…

ThreadLocal详解

一、什么是ThreadLocal 1、什么是ThreadLocal&为什么用ThreadLocal ThreadLocal,即线程本地变量,在类定义中的注释如此写This class provides thread-local variables。如果创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有…

C++基础算法④——排序算法(插入、桶附完整代码)

排序算法 1.插入排序 2.桶排序 1.插入排序 基本思想:将初始数据分为有序部分和无序部分;每一步将无序部分的第一个值插入到前面已经排好序的有序部分中,直到插完所有元素为止。步骤如下: 每次从无序部分中取出第一个值&#x…
最新文章