class_docstr: Load dataset with MOT format, only support single class MOT.
  
  Args:
      dataset_dir (str): root directory for dataset.
      image_lists (str|list): mot data image lists, muiti-source mot dataset.
      data_fields (list): key name of data dictionary, at least have 'image'.
      sample_num (int): number of samples to load, -1 means all.
      repeat (int): repeat times for dataset, use in benchmark.
  
  Notes:
      MOT datasets root directory following this:
          dataset/mot
          |——————image_lists
          |        |——————caltech.train  
          |        |——————caltech.val   
          |        |——————mot16.train  
          |        |——————mot17.train  
          |        ......
          |——————Caltech
          |——————MOT17
          |——————......
  
      All the MOT datasets have the following structure:
          Caltech
          |——————images
          |        └——————00001.jpg
          |        |—————— ...
          |        └——————0000N.jpg
          └——————labels_with_ids
                      └——————00001.txt
                      |—————— ...
                      └——————0000N.txt
          or
  
          MOT17
          |——————images
          |        └——————train
          |        └——————test
          └——————labels_with_ids
                      └——————train
class_docstr_tok: ["Load","dataset","with","MOT","format",",","only","support","single","class","MOT",".","Args",":","dataset_dir","(","str",")",":","root","directory","for","dataset",".","image_lists","(","str|list",")",":","mot","data","image","lists",",","muiti-source","mot","dataset",".","data_fields","(","list",")",":","key","name","of","data","dictionary",",","at","least","have","'image","'",".","sample_num","(","int",")",":","number","of","samples","to","load",",","-1","means","all",".","repeat","(","int",")",":","repeat","times","for","dataset",",","use","in","benchmark",".","Notes",":","MOT","datasets","root","directory","following","this",":","dataset\/mot","|\u2014\u2014\u2014\u2014\u2014\u2014image_lists","|","|\u2014\u2014\u2014\u2014\u2014\u2014caltech.train","|","|\u2014\u2014\u2014\u2014\u2014\u2014caltech.val","|","|\u2014\u2014\u2014\u2014\u2014\u2014mot16.train","|","|\u2014\u2014\u2014\u2014\u2014\u2014mot17.train","|","......","|\u2014\u2014\u2014\u2014\u2014\u2014Caltech","|\u2014\u2014\u2014\u2014\u2014\u2014MOT17","|\u2014\u2014\u2014\u2014\u2014\u2014","......","All","the","MOT","datasets","have","the","following","structure",":","Caltech","|\u2014\u2014\u2014\u2014\u2014\u2014images","|","\u2514\u2014\u2014\u2014\u2014\u2014\u201400001.jpg","|","|\u2014\u2014\u2014\u2014\u2014\u2014","...","|","\u2514\u2014\u2014\u2014\u2014\u2014\u20140000N.jpg","\u2514\u2014\u2014\u2014\u2014\u2014\u2014labels_with_ids","\u2514\u2014\u2014\u2014\u2014\u2014\u201400001.txt","|\u2014\u2014\u2014\u2014\u2014\u2014","...","\u2514\u2014\u2014\u2014\u2014\u2014\u20140000N.txt","or","MOT17","|\u2014\u2014\u2014\u2014\u2014\u2014images","|","\u2514\u2014\u2014\u2014\u2014\u2014\u2014train","|","\u2514\u2014\u2014\u2014\u2014\u2014\u2014test","\u2514\u2014\u2014\u2014\u2014\u2014\u2014labels_with_ids","\u2514\u2014\u2014\u2014\u2014\u2014\u2014train"]
code: def parse_dataset(self):
      self.img_files = OrderedDict()
      self.img_start_index = OrderedDict()
      self.label_files = OrderedDict()
      self.tid_num = OrderedDict()
      self.tid_start_index = OrderedDict()
  
      img_index = 0
      for data_name in self.image_lists:
          # check every data image list
          image_lists_dir = os.path.join(
              self.dataset_dir, "image_lists"
          )
          assert os.path.isdir(
              image_lists_dir
          ), "The {} is not a directory.".format(image_lists_dir)
  
          list_path = os.path.join(image_lists_dir, data_name)
          assert os.path.exists(
              list_path
          ), "The list path {} does not exist.".format(list_path)
  
          # record img_files, filter out empty ones
          with open(list_path, "r") as file:
              self.img_files[data_name] = file.readlines()
              self.img_files[data_name] = [
                  os.path.join(self.dataset_dir, x.strip())
                  for x in self.img_files[data_name]
              ]
              self.img_files[data_name] = list(
                  filter(
                      lambda x: len(x) > 0, self.img_files[data_name]
                  )
              )
  
              self.img_start_index[data_name] = img_index
              img_index += len(self.img_files[data_name])
  
          # record label_files
          self.label_files[data_name] = [
              x.replace("images", "labels_with_ids")
              .replace(".png", ".txt")
              .replace(".jpg", ".txt")
              for x in self.img_files[data_name]
          ]
  
      for data_name, label_paths in self.label_files.items():
          max_index = -1
          for lp in label_paths:
              lb = np.loadtxt(lp)
              if len(lb) < 1:
                  continue
              if len(lb.shape) < 2:
                  img_max = lb[1]
              else:
                  img_max = np.max(lb[:, 1])
              if img_max > max_index:
                  max_index = img_max
          self.tid_num[data_name] = int(max_index + 1)
  
      last_index = 0
      for i, (k, v) in enumerate(self.tid_num.items()):
          self.tid_start_index[k] = last_index
          last_index += v
  
      self.num_identities_dict = defaultdict(int)
      self.num_identities_dict[0] = int(last_index + 1)  # single class
      self.num_imgs_each_data = [
          len(x) for x in self.img_files.values()
      ]
      self.total_imgs = sum(self.num_imgs_each_data)
  
      logger.info("MOT dataset summary: ")
      logger.info(self.tid_num)
      logger.info("Total images: {}".format(self.total_imgs))
      logger.info("Image start index: {}".format(self.img_start_index))
      logger.info(
          "Total identities: {}".format(self.num_identities_dict[0])
      )
      logger.info(
          "Identity start index: {}".format(self.tid_start_index)
      )
  
      records = []
      cname2cid = mot_label()
  
      for img_index in range(self.total_imgs):
          for i, (k, v) in enumerate(self.img_start_index.items()):
              if img_index >= v:
                  data_name = list(self.label_files.keys())[i]
                  start_index = v
          img_file = self.img_files[data_name][img_index - start_index]
          lbl_file = self.label_files[data_name][
              img_index - start_index
          ]
  
          if not os.path.exists(img_file):
              logger.warning(
                  "Illegal image file: {}, and it will be ignored".format(
                      img_file
                  )
              )
              continue
          if not os.path.isfile(lbl_file):
              logger.warning(
                  "Illegal label file: {}, and it will be ignored".format(
                      lbl_file
                  )
              )
              continue
  
          labels = np.loadtxt(lbl_file, dtype=np.float32).reshape(-1, 6)
          # each row in labels (N, 6) is [gt_class, gt_identity, cx, cy, w, h]
  
          cx, cy = labels[:, 2], labels[:, 3]
          w, h = labels[:, 4], labels[:, 5]
          gt_bbox = np.stack((cx, cy, w, h)).T.astype("float32")
          gt_class = labels[:, 0:1].astype("int32")
          gt_score = np.ones((len(labels), 1)).astype("float32")
          gt_ide = labels[:, 1:2].astype("int32")
          for i, _ in enumerate(gt_ide):
              if gt_ide[i] > -1:
                  gt_ide[i] += self.tid_start_index[data_name]
  
          mot_rec = (
              {
                  "im_file": img_file,
                  "im_id": img_index,
              }
              if "image" in self.data_fields
              else {}
          )
  
          gt_rec = {
              "gt_class": gt_class,
              "gt_score": gt_score,
              "gt_bbox": gt_bbox,
              "gt_ide": gt_ide,
          }
  
          for k, v in gt_rec.items():
              if k in self.data_fields:
                  mot_rec[k] = v
  
          records.append(mot_rec)
          if self.sample_num > 0 and img_index >= self.sample_num:
              break
      assert len(records) > 0, "not found any mot record in %s" % (
          self.image_lists
      )
      self.roidbs, self.cname2cid = records, cname2cid
  
imports: import os
  import sys
  import cv2
  import glob
  import numpy
  from collections import OrderedDict, defaultdict
  from .dataset import DetDataset, _make_dataset, _is_valid_file
  from ppdet.core.workspace import register, serializable
  from ppdet.utils.logger import setup_logger
label_desc: Use image node_id 3 for calling the MOTDataSet obj's underlying member method code with example usage: obj.parse_dataset() without return types