一、引言
在视频监控和智能交通系统中,多目标跟踪是一项关键技术,它涉及检测视频中的多个目标,并在视频帧之间维持每个目标的身份。DeepSORT算法作为SORT算法的扩展,通过结合深度学习和传统的跟踪技术,提高了目标跟踪的准确性和鲁棒性。本文将深入讲解DeepSORT算法的原理和流程,并对Deepsort的代码进行介绍。
二、DeepSORT算法原理
DeepSORT算法的核心在于其对目标的外观特征和运动特征的联合使用,以及对目标匹配问题的优化处理。该算法通过融合目标检测的结果,结合匈牙利算法和卡尔曼滤波等技术,实现对多个目标的持续跟踪。
DeepSORT算法的主要步骤
-
目标检测:DeepSORT算法依赖于目标检测器来确定视频中每一帧的目标位置。常用的目标检测器包括YOLO、Faster R-CNN等。检测器的输出通常包括目标的边界框(bounding box)和类别。
-
特征提取:DeepSORT使用深度学习模型来提取目标的外观特征。这些特征对于目标的再识别(re-identification,简称Re-ID)至关重要,因为即使目标在视频中被临时遮挡或丢失,这些特征也能帮助算法重新识别和关联目标。
-
匹配和跟踪:DeepSORT算法中的匹配过程涉及到计算检测框和预测框之间的相似度,并使用匈牙利算法来找到最优匹配。这个过程还包括卡尔曼滤波器的使用,它根据目标的历史运动信息来预测其在下一帧中的位置。
-
卡尔曼滤波:用于预测目标在下一帧中的位置。
-
匈牙利算法:用于计算检测框和预测框之间的最优匹配。
-
-
级联匹配:DeepSORT中的级联匹配是一种特殊的机制,它首先尝试将检测结果与高置信度的轨迹进行匹配,然后再与低置信度的轨迹进行匹配。这有助于提高匹配的准确性,尤其是在目标被遮挡或短暂消失时。
-
轨迹管理:DeepSORT维护每个目标的轨迹,并对新检测到的目标初始化新的轨迹。它还设置了确认状态(confirmed)和未确认状态(unconfirmed),以处理遮挡和临时丢失的情况。
DeepSORT算法流程
-
初始化Tracks:在视频的第一帧中,基于目标检测器的输出,为每个检测到的目标创建一个新的Tracks,并将其状态设为Unconfirmed。此时,由于是第一帧,所以所有的Tracks都处于unconfirmed状态。
-
预测Tracks:使用卡尔曼滤波器预测Tracks在下一帧中的位置和速度。
-
目标检测(Detections):在每一帧中,目标检测器识别出该帧中所有目标的检测框。
-
IOU匹配:计算上一帧预测的Tracks与当前帧Detections之间的IOU,并基于此构建代价矩阵。
-
匹配与更新:
-
使用匈牙利算法对代价矩阵进行优化匹配,以最小化匹配的总代价。
-
对于匹配成功的Tracks,使用卡尔曼滤波器进行状态更新。
-
对于未匹配的Tracks(Unmatched Tracks),直接删除这些失配的Tracks(如果Tracks是确认态,则需要连续达到一定次数(默认30次)才能删除)。
-
对于未匹配的Detections(Unmatched Detections),将这些失配的Detections初始化为新的Tracks。
-
-
循环执行(2)-(5)步骤,直到出现确认态(confirmed)的Tracks或者视频帧结束。
-
级联匹配:对于Confirmed状态的Tracks,利用外观特征进行更精确的级联匹配。
-
第一种是Tracks匹配,通过卡尔曼滤波更新相应的Tracks变量。
-
第二种和第三种是Detections和Tracks失配,将之前的不确定态的Tracks和失配的Tracks与Unmatched Detections逐一进行IOU匹配,再根据匹配度计算代价矩阵。
-
-
线性匹配结果:将(7)中得到的所有代价矩阵作为匈牙利算法的输入,得到线性匹配的结果。
-
第一种是Tracks失配(Unmatched Tracks),直接删除这些失配的Tracks(如果Tracks是确认态,则需要连续达到一定次数(默认30次)才能删除)。
-
第二种是Detections失配(Unmatched Detections),将这些失配的Detections初始化为新的Tracks。
-
第三种是检测框和预测的框框成功配对,表示前一帧和后一帧的追踪成功,通过卡尔曼滤波更新相应的Tracks变量。
-
-
循环执行(7)-(8)步骤,直到视频结束。
-
输出结果:在整个视频帧处理过程中,维护和更新Tracks,最终输出每个目标的跟踪结果,包括目标ID、位置、速度等信息。
匈牙利算法(Hungarian Algorithm)【额外介绍】
匈牙利算法是一种用于解决分配问题的有效算法。在DeepSORT算法中,匈牙利算法被用于解决数据关联问题,即如何将当前帧中检测到的目标(detections)与上一帧中跟踪的目标(tracks)进行匹配。DeepSORT通过计算检测框和跟踪框之间的相似度,构建一个代价矩阵,然后利用匈牙利算法找到最小化代价的匹配方案。
在DeepSORT中,匈牙利算法的作用可以概括为:
-
初始化:当视频的第一帧被检测时,每个检测到的目标初始化一个跟踪轨迹。
-
匹配:在随后的帧中,匈牙利算法将当前帧的检测与上一帧的跟踪轨迹进行匹配,通过计算代价矩阵并应用匈牙利算法来找到最优匹配,从而更新跟踪轨迹。
卡尔曼滤波器(Kalman Filter)【额外介绍】
卡尔曼滤波器是一种线性动态系统的状态估计算法,它在DeepSORT中用于预测目标的运动状态。DeepSORT中的卡尔曼滤波器处理一个8维状态空间,其中包括目标的中心位置(x, y)、宽高比(a)、高度(h)以及这些参数的一阶导数(速度)。
卡尔曼滤波器在DeepSORT中的应用包括:
-
预测:在没有观测数据的情况下,卡尔曼滤波器使用目标的历史信息来预测其在下一帧中的位置和速度。
-
更新:当获得新的观测数据时,卡尔曼滤波器会结合预测结果和观测数据来更新目标的状态估计。
DeepSORT中的卡尔曼滤波器通过以下步骤实现:
-
类初始化:定义基础参数,创建卡尔曼滤波模型矩阵。
-
初始化状态:为每个新检测到的目标初始化状态和协方差矩阵。
-
预测阶段:估计目标的状态转移,考虑运动模型和控制输入。
-
更新阶段:根据观测值调整预测,考虑观测误差和预测误差的协方差。
通过结合匈牙利算法和卡尔曼滤波器,DeepSORT算法能够有效地处理多目标跟踪中的匹配问题,即使在目标被遮挡或快速移动的情况下也能保持较高的跟踪精度。这两种算法的结合是DeepSORT算法鲁棒性的关键。
DeepSORT算法的优势
DeepSORT算法通过结合深度学习和传统的跟踪技术,有效地提高了多目标跟踪的准确性和鲁棒性。它特别适用于目标遮挡、快速移动等复杂场景。深度学习模型能够提取出鲁棒的表观特征,有助于目标的再识别。此外,DeepSORT中的轨迹确认机制允许算法区分高置信度轨迹和低置信度轨迹,从而在匹配过程中赋予它们不同的优先级。
三、DeepSORT代码讲解
configs 目录
该 yaml文件主要是保存一些参数。
-
REID_CKPT:特征提取权重的目录路径。
-
MAX_DIST:最大余弦距离,用于级联匹配,如果大于该阈值,则忽略。
-
MIN_CONFIDENCE:检测结果置信度阈值,大于该值就留下来。
-
NMS_MAX_OVERLAP:非极大抑制阈值,设置为1代表不进行抑制。
-
MAX_IOU_DISTANCE:最大IOU阈值。
-
MAX_AGE:最大寿命,也就是经过MAX_AGE帧没有追踪到该物体,就将该轨迹变为删除态。
-
N_INIT:最高检测次数,如果超过该次数(检测框与预测框匹配成功),就由不确定态转为确定态。
-
NN_BUDGET:最大保存特征帧数,如果超过该帧数,将进行滚动保存。
deep_sort/deep 目录(特征提取网络)
-
checkpoint/ckpt.t7:这是一个特征提取网络的权重文件,特征提取网络训练好了以后会生成这个权重文件,方便在目标追踪的时候提取目标框中的特征,在目标追踪的时候避免ID switch。
-
evaluate.py:计算特征提取模型精确度。
-
feature_extractor.py:提取对应bounding box中的特征, 得到一个固定维度的特征,作为该bounding box的代表,供计算相似度时使用。
-
model.py:特征提取网络模型,该模型用来提取训练特征提取网络权重。
-
original_model.py:特征提取网络模型,该模型用来提取训练特征提取网络权重。
-
train.py:训练特征提取网络的文件
-
test.py:测试训练好的特征提取网络的性能的文件
deep_sort/sort目录
-
detection.py:保存通过目标检测的一个检测框框,以及该框的置信度和获取的特征;同时还提供了框框的各种格式的转化方法。
-
iou_matching.py:计算两个框框之间的IOU。
-
kalman_filter.py:卡尔曼滤波器的相关代码,主要是利用卡尔曼滤波来预测检测框的轨迹信息。
-
linear_assignment.py:利用匈牙利算法匹配预测的轨迹框和检测框最佳匹配效果。
-
nn_matching.py:通过计算欧氏距离、余弦距离等距离来计算最近领距离。
-
preprocessing.py:非极大抑制代码,利用非极大抑制算法将最优的检测框输出。
-
track.py:主要储存的是轨迹信息,其中包括轨迹框的位置和速度信息,轨迹框的ID和状态,其中状态包括三种,一种是确定态、不确定态、删除态三种状态。
-
tracker.py:保存了所有的轨迹信息,负责初始化第一帧,卡尔曼滤波的预测和更新,负责级联匹配,IOU匹配。
deep_sort/deep_sort.py
deepsort的整体封装,实现一个deepsort追踪的一个整体效果。
deep_sort/utils 目录
这里最主要有一些各种各样的工具python代码,例如画框工具,日志保存工具等等。
-
asserts.py:判断文件、运行环境是否存在。
-
drwa.py:绘制在图片上的内容。
-
evaluation.py:自动化地评估多目标跟踪算法的性能,通过计算如MOTA(多目标跟踪精度)、IDF1(身份匹配F1分数)、召回率和精确度等关键指标,来衡量算法在处理视频序列时的效果。
-
io.py:保存文件的信息。
-
json_logger.py:用于实时目标检测的自定义日志记录机制,它能够将检测结果以JSON格式保存。
-
log.py:日志信息。
-
parser.py:解析YAML配置文件。
-
tools.py:用于检查文件是否为视频文件和测量和打印函数执行所需的时间。
四、结论
随着深度学习技术的不断进步,DeepSORT及其变体有望在未来的视频分析领域发挥更大的作用。DeepSORT算法的成功在于其能够有效地处理视频中目标的遮挡和快速移动,同时保持了较高的跟踪精度和鲁棒性。这使得DeepSORT成为了视频监控、自动驾驶、机器人视觉等领域中一个非常有价值的工具。
五、链接作者
欢迎关注我的公众号:@AI算法与电子竞赛
硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!