Open Hudaodao99 opened 8 months ago
@Hudaodao99 您好,这个问题其实是这样的,efficient neck这是一个特殊设定,是为了一些下游任务完全不需要文本输入的,如果要极致的速度且不考虑zero-shot或者推理能力的话,可以考虑用这个。
其次,我们在fine-tune的时候,针对efficient neck和正常的neck都是用相同的预训练模型,使用efficient neck的时候,其实只忽略了文本与图像交互的参数,其本质作用是对图像特征的modulation,也就是一种非线性的缩放,不会影响中间的shape,因此使用相同的预训练模型也可以正常训练efficient neck的版本(这个版本无法zero-shot推理)。
使用efficient neck目前在我们提供的pre-trained weights下fine-tune可以达到和原版neck一样的性能,也就避免去重复大规模的训练模型了,可以用较少的epochs让模型收敛到一个不错的点,这个也是预训练模型带来的一个特性。
@wondervictor 感谢指导~
但在finetune自己数据集的实验中,会出现加入efficient neck的结果比未加入efficient neck的表现效果更好。经过可视化发现,未加入efficient neck进行finetune会出现空检测结果,这会导致低准确率。请问你们做实验会出现这种情况吗?或者有更好的解决办法来避免吗?
@Hudaodao99 你说的这种情况是存在的,我们之前也遇到过这种情况,在相对类别较少的数据上微调,文本到图像的交互可能并没有什么优势了(COCO上已经有一些表现了),文本到图像的作用更多是从预训练和大规模视觉-语言数据来考虑,对于文本或者预料丰富,这种交互就非常关键了。
如果不考虑继续做open-vocabulary detection,可以继续沿用efficient neck的方式,如果想继续延续open-vocabulary detection,我建议可以修改num_training_classes
来适配你这边的数据集,如果继续用80的话,还是去用padding填充,可能会导致一些可能空检测结果。
可视化结果我们还没有具体看过,如果可以的话,可以提供一些样本吗。
@wondervictor 感谢您的细心解答~我使用的MultiModalDataset格式来进行finetune,请问不使用YOLOv5MixedGroundingDataset格式,同时不使用efficient neck的方式,只使用MultiModalDataset是否也可以达到open-vocabulary detection效果呢?
在文档中给出的三个config文件中,将num_classes
和num_training_classes
均设置为10(我自己数据集的总类别数量),epoch=80,threshold默认。finetune后的三个权重文件进行测试结果分别如下:
如上所示,只有最后一种含有efficient neck的finetune会正常检测出目标,其余两个都会存在空检测(将整张图作为目标)。请问怎么解决或者避免呢?或者有其他参数需要注意更改的吗?
@Hudaodao99
只使用MultiModalDataset是否也可以达到open-vocabulary detection效果呢?
这句话我比价好奇,目前的话,其实如果您这边类别比较固定的话,我推荐用MultiModalDataset
,这两种dataset class其实都是可有做open-vocabulary,只是侧重不一样。
你提供的这个可视化结果有点意思,我之前还没注意到,我这边看看是哪里有问题。
@wondervictor 很感激您的回复!期待解决方法~
请问侧重不一样是指YOLOv5MixedGroundingDataset格式的泛化性更强或者open-vocabulary语义理解更好吗?如果我将固定类别扩充句子为这个格式,是否检测泛化性效果更好?open-vocabulary效果更好呢?
@Hudaodao99 侧重点不是泛化性的问题,主要是类似于GQA这些数据包含了rich texts,也就是每个框的标注都不一样,针对这种情况,我们就弄一个grounding dataset来保证每个框都有一个text,而对于COCO或者O365这样的数据,每个框给一个索引就可以对应到一个text。其实只是处理text上的区别,如果扩充句子,如果单纯采用prompt方式的话,可以直接修改LoadText
是支持提供prompt的,如果是复杂的句子,或者每个物体标注都不一样的text,就可以考虑用grounding dataset了,效果上其实没有对比,目前是针对不同的数据用不同的dataset class。
@wondervictor 明白了,十分感谢~
@Hudaodao99 关于那个可视化的问题,我这边还在继续关注debug,如果您这边有新的发现可以同步给我,这个问题我觉得挺关键的。PS: 你可以尝试增加一个[" "] 空类别进去看看。
@wondervictor 好的~ 但是我在实验时发现image_demo.py中输入的text已经默认加入一个空类别了,可能空类别的加入并不能影响空白检测?
texts = [[t.strip()] for t in args.text.split(",")] + [[" "]]
您好~在使用YOLO-World过程中,注意到yolo_world_l_dual_vlpan_2e-4_80e_8gpus_mask-refine_finetune_coco.py和yolo_world_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py文件中的pretrain weight均为
load_from = 'pretrained_models/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth'
即不含有efficient neck的训练权重。pretrain的config文件中也没有efficient neck的区分。但在finetune中,他们有efficient neck的区分。请问pretrain和finetune的结构上是否存在差别?如果结构不一样的话,会有进行什么操作使他们对齐呢?如果pretrain中直接使用efficient neck的话,会对使用efficient neck的finetune结果有提升吗? 感谢解答