1、概述
1.1 DeepSORT
DeepSORT
算法是在SORT
基础上发展起来的一种多目标跟踪算法。SORT
算法结合了目标检测器和跟踪器
,其中跟踪器的核心是卡尔曼滤波和匈牙利算法
。
- 卡尔曼滤波用于预测目标在下一帧的位置和状态
- 而匈牙利算法则用于将预测状态与实际检测结果进行最佳匹配
这种方法在目标没有被遮挡或丢失时表现良好,但如果目标因为某些原因(如遮挡)在一帧中未被检测到,卡尔曼滤波的预测可能会失败,导致跟踪失败。
DeepSORT
算法为了解决这个问题,引入了深度学习中的重识别技术
。它不仅关注目标的运动信息,还利用目标的外观特征来增强跟踪的准确性。DeepSORT通过深度学习模型提取目标的外观特征,并将这些特征表示为低维向量。在每帧的检测和跟踪过程中,DeepSORT都会提取当前帧中目标的外观特征,并与之前存储的特征进行比较,以此来判断目标是否为同一物体。
这种方法的优势在于,即使在目标暂时从视野中消失或被遮挡的情况下,DeepSORT也能够通过外观特征的匹配来维持跟踪的连续性。外观特征的引入使得DeepSORT在处理遮挡、相似目标的分辨以及目标再出现时的身份恢复等方面表现得更加鲁棒。
1.2 StrongSORT
StrongSORT
它在DeepSORT
的基础上进行了一系列的改进,以提高跟踪的准确性和性能。改时以下的几个地方:
BoT(Bag of Tricks)
: 改进了外观特征提取器,它使用深度学习技术来提取目标的视觉特征,这些特征对于区分和识别不同的目标至关重要。EMA(Exponential Moving Average)
: 通过引入惯性项来平滑特征更新,EMA有助于减少噪声和异常值的影响,使得跟踪更加稳定。NSA(Neural Network-based Appearance)
: 这是一种用于非线性运动的卡尔曼滤波器,它通过神经网络来预测目标的状态,以适应更复杂的运动模式。MC(Motion Compensation)
: 包括运动信息的成本矩阵,这有助于在匹配过程中更好地考虑目标的运动信息,提高匹配的准确性。ECC(External Camera Calibration)
: 摄像机运动更正,它允许算法校正摄像机的外部参数,从而提高跟踪的准确性。woC(Without Cascading)
: 不采用级联算法,这可能意味着算法避免了在不同阶段使用不同复杂度的检测器,从而提高了处理速度。
StrongSORT++
是StrongSORT
的一个变体,它进一步引入了:
-
AFLink(Association Graph Linking)
: 这是一种仅使用运动信息的全局链接方法,它在离线处理阶段用于改进跟踪结果。 -
GSI(Gaussian Process-based Interpolation)
: 通过高斯过程对检测误差进行内插,这是一种后处理技术,用于进一步提高跟踪的精度。
StrongSORT
通过在特征提取、运动信息处理和成本矩阵计算等方面的改进,提高了多目标跟踪的性能。而StrongSORT++
则通过引入AFLink和GSI
技术,进一步优化了跟踪的准确性和鲁棒性。这些改进使得StrongSORT
能够在复杂的场景中更有效地处理遮挡、目标丢失和重新出现等问题,从而实现最先进的跟踪性能(SOTA)。
StrongSORT
与其说从根本上改变了结构,不如说是改进了跟踪所需的特征提取、运动信息和成本矩阵的处理
。StrongSORT++将AFLink(离线处理)和GSI插值(后处理)应用于改进的StrongSORT
,是一个更加精确的模型。MOT17和MOT20的准确性比较,这表明了StrongSORT的优越性。
论文地址 :https://arxiv.org/abs/2202.13514
源码地址:https://github.com/dyhBUPT/StrongSORT.git
2. 研究背景
StrongSORT
是基于DeepSORT
算法的改进版本,旨在通过结合最新的技术元素来提升跟踪的准确性。
2.1. DeepSORT的起源与影响:
DeepSORT
作为深度学习跟踪方法的先驱,为后续的研究奠定了基础。尽管后续出现了如FairMOT
和ByteTrack
等新方法,并在准确性上超越了DeepSORT
,但这并不是因为DeepSORT
方法本身存在缺陷,而是由于其提出的较早,技术尚未达到最新水平。因此,通过对DeepSORT
进行改进,有潜力将其性能提升到新的水平。
2.2. SDE与JDE的对比:
DeepSORT
属于单独检测和嵌入(SDE)模型,其检测器是独立于跟踪模型的
。相比之下,联合检测和嵌入(JDE)模型如JDE(Joint Detection and Embedding)同时训练检测和跟踪任务
,可能会导致模型冲突,限制了准确性。此外,JDE需要一个同时包含检测和跟踪信息的数据集进行训练,这限制了训练数据的多样性和范围。
2.3. 改进DeepSORT的动机:
尽管存在JDE这样的新方法,但它们在训练上的局限性和对复杂运动场景的处理不足表明,仍有很大的改进空间。StrongSORT的提出正是基于这样的动机,即在DeepSORT的SDE框架中充分利用外观特征来提升跟踪性能。
2.4. StrongSORT的定位:
提出StrongSORT
的目的是为了证明在SDE方法中结合外观特征进行跟踪是有效的。通过改进DeepSORT,StrongSORT旨在解决ByteTrack等仅基于运动信息的模型在处理复杂运动时的局限性,同时避免JDE模型在训练上的挑战。
3.DeepSORT
在跟踪任务中,需要将当前帧(记为t)中检测到的物体与过去从0~t-1
帧中跟踪到的物体的短期轨迹(tracklet)进行比较和匹配,确保为同一个物体分配相同的ID。这个过程涉及到创建一个成本矩阵,该矩阵基于物体的外观特征和运动信息来衡量当前检测到的物体与已有跟踪点之间的相似性和差异性,目的是找到成本最小的匹配组合。
3.1特征库
特征库用于存储tracklets的外观特征,以便评估新检测到的物体与当前帧中哪个跟踪点的外观最为相似。DeepSORT会保留最近100帧的外观特征,这些特征是通过一个简单的深度模型(如CNN)在MARS数据集上预训练得到的。这个深度模型能够提取物体的外观特征,有助于区分不同的个体。
3.2 卡尔曼滤波器
除了外观特征,运动信息也是跟踪过程中的一个重要因素。卡尔曼滤波器不仅关注物体的当前位置,还能够预测物体在下一帧中可能出现的位置。这种预测基于物体在前一帧的位置和运动状态,预测出的tracklet坐标与当前检测到的物体之间的距离被用作成本矩阵的一个元素。DeepSORT使用的是线性卡尔曼滤波器,并且假设所有物体的噪声特性是相同的。
3.3 匹配级联
在将检测结果与跟踪器进行关联时,DeepSORT使用匈牙利算法来处理位置信息和外观特征的成本矩阵,以找到最优的匹配方案。此外,DeepSORT采用了一种匹配级联的策略,优先考虑将最近的检测结果与当前活跃的轨迹进行匹配。这种策略有助于提高跟踪的实时性和准确性,尤其是在处理快速移动或频繁出现的物体时。
4. StrongSORT
4.1 BoT
StrongSORT采用了BoT作为更强大外观特征提取器。与DeepSORT中使用的简单CNN模型不同,BoT使用的是ResNeSt50作为骨干模型,并在DukeMTMCreID数据集上进行了预训练。这种特征提取器能够更有效地区分不同个体之间的特征,因为它利用了更复杂的网络结构和大量的预训练数据。
4.2 EMA
EMA是GIAOTracker中提出的一个特征库:DeepSORT特征库保留了100帧的特征,这使得它效率低下,对每一帧的检测噪声高度敏感。相比之下,EMA将过去的特征作为惯性项保留并更新,如下式所示:f是在第t帧检测到的物体的特征,并分配给小轨道 i,e是到第t-1帧为止的小轨道的特征。通过用α加权,特征被有效地更新,并减少了噪音。
4.3 NSA Karman
GIAOTracker中也提出了NSA卡尔曼:在DeepSORT中,它是一个简单的线性卡尔曼滤波器,但假设所有检测到的物体具有相同的观测噪声是不现实的。因此,NSA卡尔曼根据检测的置信度,以自适应的方式改变噪声。对于复杂的移动物体,检测器可能对物体的输出信心不足,所以卡尔曼滤波器加强了校正。
c k ckck代表每个对象的信心水平。通过这种方式,可以对各种复杂的物体运动进行位置估计。
4.4 MC
DeepSORT将位置信息作为一种成本,但实际上只实验了外观特征作为一种成本,其权重设置为零。与这样的DeepSORT不同,StrongSORT生成了一个λ=0.98的成本矩阵,如下式所示。KaTeX parse error: Expected 'EOF', got '&' at position 3: Aa&̲是外观特征的成本,Am&是运动(位置)信息的成本。
4.5 其他
StrongSORT采用了ECC校正算法来处理相机视角的变化。这种算法考虑到了相机的外部参数,如焦距和畸变系数,从而能够更准确地校正图像中的视角变化,这对于在不同视角下保持跟踪的一致性和准确性至关重要。
在处理匹配成本矩阵时,StrongSORT并未采用DeepSORT中的匹配级联策略。相反,它将匹配问题视为一个简单的线性分配问题,并使用一种更直接的方法来解决。这种方法的优先级是考虑那些具有较近期观测数据的轨迹(tracklets)。这是因为如果跟踪模型本身性能良好,过分复杂的匹配策略反而可能限制跟踪的准确性。通过信任并优先使用优秀的跟踪模型,StrongSORT在匹配过程中避免了不必要的复杂性,从而提高了整体的跟踪准确性。
StrongSORT放弃了级联匹配策略(wOC)。这种改变简化了匹配过程,使得跟踪算法能够更加专注于利用高质量的外观特征和运动信息来进行有效的数据关联,而不是依赖于复杂的级联结构。
5.AFLink
在讨论的在线跟踪中,每一帧图像都会被实时检测并连接追踪单元,这是实时跟踪的过程。然而,在实际应用中,由于检测错误或遮挡等原因,跟踪有时会中断,导致短时间内产生的追踪信息虽然准确但不完整。为了解决这个问题,需要采用一种离线处理方法,也就是所谓的全局链接(Global Linking),它的目的将分散的追踪单元(tracklets)连接在一起,形成一个完整的追踪序列。
AFLink是一种新颖的全局链接方法,它是第一个不依赖外观特征的全局链接机制。在以往的全局链接方法中,例如GIAOTracker中提出的GIModel,通常会使用基于ResNet的深度CNN模型从每个tracklet的帧中提取外观特征,然后将这些特征输入到Transformer Encoder中进行关联性分析。这种方法虽然强大,但模型相对复杂,计算成本高昂,并且由于它依赖于外观特征,容易受到噪声等因素的影响,这也可能成为问题。
相比之下,AFLink在小追踪T
中使用的唯一信息是检测到的帧数f
和当时的位置(x,y)
;两个小追踪Ti
和Tj
的最后30帧的信息Ti=(fk,xk,yk)(k=130)
在卷积层中被压缩和特征提取,Ti
和Tj
是否代表相同的信心水平输出是Ti和Tj是否代表同一个人的轨迹的信心水平。首先,时间块对三个特征``(f、x、y)中的每一个在七帧之间重复压缩时间序列方向。然后应用一个融合块来压缩这三个特征。综合结果被输入到分类器,分类器用Affine
和ReLU
将其转换为置信度。整体情况如下图所示。应该注意的是,为这两个小轨道提供了单独的区块。
时间块只在时间方向(7帧)对每个f,x,y
独立进行卷积。与此相反,融合块压缩了在时间方向上压缩的三维特征。实验中使用的AFLink模型如下图所示。
6.高斯平滑插值
GSI它在在线和离线跟踪过程完成后进行的后处理阶段中发挥重要作用。后处理的一个重要任务是对那些在跟踪过程中遗漏的检测进行插值,以提高轨迹的完整性和精度。
在SDE(Single Detection per Frame per Object)
跟踪框架中,如果检测器在某帧中未能检测到某个物体,那么该物体在该帧中的轨迹就会丢失。为了弥补这些遗漏,可以通过插值方法来重建丢失的轨迹。线性插值是一种简单且广泛使用的方法,它通过在已知检测点之间直线连接来估计中间点的位置。然而,线性插值的精度有限,因为它没有考虑物体的运动信息,导致插值结果可能不够自然或不符合实际情况。
在下图中,蓝色线条展示了线性插值的结果,它简单地在检测到的轨迹之间进行直线插值,但这种方法没有考虑到物体的真实运动轨迹(Ground Truth,简称GT),因此可能无法准确地反映物体在场景中的移动。
为了解决这个问题,GSI(Gaussian Process-based Interpolation)插值方法被提出。GSI插值利用高斯过程对检测误差进行建模,并在此基础上进行插值。这种方法可以更准确地估计物体在丢失帧中的位置,因为它考虑了物体的运动信息和轨迹的连续性。
GSI的核心是一个高斯过程。高斯过程对多维正态分布进行建模,其均值m和协方差K作为a的函数给出,例如,当从a预测b时,对于一些观察到的数据a, b,p(b∣a)=N(m(a),K(a))
。在这种情况下,我们假设在帧数t tt和位置信息(x、y、w、h)
之间分别有条件的多维正态分布p(x∣t)、p(y∣t)、p(w∣t)和p(h∣t∗∗)
。然后,我们估计(x,y,w,h)
在检测失误的帧t。请注意,对每个轨迹i应用一个高斯过程,在文中表示为pt。
RBF
核用于核函数k。分母λ决定了轨迹的平滑性,在本文中被设定为10。
图中显示,帧数和位置坐标用正态分布建模,成功地插值了它们之间的检测误差。StrongSORT++
是加入了这种AFLink
和GSI插值
的StrongSORT
。
7. 实验
7.1 数据集
在评估跟踪算法的性能时,通常会使用公认的基准数据集来进行实验。MOT17和MOT20是两个专门用于人员跟踪的基准数据集。MOT20相比MOT17更具挑战性,因为它包含了更密集的跟踪目标。在进行消融实验时,MOT17训练数据集中每个视频的前半部分用于训练模型,而后半部分则用于验证模型的性能。
7.2 模型设置
StrongSORT算法中使用的外观特征提取器BoT在DukeMTMC数据集上进行了预训练,而检测器YoloX-X则是在COCO数据集上预先训练的。在模型设置中,抑制重复检测的非极大值抑制(NMS)阈值设定为0.8,检测置信度阈值为0.6。AFLink能够在30帧内和75像素范围内将小轨道联系起来,如果输出置信度大于0.95,则认为关联是有效的;GSI内插法将最大可能的插值检测失误设定为20帧。
7.3 评估指标
跟踪准确性的评估通常涉及多个指标,从不同的角度来衡量跟踪的性能:
- MOTA(Multiple Object Tracking Accuracy)是一个侧重于检测准确性的指标,因为它基于跟踪过程中的假阳性、假阴性和ID切换来计算。ID切换是指在跟踪过程中物体的关联错误。
- IDF1是一个侧重于追踪过程中ID匹配的指标,例如,相同数量的ID将导致一个长而稳定的追踪。
- HOTA(Homogeneous Precision, Recall, and F1-score)是一个很平衡的评价指标,它可以同时评估检测精度(DetA)和跟踪方法(AssA)。
7.4 消融实验
为了理解StrongSORT中每个组件的作用,进行了消融实验。通过从基线DeepSORT开始,逐步添加StrongSORT的各个机制,对比在线跟踪的性能变化。这种逐项添加的方式有助于理解每个改进对整体跟踪性能的具体影响,从而验证每个新引入技术的有效性。消融实验是理解算法改进和优化效果的重要步骤,它确保了算法的每个部分都是经过精心设计和测试的。
改进外观特征提取器(BoT)明显改善了IDF1,这表明了外观特征的重要性;增加ECC略微改善了IDF1和MOTA,而相机校正可以提取准确的运动信息。然后,NSA卡尔曼改进了HOTA,但MOTA和IDF1保持不变。当tracklet特征改为EMA时,不仅代表关联准确性的IDF1增加了,而且FPS也提高了,导致速度加快。包括运动信息的成本(Motion Cost)也证实了StrongSORT准确性的提高。最后,StrongSORT在没有匹配级联的情况下执行正常的线性赋值问题,在IDF1中显示出明显的改善,表明级联是没有必要的。
7.5 AFLink和GSI。
这里使用StrongSORT和现有的SoTA模型来宣称AFLink和GSI的优势。上面的StrongSORT消融有v1~v6的顺序,这里用的是其中的v1/v3/v6,CenterTrack、TransTrack和FairMOT是现有的方法,AFLink和GSI处理分别加入到六个模型中。使用的模型如下。
AFLink提高了两个模型的准确性。就GSI而言,与AFLink不同,它对更强的跟踪模型更有效。与线性插值(LI)的比较是针对GSI单独进行的,表明GSI在计算成本略有增加的情况下提高了性能。
如上所述,AFLink和GSI被发现可以提高各种高精度跟踪模型的准确性,而不仅仅是StrongSORT。
7.6 MOTChallenge。
最后是与许多SoTA的比较:用MOT17和MOT20进行验证;没有进行FPS的比较,因为很难比较JDE和SDE,因为在SDE模型中检测阶段的处理时间基本上被忽略了。
首先是MOT17,在所有方法中,StrongSORT++在HOTA/AssA/DetA方面取得了第一名,在MOYA/IDs方面取得了第二名,远远领先于第二名的精确度。
MOT20处理更拥挤的情况。其中,StrongSORT++在HOTA/IDF1/AssA中同样取得了第一名的成绩。特别是,它显示了非常低的ID数量。
这些结果是在没有对每个数据的参数进行任何调整的情况下实现的,这表明了该方法的多功能性。
8.训练与部署
源码地址:https://github.com/dyhBUPT/StrongSORT.git
8.1 环境安装:
sh
conda create -n strongsort python=3.8 -y
conda activate strongsort
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.7 -c pytorch -c nvidia
pip install opencv-python
pip install scipy
pip install scikit-learn==0.19.2
数据集可以从这里下载:https://motchallenge.net/百度网盘地址:https://pan.baidu.com/s/1EtBbo-12xhjsqW5x-dYX8A?pwd=sort
8.2 训练与测试
- 在MOT17-val上运行DeepSORT:
sh
python strong_sort.py MOT17 val
- 在MOT17-val上运行StrongSORT:
sh
python strong_sort.py MOT17 val --BoT --ECC --NSA --EMA --MC --woC
- 在MOT17-val上运行StrongSORT++:
sh
python strong_sort.py MOT17 val --BoT --ECC --NSA --EMA --MC --woC --AFLink --GSI
- 在MOT17-test上运行StrongSORT++:
sh
python strong_sort.py MOT17 test --BoT --ECC --NSA --EMA --MC --woC --AFLink --GSI
- 在MOT20-test上运行StrongSORT++:
sh
python strong_sort.py MOT20 test --BoT --ECC --NSA --EMA --MC --woC --AFLink --GSI