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