这次做一篇2D多目标跟踪中使用对比学习的一些方法.
对比学习通过以最大化正负样本特征距离, 最小化正样本特征距离的方式来实现半监督或无监督训练. 这可以给训练MOT的外观特征网络提供一些启示. 使用对比学习做MOT的鼻祖应该是QDTrack, 本篇博客对QDTrack及其后续工作做一个总结.
持续更新...
1. QDTrack
论文: QDTrack: Quasi-Dense Similarity Learning for Appearance-Only Multiple Object Tracking (TPAMI2023)
1.1 主要思想
外观特征在跟踪中是非常重要的线索. 训练外观特征网络的方式有很多, 例如最开始JDE, Fairmot将外观特征网络的训练问题转换为分类问题, 也即每个目标(identity)都自成一类. 然而, 这样一个数据集中可能有成千上万个类, 但是外观特征的维度往往不会很大, 这样就给这个分类网络的训练带来了一定的困难.
如果采用对比学习的方式, 我们每次只关注若干正样本和若干负样本, 我们要做的就是拉大正负样本之间的距离就可以了, 实际上这时候就减少了一些训练的难度. 然而, 我们知道, 对于对比学习来说, 通常来讲样本量越多越好, batch size越大越好. 基于这个认识, QDTrack提出了一种密集采样的方法增大正负样本数量, 进而提高对比学习性能. 同时, 将MOT的关联问题就转换为了求特征距离, 不需要依赖于运动特征.
1.2 具体方法
训练过程
算法流程是这样的. 首先, 选定一帧 I 1 I_1 I1表示key frame, 然后在其附近的时序上再随机采样一帧 I 2 I_2 I2作为reference frame. QDTrack是可以和检测器一起端到端训练的, 因此我们可以根据检测器的结果定位每个目标, 并采用ROI Align方法将每个目标对应区域的特征都提出来.
正负样本的定义 : 对于预测的一个边界框, 如果它和某个真值的IoU大于 α 1 \alpha_1 α1, 则认为该边界框是真值的正样本; 如果IoU大于 α 2 \alpha_2 α2, 则认为该边界框是真值的负样本. 对于时序上, key frame和reference frame的两个边界框对应同一个目标, 则该样本对为正, 否则为负.
如果key frame上有 V V V个样本, reference frame上有 K K K个样本, 则对于一个正样本对 ( v , k + ) (\mathbf{v}, \mathbf{k^+}) (v,k+), 损失函数为:
L e m b e d = − log exp ( v k + ) exp ( v k + ) + ∑ k − exp ( v k − ) \mathcal{L}{embed} = - \log \frac{ \exp ({\mathbf{v} \mathbf{k^+}})} {\exp ({\mathbf{v} \mathbf{k^+}})+\sum{\mathbf{k^-}}\exp ({\mathbf{v} \mathbf{k^-}})} Lembed=−logexp(vk+)+∑k−exp(vk−)exp(vk+)
其中 v , k + , v , k − \mathbf{v}, \mathbf{k^+}, \mathbf{v}, \mathbf{k^-} v,k+,v,k−分别表示key frame的某个样本, 以及它对应的正负样本的特征,
在QDTrack的设计中, 最重要的就是通过密集匹配去增加样本对. 也就是说, 一个key frame的样本要和所有reference frame的样本进行对应. 损失要对所有的正样本求和, 有:
L e m b e d = − ∑ k + log exp ( v k + ) exp ( v k + ) + ∑ k − exp ( v k − ) \mathcal{L}{embed} = - \sum{\mathbf{k^+}}\log \frac{ \exp ({\mathbf{v} \mathbf{k^+}})} {\exp ({\mathbf{v} \mathbf{k^+}})+\sum_{\mathbf{k^-}}\exp ({\mathbf{v} \mathbf{k^-}})} Lembed=−k+∑logexp(vk+)+∑k−exp(vk−)exp(vk+)
整理一下:
L e m b e d = − ∑ k + log exp ( v k + ) exp ( v k + ) + ∑ k − exp ( v k − ) = ∑ k + log exp ( v k + ) + ∑ k − exp ( v k − ) exp ( v k + ) = ∑ k + log [ 1 + ∑ k − exp ( v k − − v k + ) ] \mathcal{L}{embed} = - \sum{\mathbf{k^+}}\log \frac{ \exp ({\mathbf{v} \mathbf{k^+}})} {\exp ({\mathbf{v} \mathbf{k^+}})+\sum_{\mathbf{k^-}}\exp ({\mathbf{v} \mathbf{k^-}})} \\ = \sum_{\mathbf{k^+}}\log \frac{\exp ({\mathbf{v} \mathbf{k^+}})+\sum_{\mathbf{k^-}}\exp ({\mathbf{v} \mathbf{k^-}})} {\exp ({\mathbf{v} \mathbf{k^+}})} \\ =\sum_{\mathbf{k^+}}\log [1 + \sum_{\mathbf{k^-}}\exp(\mathbf{v} \mathbf{k^-}-\mathbf{v} \mathbf{k^+}) ] Lembed=−k+∑logexp(vk+)+∑k−exp(vk−)exp(vk+)=k+∑logexp(vk+)exp(vk+)+∑k−exp(vk−)=k+∑log[1+k−∑exp(vk−−vk+)]
上面这个式子将外层的求和放到log里就是连乘号, 计算量比较大, 因此作者采用了一种等价的方式:
L e m b e d = log [ 1 + ∑ k + ∑ k − exp ( v k − − v k + ) ] \mathcal{L}{embed} = \log [1 + \sum{\mathbf{k^+}} \sum_{\mathbf{k^-}}\exp(\mathbf{v} \mathbf{k^-}-\mathbf{v} \mathbf{k^+}) ] Lembed=log[1+k+∑k−∑exp(vk−−vk+)]
同时, 还加入了一个辅助的损失函数, 使得正样本对之间相似度接近1, 否则接近0:
L a u x = ( v k ∣ ∣ v ∣ ∣ ∣ ∣ k ∣ ∣ − c ) 2 \mathcal{L}_{aux} = (\frac{\mathbf{v} \mathbf{k}}{||\mathbf{v} |||| \mathbf{k}||} - c)^2 Laux=(∣∣v∣∣∣∣k∣∣vk−c)2
其中正样本对对应的是 c = 1 c=1 c=1, 否则 c = 0 c=0 c=0.
为了和检测器端到端训练, 最终的损失函数就是检测损失, L e m b e d , L a u x \mathcal{L}{embed}, \mathcal{L}{aux} Lembed,Laux的加权和.
推理过程
推理过程主要是两个创新点. 一个是类间NMS, 这是因为有时候检测器的分类会不准确, 导致同一个目标, 但是出现两个重叠边界框, 这两个边界框被分到不同的类. 所以作者采用了一个类间NMS.
一个是对于外观相似度计算, 没有简单地采用余弦相似度的形式, 而是采用了双向softmax. 本质是差不多的, 就是softmax考虑了所有样本的信息计算相似度. 从消融实验的结果看, 采用密集正样本和双向softmax对效果的提升都是比较明显的.
2. Towards Discriminative Representation: Multi-view Trajectory Contrastive Learning for Online Multi-object Tracking
论文: Towards Discriminative Representation: Multi-view Trajectory Contrastive Learning for Online Multi-object Tracking (CVPR2022)
2.1 主要思想
类似于QDTrack这种方法, 往往只在相邻的时域当中取样本对, 而没有很好地利用整个轨迹时域上的信息. 针对这个问题, 这篇工作利用历史轨迹的信息更全面地描述一个目标, 进行对比学习.
他们将历史轨迹表示成一个向量, 并存储到一个动态的memory bank中. 并以此构建了以轨迹为中心的对比学习, 就可以利用好丰富的帧间信息. 这就是题目Multi-view的由来.
2.2 具体方法
论文的创新点一共有三个, 下面逐一介绍:
1.Learnable view sampling
作者的方法称为MTrack. MTrack是基于Fairmot改的. 当然, Fairmot是基于CenterNet, 把backbone换成了DLA-34. CenterNet是以点作为目标中心, 无锚检测器, 但作者认为只用一个点代表目标是不行的, 是因为目标的中心点可能被遮挡, 并且为对比学习产生的样本对也不足.
为了解决这个问题, 作者就加了一个线性层, 去根据目标的中心点坐标预测更多的采样点坐标 , 当然, 采样点要在边界框的范围内. 这些采样点都代表了同一个目标, 也就产生了很多正样本. (注意一个点的特征直接就是从预测的heatmap上提取的).
2. Trajectory-center memory bank
作者是如何用一个向量代表一个历史轨迹的呢?
在训练阶段, 网络以许多帧作为输入, 并检测出每个帧中所有的检测样本. 根据Learnable view sampling, 每个检测样本可以衍生出 N k N_k Nk个特征向量.
在训练阶段, 每个检测都有对应的轨迹ID (为什么? 作者没有解释). 那么, 我们就可以以当前帧检测的特征去更新memory bank中的特征. 当然, 作者在这里选择的策略是"hardest sample", 也就是选择特征最不相似的一个(用余弦距离衡量)线性更新memory bank中的对应特征.
对于损失函数, 对每一个外观特征向量 v ~ l k \tilde{v}_l^k v~lk (下标 l l l表示属于的ID, 上标 k k k表示序数), 去拉进它和它对应ID轨迹中心的距离, 放大它和其他ID轨迹中心的距离, 采用对比学习常用的InfoNCE Loss: (Softmax + 一个temperature parameter):
L N C E k = − log exp ( v ~ l k c l ) / τ ∑ i exp ( v ~ l k c i ) / τ L_{NCE}^k = - \log \frac{\exp (\tilde{v}_l^k c_l) / \tau} {\sum_i \exp (\tilde{v}_l^k c_i) / \tau} LNCEk=−log∑iexp(v~lkci)/τexp(v~lkcl)/τ
因此, 对于所有的外观embedding, 总损失为
L T C L = 1 N a ∑ k = 1 N a L N C E k L_{TCL} = \frac{1}{N_a} \sum_{k=1}^{N_a} L_{NCE}^k LTCL=Na1k=1∑NaLNCEk
最终的损失仿照Fairmot, 采用uncertainty loss.
总的训练框图如下:
推理阶段比较正常, 主要是提出了一个根据历史和现在特征余弦相似度度进行轨迹特征融合的方法. 如果和过去相似, 就取信于当前的特征, 否则不取信. 这个也是很多方法都有的.
3. Uncertainty-aware Unsupervised Multi-Object Tracking
论文:Uncertainty-aware Unsupervised Multi-Object Tracking (ICCV2023)
3.1 主要思想
对于无监督MOT, 由于没有目标ID的标签, 那么只能通过一些相似度准则生成伪标签. 然而, 如果发生错误, 这种错误在帧间是会累积的. 为了解决这个问题, 作者认为不确定性是不可避免的(不确定性就指的是在无标签的情况下, 两个不同的相似目标容易混淆, 或者同一个目标产生了遮挡或模糊, 也容易认为是两个目标), 但可以利用不确定性去提升效果(在我理解就是降低不确定性).
既然无监督是训练外观特征提取网络, 那么当外观发生不确定的时候怎么办呢? 那就融合运动特征(IoU)就可以. 这就是这篇文章主要创新点.
此外, 为了增大样本数量, 除了利用历史轨迹外, 该方法还采取了数据增强策略. 然而, 传统对比学习的增强方式不利于跟踪的学习, 因为他们增强并没有融合轨迹的运动信息. 为了解决这个问题, 作者将 t t t, t − τ t - \tau t−τ帧的仿射变换求解出来, 然后根据历史轨迹形成当前帧"应该"长成的样子, 这样就增大了样本数量.
3.2 具体方法
不确定度的衡量
在无监督训练的时候, 我们根据外观相似度将 t − 1 t-1 t−1帧的目标与 t t t帧目标进行匹配, 匹配矩阵为:
C ∈ R M t × M t − 1 , c i , j = f i t ⋅ f j t − 1 \mathbf{C}\in \mathbb{R}^{M^t \times M^{t-1}}, c_{i, j} = \mathbf{f}_i^t \cdot \mathbf{f}_j^{t-1} C∈RMt×Mt−1,ci,j=fit⋅fjt−1
然而, 有两种情况可能让余弦相似度失真: 1) 目标自身发生遮挡或者模糊, 让相似度减小; 2) 相似目标的存在, 使得不该大的相似度变大.
也就是:
c i , j < m 1 , c i , j − c i , j 2 < m 2 c_{i, j} < m_1, c_{i, j} - c_{i, j2} < m_2 ci,j<m1,ci,j−ci,j2<m2
其中 m 1 , m 2 m_1, m_2 m1,m2是常数. 理想的情况, 我们应该让 c i , j c_{i, j} ci,j接近1, 而 c i , j 2 c_{i, j2} ci,j2接近0. 为了一起衡量以上两种情况, 作者定义不确定度:
σ i , j = − log c i , j − log ( 1 − c i , j 2 ) \sigma_{i, j} = - \log c_{i, j} - \log (1 - c_{i, j2}) σi,j=−logci,j−log(1−ci,j2)
该不确定度的下界为
σ i , j ≥ γ i , j = − log m 1 − log ( 1 + m 2 − c i , j ) \sigma_{i, j} \ge \gamma_{i, j} = - \log m_1 - \log (1 + m_2 - c_{i, j}) σi,j≥γi,j=−logm1−log(1+m2−ci,j)
因此总的不确定度表现为不确定度和下界值的差:
δ i , j = σ i , j − γ i , j \delta_{i, j} = \sigma_{i, j} - \gamma_{i, j} δi,j=σi,j−γi,j
以上就是不确定度的验证过程.
验证出了不确定度后, 就要进行修正.
修正主要是考虑两点: 1) 历史的外观信息 2) 运动信息(IoU)
因此, 新的代价矩阵变为:
C ′ ∈ R M t ′ × M t − 1 ′ , c i , j ′ = ( 1 K ∑ t ^ = t − K t − 1 f i t ⋅ f j t ^ ) × I ( IoU ( b i t , b j t − 1 ) > β ) \mathbf{C}'\in \mathbb{R}^{M^{t'} \times M^{t-1'}}, \\ c_{i, j}^{\prime}=\left(\frac{1}{K} \sum_{\hat{t}=t-K}^{t-1} \boldsymbol{f}_i^t \cdot \boldsymbol{f}_j^{\hat{t}}\right) \times \mathbb{I}\left(\operatorname{IoU}\left(b_i^t, b_j^{t-1}\right)>\beta\right) C′∈RMt′×Mt−1′,ci,j′= K1t^=t−K∑t−1fit⋅fjt^ ×I(IoU(bit,bjt−1)>β)
轨迹数据增强
这一块其实就是利用图像之间的仿射变换矩阵, 根据现有帧推测出历史帧长成什么样子, 就得到了增强的图像.
对于增强图像, 也是通过前面不确定度进行匹配衡量. 具体的, 对于第 i i i个轨迹, 轨迹长度为 n n n, 这段时间它的不确定度为
Ω i = 1 n ∑ s = t 0 t exp ( δ i s ) \Omega_i=\frac{1}{n} \sum_{s=t_0}^t \exp \left(\delta_i^s\right) Ωi=n1s=t0∑texp(δis)
我们按照如下Softmax形式的原则将增强图像中的轨迹 a a a认为和 i i i是同一个
:
p ( a = i ∣ t ) = exp ( − Ω i ) ∑ i ^ = 1 M t exp ( − Ω i ^ ) p(a=i \mid t)=\frac{\exp \left(-\Omega_i\right)}{\sum_{\hat{i}=1}^{M^t} \exp \left(-\Omega_{\hat{i}}\right)} p(a=i∣t)=∑i^=1Mtexp(−Ωi^)exp(−Ωi)
上面的概率越大表明二者关联的概率越大.
此外, 作者还通过历史轨迹中"最困难"的样本进行学习, 也就是表现在不确定度最大的时候:
p ( π = t − τ ∣ a ) = exp ( δ a t − τ ) ∑ τ ^ = t 0 t − 1 exp ( δ a t − τ ^ ) p(\pi=t-\tau \mid a)=\frac{\exp \left(\delta_a^{t-\tau}\right)}{\sum_{\hat{\tau}=t_0}^{t-1} \exp \left(\delta_a^{t-\hat{\tau}}\right)} p(π=t−τ∣a)=∑τ^=t0t−1exp(δat−τ^)exp(δat−τ)
整体框图如下:
具体实现
在具体实现上, 类似JDE, 作者给YOLOX加了一个reid head进行训练的. 对比学习损失采用经典的InfoNCE.