czhaneva / SkeleMixCLR

This is the official implemntation for SkeleMixCLR
BSD 2-Clause "Simplified" License
18 stars 2 forks source link

关于NTU60数据集上复现准确率差异的进一步询问 #4

Closed b123-g321 closed 1 month ago

b123-g321 commented 2 months ago

非常感谢您之前分享的详细配置信息,这对我进行模型复现工作至关重要。然而,在严格按照您提供的配置进行复现后,我在NTU60数据集上得到的准确率(xview: 79.06%,xsub: 74.54%)与您所提及的准确率(xview: 85.5%,xsub: 80.7%)存在一定差距。 为了明确问题所在,我想进一步确认以下几点: 1.模型与配置文件:您提到的准确率(xview: 85.5%,xsub: 80.7%)是否是通过net\skeletonclr_multi_swapv2.py和processor\pretrain_skeletonclr_multi_swapv2.py文件,并在config\CrosSCLR\skelemixclr_multi_swap_ntu.yaml配置文件中设置view: 'joint'时获得的吗? 2.数据流调整:关于数据流的修改,如果我将输入的数据流从'joint'改为'motion',是直接改成view: ’motion’?另外,如果我想尝试集成'J+M+B'(关节+运动+骨骼)三种数据流进行训练,应该如何调整配置文件和代码?我注意到在skeletonclr_multi_swapv2.py中可能没有直接支持三种数据流的集成训练,请问是否有相关的指导或示例代码可以参考? 鉴于上述疑问和差异,我真诚地希望您能提供以下帮助: 类似问题解决经验:您是否曾经遇到过类似的准确率差异问题?如果是,您是如何定位并解决这些问题的? 影响因素分析:除了上述提到的数据流和配置文件差异外,您认为还有哪些因素可能显著影响模型的准确率?我是否需要进行额外的检查或调整来优化我的复现结果? 我非常重视这次复现工作,并希望能够尽快缩小与您所报告准确率的差距。您的任何指导和建议都将对我大有裨益。再次感谢您的耐心阅读和及时回复,期待您的宝贵回复。

czhaneva commented 2 months ago
  1. 是的,你可以通过README.md中的指引获得所述结果 2.1 你的描述是正确的,将“joint”替换为"motion" 或者 “bone”即可得到对应串流的结果,注意测试阶段也需要同步修改 2.2 SkeleMixCLR目前暂不支持多串流同步训练,而是基于Ensemble的方式进行集成学习的,你可以在得到各个串流的结果后,参考ensemble.py得到J+M+B的结果

Q1. 关于准确率的问题,我建议你先使用所提供的权重的权重测试下性能,看看性能是否符合预期,如果符合预期,那就是训练阶段出了问题,可以考虑从配置检查,例如数据集、串流的选择。 Q2. BatchSize对模型的性能影响比较大,你可以尝试完全按照所提供的配置进行训练和测试,看看是否可以达到预期,如果batchsize无法满足,可能需要考虑下梯度累积策略,或者多卡的同步BN策略

b123-g321 commented 1 month ago

非常谢谢您的宝贵建议,我按照您的指导进行了详细的测试,并尝试了一些调整以期望达到原文中提到的准确率,但结果仍有一定差距。以下是具体的测试过程以及发现的问题: 1)使用提供的权重文件以及严格按照提供的测试的配置,得到的结果比原文提到的准确率少了3 ~ 3.4%。其中,NTU-60的xsub:77.4%,xview:82.5%;NTU-120的xsub:65.9%,xset:65.1%。(配置文件中改动的地方就是数据集路径和相应数据集对应的类别数num_class,其他都是源码中的参数,包括Batch-Size等,均未改动。在3090和4090上均已测试,得到结果一致。) 2)检查了原文,看到原文里,在线性评估阶段,使用初始学习率3训练了100轮,而测试配置文件的是80轮,于是根据原文中提到的step(原80)改成step: [100],再测试提供的参数权重文件,上述4种数据集的准确率均只比未改动step前提高了0.1%。 3)关于动量参数:原文里是0.9,配置文件是0.999。于是也做了部分实验,结果骤降。 如果您有任何进一步的建议或指导,请随时告知。我非常期待能够进一步提升模型的准确率,并感谢您在此过程中的支持与帮助!

czhaneva commented 1 month ago
  1. 数据集的内容建议检查一遍,是否按照README.md中的流程生成了数据集,我曾在三台服务器上复现过该结果,均没有这么大的偏差,建议你排查下数据集,或者按照流程重新生成
  2. 线性评估阶段的step指的是在第80轮的时候进行学习率衰减,总共训练100个epoch,前80个epoch学习率为3.0,后20个学习率为0.3
  3. 动量参数有两个,一个是MoCo的,其配置在model_args下面,该配置为0.999(原文未提及,该参数沿用CrosSCLR论文,建议阅读此论文),另一个是SGD的,该参数为0.9(与原论文保持一致)
czhaneva commented 1 month ago

希望你已成功复现论文结果,如有疑问,可重开此issue

b123-g321 commented 3 weeks ago

谢谢您的耐心指导和关心,首先,关于数据处理这块,我是按照README.md里的步骤去做的,如下面两条指令所示:

generate raw database for NTU-RGB+D

  $ python tools/ntu_gendata.py --data_path <path to nturgbd+d_skeletons>   # preprocess the above data for our method (for limited computing power, we resize the data to 64 frames)   $ python feeder/preprocess_ntu.py 下面是根据这两行指令处理数据过程的结果展示: 1.通过上面两个步骤,得到如下NTU60的数据,读取并打印了数据维度,如图1所示:

图片1

2.NTU-120的数据集处理过程的具体展示,如图2: 图片2 总之,按照上述流程处理数据之后,复现的结果还是低,不清楚造成这样的原因是什么,还请作者能帮忙指点一二,不胜感激。 其次,就是三个数据流的集成,ensemble.py文件里的r1-4(如图3)读取的是什么文件呢?我试着去读linear_eval测试得出来的.pt文件,并转换成.pkl文件,内容如图4所示,继续将这个文件当做权重文件进行读取,但按照您提供的代码里的那种读取方式,是读取不了的,所以我想问您,这个pkl文件是怎么得到的呢? 图片3 图片4

b123-g321 commented 3 weeks ago

谢谢您的耐心指导和关心,首先,关于数据处理这块,我是按照README.md里的步骤去做的,如下面两条指令所示:

generate raw database for NTU-RGB+D

  $ python tools/ntu_gendata.py --data_path <path to nturgbd+d_skeletons>   # preprocess the above data for our method (for limited computing power, we resize the data to 64 frames)   $ python feeder/preprocess_ntu.py 下面是根据这两行指令处理数据过程的结果展示: 1.通过上面两个步骤,得到如下NTU60的数据,读取并打印了数据维度,如图1所示:

图片1

2.NTU-120的数据集处理过程的具体展示,如图2: 图片2 总之,按照上述流程处理数据之后,复现的结果还是低,不清楚造成这样的原因是什么,还请作者能帮忙指点一二,不胜感激。 其次,就是三个数据流的集成,ensemble.py文件里的r1-4(如图3)读取的是什么文件呢?我试着去读linear_eval测试得出来的.pt文件,并转换成.pkl文件,内容如图4所示,继续将这个文件当做权重文件进行读取,但按照您提供的代码里的那种读取方式,是读取不了的,所以我想问您,这个pkl文件是怎么得到的呢? 图片3 图片4

b123-g321 commented 3 weeks ago

再次感谢您的耐心指导和关心。我一直在严格按照 readme 文档中的流程处理数据,并且已经尝试了多次,但遗憾的是,我得到的复现结果仍然低于预期。我不清楚是什么原因导致了这样的结果差异,因此非常希望能得到您的进一步指点。此外,我还想询问关于三流集成的问题。能否请您详细说明在进行三流集成时需要读取的具体文件是什么呢?这将对我接下来的工作非常有帮助。我已经将相关的图和文字描述发布在了 GitHub 上。期待着您的回复,并希望能得到您的进一步帮助和指导。非常感谢您抽出宝贵时间来支持我的工作。

祝好

在 2024-09-11 11:13:15,"czhaneva" @.***> 写道:

希望你已成功复现论文结果,如有疑问,可重开此issue

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

czhaneva commented 3 weeks ago

数据的帧长应该是64,但是看你显示的shape,帧长是32

czhaneva commented 3 weeks ago

修改max_frame = 32为max_frame = 64

b123-g321 commented 3 weeks ago

谢谢您的回复,还有一个问题就是:三个数据流的集成,ensemble.py文件里的r1-4(如图3)读取的是什么文件呢?我试着去读linear_eval测试得出来的.pt文件,并转换成.pkl文件,内容如图4所示,继续将这个文件当做权重文件进行读取,但按照您提供的代码里的那种读取方式,是读取不了的,所以我想问您,这个pkl文件是怎么得到的呢? 图片3 图片4

czhaneva commented 3 weeks ago

读取的是测试结果,你可以查看下这一段代码,其保存了测试结果,用于决策融合https://github.com/kchengiva/Shift-GCN/blob/20276b64d16775c2de33408beb32825d2f93ffa4/main.py#L407C1-L474C43

b123-g321 commented 2 weeks ago

请问作者ensemble里的那三个pkl文件是self.io.save_pkl(result_dict, 'test_result.pkl') 实现的,还是函数def eval(self, epoch, save_score=False, loader_name=['test'], wrong_file=None, result_file=None)实现的。如果是self.io.save_pkl(result_dict, 'test_result.pkl') 实现的能不能告诉一下self.result有没有经过什么处理,因为这里self.result我查看里面的内容是空的。也就是还是初始化的情况。 1微信图片_20240927161549 2微信图片_20240927161629 3微信图片_20240927161657

czhaneva commented 2 weeks ago

ensemble本质上是决策融合,其具体实现是保存每个串流的输出结果,最后进行加权平均然后取最高置信度的类别作为预测的结果。 其实现为首先保存每个串流的输出(dataloader的shuffle需要设置为False,防止顺序混乱),如我所提供的链接那样(假设为60个类别),保存的是样本名(用来校对顺序是否正确)和60个类别的概率。 你所描述的结果为空,是否是因为你没有把每个测试batch的输出保存至result中导致的呢?

b123-g321 commented 2 weeks ago

非常感谢,在您的帮助和指导下,找到了复现结果低的原因,将max_frame =32改成max_frame = 64复现的结果有了提升。但关于ensemble.py集成方面我有些问题还需要请教您,具体的已经提交至github上,非常期待您的宝贵意见和解答。

在 2024-09-23 08:53:58,"czhaneva" @.***> 写道:

读取的是测试结果,你可以查看下这一段代码,其保存了测试结果,用于决策融合https://github.com/kchengiva/Shift-GCN/blob/20276b64d16775c2de33408beb32825d2f93ffa4/main.py#L407C1-L474C43

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

b123-g321 commented 2 weeks ago

您之前提到的用于决策融合(),是加在processor/processor.py的函数 def start()的train模块里边吗?还是test模块呢?能否告知我一下源码呢?这个问题对我非常重要,非常感谢。

图片11