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

请问有没有推理的代码呢 #18

Closed BianJinLong123 closed 3 months ago

HELLORPG commented 3 months ago

你可以参考我们所提供的文档,包含有提交到服务器所需要的脚本。

BianJinLong123 commented 3 months ago

好的,非常感谢,我还想问一下这个模型适合迁移到红外弱小目标跟踪上来吗

HELLORPG commented 3 months ago

不用谢。 这我还真的不太了解,因为没有了解过红外跟踪这个领域的具体需求。如果你们这边可以基于 DETR 类的方法进行检测的话,我觉得应该可以试一试。还可以看看之前的 E2E 方法例如 MOTR/TrackFormer/MeMOTR 是否有在这个领域的应用,如果有的话那我们这个也是可以的,因为我们都是基于 DETR 做检测后进行跟踪的。

BianJinLong123 commented 3 months ago

收到,非常感谢,后续如果有什么问题的话再向您请教

HELLORPG commented 3 months ago

好的,没问题,欢迎交流。

BianJinLong123 commented 2 months ago

大佬,请问在配置文件中 INFERENCE_ENSEMBLE: 0 这个配置是集成学习的意思吗,就是推理的时候使用多个训练好的模型来均衡考虑, 设置为0就是只使用一个模型来推理,而设置为n就是使用n个模型来推理,我这样理解正确吗

HELLORPG commented 2 months ago

大佬,请问在配置文件中 INFERENCE_ENSEMBLE: 0 这个配置是集成学习的意思吗,就是推理的时候使用多个训练好的模型来均衡考虑, 设置为0就是只使用一个模型来推理,而设置为n就是使用n个模型来推理,我这样理解正确吗

很抱歉,前段时间太忙了没能注意到这个回复,下次你可以尝试 new 一个 issue。 从我的构想里面不太一样,因为 model ensemble 实在有点昂贵(需要额外 x TIMES 的训练时间)。我这边考虑的是对 ID Embed 进行打乱,对 ID Decoder 部分进行一个小小的 ensemble,实现起来不是非常费时间,并且可以消除一部分的 ID Embeding 带来的波动,同时在大多数情况下带来一点性能的提升。不过在当前的开源代码版本中没有实现这一功能,后续如果实现的话,我会在 News 中提到的。 谢谢关注,如果有需要随时交流。

GianlucaMancusi commented 2 months ago

Hi @HELLORPG, can you briefly explain this issue in English? Just a recap, thank you

HELLORPG commented 2 months ago

@GianlucaMancusi Sure! The discussion at the beginning of this issue was about whether there is code used for model inference, and I replied that it can be found in our doc. Then he asked me if our model could be applied to infrared small target tracking (not sure about this translation). I replied that I'm not sure about it, I think if DETR can be used in infrared small target detection, then our model can be used in tracking. Finally, he asked me if the INFERENCE_ENSEMBLE parameter represents an ensemble of inferences using multiple models. I said that our design is going to use a runtime & lightweight ensemble only on the ID Decoder. However, this part of the code is currently not open source. Based on my experiments so far, in most cases, this will slightly improve the performance of the model and make it more stable. You can follow our News 🔥 to get the latest news.

That's all. If you have any other questions, feel free to discuss with me.

BianJinLong123 commented 2 months ago

是不是打乱ID嵌入之后训练多个ID解码器,相当于只集成了ID解码器这一部分模型,假如ID嵌入打乱之前 模型输出的的 ID为 1 2 3 4 ,而 ID嵌入打乱之后 假如 原先的 ID嵌入 由 1 2 3 4 变为了 3 4 1 2 , 那么由这个打乱后的 ID嵌入 训练出来的 ID 解码器 的输出就变为了 3 4 1 2 。 另外,我看到 ID嵌入 是由 最初的 独热编码 经过 前馈网络 得到的 ,那么在 训练的时候, 是不是主要训练 ID解码器 和 这个前馈网络 这两部分呢。我这样理解对吗,非常感谢

HELLORPG commented 2 months ago

是不是打乱ID嵌入之后训练多个ID解码器,相当于只集成了ID解码器这一部分模型,假如ID嵌入打乱之前 模型输出的的 ID为 1 2 3 4 ,而 ID嵌入打乱之后 假如 原先的 ID嵌入 由 1 2 3 4 变为了 3 4 1 2 , 那么由这个打乱后的 ID嵌入 训练出来的 ID 解码器 的输出就变为了 3 4 1 2 。 另外,我看到 ID嵌入 是由 最初的 独热编码 经过 前馈网络 得到的 ,那么在 训练的时候, 是不是主要训练 ID解码器 和 这个前馈网络 这两部分呢。我这样理解对吗,非常感谢

我目前的实现会比你这个更加初级一点,就是我网络中的 ID Decoder 是只有一份的(不会有集成,只训练一个这个 ID Decoder)。 我只是在推理中,在处理每一帧的时候,像是你说的,打乱几次 ID embed,以此来获得不同的 ID embed 和 ID labal(最终输出)的对应关系。这样的原因是因为我发现在推理过程中,如果打乱 ID embed,会带来一定的波动(考虑是因为 ID 词典的训练具有随机波动,这也是可以预料的)。因此,我取了多次打乱后 ID embed 的结果作为平均,就可以得到更加稳定 & 略微效果更好的结果。

给一个我所说的对应关系的例子:

output ID label (in the submit file): 0 1 2 3
ID embed (normal case): 0 1 2 3
ID embed (ensemble 1): 3 34 21 1
ID embed (ensemble 2): 21 33 8 9
......

也就是说,输入 ID Decoder 的 ID embed 不一样,但是对外输出到跟踪结果的 ID 是一样的,在 ID Decoder 之后将 ensemble ID embed 重新对应到 output ID label 上(加和 logits 并且平均),这样就完成了一个简单的 runtime ensemble,其实是对 in-context ID embed 的一种 ensemble。 这个有点混乱,最近事情有点多,我暂时没有组织好语言,如果你有问题的话,欢迎讨论。

BianJinLong123 commented 2 months ago

懂了,就只是用多个打乱后的ID 嵌入得到的结果做了一下集成,非常感谢你耐心的回答,非常感谢

HELLORPG commented 2 months ago

不用谢。目前是这样做的,主要是这样的 coding 会相对简单并且也有效果。 在训练中,也可以对偶的来增加对 ID 词典部分的监督(但是同样的也不需要引入额外的训练参数量)。

这两个部分目前都未开源,后续开源会在 News 中提到。 也十分感谢您对我们工作的关注。

BianJinLong123 commented 2 months ago

大佬,我又来问问题了。在DETR检测器的编码器和解码器的自注意力层中都用到了 sampling_offsets(采样偏移量) 和 attention_weights(注意力权重) ,这两个张量是通过 sampling_offsets 和 attention_weights 这两个线性层得到的,在我的认知当中,注意力权重是Q和K计算后通过softmax得到的,那么sampling_offsets(采样偏移量) 和 attention_weights(注意力权重)是什么意思呢,这个我百思不得其解,我尝试查看底层代码,发现底层代码是 'MultiScaleDeformableAttention.cp311-win_amd64.pyd' 不可查看,所以我不清楚这个自注意力层的实现细节,如果方便的话希望您可以解答一下,如果不方便回答的话就不用了,非常感谢!

HELLORPG commented 2 months ago

这个部分的内容超出了我们本文阐述的范围,你可以参考一下 Deformable DETR 的文章,这是他们提出的技术,后续在绝大多数的 Deformable Attention 都采用了这一做法,和传统的 Attention 是有差异的,主要是为了减少因平方增长而带来的计算量爆炸问题。

BianJinLong123 commented 2 months ago

你好,在seq_decoder.py 的 net_forward方法中,

Adapter

    trajectory_feature_embeds = format_seq["trajectory"]["features"]
    unknown_features = format_seq["unknown"]["features"]

    # Use a simple adapter:
    trajectory_feature_embeds = self.trajectory_feature_adapter(trajectory_feature_embeds)

    # Trajectory Augmentation, only use FFN for now:
    trajectory_feature_embeds = self.trajectory_augmentation(
        seq_features=trajectory_feature_embeds,
    )

这一部分代码为什么只是将历史轨迹的特征经过两个FFN,而当前检测帧的特征就不做任何处理,而且我不太理解这两个FFN有什么作用

HELLORPG commented 2 months ago

这里的两个 FFN 的含义么有那么明确,当初的思考和来源是这样的:

  1. 第一个 self.trajectory_feature_adapter 是因为考虑到 DETR 出来的内容中存在检测信息,增加一个 adapter 企图筛选掉不需要的信息(或者说增强所需要的信息)。之所以没有在当前帧上面做这个 FFN,是因为当时考虑到 Decoder 中当前帧的 feature 会经过多个 cross-attention 不断更新,所以没有增加这个。
  2. 第二个 self.trajectory_augmentation 是一个历史遗留问题,我曾经尝试过比较复杂的建模方式,但是带来的提升微乎其微,因此最终将复杂的建模形式退化成为了一个 FFN,并且保留在了最终的版本中。

在我现在的理解中,我认为,两个 FFN 至少可以删掉一个,或者是将当前帧的 feature 也经过 FFN。不过我中途做过类似的实验,并没有带来太大的差距当时。为了减少重复实验,保持消融实验中的统一(毕竟 GPU 资源也不是大风刮来的),我就保留了这个无伤大雅但是可能确实也没有太大影响的设计。

HELLORPG commented 2 months ago

这一部分代码为什么只是将历史轨迹的特征经过两个FFN,而当前检测帧的特征就不做任何处理,而且我不太理解这两个FFN有什么作用

简言之,如果你没有特别的需求,可以不用管它们;它们也不是本文中关键的组件,应该也不需要特别理解。

BianJinLong123 commented 2 months ago

我用这个模型跟踪红外小目标的时候,检测没什么大问题,就是偶尔会重复检测到同一个目标,但是跟踪的时候查询效果很不好,完全跟踪不到,应该是小目标特征不明显导致的,我尝试将检测框(4维)映射到256维度的嵌入,加入到512维的特征中(特征嵌入+id嵌入)变为(框嵌入+特征嵌入+id嵌入)来进行查询,有一点效果,但是整体效果还是不好,我又尝试变为(框嵌入+id嵌入)来进行查询,效果好了很多,但还是差点意思

BianJinLong123 commented 2 months ago

但是肯定不能用(框嵌入+id嵌入)来进行查询,这样无法应对目标交叉这样的挑战,我现在有点不懂怎么能利用好这个特征,或者说如何能丰富这个特征,让模型适用于小目标跟踪跟踪

HELLORPG commented 2 months ago

关于其他特定的 MOT 应用场景,我确实不太了解,不过我认为有这个几个部分可以来尝试或者思考:

  1. 模型是否收敛完全:可以参考 #24 中的讨论。
  2. 可以引入一定的运动估计模块来产生出了 bounding boxes 信息之外的 position embedding。
  3. 可能红外目标由于缺少纹理信息?(在我的理解中,红外目标中的完整色块区域会比较多,因为温度的出现总是带有区域性的)这有可能导致特征的提取比较困难?可以参考一下以前红外 MOT 中的 ReID 方法看看?