【多目标跟踪学习笔记】基于Transformer的MOT算法对比(TransTrack、TrackFormer、TransCenter、TransMOT、MOTR)

2022.3.20更新了一些内容:由于最近重点研究了TrackFormer,所以更新了TrackFormer的三张流程图和对损失函数的表述(过去的表述不太明确)。其余方法和这个流程大同小异。所谓的query-key机制,就是拿embedding来代表目标,当做Transformer的输入来学习它们之间的关系。


最近看了一些基于Transformer的MOT方法,在此进行一下总结。总共看了题目的五个方法,这些方法发表时间顺序为:

TransTrack(20.12)------TrackFormer(21.1)-----TransCenter(21.3)-----TransMOT(21.4)-----MOTR(21.5)

这五个方法并不都相似,可分为三类:TransMOT单独一类,因为它用的是graph transformer。TransCenter也是单独一类,因为其用的是中心点(学习热度图),而不是bbox。两篇文章的笔记分别见:

TransCenter
TransMOT

此外MOTR的笔记见:MOTR

TransMOT主要批评传统的Transformer并没有很有效地对时空关系进行建模(而graph能直接对空间关系进行建模),TransCenter主要批评基于bbox而不是热度图的方法会让遮挡变得难以处理。

着重对TransTrack、TrackFormer、MOTR进行对比。


先按时间顺序大概叙述TransTrack和TrackFormer大概工作流程,期望从思路、对special event(遮挡、重复、进入、退出)的处理、损失函数的设定等方面对这五种方法进行比较。

  \space  

1.TransTrack的大体流程

在这里插入图片描述
  \space  
在这篇文章里比较系统地讲述了query-key机制query实质上就是目标的代表, 它蕴含着目标的信息。key在过去的工作中表示图像区域,实际上还是query比较重要。

本文将query分为object query和track query:

有两个keys的集合。一个包括object queries目标查询,从现有(DETR)的transformer-based的detector学到。另一个包括从现有的帧当中学习到目标的特征,为了区分,将这个集合叫做“track query“。

第一个集合(object queries)提供新来的目标的信息,第二个track queries则提供相符的目标信息来保持轨迹。

两个集合的bbox被分别预测,然后用简单的IOU匹配来产生最终的目标集合。
  \space  
TransTrack的工作流程大体是:
在这里插入图片描述

  \space  
TransTrack拿一个object query当做输入,来进行检测。另一方面,TransTrack利用之前检测的目标的特征来形成另一个track query去在接下来的帧中关联目标。

这样,TransTrack就生成了平行的两个bbox的集合,叫做“detection boxes”和“tracking boxes”。之后的任务就是将这两个box一一匹配,用的是匈牙利算法(KM算法),cost是IOU,生成一个最终的有序的box set。
  \space  
具体地,
Encoder接受两个相邻帧的feature map作为输入。为了避免重复计算,当前帧的map保留到下一帧再使用。Encoder产生的feature map作为两个decoder的keys。

用了两个平行的Decoder,两个Decoder一个负责目标检测一个负责目标传播。负责目标检测的decoder将已学习的object query作为输入(为何称作已学习的,因为输入的object query首先经过了self-attention),然后预测检测的box。

另一个decoder将之前的帧的目标特征作为输入,叫做track query,然后预测对应的目标在本帧中的位置,产生的bbox叫做tracking boxes。

目标传播任务中,由于继承了之前目标的特征,所以能看到之前的外观信息和位置信息,可以做到更好的预测。

  \space  
对special event的处理:

对于新进入:就是用object query来检测,最后没匹配上的detection box被认为是新轨迹
对于退出:同理,没匹配上的track box被划定为inactive状态,超过一定寿命后放弃。
对于遮挡:作者把遮挡和短期消失作为同等事件来处理。
对于重复检测:没有。
  \space  

损失函数

TransTrack的损失函数比较简单,是分类损失、L1损失和广义IOU损失的加权和。 和MOTR计算单个帧的损失函数一样:

在这里插入图片描述

  \space  
  \space  

2.TrackFormer的大致流程

在这里插入图片描述
  \space  

TrackFormer的工作方式:

每个query代表一个目标,并且在时空上以自回归的方式跟随这个目标。新目标到来的时候,就被静态object queries检测,然后就转变成后来的track queries。因此一共有两种query:

  1. 静态object queries,让模型在任一帧去初始化轨迹
  2. 自回归track queries,负责在帧间追踪目标

在每一帧,Encoder-decoder都处理输入图像的特征和track、object queries,输出分配了id的bbox。

TrackFormer大致分为这四个步骤:

  1. 通过CNN来进行帧级的特征提取
  2. 在Encoder中通过自注意力给特征进行编码
  3. 在Decoder中通过self和cross attention对queries解码
  4. 经过MLP将queries映射成边界框和class(应该就是ID)

  \space  

分别对object queries和track queries进行说明,Encoder-Decoder结构如下:

在这里插入图片描述
  \space  
i. Object queries
在场景中出现的新目标是被固定数量( N o b j e c t N_{object} Nobject)的输出embeddings检测的,每个output embedding用一个静态的和学习的object queries进行对象编码。

每个object query学习预测有特定空间特性的目标,例如bbox和位置。

Decoder的自注意力依赖于目标编码(图中object queries相连的最右线),来避免重复检测和对目标的空间和类别关系进行推理。

ii. Track queries
track queries的作用:实现帧到帧的跟踪迭代。

track queries在一个视频序列中跟随目标,带着目标的id信息,以自回归方式适应变化的位置。

为每个新目标初始化一个track query,和对应的上一帧的output embedding一起。

Transformer对当前帧的feature进行注意,并且decoder queries对目标id和位置进行连续的更新。
decoder中在两种query(track和object)基础上的自注意力可以避免重复检测。

综上,TrackFormer实现了隐式的多帧注意力(实际上是因为track query自回归地传递信息)

  \space  
对special event的处理:

对于新进入:和TransTrack相同,也是是用object query来检测

对于退出:如果分类置信度太低,或者经过NMS计算后IOU的值太低被认为是inactive。在触发remove条件后,寿命到之前,track query被视为inactive的,但如果有个分类置信度高于 σ t r a c k − r e i d \sigma_{track-reid} σtrackreid,那就会复活。

对于遮挡:作者说将空间信息整合到track query中可以应对短期遮挡。TrackFormer不需要额外训练Re-ID网络,保证了整个机制的整体性。

对于重复检测:通过目标编码的形式(object encoding)避免重复检测。

整体算法流程图:
在这里插入图片描述
训练过程中前向传播流程图(重要):
在这里插入图片描述
推理过程匹配算法流程图(重要):
在这里插入图片描述
  \space  
损失函数

TrackFormer的损失函数复杂一些。本质上,对于相邻帧id的集合的关系(差集、交集),它分为了几种情形,对于不同的情形用了不同的处理方式。

具体地,其采用的是双边匹配的策略。

从GT到object和track query的联合集合的映射 π \pi π从track id或者基于bbox相似度和目标类别的cost得到。

假设在 t t t帧的track id的GT是 K t K_t Kt, 则 K t K_t Kt K K K(全体)的一个子集。第一步中的每个检测都被指定到对应的GTtrack id k k k。对应的output embeddings,即track queries,就天然地携带了给下一帧的id信息。

t t t t − 1 t-1 t1的GT描述了 N t r a c k N_{track} Ntrack个track query的硬分配(hard assignment)。

用人话说就是, 以相邻两帧为输入进行训练,不妨记第t帧上的轨迹集为 K t ⊂ K K_t \subset K KtK,上一帧的检测结果被安排的id是上一帧 K t − 1 ⊂ K ​ K_{t − 1} \subset K​ Kt1K中的,它带着id信息作为当前帧的track query,如果当前帧的 K t K_t Kt中仍然存在对应的id,那么将该id的GT分配给该track query,否则给予其背景类表示该目标没出现过,剩下的没有分配的id则按照DETR的思路分配给object query(MOTR也采用的DETR原有的loss)。

在这里插入图片描述

再用人话说,首先根据DETR分配的策略计算令cost最小的最佳匹配:
在这里插入图片描述
上式的意思就是:力求某种排列s.t.两个集合的距离最短。

其中:

在这里插入图片描述
在这里插入图片描述
最终loss:通过所有object和query的loss求和:
在这里插入图片描述
其中:
在这里插入图片描述
对于每个query的loss:

先说了被归为背景类的条件:
若按之前的分配算法,既不属于track id,也不属于 π \pi π映射中的,被认为成背景类。

对于在 π \pi π中的query,loss由两部分组成:bbox和class。class是log损失,对置信度取负对数,bbox就是边界框损失,计算方式和 C b o x C_{box} Cbox相同。

π \pi π到底是什么?
经过最佳匹配得到的 σ ^ \hat{\sigma} σ^决定了分配,也就是GT到queries的分配。这个分配(映射)就是 π \pi π,在这个映射中的query,就按照class和bbox来算损失。不在的,就只有类别损失。

最近在毕设中期里写的对TrackFormer损失函数的解释,觉得比上面更言简意赅:
在这里插入图片描述

  \space  

3.最终对比

3.1 基本思路

名称 基本思路 Encoder-decoder结构
TransTrack query-key机制,组合相邻两帧的特征。object query用来学习检测新目标,track query负责保持轨迹。两个decoder一个负责检测,产生检测框;一个负责目标传播,产生追踪框。两个框通过IoU匹配得到结果。 dual decoder
TrackFormer query-key机制,object query检测新目标,track query负责在帧间追踪目标(同TransTrack).Decoder中将track queries和object queries拼接后输入,MLP将decoder的输出直接映射成class和box。 single decoder,有位置编码和目标编码(object encoding)
TransCenter 孪生网络结构,相邻两帧作为输入。一路检测一路追踪,产生多尺度特征后进行融合,分别进入三个branch进行三个任务:预测中心热度图、预测box的size 、预测位移。 Siamese transformer
TransMOT 用稀疏带权图表示目标间空间关系,过去几帧的图的集合进入Encoder,学习时域空间关系;当前帧的图进入Decoder,学习空间关系,最终产生分配矩阵进行匹配 Graph transformer
MOTR query-key机制,经过CNN backbone和Encoder产生特征,和空查询一起输入Decoder。Decoder输出一个original track query,经过QIM网络学习检测新目标和排除离场目标,经过其中的TAN,融合上一帧的轨迹预测来产生track query(携带本帧目标信息),并传输到下一帧 正常的Encoder-decoder

3.2 special event处理

名称 新进入 退出 遮挡 重复检测
TransTrack 用object query来检测,最后没匹配上的detection box被认为是新轨迹 没匹配上的track box被划定为inactive状态,超过一定寿命后放弃。 视作退出 没特别说
TrackFormer object query检测 分类置信度低或者IoU低,超过阈值恢复 将空间信息整合到track query中可以应对短期遮挡 通过目标编码的形式避免重复检测
TransCenter 经过检测分支进行检测,没匹配到已有的被认为是新轨迹 没匹配上的被认为是sleep(和TransTrack相同) 对于被认为是新轨迹的,会和sleep状态的轨迹进行匹配,用一个额外的Re-ID网络 用热度图,就是为了解决重复检测
TransMOT 用一个虚拟源(virtual source)处理新轨迹,将Encoders输出张量的目标数量维度加一用以学习 用虚拟节点(virtual sink node)和所有节点相连,处理退出和遮挡 同左 对于可能出现的重复检测,对于所有未匹配的候选,将其与所有关联对象匹配。还是计算bbox的重合程度。实际上应该是把重合程度高的删去了。
MOTR 用query处理(本质与TransTrack、TrackFormer相同) 分类置信度低的被认为是退出 没特别说 作者认为将detect queries和track queries拼接起来输入,可以降低对已追踪目标的检测

3.3 损失函数

名称 损失函数构成
TransTrack 分类损失、L1损失、广义IoU损失的加权和
TrackFormer 找到queries和GT最优匹配的映射,对每个query计算loss,由分类损失和bbox损失组成
TransCenter 对热度图定义了loss。当预测点和GT中心点重合时,计算size和track的loss,都是基于1范数。此外还有边框损失,依据中心点GT和预测的尺寸计算的。最后的loss是这四种的加权和。
TransMOT 它的loss没看懂T_T,大概类似于交叉熵
MOTR MOTR训练时将整个video clip作为输入,提出了CAL(集合平均损失),其是每一帧检测和跟踪预测结果和GT的损失的总和与每一帧的GT的总和之比。每一帧的loss由分类损失、L1损失、广义IoU损失的加权和组成。

后记
还有需要完善之处,其实退出和遮挡通常是可以一起处理的。应该再总结一个Re-ID方法的差异。

猜你喜欢

转载自blog.csdn.net/wjpwjpwjp0831/article/details/121392440