论文阅读笔记4——MOTR: End-to-End Multiple-Object Tracking with TRansformer(利用Transformer进行多目标跟踪)

MOTR是首个基于端到端Transformer的多目标追踪模型,摒弃了传统的启发式算法,通过trackquery对每个object的track建模,实现时序数据关联。它利用轨迹感知的标签分配方法(TALA)解决一对一对应问题,通过时间聚合网络(TAN)和集体平均损失(CAL)强化长时序学习。实验表明,MOTR在MOT16和17数据集上表现出色,验证了Transformer在追踪领域的潜力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首个完全基于端到端 Transformer 的多目标追踪模型,21年5月上传到arxiv上。

论文:论文
代码:代码

  \space  

1. Abstract

摘要大概由两部分组成,一是过去启发式算法的缺陷,二是MOTR的基本思路。

他说MOT问题的关键在于时序上的建模。过去的空间和外观相似度的这种启发式算法虽然简单,但是缺乏学习时域上的变化。

MOTR的基本思路是利用一个叫 “track query” 的东西,每个track query对一个object的整个track建模,它以逐帧的方式去传输和更新,并以无缝的方式迭代预测。 这样,MOTR就隐式地进行时序上的数据关联,并避免用显式的启发式算法。

(By the way,这种为单个object分配一个东西的算法并非首个,记得一个类似的工作:Ren et al.

L. Ren,J. Lu,Z. Wang,Q. Tian,J. Zhou, Collaborative deep reinforcement learning for multi-object tracking, in: ECCV

利用强化学习进行多目标跟踪,算法由两部分组成:预测网络和决策网络。决策网络中,为每个target创建一个agent,这些agent组成一个协作系统(collaborative system),其并不是孤立的,而是和环境相互作用,最大化共享效用函数(shared utility function)。之后每个agent通过一定的算法来决定当前采取何种行动)

  \space  
关于track query和object track的一对一分配问题,提出了轨迹感知的标签分配方法(Tracklet-aware label assignment)。

为了增强长时序的学习,提出了时间聚集网络和集体平均损失(Temporal aggregation network and collective average loss)

这些概念要看后文的解释,在这里还是一头雾水。

  \space  

2. Introduction

Introduction部分主要介绍了MOTR的大体思路。

在一开始还是又强调了一下MOTR是第一个端对端的,不用显式方式(例如IOU)进行数据关联的,能同时学习外观和位置变化的算法。

由于MOTR是基于DETR的,因此简单介绍了一下DETR的思路。

  • DETR把detection视作set(集合) prediction的问题。充当解耦合的object的代表,叫做object
    query(和本文的track query有相似之处),与feature相结合。作为Transformer Decoder的输入。

    它用二部匹配实现object query和ground truth的一一匹配,而没用那些后处理,例如NMS(前面提到post-process无法使模型成为端到端的结构)

  \space  
接下来文章提到,MOT和机器翻译有相似之处,MOT也可以看作是序列预测的问题。 而上文提到的DETR是集合预测的问题。

  • 将MOT也视作sequence预测的问题,每个sequence对应一个object的轨迹。因此他们拓展DETR中object query的功能,叫做track query。如前所述,每个track query应该负责一个object的预测。

    根据Transformer模型,track queries(注意,复数的track queries可以认为是track query的集合)就是作为一个hidden state,参与迭代运算。具体地,track query的更新不仅依赖于自注意力,而且还有和多帧特征的cross-attention。

    更新的track query会进一步用于预测bounding box。一个object的轨迹就是track query的更新的序列。

    上面这句话非常关键,原文是:

The updated track queries are further used to predict the bounding boxes.All predictions of one track query naturally form the track of one object.

  \space  
接下来,说到将MOT视作sequence预测的两个主要问题:

1.如何保证一个track query跟踪一个object,应该就是一一对应的问题。

  • 为此引入了TALA(轨迹感知的标签分配方法),每个track query的预测都在同一个ID的边界框序列的监督之下。

2.如何处理新进入的和离开的object。

  • 他做了一个track query的集合,new born的就加入,dead的就移除。这样就可以避免用IoU这种显式的关联方法。

  \space  
在下文中,作者用了一个递进词"Moreover",但好像没有明显的递进关系…后面作者逐一解释了CAL(集体平均损失)和TAN(时间聚合网络)的作用

他说在track query的迭代更新的过程中,实际上就可以学习外观和位置特征的时序变化。为了加强这个长时间学习,提出了CAL(集体平均损失)和TAN(时间聚合网络)。

MOTR整体参数的更新都依据全局的loss。TAN通过多头注意力机制提供了track query从历史状态中来合计历史信息的捷径。(但并没有说track query为什么要合计历史信息…)

  \space  
  \space  
3.Related work

Related work里没有太大的信息量,主要介绍了Transformer结构的发展史,MOT的发展史和seq2seq模型的大致运作方式。
  \space  
  \space  

4.Method

这部分首先又说了一下DETR的大致流程,然后说Track query和Detect query(就是DETR里object query,为了区分故换称呼)的关系,然后介绍了为了解决第一个problem而提出的TALA,之后介绍了整个MOTR的架构,之后介绍了MOTR架构里的Query Interaction Module和训练时用的损失函数Collective Average Loss。

(我感觉这部分的逻辑有点乱…所以就不按书写顺序记了,尽力按我理解的逻辑顺序记。)

顺序:

  1. 总体工作流程
  2. QIM工作流程和TALA是什么
  3. CAL是什么

  \space  
直接看MOTR的框图:

在这里插入图片描述
  \space  

4.1 总体工作流程:

为了方便,暂且不把训练过程和测试过程加以区分。

假设video一共有N帧,每一帧用 T 1 , . . . , T N T_1,...,T_N T1,...,TN表示。

第一帧来了的时候:
1.用一定结构的CNN(例如ResNet50)和DETR里的Encoder提取出该帧的特征 f 1 f_1 f1

并且用DETR产生检测结果,叫做detect query,记作 q d q_d qd.

特别注意: 将DETR的模式修改为探测new-born的目标。也就是 q d q_d qd仅包含本帧新出现的目标。

2.将特征 f 1 f_1 f1和detect query q d \quad q_d qd输入到Decoder里,产生原始的轨迹查询(original track queries) q o t 1 q_{ot}^1 qot1.

3. q o t 1 q_{ot}^1 qot1经过查询交互模块(Query Interaction Module,QIM)之后才能变成track queries q t q_t qt.由于下一步要预测第二帧,所以 q o t 1 q_{ot}^1 qot1经过QIM之后产生的track queries 记作 q t 2 q_t^2 qt2.

4. q o t 1 q_{ot}^1 qot1被用来生成最终的预测 Y 1 Y_1 Y1,我理解的是 Y 1 Y_1 Y1就包含了这一帧里的所有应该有的信息。

  \space  

第一帧的工作流程说完了,普适地,对于第 i i i T i T_i Ti

1.用一定结构的CNN和DETR里的Encoder提取出该帧的特征 f i f_i fi

2.接收 T i − 1 T_{i-1} Ti1帧SIM的输出 q t i q_t^i qti,并且和detect query q d q_d qd进行拼接,输入到Decoder里,产生原始track queries q o t i q_{ot}^i qoti,这个 q o t i q_{ot}^i qoti会被输入到SIM里,产生为下一帧服务的 q t i + 1 q_t^{i+1} qti+1.

3. q o t 1 q_{ot}^1 qot1被用来生成最终的预测 Y i Y_i Yi

4.跑完 N N N帧以后,最终生成的预测集合 { Y 1 , . . . , Y N } \{Y_1,...,Y_N\} {Y1,...,YN}在训练过程中,我们知道Ground truth { T 1 ^ , . . . , T N ^ } \{\hat{T_1},...,\hat{T_N}\} {T1^,...,TN^},利用集合平均损失(Collective Average Loss)进行优化。

  \space  

非常重要的逻辑关系:
我的理解是,DETR中的object query,也就是在这里被称为的detect query,里面包含了这一帧detection的目标的信息。
track query,如前文所述,每一个track query负责跟踪一个目标的轨迹。这就是说,每个track query记录了一个帧中一个object的运动的信息。那么一个帧中track query的集合,也就是track queries(注意!是复数) q t i q_t^i qti,代表了第 i i i帧中被追踪的目标的信息。由于有新产生和消失的目标,因此 q t i q_t^i qti的长度应该是变化的。
因此,我觉得detect query q d q_d qd也应该用复数。而文章有的地方是复数有的地方不是。

  \space  
OK,那就发现QIM是整个框图里很重要的部分,它接受Decoder的输出,并将其转化为我们要的track queries。

  \space  
4.2 QIM和TALA

4.2.1 QIM整体工作流程

为了便于举例子,假设如下的情形:

在这里插入图片描述

可以看出,目标1和2在第一帧中就已经存在,目标3在第 i i i帧进入,目标2在第 j j j帧退出。

那么如果我们考虑第 i i i帧,那么这一帧发生了两个事情:目标3的进入和目标2的退出。

QIM的框图如下图所示:

在这里插入图片描述
  \space  
接续前面的例子,当处在第 i i i帧的时候,上一帧传来的 q t i q_t^i qti里面有目标1和2的信息,detect query q d q_d qd为空。

这里有个疑问: 目标3已在第i帧出现,detect query q d q_d qd里面为何没有目标3的信息。有人解读说 q d q_d qd实际上是空查询,为了应对可能出现的新目标。这样的确会让框图解释起来更加合理,但通篇论文我没有找到是空查询的暗示。

然后 q t i q_t^i qti q d q_d qd以及提取出的第i帧特征 f i f_i fi(里面应该有目标3的信息)被输入进Decoder,输出original track queries q o t i q_{ot}^i qoti.

经过Decoder生成的original track query q o t i q_{ot}^i qoti被分成两个集合,一个是 q t r q_{tr} qtr,一个是 q d e t q_{det} qdet(注意和前面 q t , q d q_t,q_d qt,qd符号的差别)。其中 q d e t q_{det} qdet包含新产生的objects, q t r q_{tr} qtr包含被追踪的和离场的objects。

在这个例子里, q t r q_{tr} qtr包含目标1,2。 q d e t q_{det} qdet是空的。

  \space  

下面按照训练阶段和测试阶段分别说明工作方式。

训练阶段:

在训练阶段,将 q t r i q_{tr}^i qtri q d e t i q_{det}^i qdeti对Ground Truth Y i ^ \hat{Y_i} Yi^和matching result ω t r i \omega_{tr}^i ωtri(匹配结果,我的理解就是目标ID序列)进行双边匹配从而进行训练。

看图可以得出,由于目标2退出,我们希望训练之后track queries应该剔除目标2,detect query应该出现目标3.因此经过双边匹配后的结果,我们用字母上面加overline表示,就应该是:
q ‾ t r i \overline{q}_{tr}^i qtri包含目标1, q ‾ d e t i \overline{q}_{det}^i qdeti包含目标3.

那么 ω d e t i \omega_{det}^i ωdeti ω t r i \omega_{tr}^i ωtri是怎么得到的呢?这就是TALA(轨迹感知的标签分配)的作用。
  \space  
简单说,TALA就是将标签序列和预测结果一一对应的一个方法。和前文一样,DETR只考虑new-born的目标。假设预测和GT分别为: Y i = { Y t r i , Y d e t i } Y_i=\{Y_{tr}^i,Y_{det}^i\} Yi={Ytri,Ydeti} Y i ^ = { Y t r i ^ , Y d e t i ^ } \hat{Y_i}=\{\hat{Y_{tr}^i},\hat{Y_{det}^i}\} Yi^={Ytri^,Ydeti^}.标签分配的结果记为 ω i = { ω t r i , ω d e t i } \omega_{i}=\{\omega_{tr}^i,\omega_{det}^i\} ωi={ωtri,ωdeti}.

则按照下式进行标签分配结果的计算:

在这里插入图片描述

其中 L L L就是DETR中计算匹配cost的函数, Ω i \Omega_i Ωi论文里没说,我认为应该是label排列组合的全体(当然,应该只考虑了new-born)。

这个公式里第一个公式的意思就是:按照DETR里的算法计算出对应的detect的标签顺序。第二个式子就是对于追踪对象,每一帧按照前一帧的追踪对象和检测标签取并集(第一帧设为空)。

就是下面这个图:
在这里插入图片描述

一个疑问: 只能检测new-born的对象,但是退出机制呢?TALA是如何管理消失目标的标签的?

  \space  
之后 q ‾ t r i \overline{q}_{tr}^i qtri q ‾ d e t i \overline{q}_{det}^i qdeti经过TAN产生 q t r i + 1 q_{tr}^{i+1} qtri+1,TAN的结构后文再说。

  \space  

测试阶段:

在测试阶段,用分类的score(我的理解就是置信度)来决定一个track的出现和消失。具体地,对于new-born对象,大于阈值 τ e n \tau_{en} τen的就留下。对于消失对象,若连续 M M M帧都低于阈值 τ e x \tau_{ex} τex,就删除。

一个疑问: 阈值是超参数还是训练出来的?
解答:应该是自定义的。参见Table(3) e.

就是用如下两个公式表示:

q ‾ d e t i = { q k ∈ q d e t i ∣ s k > τ e n } \overline{q}_{det}^i = \{{q_k \in q_{det}^i | s_k > \tau_{en}\}} qdeti={qkqdetisk>τen}

在这里插入图片描述
其中 s k i s_k^i ski表示第 i i i帧第 k k k个track query的score。

之后跟训练阶段相同, q ‾ t r i \overline{q}_{tr}^i qtri q ‾ d e t i \overline{q}_{det}^i qdeti经过TAN产生 q t r i + 1 q_{tr}^{i+1} qtri+1

一个理解:训练的时候实际上就是利用TALA产生的结果,和模型算出的结果进行匹配。推理(测试)的时候Decoder会根据frame特征和之前的输入学习到特征,然后产生 q o t q_{ot} qot。用 q o t q_{ot} qot预测的时候就会有置信度,比如这个例子里,就应包含了目标2退出和目标3进入的信息,因此根据置信度和阈值,QIM就能产生出新的sequence,来更新现有的追踪的目标。
所以,QIM相当于一个桥梁, 其将上一帧的信息传递给下一帧,这也许就是长时学习的要义所在。

  \space  
4.2.2 TAN

TAN实际上比较简单,主要由多头注意力机制block(MHA)、Add&Norm层、前馈神经网络构成。其接受的输入不仅是前文所述 q ‾ t r i \overline{q}_{tr}^i qtri q ‾ d e t i \overline{q}_{det}^i qdeti其还接受上一帧的 q ‾ t r i − 1 \overline{q}_{tr}^{i-1} qtri1来更好的学习时序信息。

q ‾ t r i − 1 \overline{q}_{tr}^{i-1} qtri1 q ‾ t r i \overline{q}_{tr}^{i} qtri进行相加,当做MHA的 Q Q Q K K K,本帧的 q ‾ t r i \overline{q}_{tr}^i qtri作为 V V V.

结构如下:

在这里插入图片描述
  \space  

对于Add&norm层, q ‾ t r i \overline{q}_{tr}^{i} qtri作为残差连接到Add&Norm层,并且按下式更新。这个式子计算出的tgt再被输入到前馈神经网络里。

在这里插入图片描述
(这个式子就是Transformer原论文里的 A = σ ( Q K T d ) V A=\sigma(\frac{QK^T}{\sqrt d})V A=σ(d QKT)V,叫做Scaled Dot-Product Attention)

tgt经过网络后的结果和这一帧的检测估计 q ‾ d e t i \overline{q}_{det}^i qdeti相连,得到QIM的输出 q t i + 1 q_t^{i+1} qti+1.

至此,QIM的流程就完成了。

  \space  

4.3 CAL是什么

在整个MOTR进行训练的过程中,要衡量整个Predictions和GTs的loss,就是Collective Average Loss。

在这里插入图片描述

为什么要整体计算loss呢,文章说,对于传统的训练方式,例如在相邻两帧之间进行训练,无法生成长范围的目标的运动样本,我的理解就是无法学习长时间时域上的变化。所以在训练的时候,是把整个video剪辑作为输入。

CAL的计算公式:

在这里插入图片描述
其中 L L L和DETR中计算单帧的Loss相似:

在这里插入图片描述

其中 L c l s L_{cls} Lcls是focal loss, L l 1 L_{l_1} Ll1是L1 loss, L g i o u L_{giou} Lgiou是广义IOU loss。

CAL是根据整个video计算的。Collective意为整个集合,应该就是指整个video的Prediction和Ground Truth一次性计算。Average指的是公式里分母的目标的数目总和。因此叫做Collective Average Loss。

  \space  
  \space  

5.Experiments

实验中的CNN选用ResNet50,并利用裁剪旋转等进行数据增强。

此外,在训练阶段, 为了产生更多的new-born目标,随机抹除一些track queries,这个概率记为 p p r o p p_{prop} pprop。为了模拟消失的目标,随机插入一些False positive(本来有,没检测到)的track queries。

网络用COCO数据集进行预训练,优化器选择AdamW。在MOT16和17数据集上进行训练,结果如下表:

在这里插入图片描述
  \space  
可以看出,MOT16数据集上大多数指标都取得了比传统的CNN based方法更好的结果,在MOT17数据集上也不错,但是略逊于TransTrack,which也是一个端到端的基于Transformer的。

所以基于Transformer的整体性能确实比传统CNN based的要好一些。

作者后续证明了TAN和CAL的作用很大,还有进入和退出阈值 τ e n , τ e x \tau_{en},\tau_{ex} τen,τex对结果的影响并不大。

  \space  

感想和总结:
读这篇文章确实花了一些力气,就是很想吐槽,感觉逻辑性有点差,而且原文中也有一些错误(也可能是我太菜了)
Transformer最开始用于机器翻译中。因为在NLP任务中一个句子有天然的时序先后关系,这里用Transformer实际上是把追踪对象的集合作为了input sequence,在时序上还是迭代运算。而帧和帧之间依靠QIM进行连接,因此可以学习时序上的变化,这也是这个模型的精髓所在。

### MOTR源码分析与解读 #### Label Assignment机制解析 Label Assignment机制是MOTR中至关重要的部分之一,其核心代码位于`plugin/track/models/loss.py`文件中的`ClipMatcher.match_for_single_frame()`函数[^3]。此函数负责在每一帧内完成检测框和跟踪ID之间的匹配工作。 该过程不仅涉及当前帧内的目标检测结果,还关联着历史帧的信息来确保同一物体在整个视频序列里拥有唯一稳定的身份标识。通过这种方式,即使目标短暂消失或被遮挡,在重新出现时也能准确恢复之前的轨迹编号。 #### Query Interaction Module (QIM) 工作原理 Query Interaction Module(QIM)接收来自Transformer解码器生成的隐藏状态以及对应的预测得分作为输入[^2]。对于任意给定的一帧图像而言,每一个待追踪的目标都会对应一个track query;而每个可能成为新出现对象的位置则由detect query表示。这些queries会与解码器输入相结合形成最终用于计算隐藏层特征向量的基础。 当完成了上述提到的对象间关系建模之后,下一步就是利用自注意力机制(self-attention mechanism),即让各个位置之间相互作用并更新各自的表征形式。这一步骤有助于增强模型捕捉长时间依赖性的能力,并提高跨时间步长下相同实体识别准确性。 #### Memory Bank的作用 Memory Bank模块主要用于执行时序上的信息融合操作。尽管它不会直接影响到查询的数量或是具体的匹配决策流程,但是通过对过往时刻存储下来的特征进行综合考量,则可以在一定程度上改善整体性能表现。因此,在深入研究其他组件之前先掌握好Label Assignment相关内容是非常必要的。 ```python def match_for_single_frame(preds_logits, pred_boxes, gt_instances): # 这里的preds_logits和pred_boxes分别是网络输出的分类概率分布矩阵及边界框坐标, # 而gt_instances包含了真实标签的相关信息。 # ... 省略具体实现细节 ... return matches # 返回本次配对的结果列表 ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值