MCG-NJU / MOTIP

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

训练出现的问题 #24

Closed coptersack closed 3 months ago

coptersack commented 4 months ago

感谢大佬的工作,我现在想用您的模型在自己的数据集上训练,有训练指令吗。

coptersack commented 4 months ago

现在好像能训练的,但是多进程训练会报错,只能把NUM_WORKERS改成0

HELLORPG commented 4 months ago

现在好像能训练的,但是多进程训练会报错,只能把NUM_WORKERS改成0

你是在 Windows 上吗?

coptersack commented 4 months ago

现在好像能训练的,但是多进程训练会报错,只能把NUM_WORKERS改成0

你是在 Windows 上吗?

是的

HELLORPG commented 4 months ago

在报错中是不是有一段:

AttributeError: Can't pickle local object 'MOTDataset.get_dataset_infos.<locals>.<lambda>'
coptersack commented 4 months ago

在报错中是不是有一段:

AttributeError: Can't pickle local object 'MOTDataset.get_dataset_infos.<locals>.<lambda>'

是的

HELLORPG commented 4 months ago

这个问题在 Linux 系统下没有,我没有办法复现。但是根据之前和其他朋友的交流经验,这个问题应该是出在 defaultdict 中的 lambda 表达式,例如: https://github.com/MCG-NJU/MOTIP/blob/1b092827ec244dfe03d61506b78cfd7556138a17/data/mot_dataset.py#L56 这是为了实现嵌套的 defaultdict 用于更好的初始化数据集。可以尝试一下绕开,我搜到的方法可能有:https://blog.csdn.net/lly1122334/article/details/114886444

coptersack commented 4 months ago

这个问题在 Linux 系统下没有,我没有办法复现。但是根据之前和其他朋友的交流经验,这个问题应该是出在 defaultdict 中的 lambda 表达式,例如:

https://github.com/MCG-NJU/MOTIP/blob/1b092827ec244dfe03d61506b78cfd7556138a17/data/mot_dataset.py#L56

这是为了实现嵌套的 defaultdict 用于更好的初始化数据集。可以尝试一下绕开,我搜到的方法可能有:https://blog.csdn.net/lly1122334/article/details/114886444

好像windows的dataloader就是有NUM_WORKERS的问题,感谢大佬,我再自己调试一下,抱歉占用您时间了

HELLORPG commented 4 months ago

也有可能,这个我不太确定,因为我没有 windows 的开发环境,所以没办法感同身受可能哈哈。

没事儿,有问题随时交流。

coptersack commented 4 months ago

用partial嵌套确实可以解决问题,感谢大佬

HELLORPG commented 4 months ago

不用谢~ 🎉

liaopan-lp commented 4 months ago

用partial嵌套确实可以解决问题,感谢大佬

大佬,具体是用partial嵌套改了哪?我也有这个问题

coptersack commented 4 months ago

用partial嵌套确实可以解决问题,感谢大佬

大佬,具体是用partial嵌套改了哪?我也有这个问题

主要就是mot_dataset.py的两处 line 56 :

self.dataset_weights = defaultdict(lambda: defaultdict(float))

        self.dataset_weights = defaultdict(partial(defaultdict, list))

line 149:

infos = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(dict))))

    infos = defaultdict(partial(defaultdict, partial(defaultdict, partial(defaultdict, dict))))
liaopan-lp commented 3 months ago

用partial嵌套确实可以解决问题,感谢大佬

大佬,具体是用partial嵌套改了哪?我也有这个问题

主要就是mot_dataset.py的两处 line 56 : # self.dataset_weights = defaultdict(lambda: defaultdict(float)) self.dataset_weights = defaultdict(partial(defaultdict, list)) line 149: # infos = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))) infos = defaultdict(partial(defaultdict, partial(defaultdict, partial(defaultdict, dict))))

谢谢大佬

coptersack commented 3 months ago

我这几天用自己的数据训练之后发现一个严重的问题,检测的效果良好,但是ID的分配几乎没有一个是对的,应该继承上一帧的ID全被舍弃,几乎所有的ID都是新分配的,这是什么原因呢,是因为我的数据量太小了吗,加起来一共182帧,我只有一张3090,所有数据加起来一起训练耗时太久了。

HELLORPG commented 3 months ago

182 帧是只有一个视频吗?

coptersack commented 3 months ago

182 帧是只有一个视频吗?

两个

HELLORPG commented 3 months ago

log.txt 文件方便给一个吗?看看 loss 的收敛情况。

coptersack commented 3 months ago

log.txt 我自己给summary全写了0,主要是看id_loss吗,好像确实是没有变化

HELLORPG commented 3 months ago

有关于训练参数,有两个关键点:

coptersack commented 3 months ago

ACCUMULATE_STEPS我没有改动,还是2,明白了,就是要调整ACCUMULATE_STEPS和训练轮数再看效果,那ACCUMULATE_STEPS和Epochs如何配合设置,向大佬请教了,此外项目里evaluate部分是不是还没有?

HELLORPG commented 3 months ago

因为我不太了解你们具体的应用场景,我只能给出一些我的理解:

HELLORPG commented 3 months ago

另外,你可以尝试一下增加一个训练步骤,在短序列上对 ID embeddings 进行一个初步训练,例如:

SAMPLE_STEPS: [0, 40]
SAMPLE_LENGTHS: [4, 40]
SAMPLE_MODES: [random_interval, random_interval]
SAMPLE_INTERVALS: [4, 4]

如上这样修改可以在前 40 个 epochs 只以 clip_length=4 的形式进行训练,从而减少一定的开销。 PS:也可以更短,例如 clip_length=2/3 应该也是可以的。

HELLORPG commented 3 months ago

你可以参考一下我在 Results 中给出的 DanceTrack 的 log.txt 文件,了解一下模型大概的收敛曲线。

coptersack commented 3 months ago

好滴,十分感谢,太麻烦您了!

HELLORPG commented 3 months ago

不用谢~