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

2023-10-31

首个完全基于端到端 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进行连接,因此可以学习时序上的变化,这也是这个模型的精髓所在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • LeetCode总结 -- 图篇

    图的算法跟树一样是准备面试中必不可少的一块 不过图的方法很容易概括 面试中考核的无非就是两种搜索算法 深度优先搜索和广度优先搜索 LeetCode中关于图的问题有以下几个 Clone Graph Word Ladder Word Ladde
  • 【华为OD机试真题】不含101的数(python版)100%通过率 超详细代码注释 代码解读

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 不含101的数 时间限制 1s空间限制 256MB限定语言 不限 题目描述 小明在学习二进制
  • 堪称一绝,阿里技术人都用的Nginx笔记手册,应用到架构齐全

    有人调侃我们说 程序员不如送外卖 送外卖是搬运食物 自己是搬运代码 都不产出新的东西 透支体力 又消耗健康 可替代性极强 30岁之后就要面临被优化的危险 想跳槽 但是更高的平台难进 同级别的平台又是重复 想利用业余时间学习提升 但是自己能力
  • mininet+pox+poxdesk使用入门

    mininet pox poxdesk使用入门 前提是安装好mininet以及pox和poxdesk模块 接下来就是如何使用 笔者环境是Win7环境下VMware Workstation新建虚拟机上运行Ubuntu 12 0 首先在新打开的
  • 面试题(vue,react,前端)

    目录 1 说说React生命周期中有哪些坑 如何避免 2 说说Real diff算法是怎么运作的 3 调和阶段setState干了什么 4 说说redux的实现原理是什么 写出核心代码 5 React合成事件的原理 6 React组件之间如
  • java后端生成图形验证码、前端接收并展示

    1 工具类 import java awt Color import java awt Font import java awt Graphics import java awt Graphics2D import java awt Ren
  • PHP中的数据类型有哪些?

    嗨 大家好 今天 我们来了解一下PHP中的数据类型 首先 让我们来介绍一下PHP中的基本数据类型 在PHP中 有六种基本数据类型 它们分别是 整数型 int 用于存储整数 例如 123 456等 浮点型 float 用于存储带有小数点的数
  • Linux删除文件后,发现磁盘空间没有释放-lsof

    最近碰到磁盘快满了 原因是程序错误导致日志爆炸性增长 于是直接删除日志文件 然后df h 发现磁盘空间一点都没下降 还是原来的90 使用率 有点奇怪 百度了解到 日志文件被删除之前文件处于被其他进程占用状态 即使删除 依然占用空间 通过ls
  • STL源码分析:sort函数

    目录 支持sort的容器 几种涉及到的排序算法 插入排序 快速排序 堆排序 sort函数的策略 sort函数的实现 STL的sort函数非常常用 不同的STL版本有不同的实现方式 本文就来说一下SGI STL中是如何实现sort函数的 so
  • 408计算机网络(王道版)

    408计算机网络第一章总结 408计算机网络第二章总结 408计算机网络第三章总结 408计算机网络第四章总结 408计算机网络第五章总结 408计算机网络第六章总结 408计算机网络第一轮反思
  • QHash 与 QMap的区别

    QMap QMap是Qt的一个模板类 它是基于红黑树算的的一套字典 是Qt容器中的一种 它的原型是 QMap原型为class QMap
  • 2023.01.11 某国企前端笔试题一部分

    什么时候开始记录都不算晚 即使已经是晚了 但是再早的东西也会有淘汰的时候 收藏另说 问题主要选取一些高频和基础的问题 问题的回答只是本人的理解 非参考答案 有些答案只给个提示 详解可谷歌百度或在掘金内搜索相关文章 同时本人每次回顾更新文章都
  • 大数据-玩转数据-Flink定时器

    一 说明 基于处理时间或者事件时间处理过一个元素之后 注册一个定时器 然后指定的时间执行 Context和OnTimerContext所持有的TimerService对象拥有以下方法 currentProcessingTime Long 返
  • MYSQL面试题

    1 什么是MySQL多实例 如何配置MySQL多实例 多实例的优缺点 答案 https blog 51cto com superpcm 2094744 2 如何加强MySQL数据的安全 请你给出可行的思路 答案 https blog csd
  • 李开复李彦宏奥特曼获评全球AI领袖,《时代》出品,全球100人

    西风 发自 凹非寺量子位 公众号 QbitAI 时代周刊 首次发布世界AI最具影响力人物榜 100位学界业界大佬齐聚于此 这其中就包括吴恩达教授 李飞飞教授 创新工场CEO李开复 百度CEO李彦宏 OpenAI CEO Sam Altman
  • 【软件测试】快速入行软件测试

    快速入行软件测试 1 初识软件测试 软件测试的前景与现状 软件测试越来越被企业重视 人才稀缺 市场需求扩大 软件测试人员的职业生涯规划 技术型路线 自动化测试工程师 性能测试工程师 安全测试工程师等 管理型路线 测试主管 测试经理 测试总监
  • 解决Python配置Opencv报错recursion is detected during loading of "cv2" binary extensions的问题

    解决Python配置Opencv报错recursion is detected during loading of cv2 binary extensions的问题 使用pip卸载opencv pip uninstall opencv 具体
  • UNIX网络编程(UNP) 第四章学习笔记

    文章目录 总括内容 socket函数 函数定义 常用套路 具体解释 题外话 connect函数 函数定义 常用套路 具体解释 题外话 实战尝试 bind函数
  • STL中用ERASE()方法遍历删除元素

    STL中的容器按存储方式分为两类 一类是按以数组形式存储的容器 如 vector deque 另一类是以不连续的节点形式存储的容器 如 list set map 在使用erase方法来删除元素时 需要注意一些问题 在使用 list set
  • 论文阅读笔记4——MOTR: End-to-End Multiple-Object Tracking with TRansformer(利用Transformer进行多目标跟踪)

    首个完全基于端到端 Transformer 的多目标追踪模型 21年5月上传到arxiv上 论文 论文 代码 代码 space 1 Abstract 摘要大概由两部分组成 一是过去启发式算法的缺陷 二是MOTR的基本思路 他说MOT问题的关