MCG-NJU / MOTIP

Multiple Object Tracking as ID Prediction
https://arxiv.org/abs/2403.16848
Apache License 2.0
90 stars 8 forks source link

一些问题没有看明白 paper #2

Closed sssssshf closed 6 months ago

sssssshf commented 6 months ago

1 文中公式1的id预测能力 这是一个单独的模型吗? 训练数据大概i是怎么样的一个数据对 输入是轨迹表达和Dt Dt是检测模型的输出是啥我看里面写的是一个embding 不是box吗 2 公式2 里的i是一个可学习的C 维向量 这个是放在哪里学习的 检测模型里的一个分支 ? 3 公式3 的e是一个检测模型的fpn输出向量 这个向量是全局的吧 为什么能够和id的k联系起来 难道不同的目标有不同的向量输出吗 有没有网络的结构图能够分享一下

xifen523 commented 6 months ago

都是好问题 我先去看看论文 再来回答

HELLORPG commented 6 months ago

关于这几个问题:

  1. 公式(1) 中所展示的是对于问题的宏观定义,具体的实现在 ID Decoder 中有所叙述,代码在这里。同时,我们采用的 Detection Embeddings 是 DETR 的输出向量,因此是一个高维向量。
  2. ID 字典是单独的一个部分,如主图所示,代码在这里
  3. 公式(3) 中的 e 是来自 DETR query 的输出,因此是每个目标一个,而不是全局共有一个。
sssssshf commented 6 months ago

关于这几个问题:

  1. 公式(1) 中所展示的是对于问题的宏观定义,具体的实现在 ID Decoder 中有所叙述,代码在这里。同时,我们采用的 Detection Embeddings 是 DETR 的输出向量,因此是一个高维向量。
  2. ID 字典是单独的一个部分,如主图所示,代码在这里
  3. 公式(3) 中的 e 是来自 DETR query 的输出,因此是每个目标一个,而不是全局共有一个。

我又去把所有的公式串起来再看了一下,大佬写的论文我小白入门看起来还是有一些疑惑,还有一些问题: 1 请问整个MOTIP 里 DETR和 ID decoder是一起训练的话 ID decoder的数据标签该如何给呢 。他的损失是从哪里来的呢,也就是公式7 里面的 Lcls 和L id 他的损失标签是怎么计算的 。

2 在3.2 history Trajectory中,公式3用到的e是o经过fpn得到的。公式4是用的o,包括前面O是有多个小o组成的,请问o和e只是经过了一个fpn变换,为什么就用到了两个地方呢 有什么特殊的含义吗。 3 在id predicetor模块,模型输入的是历史轨迹和当前帧的融合信息D 请问在不同时间里,历史轨迹的长度(也就是出现的目标数量)是不一样的,并且每个目标的轨迹长度也就是t也是不一样的 在文中只是简单的说了依据用6层的transformer来应对这个问题。 我不太清楚为啥是可以处理这种不同长度情况。 您能用简单的说法解答一下吗

HELLORPG commented 6 months ago
  1. ID Decoder 的数据标签是随机赋予的,只需要保证同一个目标在一个训练周期内的标签一致即可。公式(7) 的 L{cls} 是来自于 DETR 的原版 Loss,我们只定义了 L{id}。
  2. 是的,从 e 到 o 只经过了一个简单的 FFN 变换,具体代码在这里。没有什么特殊的含义,增加一个 adapter 理论上可以帮助模型提升性能,因为可以进行特征空间的重组和筛选。
  3. 因为 Transformer Decoder 本身就可以处理不定长的序列,因此处理起来十分方便,这也是我们本文选择用其作为 ID Decoder 结构的主要原因。
sssssshf commented 6 months ago
  1. ID Decoder 的数据标签是随机赋予的,只需要保证同一个目标在一个训练周期内的标签一致即可。公式(7) 的 L{cls} 是来自于 DETR 的原版 Loss,我们只定义了 L{id}。
  2. 是的,从 e 到 o 只经过了一个简单的 FFN 变换,具体代码在这里。没有什么特殊的含义,增加一个 adapter 理论上可以帮助模型提升性能,因为可以进行特征空间的重组和筛选。
  3. 因为 Transformer Decoder 本身就可以处理不定长的序列,因此处理起来十分方便,这也是我们本文选择用其作为 ID Decoder 结构的主要原因。

Lid这个损失函数是怎么计算的呢,也就是在出了第一帧之外的id predict过程,有一个交叉熵计算损失,真是标签是怎么样的分配呢。是需要对视频切分后的每帧给每个目标 12 34 这样的类别标签吗

HELLORPG commented 6 months ago

MOT 的 GT 中本来就有 ID 的数字标签,我们只需要将这些标签随机映射成为字典中的某一个索引即可(构建一个随机的简单 mapping 就可以)。这些索引就成为了该目标在训练过程中的 ID 标签,可以直接用于监督训练。

sssssshf commented 6 months ago

MOT 的 GT 中本来就有 ID 的数字标签,我们只需要将这些标签随机映射成为字典中的某一个索引即可(构建一个随机的简单 mapping 就可以)。这些索引就成为了该目标在训练过程中的 ID 标签,可以直接用于监督训练。 大概懂了。期待训练代码开源之后再对着代码去看。 感谢大佬。 这个工程可以对某个视频段进行跟踪展示吗,例如输入是一个mp4格式文件

HELLORPG commented 6 months ago

目前并没有实现这一功能,可能会考虑在未来增加类似我们之前工作一样的 demo 展示功能,但是具体时间还不确定,因为还有其他的工作在同步推进。 或者你可以考虑自己修改一下之前的 demo 代码,接口应该差别不大。

sssssshf commented 6 months ago
  1. ID Decoder 的数据标签是随机赋予的,只需要保证同一个目标在一个训练周期内的标签一致即可。公式(7) 的 L{cls} 是来自于 DETR 的原版 Loss,我们只定义了 L{id}。
  2. 是的,从 e 到 o 只经过了一个简单的 FFN 变换,具体代码在这里。没有什么特殊的含义,增加一个 adapter 理论上可以帮助模型提升性能,因为可以进行特征空间的重组和筛选。
  3. 因为 Transformer Decoder 本身就可以处理不定长的序列,因此处理起来十分方便,这也是我们本文选择用其作为 ID Decoder 结构的主要原因。

关于1这个问题,ID decoder这个模块输入的是DETR的embedding作为input,中间层是一个c维向量 输出也是一个c维向量 是输出的地方用于与随机赋予的标签进行loss计算吗?我理解成u型网络那样 中间层作为 i与与e进行concat?

HELLORPG commented 6 months ago

是在输出层与随机赋予的 ID 标签进行计算;不过只有在开头 i 与 e 进行 concat,后续只是逐层将输出作为输入进行计算,而不会在重复这一过程。

sssssshf commented 6 months ago

是在输出层与随机赋予的 ID 标签进行计算;不过只有在开头 i 与 e 进行 concat,后续只是逐层将输出作为输入进行计算,而不会在重复这一过程。

“输出层与随机赋予的id进行计算” 意思是 这个MOTIP有三个模块,DETR , id decoder 和id predict。iddecoder的训练损失也是由 id class这个模块传播得到的吗 它并没有自己的损失计算过程

HELLORPG commented 6 months ago

是的,梯度是可以回传的,我们不需要单独监督 ID Decoder。这样的梯度也会回传到 DETR 中,因此我们在消融中也验证了,One-Stage 的训练会优于 Two-Stage 的训练。