【原理代码详解】DeepSORT算法:多目标跟踪的深度学习解决方案

一、引言

在视频监控和智能交通系统中,多目标跟踪是一项关键技术,它涉及检测视频中的多个目标,并在视频帧之间维持每个目标的身份。DeepSORT算法作为SORT算法的扩展,通过结合深度学习和传统的跟踪技术,提高了目标跟踪的准确性和鲁棒性。本文将深入讲解DeepSORT算法的原理和流程,并对Deepsort的代码进行介绍。

二、DeepSORT算法原理

DeepSORT算法的核心在于其对目标的外观特征和运动特征的联合使用,以及对目标匹配问题的优化处理。该算法通过融合目标检测的结果,结合匈牙利算法和卡尔曼滤波等技术,实现对多个目标的持续跟踪。

DeepSORT算法的主要步骤

  1. 目标检测:DeepSORT算法依赖于目标检测器来确定视频中每一帧的目标位置。常用的目标检测器包括YOLO、Faster R-CNN等。检测器的输出通常包括目标的边界框(bounding box)和类别。

  2. 特征提取:DeepSORT使用深度学习模型来提取目标的外观特征。这些特征对于目标的再识别(re-identification,简称Re-ID)至关重要,因为即使目标在视频中被临时遮挡或丢失,这些特征也能帮助算法重新识别和关联目标。

  3. 匹配和跟踪:DeepSORT算法中的匹配过程涉及到计算检测框和预测框之间的相似度,并使用匈牙利算法来找到最优匹配。这个过程还包括卡尔曼滤波器的使用,它根据目标的历史运动信息来预测其在下一帧中的位置。

    1. 卡尔曼滤波:用于预测目标在下一帧中的位置。

    2. 匈牙利算法:用于计算检测框和预测框之间的最优匹配。

  4. 级联匹配:DeepSORT中的级联匹配是一种特殊的机制,它首先尝试将检测结果与高置信度的轨迹进行匹配,然后再与低置信度的轨迹进行匹配。这有助于提高匹配的准确性,尤其是在目标被遮挡或短暂消失时。

  5. 轨迹管理:DeepSORT维护每个目标的轨迹,并对新检测到的目标初始化新的轨迹。它还设置了确认状态(confirmed)未确认状态(unconfirmed),以处理遮挡和临时丢失的情况。

DeepSORT算法流程

  1. 初始化Tracks:在视频的第一帧中,基于目标检测器的输出,为每个检测到的目标创建一个新的Tracks,并将其状态设为Unconfirmed。此时,由于是第一帧,所以所有的Tracks都处于unconfirmed状态

  2. 预测Tracks:使用卡尔曼滤波器预测Tracks在下一帧中的位置和速度。

  3. 目标检测(Detections):在每一帧中,目标检测器识别出该帧中所有目标的检测框。

  4. IOU匹配:计算上一帧预测的Tracks与当前帧Detections之间的IOU,并基于此构建代价矩阵。

  5. 匹配与更新

    1. 使用匈牙利算法对代价矩阵进行优化匹配,以最小化匹配的总代价。

    2. 对于匹配成功的Tracks,使用卡尔曼滤波器进行状态更新。

    3. 对于未匹配的Tracks(Unmatched Tracks),直接删除这些失配的Tracks(如果Tracks是确认态,则需要连续达到一定次数(默认30次)才能删除)。

    4. 对于未匹配的Detections(Unmatched Detections),将这些失配的Detections初始化为新的Tracks。

  6. 循环执行(2)-(5)步骤,直到出现确认态(confirmed)的Tracks或者视频帧结束。

  7. 级联匹配:对于Confirmed状态的Tracks,利用外观特征进行更精确的级联匹配。

    1. 第一种是Tracks匹配,通过卡尔曼滤波更新相应的Tracks变量。

    2. 第二种和第三种是Detections和Tracks失配,将之前的不确定态的Tracks和失配的Tracks与Unmatched Detections逐一进行IOU匹配,再根据匹配度计算代价矩阵。

  8. 线性匹配结果:将(7)中得到的所有代价矩阵作为匈牙利算法的输入,得到线性匹配的结果。

    1. 第一种是Tracks失配(Unmatched Tracks),直接删除这些失配的Tracks(如果Tracks是确认态,则需要连续达到一定次数(默认30次)才能删除)。

    2. 第二种是Detections失配(Unmatched Detections),将这些失配的Detections初始化为新的Tracks。

    3. 第三种是检测框和预测的框框成功配对,表示前一帧和后一帧的追踪成功,通过卡尔曼滤波更新相应的Tracks变量。

  9. 循环执行(7)-(8)步骤,直到视频结束。

  10. 输出结果:在整个视频帧处理过程中,维护和更新Tracks,最终输出每个目标的跟踪结果,包括目标ID、位置、速度等信息。

匈牙利算法(Hungarian Algorithm)【额外介绍】

匈牙利算法是一种用于解决分配问题的有效算法。在DeepSORT算法中,匈牙利算法被用于解决数据关联问题,即如何将当前帧中检测到的目标(detections)与上一帧中跟踪的目标(tracks)进行匹配。DeepSORT通过计算检测框和跟踪框之间的相似度,构建一个代价矩阵,然后利用匈牙利算法找到最小化代价的匹配方案。

在DeepSORT中,匈牙利算法的作用可以概括为:

  • 初始化:当视频的第一帧被检测时,每个检测到的目标初始化一个跟踪轨迹。

  • 匹配:在随后的帧中,匈牙利算法将当前帧的检测与上一帧的跟踪轨迹进行匹配,通过计算代价矩阵并应用匈牙利算法来找到最优匹配,从而更新跟踪轨迹。

卡尔曼滤波器(Kalman Filter)【额外介绍】

卡尔曼滤波器是一种线性动态系统的状态估计算法,它在DeepSORT中用于预测目标的运动状态。DeepSORT中的卡尔曼滤波器处理一个8维状态空间,其中包括目标的中心位置(x, y)、宽高比(a)、高度(h)以及这些参数的一阶导数(速度)。

卡尔曼滤波器在DeepSORT中的应用包括:

  1. 预测:在没有观测数据的情况下,卡尔曼滤波器使用目标的历史信息来预测其在下一帧中的位置和速度。

  2. 更新:当获得新的观测数据时,卡尔曼滤波器会结合预测结果和观测数据来更新目标的状态估计。

DeepSORT中的卡尔曼滤波器通过以下步骤实现:

  • 类初始化:定义基础参数,创建卡尔曼滤波模型矩阵。

  • 初始化状态:为每个新检测到的目标初始化状态和协方差矩阵。

  • 预测阶段:估计目标的状态转移,考虑运动模型和控制输入。

  • 更新阶段:根据观测值调整预测,考虑观测误差和预测误差的协方差。

通过结合匈牙利算法和卡尔曼滤波器,DeepSORT算法能够有效地处理多目标跟踪中的匹配问题,即使在目标被遮挡或快速移动的情况下也能保持较高的跟踪精度。这两种算法的结合是DeepSORT算法鲁棒性的关键。

DeepSORT算法的优势

DeepSORT算法通过结合深度学习和传统的跟踪技术,有效地提高了多目标跟踪的准确性和鲁棒性。它特别适用于目标遮挡、快速移动等复杂场景。深度学习模型能够提取出鲁棒的表观特征,有助于目标的再识别。此外,DeepSORT中的轨迹确认机制允许算法区分高置信度轨迹和低置信度轨迹,从而在匹配过程中赋予它们不同的优先级。

三、DeepSORT代码讲解

  

configs 目录

该 yaml文件主要是保存一些参数。

  1. REID_CKPT:特征提取权重的目录路径。

  2. MAX_DIST:最大余弦距离,用于级联匹配,如果大于该阈值,则忽略。

  3. MIN_CONFIDENCE:检测结果置信度阈值,大于该值就留下来。

  4. NMS_MAX_OVERLAP:非极大抑制阈值,设置为1代表不进行抑制。

  5. MAX_IOU_DISTANCE:最大IOU阈值。

  6. MAX_AGE:最大寿命,也就是经过MAX_AGE帧没有追踪到该物体,就将该轨迹变为删除态。

  7. N_INIT:最高检测次数,如果超过该次数(检测框与预测框匹配成功),就由不确定态转为确定态。

  8. NN_BUDGET:最大保存特征帧数,如果超过该帧数,将进行滚动保存。

deep_sort/deep 目录(特征提取网络)

  1. checkpoint/ckpt.t7:这是一个特征提取网络的权重文件,特征提取网络训练好了以后会生成这个权重文件,方便在目标追踪的时候提取目标框中的特征,在目标追踪的时候避免ID switch。

  2. evaluate.py:计算特征提取模型精确度。

  3. feature_extractor.py:提取对应bounding box中的特征, 得到一个固定维度的特征,作为该bounding box的代表,供计算相似度时使用。

  4. model.py:特征提取网络模型,该模型用来提取训练特征提取网络权重。

  5. original_model.py:特征提取网络模型,该模型用来提取训练特征提取网络权重。

  6. train.py:训练特征提取网络的文件

  7. test.py:测试训练好的特征提取网络的性能的文件

deep_sort/sort目录

  1. detection.py:保存通过目标检测的一个检测框框,以及该框的置信度和获取的特征;同时还提供了框框的各种格式的转化方法。

  2. iou_matching.py:计算两个框框之间的IOU。

  3. kalman_filter.py:卡尔曼滤波器的相关代码,主要是利用卡尔曼滤波来预测检测框的轨迹信息。

  4. linear_assignment.py:利用匈牙利算法匹配预测的轨迹框和检测框最佳匹配效果。

  5. nn_matching.py:通过计算欧氏距离、余弦距离等距离来计算最近领距离。

  6. preprocessing.py:非极大抑制代码,利用非极大抑制算法将最优的检测框输出。

  7. track.py:主要储存的是轨迹信息,其中包括轨迹框的位置和速度信息,轨迹框的ID和状态,其中状态包括三种,一种是确定态、不确定态、删除态三种状态。

  8. tracker.py:保存了所有的轨迹信息,负责初始化第一帧,卡尔曼滤波的预测和更新,负责级联匹配,IOU匹配。

deep_sort/deep_sort.py

deepsort的整体封装,实现一个deepsort追踪的一个整体效果。

deep_sort/utils 目录

这里最主要有一些各种各样的工具python代码,例如画框工具,日志保存工具等等。

  1. asserts.py:判断文件、运行环境是否存在。

  2. drwa.py:绘制在图片上的内容。

  3. evaluation.py:自动化地评估多目标跟踪算法的性能,通过计算如MOTA(多目标跟踪精度)、IDF1(身份匹配F1分数)、召回率和精确度等关键指标,来衡量算法在处理视频序列时的效果。

  4. io.py:保存文件的信息。

  5. json_logger.py:用于实时目标检测的自定义日志记录机制,它能够将检测结果以JSON格式保存。

  6. log.py:日志信息。

  7. parser.py:解析YAML配置文件。

  8. tools.py:用于检查文件是否为视频文件和测量和打印函数执行所需的时间。

四、结论

随着深度学习技术的不断进步,DeepSORT及其变体有望在未来的视频分析领域发挥更大的作用。DeepSORT算法的成功在于其能够有效地处理视频中目标的遮挡和快速移动,同时保持了较高的跟踪精度和鲁棒性。这使得DeepSORT成为了视频监控、自动驾驶、机器人视觉等领域中一个非常有价值的工具。

五、链接作者

欢迎关注我的公众号:@AI算法与电子竞赛

硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!

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

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

相关文章

用户需求甄别和筛选的6大标准

产品经理日常经常接收到大量的需求,并不是所有的需求都需要开发,需要进行甄别和筛选,这样有利于确保项目的成功、优化资源利用以及提高产品质量。 那么针对这些用户需求进行甄别或筛选的评判标准是什么?需求筛选可以说是初步的需求…

C语言/数据结构——每日一题(环形链表)

一.前言 今天在力扣上刷到一道链表题——环形链表https://leetcode.cn/problems/linked-list-cycle 想着和大家们分享一下。让我们直接开始今天的分享吧。、 二.正文 1.1题目描述 1.2题目分析 这道题是想让我们做出分析,该链表是不是带环链表,如果是…

计算机网络 3.3OSI参考模型

第三节 OSI参考模型 一、认识OSI/RM 1.描述:定义了一个连接异种计算机的标准主体结构,给网络设计者提供了一个参考规范。 2.组织:国际标准化组织. 3.发展:1979年研究并提出了该国际标准。 4.分层原则: ①层次的划…

基于SSM SpringBoot vue学校办公自动化系统

基于SSM SpringBoot vue学校办公自动化系统 系统功能 登录注册 个人中心 用户信息管理 部门信息管理 公共通知管理 个人邮箱管理 日常安排管理 管理员管理 签到记录管理 会议管理 开发环境和技术 开发语言:Java 使用框架: SSM(Spring SpringMVC Mybaits)或Spr…

资料如何打印更省钱

在日常工作和学习中,我们经常需要打印各种资料。然而,随着打印成本的不断提高,如何更省钱地打印资料成为了大家关注的焦点。今天,就为大家分享一些资料打印的省钱技巧,并推荐一个省钱又省心的打印平台。 首先&#xff…

(动画详解)LeetCode232.用栈实现队列

💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…

windows安装DrawDB

下载 新建一个目录drawdb,使用git下载,如果没有安装git的话,进入git官网进行下载windows版本 https://git-scm.com/downloads。 空白地方鼠标右键,打开git终端 执行命令: git clone https://github.com/drawdb-io/drawdb 安装依…

苹果cms:开启高速缓存加快访问速度

由于苹果cms采集的影片数据过多,如果不设置缓存,可能会造成网站访问缓慢,或者CPU消耗过高。随着用户访问量的上升,添加缓存设置是有这个必要的。目前cms提供了四种缓存方式 1)file:以文件形式,通俗说直接访问Mysql,要达…

【Arduino】数字I/O的使用

目录 1、引脚工作模式 2、写入引脚digitaWrite() 3、读取引脚digitalRead(pin); 4、示例 跑马灯 1、引脚工作模式 Arduino通过pinMode()设置引脚的io工作模式,一共有4种模式 工作模式 Mode 说明 输出模式 OUTPUT 引脚为低阻抗状态&…

Docker入门指南:Docker容器的使用(三)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 在本章节中,将深入探讨 Docker 容器的概念,以及容器的使用。 📖 正文 1 什么是容器 1.1 Docker容器的介绍 Docker 容…

RT-Thread事件集

文章目录 前言一、RT-Thread事件集的概念二、事件集函数的使用1.创建事件集函数2.事件集发送函数3.事件集接收函数4.事件集删除函数 三、事件集使用例程总结 前言 本篇文章将给大家讲解RT-Thread中事件集的概念,了解什么是事件集及事件集的函数使用方法。 一、RT-…

uni-app跨端兼容

1.样式兼容 小程序端不支持*选择器,可以使用(view,text) 页面视口差异(tabar页、普通页) H5端默认开始scoped 例如骨架屏样式出现问题,需要将之前的样式拷贝到骨架屏中 提示:H5端是单页面应用,scoped隔离…