MOTR: End-to-End Multiple-Object Tracking with TRansformer阅读笔记

(一) Title

在这里插入图片描述
论文地址:https://arxiv.org/abs/2105.03247
代码地址:https://github.com/megvii-model/MOTR
前言:最近有幸看了几篇MOT的工作,感觉目前MOT的工作有一些集中将循环神经网络引入来构建对轨迹的预测,从而实现对遮挡情况的处理,提升性能。然而我自己没有仔细研读过Transformer相关的论文,希望以此为契机,开启循环神经网络在视觉领域的研究,本文最显著的贡献就是将track trajectory当成隐状态,并且在细节上的有很多的考究。

(二) Summary

当前存在的问题:

多目标跟踪任务之前的做法中,往往是基于motion以及appearance相似性使用启发式方式来进行检测地关联,但是这种做法忽略了跟踪任务基于视频的属性,并且过多地信任检测和Re-ID的性能,同时对于遮挡和非线性运动的适应能力较差。不过在MOT性能上表现很好。基于FairMOT端到端学习detection和re-id的思想,如何将data association的过程也引入到端到端的过程中来呢?目前基于卷积+RNN的融合有一些实现方式,也取得了比较好的效果,那么基于Transformer的方式在处理上又能起到什么作用呢?基于Transformer的实现,往往是通过一种隐式的关联来构建

本文的方法:

本文提出了MOTR,一个端到端的MOT框架:

  • 学习model the long-range temporal variation of the objects,从而能够实现隐式地association。
  • 引入track query,每一个track query models the entire track of an object,track query is transferred and updated frame-by-frame to perform iterative predictions.
  • 提出Tracklet-aware label assignment在track queries和object tracks实现一对一的assignment。
  • Temporal aggregation network以及collective average loss用来平衡long-range temporal relation。

[注:关于方法这边有一些过于抽象,直接看表述不是很容易理解,Mark下来,等整篇看完回来重新梳理]

实验结果

MOTR取得了competitive performance,可以作为Transformer MOT任务中的一个baseline。

本文贡献

  • 提出了一个端到端的MOT框架,基于DETR,能够隐式地学习appearance以及position变化(通过隐状态来说能够学习appearance和position变化,很难get到。)
  • 将MOT看成是一个set of sequence prediction的问题,从DETR角度来看,只是将固定的检测框转换成track trajectory和检测框,并且track trajectory以及检测框的定义形式都相同,只不过检测框的id标签为-1,并且引入了QIM来实现对输出检测框(图3中的 q t r i ˉ , q d e t i ˉ \bar{q_{tr}^i},\bar{q_{det}^i} qtriˉ,qdetiˉ)的编码,并且这里是将track trajectory看成是隐状态。
  • TALA用来一对一assignment预测和gt boxes,这里在代码中涉及到很多细节的地方(需要运行代码看下)
    引入CAL以及TAN来增强long-range temporal motion

(三) Research Object

本文希望能够构建一种端到端的MOT框架,就需要解决如何定义trajectory?如何处理new-born和death?如何进行轨迹状态的预测等问题,作者这里是将trajectory看成隐状态,使用class score来处理trajectory的生成和退出,并借助transformer的encoder架构来预测下一个时刻的trajectory隐状态。

(四) Problem Statement

本文基于Deformable DETR出发,希望能够使用端到端的方式来解决多目标跟踪任务,使用隐状态(track query)表示track trajectories,需要解决的主要问题包括:

  • 怎么根据这个track query跟踪一个目标?这里我觉得说的应该是怎么基于track query来预测下一个时刻的query?
    在训练期间使用tracklet-aware label assignment(TALA),也就是说通过具有相同id标签的box sequences来监督,马马虎虎不理解,问题也不是很理解
  • 怎么处理track query的new-born和dead objects?
    采用动态长度,对于当前的N个object queries(其中包括m个track querie以及N-m个detection queries,detection queries设置成zero,设置成zero是不是有问题呢?),同时在inference过程中不再使用IoU matching关联。

(五) Method

5.1 构建MOTR的一些相关介绍

  • 关于DETR中使用object query作为隐状态最终生成固定长度的object的描述
    DETR中引入的是object queries(在Decoder中使用的,对Transformer代码部分不是特别理解,先留下疑问吧)使用固定长度的embedding来表示目标,在decoder中image feature和object queries之间进行交互,来实现更新他们呢的表示。进一步采用Bipartite matching实现the updated queries和GTs之间的一一匹配,并且作者这里将这个query看成是object detection的query。
  • 本文是怎么构建track query的,如何实现track query和object query同GTs的一对一对应关系呢?
    首先介绍本文基于DETR的改动,本文中从DETR的detect query中增加了track query,文中指出这里的detect queries是固定长度的,track queries是可变长度的,并且track queries自动能够实现自动更新。

这里的疑问是:detect query中的固定长度跟DETR中是一样的呢,也就是说都指的是最大可以检测到的目标?还是说detect query和track query的总长度是DETR中detect query的长度呢?也就是可以同时使用detect query和track query来和GTs做one-by-one的对应呢?从论文的理解上来看,这里我更倾向于后面这种,需要回头代码中确认
回答:detect query的长度是固定的,相当于DETR中的固定长度,而track query的长度的不固定的,cat到一起输入到decoder中
在这里插入图片描述
这里的问题是 T i T_i Ti帧中的黄色框是不检测1和2目标了嘛?之前看代码好像是这样的,是将GTs分成两部分,一部分用于track query的回归,另一部分用于detect query的回归,回头再确认下是不是这个情况
是的,这里detect query只用于跟new-born的目标进行one-by-one 匹配,也就是说只负责预测除了tracklets中已经有的目标?
参考论文中的原话:While in MOTR, detect queries are only used to detect the new-born objects and track queries predict these tracked objects.

怎么将detect query,track query同GTs一对一对应上呢?本文采用的是tracklet-aware label assignment(TALA)这边应该是本文新起的一个名词,注意这里的detect queries仅仅用来检测new-born目标,并且track queries用来对应已经跟踪上的目标。具体的做法是(这里是博主自己的理解,代码只是粗略的看了下,可能会有问题):

现在有GTs,track queries,detect queries。Track queries不需要使用bipartite matching进行匹配,follow the same assignment of previous frames(这里说的比较抽象,实际上应该是当前已有的track queries中在之前已经将gt的label给到这儿了,接只需要确定当前track queries中和gt id对应上的那个就是要track queries需要对应的gt,如果GTs中没有能够同track queries对应上的,则将当前的track queries设置成无效,应该是将该track query删除),接着剩下的没有匹配上的就看成是detect queries,将detect queries同剩下的GTs做一次匈牙利匹配,也就是一一对应上。

基于上述做法的思考,论文中将 T i T_i Ti时刻的predictions记作 Y i = { Y t r i , Y d e t i } Y_{i}=\left\{Y_{t r}^{i}, Y_{d e t}^{i}\right\} Yi={Ytri,Ydeti},其中 Y t r i Y_{t r}^{i} Ytri表示track queries对应的预测边界框, Y d e t i Y_{d e t}^{i} Ydeti表示detect queries对应的预测框。同时将GTs记作 Y ^ i = { Y ^ t r i , Y ^ d e t i } \hat{Y}_{i}=\left\{\hat{Y}_{t r}^{i}, \hat{Y}_{d e t}^{i}\right\} Y^i={Y^tri,Y^deti}, Y ^ t r i \hat{Y}_{t r}^{i} Y^tri表示同track queries对应的gt边界框, Y ^ d e t i \hat{Y}_{d e t}^{i} Y^deti表示同detect queries对应的gt边界框。track queries+detect queries同ground truth之间的对应关系使用 ω i = { ω t r i , ω d e t i } \omega_{i}=\left\{\omega_{t r}^{i}, \omega_{d e t}^{i}\right\} ωi={ωtri,ωdeti}表示。其中
ω d e t i = arg ⁡ min ⁡ ω ^ d e t i ∈ Ω i L ( Y d e t i ∣ ω ^ d e t i , Y ^ d e t i ) ) ω t r i = { ∅ i = 1 ω t r i − 1 ∪ ω d e t i − 1 2 ≤ i ≤ N \begin{array}{c} \left.{\omega}_{d e t}^{i}=\underset{\hat\omega_{d e t}^{i} \in \Omega_{i}}{\arg \min } \mathcal{L}\left(\left.Y_{d e t}^{i}\right|_{\hat\omega_{d e t}^{i}}, \hat{Y}_{d e t}^{i}\right)\right) \\ \omega_{t r}^{i}=\left\{\begin{array}{ll} \emptyset & i=1 \\ \omega_{t r}^{i-1} \cup \omega_{d e t}^{i-1} & 2 \leq i \leq N \end{array}\right. \end{array} ωdeti=ω^detiΩiargminL(Ydetiω^deti,Y^deti))ωtri={ωtri1ωdeti1i=12iN
这里的符号相对于原文进行了调整,其中 N N N表示视频序列的长度, L \mathcal{L} L表示pair-wise matching cost,这里就是匈牙利匹配,主要解决 Y d e t i Y_{d e t}^{i} Ydeti Y ^ d e t i \hat{Y}_{d e t}^{i} Y^deti的一一对应关系,在初始时刻 T 1 T_1 T1, ω t r 1 \omega_{tr}^{1} ωtr1没有任何目标,而 ω d e t 1 \omega_{det}^{1} ωdet1则是通过 Y d e t i Y_{d e t}^{i} Ydeti Y ^ d e t i \hat{Y}_{d e t}^{i} Y^deti的匹配得到,接着 ω t r i \omega_{tr}^{i} ωtri则是由上一个时刻的跟踪queries对应的 ω t r i − 1 \omega_{tr}^{i-1} ωtri1以及上一个时刻的检测目标 ω d e t i − 1 \omega_{det}^{i-1} ωdeti1表示,对于在 T i − 1 T_{i-1} Ti1时刻出现的new-born目标,会加入到 T i T_{i} Ti时刻的query中

这里的疑问是为什么不使用当前时刻的检测目标呢?

最后就是DETR框架中重复框的置信度非常低,这应该是使用bipartite matching的作用,不再使用一对多的情况。

5.2 MOTR

5.2.1 模型框架

在这里插入图片描述

上图以及相关的描述中已经将MOTR的整体框架介绍很清楚了。其中骨干采用CNN实现(ResNet50),接着引入transformer的encoder来提取图像序列特征: f = { f 1 , f 2 , … , f N } f=\left\{f_{1}, f_{2}, \ldots, f_{N}\right\} f={f1,f2,,fN},对于第一帧 T 1 T_1 T1来说,将经过encoder的图像feature f 1 f_1 f1以及固定长度的detected queries q d q_d qd输入到Transformer decoder中来生成track queries q o t 1 q^1_{ot} qot1,后面跟FFN来生成预测 Y 1 Y_1 Y1,同时 q o t 1 q^1_{ot} qot1通过QIM(Query Interaction Module)来得到下一个时刻的track queries,这里其实类似track任务中基于当前的track trajectory来预测未来的track trajectory,得到 q t 2 q_t^2 qt2用作第二帧的decoder输入,并且此时detect queries同第一帧输入的detect queries是相同的都是 q d q_d qd,

问题:图中提到的Predictions of the video clip are aggregated together and used to calculate the collective average loss with ground-truths难道是整个视频序列的输出同gt序列的输出进行比对嘛?
回答:在CAL中指出不是使用frame-by-frame计算损失,而是通过collect 多个预测。

5.2.2 QIM模块

本文的核心内容就是Query Interaction Module,主要包括两个内容:目标的进入和退出机制以及TAN(temporal aggregation network):
在这里插入图片描述
首先就是目标的进入和退出机制
T i T_i Ti帧时,track queries q i t q_i^t qit以及detect queries q d q_d qd输入到Transformer的Decoder中,得到original track queries q o t i q^i_{ot} qoti(说实话,我觉得这里起名字交track queries不合适),并将track queries分成两个sets: q o t i = { q t r i , q det  i } q_{o t}^{i}=\left\{q_{t r}^{i}, q_{\text {det }}^{i}\right\} qoti={qtri,qdet i},这里原文说 q t r i q_{t r}^{i} qtri中同时包含了tracked以及dead目标,需要在接下来的处理中将dead目标去除掉, q det  i q_{\text {det }}^{i} qdet i中是new-born的目标。
这里如图4(a)中所示, q o t i q_{o t}^{i} qoti中包含1,2两个目标,2是dead目标,

问题:怎么将dead目标去除掉?
回答:训练过程和推理过程是分开来处理的
训练过程通过在ground-truth Y ^ i \hat Y_i Y^i和当前的track trajectories的匹配结果 ω t r i \omega_{t r}^{i} ωtri进行comparison。对应代码在motr matching的step1中:
在这里插入图片描述
将没能够和gt idx匹配上的目标看成是dead目标,并将没有dead的track queries保留下来,得到 q ˉ t r i \bar{q}_{t r}^{i} qˉtri,并且det queries表示的是new-born的目标,也就是图中所示的 q ˉ d e t i \bar{q}_{det}^{i} qˉdeti,通过 w d e t i w^i_{det} wdeti来获取。此时还没有将new born目标添加到track query(也就是所谓的track轨迹)当中。
推理过程中使用预测 Y i Y_i Yi的类别分数来判断一个track query的增加和删除,注意这里是同训练过程不一样的,并且这个地方同时说明了track query的增加和删除,文中的classification分数是目标所有类别分数中的最大值(比如说coco一共有91个类别,然后每一个类别有一个置信度分数,取所有类别中置信度最高的那个作为当前query的类别分数),此外这里图4中关于inference表述有问题,实际上在inference过程中,没有再对 q d e t i q^i_{det} qdeti做track query和detect query做划分,对应的公式表示相比于原论文进行了调整
文中所提到的 s k s_k sk表示 q o t i q^i_{ot} qoti中的第k个query的分类分数,判断分数 s k s_k sk是否超过设置的阈值 τ n \tau_{n} τn,超过当前阈值的话则加入到track轨迹中。
q ˉ t r i = { q k ∈ q o t i ∣ s k > τ n } \bar{q}_{t r}^{i}=\left\{q_{k} \in q_{ot}^{i} \mid s_{k}>\tau_{n}\right\} qˉtri={qkqotisk>τn}
对于从当前轨迹中删除的话,也就是基于分类分数 s k s_k sk以及退出阈值 τ e x \tau_{ex} τex,并且设置成当连续 M M M帧小于这个阈值时退出,对应的公式表述为:
q ˉ t r i = { q k ∈ q o t i ∣ max ⁡ { s k i , … , s k i − M } > τ e x } \bar{q}_{t r}^{i}=\left\{q_{k} \in q_{ot}^{i} \mid \max \left\{s_{k}^{i}, \ldots, s_{k}^{i-M}\right\}>\tau_{e x}\right\} qˉtri={qkqotimax{ski,,skiM}>τex}
对应到代码上的表述为:
在这里插入图片描述

接着就是TAN模块
这里引入TAN的主要目的在于给tracked目标提供contextual relation,增强temporal relation,TAN的输入是filtered track queries q ˉ t r i \bar{q}_{t r}^{i} qˉtri以及 q ˉ d e t i \bar{q}_{d e t}^{i} qˉdeti分别表示已经跟踪上的和new-borned,同时将上一个时刻的tracked queries q ˉ t r i − 1 \bar{q}_{t r}^{i-1} qˉtri1也作为输入。TAN实际上就是一个Transformer的encoder,Multi-Head Self-Attention的输出记作 t g t tgt tgt表示成:
t g t = σ s ( ( q ˉ t r i + q ˉ t r i − 1 ) ⋅ ( q ˉ t r i + q ˉ t r i − 1 ) T d ) ⋅ q ˉ t r i t g t=\sigma_{s}\left(\frac{\left(\bar{q}_{t r}^{i}+\bar{q}_{t r}^{i-1}\right) \cdot\left(\bar{q}_{t r}^{i}+\bar{q}_{t r}^{i-1}\right)^{\mathrm{T}}}{\sqrt{d}}\right) \cdot \bar{q}_{t r}^{i} tgt=σs(d (qˉtri+qˉtri1)(qˉtri+qˉtri1)T)qˉtri
这里 T T T表示转置, σ s \sigma_{s} σs表示sigmoid函数, d d d表示track queries的维度,经过通过FFN refine t g t tgt tgt最终同 q ˉ d e t i \bar{q}_{d e t}^{i} qˉdeti做cat得到下一个时刻的track queries q t i + 1 {q}_{t }^{i+1} qti+1

5.2.3 Collective Average Loss

这里作者提出通过在视频序列上的multiple predictions计算损失,来学习temporal variances。使用序列上的损失,相比于frame-by-frame的损失有什么差异呢?
符号表述:这里假定视频序列的长度为 N N N,对应的预测boxes分别为 Y = { Y i } i = 1 N Y=\left\{Y_{i}\right\}_{i=1}^{N} Y={Yi}i=1N,并且视频序列对应的真实boxes为 Y ^ = { Y ^ i } i = 1 N \hat Y=\left\{\hat Y_{i}\right\}_{i=1}^{N} Y^={Y^i}i=1N,使用 ω = { ω i } i = 1 N \omega=\left\{\omega_{i}\right\}_{i=1}^{N} ω={ωi}i=1N表示一对一的对应关系。此时整个序列的损失为:
L o ( Y ∣ ω , Y ^ ) = ∑ n = 1 N ( L ( Y t r i ∣ ω t r i , Y ^ t r i ) + L ( Y d e t i ∣ ω d e t i , Y ^ d e t i ) ) ∑ n = 1 N ( V i ) \mathcal{L}_{o}\left(\left.Y\right|_{\omega}, \hat{Y}\right)=\frac{\sum_{n=1}^{N}\left(\mathcal{L}\left(\left.Y_{t r}^{i}\right|_{\omega_{t r}^{i}}, \hat{Y}_{t r}^{i}\right)+\mathcal{L}\left(Y_{d e t}^{i} \mid \omega_{d e t}^{i}, \hat{Y}_{d e t}^{i}\right)\right)}{\sum_{n=1}^{N}\left(V_{i}\right)} Lo(Yω,Y^)=n=1N(Vi)n=1N(L(Ytriωtri,Y^tri)+L(Ydetiωdeti,Y^deti))
上式中 V i = V t r i + V d e t i V_{i}=V_{t r}^{i}+V_{d e t}^{i} Vi=Vtri+Vdeti表示 T i T_i Ti帧的GTs的总数, V t r i V_{t r}^{i} Vtri表示tracked objects的数量, V d e t i V_{d e t}^{i} Vdeti表示new-born的目标的数量, L \mathcal{L} L表示损失函数,这里的损失函数同DETR中相似。对于单帧的损失 L \mathcal{L} L可以表示成:
L ( Y i ∣ ω i , Y ^ i ) = λ c l s L c l s + λ l 1 L l 1 + λ giou  L giou  \mathcal{L}\left(\left.Y_{i}\right|_{\omega_{i}}, \hat{Y}_{i}\right)=\lambda_{c l s} \mathcal{L}_{c l s}+\lambda_{l_{1}} \mathcal{L}_{l_{1}}+\lambda_{\text {giou }} \mathcal{L}_{\text {giou }} L(Yiωi,Y^i)=λclsLcls+λl1Ll1+λgiou Lgiou 
这里 L c l s \mathcal{L}_{c l s} Lcls为类别损失,使用focal loss; L l 1 \mathcal{L}_{l_{1}} Ll1损失表示的是L1损失这里是边界框参数的l1loss L giou  \mathcal{L}_{\text {giou }} Lgiou 是GIoU损失。L1损失和GIoU损失对应到代码上为:
在这里插入图片描述

(六) Experiments

6.1 实验设置

  • 数据集
    MOT16,MOT17
  • 评价指标
    MOTA,MT,ML,IDS,IDF1.其中IDF1用来表示轨迹标签的准确性,MOTA用来描述整体的detection和tracking性能。
  • 训练设置
    同CenterTrack相同,使用了random flip和random crop等增强方式
    短边resize到800,最大size限制到1536.
    randomly sample key frames from video sequences来解决不同帧率的问题.
    p d r o p p_{drop} pdrop的概率erase掉tracked queries来为new-born生成更多的样本,同时还要以 p i n s e r t p_{insert} pinsert的概率模拟dead objects这是咋想到的,这样处理是不是相当于调整了gt,对性能会有影响吗
    在COCO检测数据集上预训练,采用AdamW训练200epochs,使用初始学习率 2 e − 4 2e-4 2e4,学习率在第150个epoch衰减到 2 e − 5 2e-5 2e5,batch设置成1,并且每一个batch包括了一个视频clip的5帧。在SOTA中,在联合数据集上训练(MOT17 train以及CrowdHuman),视频的initial clips为2,接着在50,90和150个epoch时变成了3,4,5,在消融实验中,基于MOT17数据集进行训练,不使用CrowdHuman。

6.2 同SOTA比较

在这里插入图片描述
讲道理这种端到端的训练方式效果上应该要比detection+association要好很多吧,主要还是目前Tracking方面端到端模型的研究比较少,应该还有很大的改进空间。

6.3 消融实验

消融实验使用不同的数据集来fast training。
在这里插入图片描述
(a)图表示TAN和CAL对模型性能的影响,两个结合起来用性能提升好多啊~
(b)图表示视频序列长度对于CAL性能的影响,多帧计算损失能够提升跟踪性能,帮助网络处理一些遮挡问题。
©(d)图表示在训练过程中增加的 p d r o p p_{drop} pdrop p i n s e r t p_{insert} pinsert的影响。
(e)表示QIM的两个阈值对模型性能的影响。

(七) Conclusion

本文提出的MOTR是一个真正的端到端的多目标跟踪框架,将track query看成是隐状态来迭代更新。同时引入了TAN和CAL来增强帧间的long-term关系,取得了有竞争力的结果。achieves competitive performance

(八) Notes

8.1 MOT方法

当前tracking-by-detection的方式,实际上将MOT任务分成了两个阶段,detection和data association。目前的association还是采用基于appearance和location差异来构建的不同frame之间的联系。appearance差异主要体现在Re-ID来度量不同frame上boxes的相似性,位置上的相似性度量主要体现在利用kalman实现的下一帧位置预测同当前检测结果的相似性。然而这种方式中learning of temporal motion not end-to-end.每一个检测box分配一个轨迹,整个pipeline并不是端到端的。
从上述来看,目前tracking-by-detection的方式主要存在的问题是:

  • 没有考虑temporal motion
  • 没有考虑整个pipeline的端到端学习

从这种情况来看,目前tracking-by-detection方式中还是存在着较多的不足之处的。
在DETR中是将目标检测问题描述成一个set prediction problem
在这里插入图片描述
如图中(a)所示,object queries(可以看成是decoupled representation of objects,从代码上来看的话,nn.Embedding(num_queries, hidden_dim).weight)输入到Transformer的decoder中,然后跟图像feature进行interact。同时采用Bipartite matching来试先one-to-one的assignment(在object queries和ground-truths之间),从而消除了NMS。
而图(b)表示的是利用,隐状态同sentence feature交互从而进行序列预测。而MOT问题也可以看成是序列 预测问题,因为最终MOT是要得到一组object sequences,这里作者是将每一个sequence对应到一个轨迹上,并且track queries是作为一个隐状态对应到图3中的 q t i q^i_{t} qti,相比于DETR中的做法这里是将检测query和track的query放到一起会不会有问题呢?有没有可能是做一个2N的query查询呢?一个用于查询detections,另一个用于查询track trajectories?,接着在Decorder中进行update得到图3中 q o t i q^i_{ot} qoti,将 q o t i q^i_{ot} qoti通过FFN(Feed Forword Network)得到类别分数以及边界框的预测值,这里跟One-Stage的方式不同了,主要是通过全连接层来得到最终的预测,而不是feature map得到最终的预测输出。

疑问:既然在输出 q o t i q^i_{ot} qoti时已经进行了query的更新,为什么还有引入QIM这个模块呢?
这里的话我觉得应该是decoder对query解码得到对应的预测边界框,接着再通过QIM中的TAN编码成隐状态。并且TAN中引入了一个shortcut来集成历史信息。

其他的一些基于Transformer框架的MOT比如TransTrack以及TrackFormer。这里本文提出的方法同其他的方法存在的差异是:
在这里插入图片描述

8.2 基于Transformer的架构

DETR中结合了CNN,Transformer以及bipartite matching来进行端到端的目标检测,在Deformable DETR中引入了deformable attention module到Transformer中。
VIT中构建了一个pure Transformer架构用于图像分类,在swin transformer中引入了shifted windowing scheme来进行self-attention

(九) TODO

  • 1. detect query中的固定长度跟DETR中是一样的呢,也就是说都指的是最大可以检测到的目标?还是说detect query和track query的总长度是DETR中detect query的长度呢?也就是可以同时使用detect query和track query来和GTs做one-by-one的对应呢?从论文的理解上来看,这里我更倾向于后面这种,需要回头代码中确认
  • 2. 5.1小节中 问题是 T i T_i Ti帧中的黄色框是不检测1和2目标了嘛?之前看代码好像是这样的,是将GTs分成两部分,一部分用于track query的回归,另一部分用于detect query的回归,回头再确认下是不是这个情况
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值