DenseLabelDev / vlm /datasets /evaluation /base_eval_dataset.py
zhouyik's picture
Upload folder using huggingface_hub
032e687 verified
from torch.utils.data import Dataset
import copy
from collections.abc import Mapping
from typing import Union
from mmengine.config import Config
import logging
from mmengine.fileio import list_from_file
from mmengine.logging import print_log
from abc import abstractmethod
class BaseEvalDataset(Dataset):
METAINFO: dict = dict(name='default')
def __init__(self, metainfo: Union[Mapping, Config, None] = None):
self._metainfo = self._load_metainfo(copy.deepcopy(metainfo))
@classmethod
def _load_metainfo(cls,
metainfo: Union[Mapping, Config, None] = None) -> dict:
"""Collect meta information from the dictionary of meta.
Args:
metainfo (Mapping or Config, optional): Meta information dict.
If ``metainfo`` contains existed filename, it will be
parsed by ``list_from_file``.
Returns:
dict: Parsed meta information.
"""
# avoid `cls.METAINFO` being overwritten by `metainfo`
cls_metainfo = copy.deepcopy(cls.METAINFO)
if metainfo is None:
return cls_metainfo
if not isinstance(metainfo, (Mapping, Config)):
raise TypeError('metainfo should be a Mapping or Config, '
f'but got {type(metainfo)}')
for k, v in metainfo.items():
if isinstance(v, str):
# If type of value is string, and can be loaded from
# corresponding backend. it means the file name of meta file.
try:
cls_metainfo[k] = list_from_file(v)
except (TypeError, FileNotFoundError):
print_log(
f'{v} is not a meta file, simply parsed as meta '
'information',
logger='current',
level=logging.WARNING)
cls_metainfo[k] = v
else:
cls_metainfo[k] = v
return cls_metainfo
@property
def metainfo(self) -> dict:
"""Get meta information of dataset.
Returns:
dict: meta information collected from ``BaseDataset.METAINFO``,
annotation file and metainfo argument during instantiation.
"""
return copy.deepcopy(self._metainfo)
@abstractmethod
def evaluate(self, results, work_dir):
pass