open-mmlab / mmdetection

OpenMMLab Detection Toolbox and Benchmark
https://mmdetection.readthedocs.io
Apache License 2.0
29.02k stars 9.36k forks source link

关于mm_grounding_dino获得伪标签后的训练 #11374

Open zhangnanyue opened 7 months ago

zhangnanyue commented 7 months ago

首先感谢你们的工作,按照你们提供的方式,在自有数据集上进行微调,获得了超预期的效果。

我有一个疑问关于:mm_grounding_dino获得伪标签后的训练。

在“模型自训练伪标签迭代生成和优化 pipeline”中的第3条:“在得到伪标签后,你可以混合一些预训练数据联合进行继续预训练,提升模型在当前数据集上的性能,然后重新运行 2 步骤,得到更准确的伪标签,如此循环迭代即可”。

这里的“混合一些预训练数据联合进行继续预训练”,是指将伪标签混着预训练数据,每次都要重头开始训练,还是从上一次训练获得的checkpoint迭代着训练?

hhaAndroid commented 7 months ago

感谢你的使用。 是基于从上一次训练获得的checkpoint迭代着训练,如果是最开始的话就是加载我们发布的权重进行继续预训练。注意学习率要调小一些,否则会波动很大。

zhangnanyue commented 7 months ago

感谢你的使用。 是基于从上一次训练获得的checkpoint迭代着训练,如果是最开始的话就是加载我们发布的权重进行继续预训练。注意学习率要调小一些,否则会波动很大。

感谢您的回答。

我今天在使用的时候仍遇到一些问题:

事情的背景是,由于缺少数据标注(少量标注)及GPU资源,我想依靠你们给出的微调方法及模型自训练伪标签迭代生成和优化方法。通过微调后的模型,对数据集进行推理,获得更多的数据标签。然后在通过更多的数据标签,来进行微调,如此循环。我现在的做法是: 1、使用少量的数据(COCO格式)进行微调(完成); 2、获取微调后的权重,使用该权重对数据集中其他未打标签数据生成伪标签(OD格式)(完成); 3、将所有已有的数据也转为OD格式,加上伪标签一起,并修改微调config文件中的部分参数(适配OD格式),进行微调,这一步并未能完成,程序报错。

我的问题是: 1、”在得到伪标签后,你可以混合一些预训练数据联合进行继续预训练“,我的理解是,在获取了伪标签数据后,使用--resume加载之前的checkpoint继续进行训练,这一步应该和微调并不相同? 2、 ODVG格式的数据,是不是不能进行微调操作? 3、不知道我上述的做法是否有误,您这边是否有更好的建议?

hhaAndroid commented 7 months ago
  1. 你重新混合数据训练的话,不是用 resume,而是应该用 load_from
  2. 不管是啥数据都支持微调的,ODVG 的微调我们也有例子的,所以是可以的,可以看 LVIS 微调,那个就是 ODVG 格式微调
  3. 上面做法没有问题的,就是可能有些参数要调,不同 stage 和不同规模的数据,学习率啥的要调一下
zhangnanyue commented 7 months ago
  1. 你重新混合数据训练的话,不是用 resume,而是应该用 load_from
  2. 不管是啥数据都支持微调的,ODVG 的微调我们也有例子的,所以是可以的,可以看 LVIS 微调,那个就是 ODVG 格式微调
  3. 上面做法没有问题的,就是可能有些参数要调,不同 stage 和不同规模的数据,学习率啥的要调一下

依旧您说的方法,对照着其他例子,我已经将单个步骤中所有遇到的BUG修复。期待后续整个流程构建好,能有不错的效果。

再次感谢您的耐心解答。

zhangnanyue commented 6 months ago
  1. 你重新混合数据训练的话,不是用 resume,而是应该用 load_from
  2. 不管是啥数据都支持微调的,ODVG 的微调我们也有例子的,所以是可以的,可以看 LVIS 微调,那个就是 ODVG 格式微调
  3. 上面做法没有问题的,就是可能有些参数要调,不同 stage 和不同规模的数据,学习率啥的要调一下

您好, 目前,我已经构建了训练的全流程,步骤如下: 1、使用少量的数据66张(od格式)进行微调,已经完成,检出率和置信度都很好,20个epoch,学习率为0.0001; 2、使用微调后的权重对数据集中其他未打标签数据生成伪标签(200张图片,od格式),设置置信度为0.7; 3、将第二步生成的伪标签和第一步的数据进行混合,并load_from第一步生成的微调权重,其余训练参数与第一步相同,进行微调训练。

在完成第三步后,检出率和置信度均有下降。第三步训练的log文件为20240228_192337.log

我这边的疑问在于: 1、生成伪标签后,进行混合训练。从信息论的角度来说,网络训练只是在自我迭代,没有人为的增加任何额外信息,这种循环如何能提高网络精度? 2、混合训练后,网络精度降低,如果我想获得更好的精度,有什么建议吗?

ccccwb commented 5 months ago
  1. 你重新混合数据训练的话,不是用 resume,而是应该用 load_from
  2. 不管是啥数据都支持微调的,ODVG 的微调我们也有例子的,所以是可以的,可以看 LVIS 微调,那个就是 ODVG 格式微调
  3. 上面做法没有问题的,就是可能有些参数要调,不同 stage 和不同规模的数据,学习率啥的要调一下

您好, 目前,我已经构建了训练的全流程,步骤如下: 1、使用少量的数据66张(od格式)进行微调,已经完成,检出率和置信度都很好,20个epoch,学习率为0.0001; 2、使用微调后的权重对数据集中其他未打标签数据生成伪标签(200张图片,od格式),设置置信度为0.7; 3、将第二步生成的伪标签和第一步的数据进行混合,并load_from第一步生成的微调权重,其余训练参数与第一步相同,进行微调训练。

在完成第三步后,检出率和置信度均有下降。第三步训练的log文件为20240228_192337.log

我这边的疑问在于: 1、生成伪标签后,进行混合训练。从信息论的角度来说,网络训练只是在自我迭代,没有人为的增加任何额外信息,这种循环如何能提高网络精度? 2、混合训练后,网络精度降低,如果我想获得更好的精度,有什么建议吗?

您好,我也对混合训练的问题有疑问,请问这个问题您解决了吗

HarryBarry123 commented 5 months ago

请用两张RTX3090或者4090能够使用1000张左右的图像进行微调嘛

zhangnanyue commented 5 months ago
  1. 你重新混合数据训练的话,不是用 resume,而是应该用 load_from
  2. 不管是啥数据都支持微调的,ODVG 的微调我们也有例子的,所以是可以的,可以看 LVIS 微调,那个就是 ODVG 格式微调
  3. 上面做法没有问题的,就是可能有些参数要调,不同 stage 和不同规模的数据,学习率啥的要调一下

您好, 目前,我已经构建了训练的全流程,步骤如下: 1、使用少量的数据66张(od格式)进行微调,已经完成,检出率和置信度都很好,20个epoch,学习率为0.0001; 2、使用微调后的权重对数据集中其他未打标签数据生成伪标签(200张图片,od格式),设置置信度为0.7; 3、将第二步生成的伪标签和第一步的数据进行混合,并load_from第一步生成的微调权重,其余训练参数与第一步相同,进行微调训练。 在完成第三步后,检出率和置信度均有下降。第三步训练的log文件为20240228_192337.log 我这边的疑问在于: 1、生成伪标签后,进行混合训练。从信息论的角度来说,网络训练只是在自我迭代,没有人为的增加任何额外信息,这种循环如何能提高网络精度? 2、混合训练后,网络精度降低,如果我想获得更好的精度,有什么建议吗?

您好,我也对混合训练的问题有疑问,请问这个问题您解决了吗

还没有,依旧困扰着我,没有想明白为什么

zhangnanyue commented 5 months ago

请用两张RTX3090或者4090能够使用1000张左右的图像进行微调嘛

可以,完全够用。