AssertionError: Initialize datas

2024-02-01  本文已影响0人  JIAWEIJIAWEI

AssertionError: Initialize dataset with 'reduce_zero_label`'as False but when load annotation the ‘reduce_zero_label’ is True
原因分析:
我这里是因为用的新版本,然后偷懒没有定义自己数据类型,在config中直接使用的basesegdataset基类,这就导致数据读入时会首先通过这个基类来获得reduce_zero_label的参数,然后再通过pipeline进行数据处理,这时如果pipeline中设置了reduce_zero_label=True就会出现报错,因为basesegdataset基类中这个参数默认是false。下面是basesegdataset类的init函数。

    def __init__(self,
                 ann_file: str = '',
                 img_suffix='.jpg',
                    、、、、、
                 ignore_index: int = 255,
                 reduce_zero_label: bool = False,
                 backend_args: Optional[dict] = None) -> None:

在loading时,会进行判断,源码如下:

        if self.reduce_zero_label is None:
            self.reduce_zero_label = results['reduce_zero_label']
        assert self.reduce_zero_label == results['reduce_zero_label'], \
            'Initialize dataset with `reduce_zero_label` as ' \
            f'{results["reduce_zero_label"]} but when load annotation ' \
            f'the `reduce_zero_label` is {self.reduce_zero_label}'

解决办法:
共有三种解决办法,选其一即可。
1、不要偷懒,定义自己数据集类并注册,在init函数中加入reduce_zero_label=True。
2、不要偷懒,在解码头中num_classes的类别数目加上背景,即+1。
3、在config文件的train_dataloader和val_dataloader下的dataset中添加reduce_zero_label=True。

train_dataloader = dict(
    batch_size=2,
    num_workers=2,
    persistent_workers=True,
    sampler=dict(type='InfiniteSampler', shuffle=True),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        metainfo=metainfo,
        reduce_zero_label=True,  # 这里添加,val_dataloader也是一样的位置添加
        data_prefix=dict(
            img_path='img_dir/train', seg_map_path='ann_dir/train'),
        pipeline=train_pipeline))

参考:原文链接:https://blog.csdn.net/stone_tigerLI/article/details/130806118

上一篇 下一篇

猜你喜欢

热点阅读