Open David-19940718 opened 8 months ago
@David-19940718 您好,这个问题应该是由于直接使用CocoDataset
导致类比不一致,我建议您可以新建一个dataset class,然后指定相应的类别。
@wondervictor,感谢回复。我这边查看了下,使用efficient_neck可以正常训练和验证;可是使用dual_vlpan就会报上面的错误,得到的self.cat_ids有点奇怪,好像不是基于我提供的classes去映射的。我是根据提供的coco_class_texts.json去修改的,如[['cat'], ['dog']]。
请问这两个配置文件有啥区别吗?我以为只是网络结构不同而已,是需要做额外的配置还是? 另外请教下几个问题:
base_lr
和weight_decay
的值默认是2e-4,如果我是使用1、2或者4卡等,设置不同的batchsize,这些值应该如何调整?num_classes
和num_training_classes
的区别是什么?我看两个值好像是一样的?@wondervictor,感谢回复。我这边查看了下,使用efficient_neck可以正常训练和验证;可是使用dual_vlpan就会报上面的错误,得到的self.cat_ids有点奇怪,好像不是基于我提供的classes去映射的。我是根据提供的coco_class_texts.json去修改的,如[['cat'], ['dog']]。
请问这两个配置文件有啥区别吗?我以为只是网络结构不同而已,是需要做额外的配置还是? 另外请教下几个问题:
base_lr
和weight_decay
的值默认是2e-4,如果我是使用1、2或者4卡等,设置不同的batchsize,这些值应该如何调整?num_classes
和num_training_classes
的区别是什么?我看两个值好像是一样的?
您好,我遇到了同样的问题,配置文件修改也是一样的,但是,请问为啥我用[efficient_neck]也不可以正常验证呢?
@David-19940718 您好,针对前面cat_ids
的问题,目前应该是CocoDataset
封装不太灵活,这块我也在更新,目前比较简单的处理方式是重构一个您自己的Dataset
。
对于关于配置的问题:
num_classes
是inference stage的类别数量(根据不同的dataset会调整),num_training_classes
是训练阶段的类别数量(默认为80)。@David-19940718 @Sally-lxy, 这个cat_ids
的问题和PAN
没有太多关系,应该都会出现。
@David-19940718 @Sally-lxy, 这个
cat_ids
的问题和PAN
没有太多关系,应该都会出现。
好的,感谢。
@David-19940718 您好,针对前面
cat_ids
的问题,目前应该是CocoDataset
封装不太灵活,这块我也在更新,目前比较简单的处理方式是重构一个您自己的Dataset
。 对于关于配置的问题:
- 我个人建议根据batch size调整learning rate,基本保证batchsize和learning rate正比,可以参考 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
num_classes
是inference stage的类别数量(根据不同的dataset会调整),num_training_classes
是训练阶段的类别数量(默认为80)。
请问下说num_training_classes说是训练阶段的类别数量(80),但光object365就有365个类别、flickr数据集没有类别,没有太明白80是怎么来的,谢谢
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?
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.
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.
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 .
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']
@David-19940718 您好,针对前面
cat_ids
的问题,目前应该是CocoDataset
封装不太灵活,这块我也在更新,目前比较简单的处理方式是重构一个您自己的Dataset
。 对于关于配置的问题:
- 我个人建议根据batch size调整learning rate,基本保证batchsize和learning rate正比,可以参考 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
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结果会提升。
@David-19940718 您好,针对前面
cat_ids
的问题,目前应该是CocoDataset
封装不太灵活,这块我也在更新,目前比较简单的处理方式是重构一个您自己的Dataset
。 对于关于配置的问题:
- 我个人建议根据batch size调整learning rate,基本保证batchsize和learning rate正比,可以参考 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
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结果会提升。
谢谢
对于训练中的验证报出该错误:
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
类。
复制class CocoDataset
并命名为自己的class BomoDataset
,然后修改变量METAINFO
中的类别名。如:
METAINFO = {
'classes':
("Big black spot", ..),
..
在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
类。
复制class YOLOv5CocoDataset
并命名为自己的class YoloWorldBomoDataset(BatchShapePolicyDataset, BomoDataset)
,注意继承。
在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
..
到这里我就解决该问题了。
YoloWorldBomoDataset
请问class_text_path='data/texts/coco_class_texts.json' 这个里面的内容 是否需要有对应修改呢?比如新的数据集就10个类名,这里面原本的80个类需要改吗
YoloWorldBomoDataset
请问class_text_path='data/texts/coco_class_texts.json' 这个里面的内容 是否需要有对应修改呢?比如新的数据集就10个类名,这里面原本的80个类需要改吗
要改的
dataset class,然后指定相应的类别。
如何新建类别呢
对于训练中的验证报出该错误:
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
- 复制并命名为自己的,然后修改变量中的类别名。如:
class CocoDataset``class BomoDataset``METAINFO
METAINFO = { 'classes': ("Big black spot", ..), ..
- 在中引入类
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
- 复制并命名为自己的,注意继承。
class YOLOv5CocoDataset``class YoloWorldBomoDataset(BatchShapePolicyDataset, BomoDataset)
- 在中引入
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.
或者可考虑
dataset=dict(
type='YOLOv5CocoDataset',
metainfo=dict(classes=your_classes),
.....
或者可考虑
dataset=dict( type='YOLOv5CocoDataset', metainfo=dict(classes=your_classes), .....
这个我也用了,后面两个的损失都是0
关掉mask-refine
, 如果开启了 mask-refine
会导致没有物体框作为监督参与loss计算,也就是loss为0.
可以参考以下config:
另外,建议参考来选择合适的finetune方式: https://github.com/AILab-CVC/YOLO-World/blob/master/README.md#fine-tuning-yolo-world
mask-refine
感谢您的指导,我去修改一下
对于训练中的验证报出该错误:
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
类。
- 复制
class CocoDataset
并命名为自己的class BomoDataset
,然后修改变量METAINFO
中的类别名。如:METAINFO = { 'classes': ("Big black spot", ..), ..
- 在
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
类。
- 复制
class YOLOv5CocoDataset
并命名为自己的class YoloWorldBomoDataset(BatchShapePolicyDataset, BomoDataset)
,注意继承。- 在
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里的数据。长度和类别一样。不知道是什么问题。
@xiyangyang99 单步调试下吧,这种问题找起来很快的
init里写进去
mmdet下面的datasets的init和mmyolo下面的datasets的init我都写了。哥们你的成功了吗
哥们,你现在成功了吗?
@wondervictor,感谢回复。我这边查看了下,使用efficient_neck可以正常训练和验证;可是使用dual_vlpan就会报上面的错误,得到的self.cat_ids有点奇怪,好像不是基于我提供的classes去映射的。我是根据提供的coco_class_texts.json去修改的,如[['cat'], ['dog']]。 请问这两个配置文件有啥区别吗?我以为只是网络结构不同而已,是需要做额外的配置还是? 另外请教下几个问题:
base_lr
和weight_decay
的值默认是2e-4,如果我是使用1、2或者4卡等,设置不同的batchsize,这些值应该如何调整?num_classes
和num_training_classes
的区别是什么?我看两个值好像是一样的?您好,我遇到了同样的问题,配置文件修改也是一样的,但是,请问为啥我用[efficient_neck]也不可以正常验证呢?
请问现在这个问题您解决了吗
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
对于训练中的验证报出该错误:
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
类。
- 复制
class CocoDataset
并命名为自己的class BomoDataset
,然后修改变量METAINFO
中的类别名。如:METAINFO = { 'classes': ("Big black spot", ..), ..
- 在
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
类。
- 复制
class YOLOv5CocoDataset
并命名为自己的class YoloWorldBomoDataset(BatchShapePolicyDataset, BomoDataset)
,注意继承。- 在
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
我找到解决办法了,参考这篇文章https://blog.csdn.net/qq_36810398/article/details/116994577
我这边随便下载了一份demo数据集:balloons,并根据finetuning.md进行修改和配置,下面是对应的配置文件:
目前能正常训练,等到评估的时候报了下面的错误:
调试发现
self.cat_ids
的值为空,这是哪里没设置对吗?