赞
踩
记录一下目标跟踪算法的学习历程,分享一些对算法的学习理解。有问题可以留言交流,看到会及时回复。也希望大佬可以指出问题和不足,感谢!
文章全名:Learning Target Candidate Association to Keep Track of What Not to Track
原文地址:https://arxiv.org/abs/2103.16556
代码地址:https://github.com/visionml/pytracking
项目配置:参考站内大佬的教程
马丁大神最新力作(21年的语境),发表在ICCV2021。没有延续DiMP系列算法的改进路线,选择在Base Tracker上附加模块进行优化,研究如何解决相似物干扰挑战(Similar Object Interference)。针对该挑战,马丁组先前已经有过一定的研究:Know Your Surroundings: Exploiting Scene Information for Object Tracking。近年来跟踪方面的文章里也很少有针对该挑战因素的专项研究了,后续目标跟踪相关工作都在致力于主流框架的设计(transformer的崛起)。
最新工作NeighborTrack又重新回到附加模块的研究上,在OSTrack上加入近邻辅助模块来应对遮挡造成的相似物体干扰挑战--2023.5.28
在基于外观的视觉跟踪中,存在与被跟踪目标混淆性相似的物体是一个根本性的挑战。这样的干扰物对象很容易被误分类为目标本身,导致最终跟踪失败。虽然大多数方法努力通过更强大的外观模型来抑制干扰物,但我们采取了一种替代方法。为了继续跟踪目标,提出对干扰物进行跟踪。(We propose to keep track of distractor objects in order to continue tracking the target.)为此引入了一个可学习的目标候选关联网络来逐帧传播所有目标候选者(target candidates)的身份。
我们的方法由一个基本外观跟踪器组成,从中提取每一帧中的目标候选。每个候选人被编码为一组与众不同的特征,由目标分类器得分、位置和外观组成。
将候选物进行定义:
First, we define the set of target candidates, which includes distractors and the sought target, as V = { v i } i = 1 N V=\{v_i\}_{i=1}^{N} V={vi}i=1N where N denotes the number of candidates present in each frame. Using the introduced notation we define the target candidate sets V′ and V corresponding to the previous and current frame, respectively.
引入了垃圾箱这一概念,来处理前后帧图像内新出现或者消失的目标候选物的配对问题。大概思路见图:
上一帧内的n个候选物,必须再当前帧有匹配关系。常见结果为保持匹配跟踪(见黑1和红1),特殊情况有:1.消失(见绿1)2.新出现(见黄1)
位置特征:
“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.”
首先假设相同的物体从帧到帧的运动很小,不同物体之间的位置相似,距离相似。这样,一个目标候选者的位置
c
i
c_i
ci形成了一个强有力的线索。
置信度特征:
假设每个对象在外观上只发生微小变化,因此使用目标分类器得分
s
i
=
s
(
c
i
)
s_i = s ( c_i )
si=s(ci)作为另一个线索。
基于外观的特征:
为了加入更具判别性的基于外观的特征
f
i
=
f
(
c
i
)
f_i = f ( c_i )
fi=f(ci),我们对骨干特征(在基线跟踪器中使用)使用单个可学习卷积层进行处理。
其中
ψ
ψ
ψ 表示多层感知器 (MLP),它将 s 和 c 映射到与
f
i
f_i
fi 相同的维度空间。这种编码允许对外观、目标相似性和位置进行联合推理。具体代码如下:
''' 特征提取代码 ''' 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'])
为了进一步丰富编码特征,特别是为了在了解相邻候选者的同时促进特征提取,我们采用了候选者嵌入网络。将关联问题近似处理为稀疏特征匹配任务,引入了SuperGlue结构进行特征关联(不用细看这部分内容,知道是干嘛的就行)。最终得到候选物特征hi。
对特征进行点积操作得到相似矩阵S。这里S还没有加入垃圾箱机制,因此需要根据前边讲述的规则对S矩阵进行扩充,将过去帧和当前帧的候选物进行匹配,并确保每个候选物都有对应的匹配结果(无匹配物就与垃圾箱匹配)
讲述了如何进行对象关联,以及关联过程中各种参数的设置。这些东西看了代码就都清楚了,不多阐述。
改进了模版更新机制,不单纯依照时间顺序或者分数大小进行模版保存和更新。写的很复杂,这部分建议去看下代码。
针对视觉追踪中分心物之间缺乏真实背景对应关系的问题,提出了部分标注和自我监督相结合的训练策略。
人话就是拿有标注的图片对进行训练,这些图片对的获取后续会讲到。
Loss:
L
s
u
p
=
−
l
o
g
A
l
′
,
l
L_{sup} = − log A_{l^′,l}
Lsup=−logAl′,l
通过人为地模拟关联问题来进行自我监督。人话就是自己写算法对一张图片生成它的图片对,自动设计出不同的干扰情况以及相对应的标注。
Loss:
L
s
e
l
f
=
∑
−
l
o
g
A
l
′
,
l
L_{self} = \sum− log A_{l^′,l}
Lself=∑−logAl′,l
L t o t = L s u p + L s e l f L_{tot} = L_{sup} + L_{self} Ltot=Lsup+Lself
首先在没有学习到判别损失参数的情况下重新训练基础跟踪器 SuperDiMP,保持其他一切不变。将 LaSOT 训练集分成训练集和训练集。在所有序列上运行base tracker,并保存每帧的搜索区域和分类分支输出的得分图。使用所存储的数据来进行数据挖掘,同时提取目标候选者及其特征为候选关联模块的训练做准备。
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.
对提出的几个改进点进行了消融实验:模版存储置信度、搜索区域自适应增加以及候选关联网络。
对提出的不同监督损失也进行了消融实验分析,可以看出效果还是不错的。
效果在当年还是比较炸裂的,在这之后transformer系列算法就占据主导地位了,优秀的纯cnn算法基本销声匿迹了。当然它的效果建立在牺牲速度的基础上,速度勉强能说是凑合。
选自家的跟踪器作为基准很合理,不过surperdimp在当时的表现也确实很不错。base tracker就不多说了,站里很多帖子。
使用LaSOT 训练集来训练我们的目标候选关联网络。特别地,将1120个训练序列随机分割成一个train-train(1000个序列)和一个train-val(120个序列)集。在所有序列上运行基础跟踪器,并为每一帧存储目标分类器得分图和搜索区域。在训练过程中,我们利用得分图和搜索区域来提取目标候选对象及其特征,以提供数据来训练目标候选对象的关联网络。
将提取出来的数据集分为下列几类,每一类代表一种跟踪情况。
个人认为是一个做的比较优秀的跟踪算法附加模块,效果也很不错。尤其是,它的性能表现跟早期的一些transformer架构的跟踪器不相上下。透露出来的潜在信息是:在如今猛搞新框架的卷海之中,针对具体挑战因素设计附加模块组件是个值得研究的好路子。
后续有啥没说到的再添加进来,准备把代码部分一些东西也放这里记录一下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。