class_docstr: Custom dataset for semantic segmentation. An example of file structure
  is as followed.
  
  .. code-block:: none
  
      ├── data
      │   ├── my_dataset
      │   │   ├── img_dir
      │   │   │   ├── train
      │   │   │   │   ├── xxx{img_suffix}
      │   │   │   │   ├── yyy{img_suffix}
      │   │   │   │   ├── zzz{img_suffix}
      │   │   │   ├── val
      │   │   ├── ann_dir
      │   │   │   ├── train
      │   │   │   │   ├── xxx{seg_map_suffix}
      │   │   │   │   ├── yyy{seg_map_suffix}
      │   │   │   │   ├── zzz{seg_map_suffix}
      │   │   │   ├── val
  
  The img/gt_semantic_seg pair of BaseSegDataset should be of the same
  except suffix. A valid img/gt_semantic_seg filename pair should be like
  ``xxx{img_suffix}`` and ``xxx{seg_map_suffix}`` (extension is also included
  in the suffix). If split is given, then ``xxx`` is specified in txt file.
  Otherwise, all files in ``img_dir/``and ``ann_dir`` will be loaded.
  Please refer to ``docs/en/tutorials/new_dataset.md`` for more details.
  
  
  Args:
      ann_file (str): Annotation file path. Defaults to ''.
      metainfo (dict, optional): Meta information for dataset, such as
          specify classes to load. Defaults to None.
      data_root (str, optional): The root directory for ``data_prefix`` and
          ``ann_file``. Defaults to None.
      data_prefix (dict, optional): Prefix for training data. Defaults to
          dict(img_path=None, seg_map_path=None).
      img_suffix (str): Suffix of images. Default: '.jpg'
      seg_map_suffix (str): Suffix of segmentation maps. Default: '.png'
      filter_cfg (dict, optional): Config for filter data. Defaults to None.
      indices (int or Sequence[int], optional): Support using first few
          data in annotation file to facilitate training/testing on a smaller
          dataset. Defaults to None which means using all ``data_infos``.
      serialize_data (bool, optional): Whether to hold memory using
          serialized objects, when enabled, data loader workers can use
          shared RAM from master process instead of making a copy. Defaults
          to True.
      pipeline (list, optional): Processing pipeline. Defaults to [].
      test_mode (bool, optional): ``test_mode=True`` means in test phase.
          Defaults to False.
      lazy_init (bool, optional): Whether to load annotation during
          instantiation. In some cases, such as visualization, only the meta
          information of the dataset is needed, which is not necessary to
          load annotation file. ``Basedataset`` can skip load annotations to
          save time by set ``lazy_init=True``. Defaults to False.
      use_label_map (bool, optional): Whether to use label map.
          Defaults to False.
      max_refetch (int, optional): If ``Basedataset.prepare_data`` get a
          None img. The maximum extra number of cycles to get a valid
          image. Defaults to 1000.
      backend_args (dict, Optional): Arguments to instantiate a file backend.
          See https://mmengine.readthedocs.io/en/latest/api/fileio.htm
          for details. Defaults to None.
          Notes: mmcv>=2.0.0rc4 required.
docstr: Load annotation from directory or annotation file.
  
  Returns:
      list[dict]: All data info of dataset.
docstr_tok: ["Load","annotation","from","directory","or","annotation","file",".","Returns",":","list","[","dict","]",":","All","data","info","of","dataset","."]
code: def load_data_list(self) -> List[dict]:
      """Load annotation from directory or annotation file.
  
      Returns:
          list[dict]: All data info of dataset.
      """
      data_list = []
      img_dir = self.data_prefix.get("img_path", None)
      ann_dir = self.data_prefix.get("seg_map_path", None)
      if not osp.isdir(self.ann_file) and self.ann_file:
          assert osp.isfile(
              self.ann_file
          ), f"Failed to load `ann_file` {self.ann_file}"
          lines = mmengine.list_from_file(
              self.ann_file, backend_args=self.backend_args
          )
          for line in lines:
              img_name = line.strip()
              data_info = dict(
                  img_path=osp.join(img_dir, img_name + self.img_suffix)
              )
              if ann_dir is not None:
                  seg_map = img_name + self.seg_map_suffix
                  data_info["seg_map_path"] = osp.join(ann_dir, seg_map)
              data_info["label_map"] = self.label_map
              data_list.append(data_info)
      else:
          for img in fileio.list_dir_or_file(
              dir_path=img_dir,
              list_dir=False,
              suffix=self.img_suffix,
              recursive=True,
              backend_args=self.backend_args,
          ):
              data_info = dict(img_path=osp.join(img_dir, img))
              if ann_dir is not None:
                  seg_map = img.replace(
                      self.img_suffix, self.seg_map_suffix
                  )
                  data_info["seg_map_path"] = osp.join(ann_dir, seg_map)
              data_info["label_map"] = self.label_map
              data_list.append(data_info)
          data_list = sorted(data_list, key=lambda x: x["img_path"])
      return data_list
  
file_path: mmdetection/mmdet/datasets/base_semseg_dataset.py
imports: import copy
  import os.path
  from typing import Callable, Dict, List, Optional, Sequence, Union
  import mmengine
  import mmengine.fileio
  import numpy
  from mmengine.dataset import BaseDataset, Compose
  from mmdet.registry import DATASETS
label_desc: Use image node_id 4 for calling the BaseSegDataset obj's underlying member method code with example usage: obj.load_data_list() and returns: data_list