项目场景:
前段时间做了基于自己的数据集进行yolo-world模型训练的实验,虽然历经周折但是模型都训练成功了,在我的数据集上通过yolo-world训练的模型map显著高于通过yolov8训练的模型,而且yolo-world模型支持自定义类别检测。
问题描述
但是问题也就出现了,经过微调训练之后的发现模型的zero-shot能力几乎消失了,也就是说通过官方发布的预训练模型可以检测任意类别,但是经过微调之后只能检测在训练过程中预定的类别,其他类别尽管调低阈值也没法检测到。
想要使用yolo-world训练模型本来就是想在保留zero-shot能力的基础之上对自己的数据集达到更好的检测效果,在yolo-world的issue上查看了很多办法都进行了尝试但是效果并没有很明显。
原因分析:
官方也在找具体原因,目前还不清楚,希望有知道原因的大佬在评论区解释一下,感谢!
解决方案:
根据issue中提出的解决方案做了以下整理,大家感兴趣可以试试:
(1)在自定义数据集中添加GQA数据集,添加 GQA 将保持包含丰富语义的zero-shot能力。目前,这是避免灾难性遗忘的有效方法。首先需要下载GQA数据集以及对应的json文件(官网都有下载链接),然后使用configs\pretrain下的配置文件修改自己数据集的路径等相关信息,比如使用
configs\pretrain\VisDrone_yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
#放自己的数据集,和之前配置的时候一样,
#具体细节可以参考前边训练yolo-world的文章
obj365v1_train_dataset = dict(
type='MultiModalDataset',
dataset=dict(
type='YOLOv5Objects365V1Dataset',
data_root='data/objects365v1/',
ann_file='annotations/objects365_train.json',
data_prefix=dict(img='train/'),
filter_cfg=dict(filter_empty_gt=False, min_size=32)),
class_text_path='data/texts/custom_class_text.json',
pipeline=train_pipeline)
#GQA数据集
mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
data_root='data/mixed_grounding/',
ann_file='annotations/final_mixed_train_no_coco.json',
data_prefix=dict(img='gqa/images/'),
filter_cfg=dict(filter_empty_gt=False, min_size=32),
pipeline=train_pipeline)
#flickr数据集
flickr_train_dataset = dict(
type='YOLOv5MixedGroundingDataset',
data_root='data/flickr/',
ann_file='annotations/final_flickr_separateGT_train.json',
data_prefix=dict(img='full_images/'),
filter_cfg=dict(filter_empty_gt=True, min_size=32),
pipeline=train_pipeline)
这个方法也许有效但是GQA数据集太大(21G),我只有一块显卡,训练时间太长了成本太大,我没办法实现。参考链接
(2)使用Prompt YOLO-World
a.首先需要下载clip_vit_b32_coco_80_embeddings.npy下载链接在这
b.打开配置文件:比如
configs\prompt_tuning_coco\yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_prompt_tuning_coco.py
c.下载配置文件中需要的checkpoint权重文件,但是镜像网站上提供的权重文件好像和配置文件中给出的不是很一样,只能找一个类似的替代一下。
下载链接在这
d.修改配置文件的内容,比如权重文件或者数据集的路径以及clip_vit_b32_coco_80_embeddings.npy的路径
e.像之前一样训练这个配置文件就可以了
configs\prompt_tuning_coco\yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_prompt_tuning_coco.py
ps:除了训练prompt_tuning_coco.py这个配置文件还可以试一下yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_all_finetuning_coco.py这个配置文件。参考链接
在训练过程中显示这个问题:The testing results of the whole dataset is empty
训练完使用模型做检测的时候发现这个问题:AttributeError: ‘SimpleYOLOWorldDetector’ object has no attribute ‘reparameterize’
(3)调整以 threshold 查看是否检测到目标对象
(4)减少训练轮数,比如训练10个epoch就停止,看是否具有zero-shot能力