AILab-CVC / YOLO-World

[CVPR 2024] Real-Time Open-Vocabulary Object Detection
https://www.yoloworld.cc
GNU General Public License v3.0
4.64k stars 449 forks source link

微调验证阶段报错:IndexError: list index out of range #65

Open David-19940718 opened 8 months ago

David-19940718 commented 8 months ago

我这边随便下载了一份demo数据集:balloons,并根据finetuning.md进行修改和配置,下面是对应的配置文件:

_base_ = (
    '../../third_party/mmyolo/configs/yolov8/'
    'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
custom_imports = dict(
    imports=['yolo_world'],
    allow_failed_imports=False)

# hyper-parameters
num_classes = 3
num_training_classes = 3
max_epochs = 80  # Maximum training epochs
close_mosaic_epochs = 10
save_epoch_intervals = 5
text_channels = 512
neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
base_lr = 2e-4
weight_decay = 0.05
train_batch_size_per_gpu = 16
load_from='pretrained/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth'
persistent_workers = False

# model settings
model = dict(
    type='YOLOWorldDetector',
    mm_neck=True,
    num_train_classes=num_training_classes,
    num_test_classes=num_classes,
    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
    backbone=dict(
        _delete_=True,
        type='MultiModalYOLOBackbone',
        image_model={{_base_.model.backbone}},
        text_model=dict(
            type='HuggingCLIPLanguageBackbone',
            model_name='openai/clip-vit-base-patch32',
            frozen_modules=['all'])),
    neck=dict(type='YOLOWolrdDualPAFPN',
              guide_channels=text_channels,
              embed_channels=neck_embed_channels,
              num_heads=neck_num_heads,
              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
              text_enhancder=dict(type='ImagePoolingAttentionModule',
                                  embed_channels=256,
                                  num_heads=8)),
    bbox_head=dict(type='YOLOWorldHead',
                   head_module=dict(type='YOLOWorldHeadModule',
                                    embed_dims=text_channels,
                                    num_classes=num_training_classes)),
    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))

# dataset settings
text_transform = [
    dict(type='RandomLoadText',
         num_neg_samples=(num_classes, num_classes),
         max_num_samples=num_training_classes,
         padding_to_max=True,
         padding_value=''),
    dict(type='mmdet.PackDetInputs',
         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
                    'flip_direction', 'texts'))
]
mosaic_affine_transform = [
    dict(
        type='MultiModalMosaic',
        img_scale=_base_.img_scale,
        pad_val=114.0,
        pre_transform=_base_.pre_transform),
    # dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
    dict(
        type='YOLOv5RandomAffine',
        max_rotate_degree=0.0,
        max_shear_degree=0.0,
        max_aspect_ratio=100.,
        scaling_ratio_range=(1 - _base_.affine_scale,
                             1 + _base_.affine_scale),
        # img_scale is (width, height)
        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
        border_val=(114, 114, 114))
        # min_area_ratio=_base_.min_area_ratio,
        # use_mask_refine=_base_.use_mask2refine)
]
train_pipeline = [
    *_base_.pre_transform,
    *mosaic_affine_transform,
    dict(
        type='YOLOv5MultiModalMixUp',
        prob=_base_.mixup_prob,
        pre_transform=[*_base_.pre_transform,
                       *mosaic_affine_transform]),
    *_base_.last_transform[:-1],
    *text_transform
]
train_pipeline_stage2 = [
    *_base_.train_pipeline_stage2[:-1],
    *text_transform
]
coco_train_dataset = dict(
    _delete_=True,
    type='MultiModalDataset',
    dataset=dict(
        type='YOLOv5CocoDataset',
        data_root='data/balloons_coco',
        ann_file='annotations/instances_train2017.json',
        data_prefix=dict(img='train2017/'),
        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
    class_text_path='data/texts/balloons_coco_class_texts.json',
    pipeline=train_pipeline)

train_dataloader = dict(
    persistent_workers=persistent_workers,
    batch_size=train_batch_size_per_gpu,
    collate_fn=dict(type='yolow_collate'),
    dataset=coco_train_dataset)
test_pipeline = [
    *_base_.test_pipeline[:-1],
    dict(type='LoadText'),
    dict(
        type='mmdet.PackDetInputs',
        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
                   'scale_factor', 'pad_param', 'texts'))
]
coco_val_dataset = dict(
    _delete_=True,
    type='MultiModalDataset',
    dataset=dict(
        type='YOLOv5CocoDataset',
        data_root='data/balloons_coco',
        ann_file='annotations/instances_val2017.json',
        data_prefix=dict(img='val2017/'),
        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
    class_text_path='data/texts/balloons_coco_class_texts.json',
    pipeline=test_pipeline)
val_dataloader = dict(dataset=coco_val_dataset)
test_dataloader = val_dataloader
# training settings
default_hooks = dict(
    param_scheduler=dict(
        scheduler_type='linear',
        lr_factor=0.01,
        max_epochs=max_epochs),
    checkpoint=dict(
        max_keep_ckpts=-1,
        save_best=None,
        interval=save_epoch_intervals))
custom_hooks = [
    dict(
        type='EMAHook',
        ema_type='ExpMomentumEMA',
        momentum=0.0001,
        update_buffers=True,
        strict_load=False,
        priority=49),
    dict(
        type='mmdet.PipelineSwitchHook',
        switch_epoch=max_epochs - close_mosaic_epochs,
        switch_pipeline=train_pipeline_stage2)
]
train_cfg = dict(
    max_epochs=max_epochs,
    val_interval=5,
    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
                        _base_.val_interval_stage2)])
optim_wrapper = dict(
    optimizer=dict(
        _delete_=True,
        type='AdamW',
        lr=base_lr,
        weight_decay=weight_decay,
        batch_size_per_gpu=train_batch_size_per_gpu),
    paramwise_cfg=dict(
        bias_decay_mult=0.0,
        norm_decay_mult=0.0,
        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
                     'logit_scale': dict(weight_decay=0.0)}),
    constructor='YOLOWv5OptimizerConstructor')

# evaluation settings
val_evaluator = dict(
    _delete_=True,
    type='mmdet.CocoMetric',
    proposal_nums=(100, 1, 10),
    ann_file='data/balloons_coco/annotations/instances_val2017.json',
    metric='bbox')

目前能正常训练,等到评估的时候报了下面的错误:

Traceback (most recent call last):
  File "./tools/train.py", line 120, in <module>
    main()
  File "./tools/train.py", line 116, in main
    runner.train()
  File "/home/administrator/miniconda3/envs/yolo-world/lib/python3.8/site-packages/mmengine/runner/runner.py", line 1777, in train
    model = self.train_loop.run()  # type: ignore
  File "/home/administrator/miniconda3/envs/yolo-world/lib/python3.8/site-packages/mmengine/runner/loops.py", line 102, in run
    self.runner.val_loop.run()
  File "/home/administrator/miniconda3/envs/yolo-world/lib/python3.8/site-packages/mmengine/runner/loops.py", line 374, in run
    metrics = self.evaluator.evaluate(len(self.dataloader.dataset))
  File "/home/administrator/miniconda3/envs/yolo-world/lib/python3.8/site-packages/mmengine/evaluator/evaluator.py", line 79, in evaluate
    _results = metric.evaluate(size)
  File "/home/administrator/miniconda3/envs/yolo-world/lib/python3.8/site-packages/mmengine/evaluator/metric.py", line 133, in evaluate
    _metrics = self.compute_metrics(results)  # type: ignore
  File "/home/administrator/miniconda3/envs/yolo-world/lib/python3.8/site-packages/mmdet/evaluation/metrics/coco_metric.py", line 425, in compute_metrics
    result_files = self.results2json(preds, outfile_prefix)
  File "/home/administrator/miniconda3/envs/yolo-world/lib/python3.8/site-packages/mmdet/evaluation/metrics/coco_metric.py", line 245, in results2json
    data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

调试发现 self.cat_ids 的值为空,这是哪里没设置对吗?

wondervictor commented 8 months ago

@David-19940718 您好,这个问题应该是由于直接使用CocoDataset导致类比不一致,我建议您可以新建一个dataset class,然后指定相应的类别。

David-19940718 commented 8 months ago

@wondervictor,感谢回复。我这边查看了下,使用efficient_neck可以正常训练和验证;可是使用dual_vlpan就会报上面的错误,得到的self.cat_ids有点奇怪,好像不是基于我提供的classes去映射的。我是根据提供的coco_class_texts.json去修改的,如[['cat'], ['dog']]。

请问这两个配置文件有啥区别吗?我以为只是网络结构不同而已,是需要做额外的配置还是? 另外请教下几个问题:

  1. base_lrweight_decay的值默认是2e-4,如果我是使用1、2或者4卡等,设置不同的batchsize,这些值应该如何调整?
  2. num_classesnum_training_classes的区别是什么?我看两个值好像是一样的?
Sally-lxy commented 8 months ago

@wondervictor,感谢回复。我这边查看了下,使用efficient_neck可以正常训练和验证;可是使用dual_vlpan就会报上面的错误,得到的self.cat_ids有点奇怪,好像不是基于我提供的classes去映射的。我是根据提供的coco_class_texts.json去修改的,如[['cat'], ['dog']]。

请问这两个配置文件有啥区别吗?我以为只是网络结构不同而已,是需要做额外的配置还是? 另外请教下几个问题:

  1. base_lrweight_decay的值默认是2e-4,如果我是使用1、2或者4卡等,设置不同的batchsize,这些值应该如何调整?
  2. num_classesnum_training_classes的区别是什么?我看两个值好像是一样的?

您好,我遇到了同样的问题,配置文件修改也是一样的,但是,请问为啥我用[efficient_neck]也不可以正常验证呢?

wondervictor commented 8 months ago

@David-19940718 您好,针对前面cat_ids的问题,目前应该是CocoDataset封装不太灵活,这块我也在更新,目前比较简单的处理方式是重构一个您自己的Dataset。 对于关于配置的问题:

  1. 我个人建议根据batch size调整learning rate,基本保证batchsize和learning rate正比,可以参考 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
  2. num_classes是inference stage的类别数量(根据不同的dataset会调整),num_training_classes是训练阶段的类别数量(默认为80)。
wondervictor commented 8 months ago

@David-19940718 @Sally-lxy, 这个cat_ids的问题和PAN没有太多关系,应该都会出现。

Sally-lxy commented 8 months ago

@David-19940718 @Sally-lxy, 这个cat_ids的问题和PAN没有太多关系,应该都会出现。

好的,感谢。

taofuyu commented 8 months ago

@David-19940718 您好,针对前面cat_ids的问题,目前应该是CocoDataset封装不太灵活,这块我也在更新,目前比较简单的处理方式是重构一个您自己的Dataset。 对于关于配置的问题:

  1. 我个人建议根据batch size调整learning rate,基本保证batchsize和learning rate正比,可以参考 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
  2. num_classes是inference stage的类别数量(根据不同的dataset会调整),num_training_classes是训练阶段的类别数量(默认为80)。

请问下说num_training_classes说是训练阶段的类别数量(80),但光object365就有365个类别、flickr数据集没有类别,没有太明白80是怎么来的,谢谢

poojatambe commented 8 months ago

Hi, Getting same error for custom data finetuning.

    data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

Any way to resolve error?

taofuyu commented 8 months ago

Hi, Getting same error for custom data finetuning.

    data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

Any way to resolve error?

implement your own Dataset class, and set your METAINFO instead of COCO's.

Hudaodao99 commented 8 months ago

Hi, Getting same error for custom data finetuning.

    data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

Any way to resolve error? you should do in your config_*.py* step 1: new metainfo metainfo = dict( classes=("classA", "classB")) step 2: add metainfo in all dataset setting like ` dataset=dict( type='YOLOv5CocoDataset', metainfo=metainfo, data_root='',`

sorry. Could you tell me which path can I find this config? I didn't find it.

poojatambe commented 8 months ago

Hi, Working on new Dataset class with the help of doc https://mmdetection.readthedocs.io/en/v2.9.0/tutorials/customize_dataset.html. But facing various error related to mmdet.custom module, and _metainfo when BaseDataset used while executing train command .

image

Dataset has coco json format and using colab for implementation.

I would like to know what missing in the dataset.py.

# custom dataset class

import mmcv
import numpy as np
import json
from mmyolo.registry import DATASETS
# from mmengine.dataset.base_dataset import BaseDataset
from mmdet.custom import CustomDataset
from mmengine.dataset import BaseDataset
# from torch.utils.data import Dataset

@DATASETS.register_module()
class CountDataset(CustomDataset):

    def __init__(self,
                data_root,
                ann_file,
                data_prefix):
        self.ann_file = ann_file
        self.data_root = data_root
        self.data_prefix = data_prefix

    def load_annotations(self):
        with open (self.ann_file, 'r') as f:
            data = json.loads(f.read())
        data_infos = []
        for i in range(len(data['annotations'])):
          filename = data['images'][data['annotations'][i]['image_id']]['file_name']
          width = data['images'][data['annotations'][i]['image_id']]['width']
          height = data['images'][data['annotations'][i]['image_id']]['height']
          bboxes = data['annotations'][i]['bbox']
          labels = (data['annotations'][i]['category_id']-1)
          data_infos.append(
                        dict(
                            filename=self.data_root+"/"+self.data_prefix['img']+filename,
                            width=width,
                            height=height,
                            ann=dict(
                                bboxes=np.array(bboxes).astype(np.float32),
                                labels=np.array(labels).astype(np.int64))
                        ))

        return data_infos

    def get_ann_info(self, idx):
        return self.data_infos[idx]['ann']
wondervictor commented 8 months ago

@David-19940718 您好,针对前面cat_ids的问题,目前应该是CocoDataset封装不太灵活,这块我也在更新,目前比较简单的处理方式是重构一个您自己的Dataset。 对于关于配置的问题:

  1. 我个人建议根据batch size调整learning rate,基本保证batchsize和learning rate正比,可以参考 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
  2. num_classes是inference stage的类别数量(根据不同的dataset会调整),num_training_classes是训练阶段的类别数量(默认为80)。

请问下说num_training_classes说是训练阶段的类别数量(80),但光object365就有365个类别、flickr数据集没有类别,没有太明白80是怎么来的,谢谢

@taofuyu 您好,这个80是一个超参数,是训练过程采样类别的数量,一方面我保持了原来YOLO训练的部分参数 (loss weight这些,80是YOLO默认训练的类别数量);其次,80是一个计算和训练速度的一个trade-off,我们验证过将训练过程的类别采样提高到365,预训练的zero-shot结果会提升。

taofuyu commented 8 months ago

@David-19940718 您好,针对前面cat_ids的问题,目前应该是CocoDataset封装不太灵活,这块我也在更新,目前比较简单的处理方式是重构一个您自己的Dataset。 对于关于配置的问题:

  1. 我个人建议根据batch size调整learning rate,基本保证batchsize和learning rate正比,可以参考 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
  2. num_classes是inference stage的类别数量(根据不同的dataset会调整),num_training_classes是训练阶段的类别数量(默认为80)。

请问下说num_training_classes说是训练阶段的类别数量(80),但光object365就有365个类别、flickr数据集没有类别,没有太明白80是怎么来的,谢谢

@taofuyu 您好,这个80是一个超参数,是训练过程采样类别的数量,一方面我保持了原来YOLO训练的部分参数 (loss weight这些,80是YOLO默认训练的类别数量);其次,80是一个计算和训练速度的一个trade-off,我们验证过将训练过程的类别采样提高到365,预训练的zero-shot结果会提升。

谢谢

Nyove commented 6 months ago

对于训练中的验证报出该错误:

data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

作者的建议是仿照CocoDataset创建一个自己的Dataset类。具体地就得自己研究尝试了,思路是先建立BomoDataset和继承前者的YoloWorldBomoDataset(名字自己随便取的),再在各自的__init__.py中引入。

具体步骤如下:

Step1. 在anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmdet/datasets/coco.py中定义自己的BomoDataset类。

  1. 复制class CocoDataset并命名为自己的class BomoDataset,然后修改变量METAINFO中的类别名。如:

    METAINFO = {
            'classes':
            ("Big black spot", ..),
            ..
  2. anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmdet/datasets/__init__.py中引入BomoDataset

    from .coco import BomoDataset
    __all__ = [.., 'BomoDataset']

Step2. 在anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmyolo/datasets/yolov5_coco.py中定义自己的YoloWorldBomoDataset类。

  1. 复制class YOLOv5CocoDataset并命名为自己的class YoloWorldBomoDataset(BatchShapePolicyDataset, BomoDataset),注意继承。

  2. anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmyolo/datasets/__init__.py中引入YoloWorldBomoDataset

    from .yolov5_coco import YoloWorldBomoDataset
    __all__ = [.., 'YoloWorldBomoDataset']

Step3. 在configs/finetune_bomo/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_bomo.py中,将train和valid的dataloader修改为自己新定义的YoloWorldBomoDataset

dataset=dict(
        ..
        dataset=dict(
            type='YoloWorldBomoDataset
            ..

到这里我就解决该问题了。

zhongzee commented 6 months ago

YoloWorldBomoDataset

请问class_text_path='data/texts/coco_class_texts.json' 这个里面的内容 是否需要有对应修改呢?比如新的数据集就10个类名,这里面原本的80个类需要改吗

taofuyu commented 6 months ago

YoloWorldBomoDataset

请问class_text_path='data/texts/coco_class_texts.json' 这个里面的内容 是否需要有对应修改呢?比如新的数据集就10个类名,这里面原本的80个类需要改吗

要改的

tm924222 commented 5 months ago

dataset class,然后指定相应的类别。

如何新建类别呢

tm924222 commented 5 months ago

对于训练中的验证报出该错误:

data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

作者的建议是仿照创建一个自己的Dataset类。具体地就得自己研究尝试了,思路是先建立和继承前者的(名字自己随便取的),再在各自的中引入。CocoDataset``BomoDataset``YoloWorldBomoDataset``__init__.py

具体步骤如下:

步骤1.在中定义自己的类。anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmdet/datasets/coco.py``BomoDataset

  1. 复制并命名为自己的,然后修改变量中的类别名。如:class CocoDataset``class BomoDataset``METAINFO
    METAINFO = {
           'classes':
           ("Big black spot", ..),
          ..
  2. 在中引入类anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmdet/datasets/__init__.py``BomoDataset
    from .coco import BomoDataset
    __all__ = [.., 'BomoDataset']

第2步。在中定义自己的类。anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmyolo/datasets/yolov5_coco.py``YoloWorldBomoDataset

  1. 复制并命名为自己的,注意继承。class YOLOv5CocoDataset``class YoloWorldBomoDataset(BatchShapePolicyDataset, BomoDataset)
  2. 在中引入anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmyolo/datasets/__init__.py``YoloWorldBomoDataset
    from .yolov5_coco import YoloWorldBomoDataset
    __all__ = [.., 'YoloWorldBomoDataset']

第3步。在中,将train和valid的修改为自己新定义的:configs/finetune_bomo/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_bomo.py``dataloader``YoloWorldBomoDataset

dataset=dict(
        ..
        dataset=dict(
            type='YoloWorldBomoDataset
              ..

到这里我就解决该问题了 不行呀,会报自定义的数据集没有注册的错误。MYYOLOv5CocoDataset is not in the mmyolo::dataset registry. Please check whether the value of MYYOLOv5CocoDataset is correct or it was registered as expected.

taofuyu commented 5 months ago

@tm924222 init里写进去

wondervictor commented 5 months ago

或者可考虑

dataset=dict(
    type='YOLOv5CocoDataset',
    metainfo=dict(classes=your_classes),
    .....
tm924222 commented 5 months ago

init里写进去

mmdet下面的datasets的init和mmyolo下面的datasets的init我都写了。哥们你的成功了吗

tm924222 commented 5 months ago

或者可考虑

dataset=dict(
    type='YOLOv5CocoDataset',
    metainfo=dict(classes=your_classes),
    .....

这个我也用了,后面两个的损失都是0

wondervictor commented 5 months ago

关掉mask-refine, 如果开启了 mask-refine 会导致没有物体框作为监督参与loss计算,也就是loss为0. 可以参考以下config:

另外,建议参考来选择合适的finetune方式: https://github.com/AILab-CVC/YOLO-World/blob/master/README.md#fine-tuning-yolo-world

tm924222 commented 5 months ago

mask-refine

感谢您的指导,我去修改一下

xiyangyang99 commented 5 months ago

对于训练中的验证报出该错误:

data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

作者的建议是仿照CocoDataset创建一个自己的Dataset类。具体地就得自己研究尝试了,思路是先建立BomoDataset和继承前者的YoloWorldBomoDataset(名字自己随便取的),再在各自的__init__.py中引入。

具体步骤如下:

Step1. 在anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmdet/datasets/coco.py中定义自己的BomoDataset类。

  1. 复制class CocoDataset并命名为自己的class BomoDataset,然后修改变量METAINFO中的类别名。如:
    METAINFO = {
           'classes':
           ("Big black spot", ..),
          ..
  2. anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmdet/datasets/__init__.py中引入BomoDataset
    from .coco import BomoDataset
    __all__ = [.., 'BomoDataset']

Step2. 在anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmyolo/datasets/yolov5_coco.py中定义自己的YoloWorldBomoDataset类。

  1. 复制class YOLOv5CocoDataset并命名为自己的class YoloWorldBomoDataset(BatchShapePolicyDataset, BomoDataset),注意继承。
  2. anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmyolo/datasets/__init__.py中引入YoloWorldBomoDataset
    from .yolov5_coco import YoloWorldBomoDataset
    __all__ = [.., 'YoloWorldBomoDataset']

Step3. 在configs/finetune_bomo/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_bomo.py中,将train和valid的dataloader修改为自己新定义的YoloWorldBomoDataset

dataset=dict(
        ..
        dataset=dict(
            type='YoloWorldBomoDataset
              ..

到这里我就解决该问题了。

我按照这个重写了类,但是还是存在list index out of range的问题。我用的是prompt_tuning_coco的config,不管打开mask-refine还是不打开都是同样的报错。而且我的mmde/dataset/coco.py的class就是我的数据集coco里的数据。长度和类别一样。不知道是什么问题。

taofuyu commented 5 months ago

@xiyangyang99 单步调试下吧,这种问题找起来很快的

LRuiRui517 commented 3 months ago

init里写进去

mmdet下面的datasets的init和mmyolo下面的datasets的init我都写了。哥们你的成功了吗

哥们,你现在成功了吗?

LRuiRui517 commented 3 months ago

@wondervictor,感谢回复。我这边查看了下,使用efficient_neck可以正常训练和验证;可是使用dual_vlpan就会报上面的错误,得到的self.cat_ids有点奇怪,好像不是基于我提供的classes去映射的。我是根据提供的coco_class_texts.json去修改的,如[['cat'], ['dog']]。 请问这两个配置文件有啥区别吗?我以为只是网络结构不同而已,是需要做额外的配置还是? 另外请教下几个问题:

  1. base_lrweight_decay的值默认是2e-4,如果我是使用1、2或者4卡等,设置不同的batchsize,这些值应该如何调整?
  2. num_classesnum_training_classes的区别是什么?我看两个值好像是一样的?

您好,我遇到了同样的问题,配置文件修改也是一样的,但是,请问为啥我用[efficient_neck]也不可以正常验证呢?

请问现在这个问题您解决了吗

WtElio commented 3 months ago

init里写进去

mmdet下面的datasets的init和mmyolo下面的datasets的init我都写了。哥们你的成功了吗

哥们,你现在成功了吗?

我按上述方式走通了,但是还是报 File "/home/miniconda3/lib/python3.8/site-packages/mmdet/evaluation/metrics/coco_metric.py", line 243, in results2json data['category_id'] = self.cat_ids[label] IndexError: list index out of range Killing subprocess 5909

WtElio commented 3 months ago

对于训练中的验证报出该错误:

data['category_id'] = self.cat_ids[label]
IndexError: list index out of range

作者的建议是仿照CocoDataset创建一个自己的Dataset类。具体地就得自己研究尝试了,思路是先建立BomoDataset和继承前者的YoloWorldBomoDataset(名字自己随便取的),再在各自的__init__.py中引入。 具体步骤如下: Step1. 在anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmdet/datasets/coco.py中定义自己的BomoDataset类。

  1. 复制class CocoDataset并命名为自己的class BomoDataset,然后修改变量METAINFO中的类别名。如:
    METAINFO = {
           'classes':
           ("Big black spot", ..),
        ..
  2. anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmdet/datasets/__init__.py中引入BomoDataset
    from .coco import BomoDataset
    __all__ = [.., 'BomoDataset']

Step2. 在anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmyolo/datasets/yolov5_coco.py中定义自己的YoloWorldBomoDataset类。

  1. 复制class YOLOv5CocoDataset并命名为自己的class YoloWorldBomoDataset(BatchShapePolicyDataset, BomoDataset),注意继承。
  2. anaconda3/envs/yoloworld/lib/python3.8/site-packages/mmyolo/datasets/__init__.py中引入YoloWorldBomoDataset
    from .yolov5_coco import YoloWorldBomoDataset
    __all__ = [.., 'YoloWorldBomoDataset']

Step3. 在configs/finetune_bomo/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_bomo.py中,将train和valid的dataloader修改为自己新定义的YoloWorldBomoDataset

dataset=dict(
        ..
        dataset=dict(
            type='YoloWorldBomoDataset
            ..

到这里我就解决该问题了。

我按照这个重写了类,但是还是存在list index out of range的问题。我用的是prompt_tuning_coco的config,不管打开mask-refine还是不打开都是同样的报错。而且我的mmde/dataset/coco.py的class就是我的数据集coco里的数据。长度和类别一样。不知道是什么问题。

请问你最后找到解决方法了吗?我也是按照上面说的步骤走了一遍但还是报错IndexError: list index out of range

WtElio commented 3 months ago

我找到解决办法了,参考这篇文章https://blog.csdn.net/qq_36810398/article/details/116994577