前言

记录一下目标跟踪算法的学习历程,分享一些对算法的学习理解。有问题可以留言交流,看到会及时回复。也希望大佬可以指出问题和不足,感谢!


一、KeepTrack目标跟踪算法简介

文章全名:Learning Target Candidate Association to Keep Track of What Not to Track


马丁大神最新力作(21年的语境),发表在ICCV2021。没有延续DiMP系列算法的改进路线,选择在Base Tracker上附加模块进行优化,研究如何解决相似物干扰挑战(Similar Object Interference)。针对该挑战,马丁组先前已经有过一定的研究:Know Your Surroundings: Exploiting Scene Information for Object Tracking。近年来跟踪方面的文章里也很少有针对该挑战因素的专项研究了,后续目标跟踪相关工作都在致力于主流框架的设计(transformer的崛起)。

最新工作NeighborTrack又重新回到附加模块的研究上,在OSTrack上加入近邻辅助模块来应对遮挡造成的相似物体干扰挑战--2023.5.28

目标跟踪卡尔曼离散模型 目标跟踪 算法_算法

二、贡献

1.keep track

在基于外观的视觉跟踪中,存在与被跟踪目标混淆性相似的物体是一个根本性的挑战。这样的干扰物对象很容易被误分类为目标本身,导致最终跟踪失败。虽然大多数方法努力通过更强大的外观模型来抑制干扰物,但我们采取了一种替代方法。为了继续跟踪目标,提出对干扰物进行跟踪。(We propose to keep track of distractor objects in order to continue tracking the target.)为此引入了一个可学习的目标候选关联网络来逐帧传播所有目标候选者(target candidates)的身份。

目标跟踪卡尔曼离散模型 目标跟踪 算法_人工智能_02

1.1 概述

我们的方法由一个基本外观跟踪器组成,从中提取每一帧中的目标候选。每个候选人被编码为一组与众不同的特征,由目标分类器得分、位置和外观组成。

  1. 采用Super DiMP作为base tracker,该跟踪器使用DiMP中的目标分类器和PrDiMP中的概率包围盒回归,并改进了训练设置。利用基本跟踪器得到候选物的一系列特征:目标分类器分数 si,图像中的位置 ci,以及基于基础跟踪器的主干特征的外观提示 目标跟踪卡尔曼离散模型 目标跟踪 算法_python_03
  2. 将这组特征编码为候选物的单个特征向量目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪_04
  3. 将这些特征和前一帧的特征一起送入候选嵌入网络模块,为每个候选物生成更丰富的嵌入特征.利用这些特征计算相似度矩阵S,再利用最优匹配策略估计两个连续帧之间的分配矩阵A。
  4. 一旦估计了候选到候选的分配概率,我们就构建了场景 O 中当前可见对象的集合,并将它们与先前识别的对象 O′ 相关联,便可确定哪些对象消失了、新出现了或保持可见,并且可以明确关联。
  5. 此外,当在线更新目标分类器时,我们计算目标检测置信度 目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_05

1.2 问题表述

将候选物进行定义:

First, we define the set of target candidates, which includes distractors and the sought target, as 目标跟踪卡尔曼离散模型 目标跟踪 算法_人工智能_06

引入了垃圾箱这一概念,来处理前后帧图像内新出现或者消失的目标候选物的配对问题。大概思路见图:

目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪_07


上一帧内的n个候选物,必须再当前帧有匹配关系。常见结果为保持匹配跟踪(见黑1和红1),特殊情况有:1.消失(见绿1)2.新出现(见黄1)

1.3 目标候选提取

  • 位置特征:
    “First, we assume small motion of the same objects from frame to frame and thus similar locations and similar distances between different objects. Thus, the position ci of a target candidate forms a strong cue.”
    首先假设相同的物体从帧到帧的运动很小,不同物体之间的位置相似,距离相似。这样,一个目标候选者的位置目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪卡尔曼离散模型_08形成了一个强有力的线索。
  • 置信度特征:
    假设每个对象在外观上只发生微小变化,因此使用目标分类器得分目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪_09作为另一个线索。
  • 基于外观的特征:
    为了加入更具判别性的基于外观的特征目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_10,我们对骨干特征(在基线跟踪器中使用)使用单个可学习卷积层进行处理。
解释一下对于几种特征的提取和融合:

目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_11


其中 目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪_12 表示多层感知器 (MLP),它将 s 和 c 映射到与 目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_13

'''
	特征提取代码
'''
class DescriptorExtractor(nn.Module):
    def __init__(self, backbone_feat_dim, descriptor_dim, kernel_size=4):
        super().__init__()

        self.conv = nn.Conv2d(in_channels=backbone_feat_dim, out_channels=descriptor_dim, kernel_size=kernel_size,
                              padding=kernel_size // 2, bias=True)  

    def forward(self, x, coords):
        feats = self.conv(x)  
        assert torch.all(coords >= 0) and torch.all(coords < feats.shape[3])
        desc = feats[torch.arange(x.shape[0]).unsqueeze(1), :, coords[:, :, 0].long(),
               coords[:, :, 1].long()]  # 提取候选物的特征
        return desc.permute(0, 2, 1)
'''
	特征融合
'''
desc0 = desc0 + self.kenc(kpts0, data['scores0'])  # 三个clue拼接起来  直接相加
desc1 = desc1 + self.kenc(kpts1, data['scores1'])

1.4 候选嵌入网络

为了进一步丰富编码特征,特别是为了在了解相邻候选者的同时促进特征提取,我们采用了候选者嵌入网络。将关联问题近似处理为稀疏特征匹配任务,引入了SuperGlue结构进行特征关联(不用细看这部分内容,知道是干嘛的就行)。最终得到候选物特征hi。

目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_14

1.5 候选匹配

对特征进行点积操作得到相似矩阵S。这里S还没有加入垃圾箱机制,因此需要根据前边讲述的规则对S矩阵进行扩充,将过去帧和当前帧的候选物进行匹配,并确保每个候选物都有对应的匹配结果(无匹配物就与垃圾箱匹配)

目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_15

1.6 对象关联

讲述了如何进行对象关联,以及关联过程中各种参数的设置。这些东西看了代码就都清楚了,不多阐述。

目标跟踪卡尔曼离散模型 目标跟踪 算法_人工智能_16

1.7 更新机制

改进了模版更新机制,不单纯依照时间顺序或者分数大小进行模版保存和更新。写的很复杂,这部分建议去看下代码。


2.数据挖掘

针对视觉追踪中分心物之间缺乏真实背景对应关系的问题,提出了部分标注和自我监督相结合的训练策略。

2.1 部分监督

人话就是拿有标注的图片对进行训练,这些图片对的获取后续会讲到。
Loss:目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_17

2.2 自我监督

通过人为地模拟关联问题来进行自我监督。人话就是自己写算法对一张图片生成它的图片对,自动设计出不同的干扰情况以及相对应的标注。
Loss:目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪_18

目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_19

2.3 数据挖掘

首先在没有学习到判别损失参数的情况下重新训练基础跟踪器 SuperDiMP,保持其他一切不变。将 LaSOT 训练集分成训练集和训练集。在所有序列上运行base tracker,并保存每帧的搜索区域和分类分支输出的得分图。使用所存储的数据来进行数据挖掘,同时提取目标候选者及其特征为候选关联模块的训练做准备。

3.New state-of-the-art

Our tracker sets a new state-of-the-art on six benchmarks, achieving an AUC score of 67.2% on LaSOT and a +6.1% absolute gain on the OxUvA long-term dataset.

目标跟踪卡尔曼离散模型 目标跟踪 算法_python_20

消融实验

对提出的几个改进点进行了消融实验:模版存储置信度、搜索区域自适应增加以及候选关联网络。

目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪卡尔曼离散模型_21


对提出的不同监督损失也进行了消融实验分析,可以看出效果还是不错的。

目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪卡尔曼离散模型_22

实验结果

目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪_23


目标跟踪卡尔曼离散模型 目标跟踪 算法_算法_24


目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪卡尔曼离散模型_25

效果在当年还是比较炸裂的,在这之后transformer系列算法就占据主导地位了,优秀的纯cnn算法基本销声匿迹了。当然它的效果建立在牺牲速度的基础上,速度勉强能说是凑合。


三、关键点解释

base tracker–Surper DiMP

选自家的跟踪器作为基准很合理,不过surperdimp在当时的表现也确实很不错。base tracker就不多说了,站里很多帖子。

Data-Mining

使用LaSOT 训练集来训练我们的目标候选关联网络。特别地,将1120个训练序列随机分割成一个train-train(1000个序列)和一个train-val(120个序列)集。在所有序列上运行基础跟踪器,并为每一帧存储目标分类器得分图和搜索区域。在训练过程中,我们利用得分图和搜索区域来提取目标候选对象及其特征,以提供数据来训练目标候选对象的关联网络。

将提取出来的数据集分为下列几类,每一类代表一种跟踪情况。

目标跟踪卡尔曼离散模型 目标跟踪 算法_目标跟踪卡尔曼离散模型_26


总结

个人认为是一个做的比较优秀的跟踪算法附加模块,效果也很不错。尤其是,它的性能表现跟早期的一些transformer架构的跟踪器不相上下。透露出来的潜在信息是:在如今猛搞新框架的卷海之中,针对具体挑战因素设计附加模块组件是个值得研究的好路子。